SmartFaceDiscernController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  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. @Override
  69. @DESRespondSecret(validated = true)
  70. public CommonResult track(Integer id, int dateTime) {
  71. JSONObject date = getDate(dateTime);
  72. String stateTime = date.getString("stateTime");
  73. String endTime = date.getString("endTime");
  74. List<SmartFaceDiscern> smartFaceDiscerns = smartFaceDiscernService.track(stateTime, endTime, id);
  75. return CommonResult.ok(smartFaceDiscerns);
  76. }
  77. @Override
  78. @DESRespondSecret(validated = true)
  79. public CommonResult access() {
  80. LocalDateTime now = LocalDateTime.now();
  81. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  82. JSONArray jsonArray = new JSONArray();
  83. for (int i = 0; i < 30; i++) {
  84. LocalDateTime stateTime = now.minusDays(i + 1);
  85. LocalDateTime endTime = now.minusDays(i);
  86. String dateTime = endTime.format(dateTimeFormatter);
  87. LambdaQueryWrapper<SmartFaceDiscern> faceDiscernWrapper = new LambdaQueryWrapper<>();
  88. faceDiscernWrapper.between(SmartFaceDiscern::getDateTime, stateTime, endTime)
  89. .ne(SmartFaceDiscern::getType, "人脸比对");
  90. int faceDiscernCount = smartFaceDiscernService.count(faceDiscernWrapper);
  91. LambdaQueryWrapper<SmartQrcode> qrcodeWrapper = new LambdaQueryWrapper<>();
  92. qrcodeWrapper.between(SmartQrcode::getCreateTime, stateTime, endTime);
  93. int qrcodeCount = smartQrcodeService.count(qrcodeWrapper);
  94. LambdaQueryWrapper<SmartCarAccess> smartCarAccessWrapper = new LambdaQueryWrapper<>();
  95. smartCarAccessWrapper.between(SmartCarAccess::getEnterTime, stateTime, endTime);
  96. int carCount = smartCarAccessService.count(smartCarAccessWrapper);
  97. JSONObject jsonObject = new JSONObject();
  98. jsonObject.put("date", dateTime);
  99. jsonObject.put("face", faceDiscernCount);
  100. jsonObject.put("code", qrcodeCount);
  101. jsonObject.put("car", carCount);
  102. jsonArray.add(jsonObject);
  103. }
  104. return CommonResult.ok(jsonArray);
  105. }
  106. @Override
  107. @DESRespondSecret(validated = true)
  108. public CommonResult lastSevenDaysTrack(int userId) {
  109. LocalDateTime end = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).plusDays(1);
  110. LocalDateTime satrt = end.minusDays(7);
  111. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  112. String endTime = end.format(dateTimeFormatter1);
  113. String startTime = satrt.format(dateTimeFormatter1);
  114. ArrayList<LastSevenDaysTrackVo> vos = new ArrayList<>();
  115. List<SmartFaceDiscern> faceDiscerns = smartFaceDiscernService.track(startTime, endTime, userId);
  116. for (SmartFaceDiscern faceDiscern : faceDiscerns) {
  117. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  118. lastSevenDaysTrackVo.setName(faceDiscern.getName());
  119. lastSevenDaysTrackVo.setType(faceDiscern.getType());
  120. lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation());
  121. lastSevenDaysTrackVo.setImage(faceDiscern.getImage());
  122. lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime());
  123. vos.add(lastSevenDaysTrackVo);
  124. }
  125. List<SmartAttendance> attendances = smartAttendanceService.track(startTime, endTime, userId);
  126. // 获取班级名称
  127. SmartUser smartUser = smartUserService.getSmartById(userId);
  128. SmartClass smartClass = smartClassService.getSmartClassById(smartUser.getSchoolClass());
  129. String className = smartClass.getName();
  130. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  131. for (SmartAttendance attendance : attendances) {
  132. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  133. lastSevenDaysTrackVo.setName(attendance.getXwUserName());
  134. lastSevenDaysTrackVo.setType("打卡");
  135. lastSevenDaysTrackVo.setLocation(className);
  136. Date attendTime = attendance.getAttendTime();
  137. lastSevenDaysTrackVo.setDateTime(sdf.format(attendTime));
  138. vos.add(lastSevenDaysTrackVo);
  139. }
  140. // 排序
  141. Collections.sort(vos, Comparator.comparing((h) -> {
  142. return h.getDateTime();
  143. }));
  144. return CommonResult.ok(vos);
  145. }
  146. @Override
  147. @PassToken
  148. @DESRespondSecret(validated = false)
  149. public String callBack(HttpServletRequest request, HttpServletResponse response) {
  150. try {
  151. BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
  152. StringBuilder responseStrBuilder = new StringBuilder();
  153. String inputStr;
  154. while ((inputStr = streamReader.readLine()) != null) {
  155. responseStrBuilder.append(inputStr);
  156. }
  157. JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
  158. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  159. // 比对时间
  160. String time = jsonObject.getString("time");
  161. logger.info("time = " + time);
  162. LocalDateTime localDateTime = LocalDateTime.now().withHour(0).withSecond(0).withMinute(0);
  163. LocalDateTime localDateTime2 = LocalDateTime.parse(time, dateTimeFormatter1);
  164. // 只获取当天的
  165. if (localDateTime.isBefore(localDateTime2)) {
  166. // 比对结果
  167. Integer resultStatus = jsonObject.getInteger("resultStatus");
  168. if (1 == resultStatus) {
  169. // 设备sn
  170. String sn = jsonObject.getString("sn");
  171. SmartDevice smartDevice = smartDeviceService.getNum(sn);
  172. String address = "";
  173. String type = "";
  174. if (ObjectUtils.isNotEmpty(smartDevice)) {
  175. // 地点
  176. address = smartDevice.getAddress();
  177. // 类型
  178. type = smartDevice.getName();
  179. }
  180. // 名字,学生会加班级[]
  181. String name = jsonObject.getString("name");
  182. System.out.println("name = " + name);
  183. String[] split = name.split("\\[");
  184. String s = split[0];
  185. logger.info("name = " + s);
  186. // 百胜门禁编号
  187. String idNum = jsonObject.getString("idNum");
  188. logger.info("idNum = " + idNum);
  189. SmartUser smartUser = smartUserService.getBsStudentNo(idNum);
  190. Integer userId = 0;
  191. if (ObjectUtils.isNotEmpty(smartUser)) {
  192. userId = smartUser.getId();
  193. } else {
  194. userId = 0;
  195. }
  196. SmartFaceDiscern smartFaceDiscern = new SmartFaceDiscern();
  197. smartFaceDiscern.setName(s);
  198. smartFaceDiscern.setLocation(address);
  199. smartFaceDiscern.setType(type);
  200. smartFaceDiscern.setUserId(userId);
  201. smartFaceDiscern.setDateTime(time);
  202. smartFaceDiscern.setIdNum(idNum);
  203. smartFaceDiscern.setSn(sn);
  204. if (userId != 0) {
  205. // 判断是否已经添加
  206. LambdaQueryWrapper<SmartFaceDiscern> wrapperFD = new LambdaQueryWrapper<>();
  207. wrapperFD.eq(SmartFaceDiscern::getDateTime, smartFaceDiscern.getDateTime())
  208. .eq(SmartFaceDiscern::getUserId, userId);
  209. List<SmartFaceDiscern> list = smartFaceDiscernService.list(wrapperFD);
  210. if (ObjectUtils.isEmpty(list) && list.size() == 0) {
  211. // 抓拍的照片 base64字符串
  212. String scenePhoto = jsonObject.getString("scenePhoto");
  213. scenePhoto = "data:image/jpeg;base64," + scenePhoto;
  214. logger.info("scenePhoto =" + scenePhoto.substring(0, 50));
  215. // base64转文件
  216. MultipartFile multipartFile = MultipartFileUtils.base64ToMultipartFile(scenePhoto);
  217. String image="";
  218. try {
  219. // 上传到cos桶,并生成图片地址
  220. image = smartUploadService.upload(new MultipartFile[]{multipartFile});
  221. }catch (Exception e){
  222. e.printStackTrace();
  223. logger.error("上传cos桶失败");
  224. }
  225. smartFaceDiscern.setImage(image);
  226. smartFaceDiscernService.save(smartFaceDiscern);
  227. // 通过学生id找到关联的家长affiliate,并找到公众号,如果openid为空则不传
  228. List<SmartUser> userList = smartUserService.getAffiliateList(userId);
  229. if (ObjectUtils.isNotEmpty(userList) && userList.size() > 0) {
  230. for (SmartUser user : userList) {
  231. String gzhOpenId = user.getGzhOpenId();
  232. if (ObjectUtils.isNotEmpty(gzhOpenId)) {
  233. String pushType = "";
  234. if (type.contains("进校")) {
  235. pushType = "进入大门";
  236. } else if (type.contains("出校")) {
  237. pushType = "离开大门";
  238. }
  239. LocalDateTime date = LocalDateTime.now();
  240. String format = date.format(dateTimeFormatter1);
  241. // 公众号信息推送
  242. Message2.send(gzhOpenId, pushType, address, format);
  243. SmartNotification smartNotification = new SmartNotification();
  244. smartNotification.setUserId(smartUser.getId());
  245. smartNotification.setUserName(smartUser.getName());
  246. smartNotification.setTypeName(pushType);
  247. smartNotification.setLocation(address);
  248. smartNotification.setImage(image);
  249. smartNotification.setDateTime(time);
  250. smartNotification.setType(2);
  251. smartNotificationService.save(smartNotification);
  252. }
  253. }
  254. }
  255. }
  256. } else {
  257. smartFaceDiscern.setUserId(0);
  258. // 判断是否已经添加
  259. LambdaQueryWrapper<SmartFaceDiscern> wrapperFD = new LambdaQueryWrapper<>();
  260. wrapperFD.eq(SmartFaceDiscern::getDateTime, time)
  261. .eq(SmartFaceDiscern::getName, s)
  262. .eq(SmartFaceDiscern::getType, type);
  263. List<SmartFaceDiscern> list = smartFaceDiscernService.list(wrapperFD);
  264. if (ObjectUtils.isEmpty(list) && list.size() == 0) {
  265. // 抓拍的照片 base64字符串
  266. String scenePhoto = jsonObject.getString("scenePhoto");
  267. scenePhoto = "data:image/jpeg;base64," + scenePhoto;
  268. logger.info("scenePhoto =" + scenePhoto.substring(0, 50));
  269. // base64转文件
  270. MultipartFile multipartFile = MultipartFileUtils.base64ToMultipartFile(scenePhoto);
  271. String image="";
  272. try {
  273. // 上传到cos桶,并生成图片地址
  274. image = smartUploadService.upload(new MultipartFile[]{multipartFile});
  275. }catch (Exception e){
  276. e.printStackTrace();
  277. logger.error("上传cos桶失败");
  278. }
  279. smartFaceDiscern.setImage(image);
  280. smartFaceDiscernService.save(smartFaceDiscern);
  281. }
  282. }
  283. }
  284. }
  285. } catch (
  286. Exception e) {
  287. e.printStackTrace();
  288. JSONObject r = new JSONObject();
  289. r.put("message", "Success");
  290. r.put("result", 0);
  291. return r.toJSONString();
  292. }
  293. JSONObject r = new JSONObject();
  294. r.put("message", "Success");
  295. r.put("result", 0);
  296. return r.toJSONString();
  297. }
  298. public static JSONObject getDate(Integer date) {
  299. JSONObject jsonObject = new JSONObject();
  300. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  301. LocalDateTime now = LocalDateTime.now();
  302. LocalDateTime stateTime = now.withHour(0).withMinute(0).withSecond(0).minusDays(date);
  303. LocalDateTime endTime = now.withHour(23).withMinute(59).withSecond(59).minusDays(date);
  304. jsonObject.put("stateTime", stateTime.format(dateTimeFormatter1));
  305. jsonObject.put("endTime", endTime.format(dateTimeFormatter1));
  306. return jsonObject;
  307. }
  308. public static void main(String[] args) {
  309. LocalDateTime dateTime1 = LocalDateTime.of(2022, 8, 29, 12, 0, 0);
  310. LocalDateTime dateTime2 = LocalDateTime.of(2022, 8, 30, 12, 0, 0);
  311. LocalDateTime dateTime3 = LocalDateTime.of(2022, 8, 28, 12, 0, 0);
  312. boolean isBefore = dateTime1.isBefore(dateTime2);
  313. boolean isBefore2 = dateTime1.isBefore(dateTime3);
  314. System.out.println("dateTime1 is before dateTime2: " + isBefore);
  315. System.out.println("dateTime1 is before dateTime2: " + isBefore2);
  316. }
  317. }