package com.template.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.template.annotation.DESRespondSecret; import com.template.annotation.PassToken; import com.template.api.SmartCarAccessControllerAPI; import com.template.api.SmartFaceDiscernControllerAPI; import com.template.common.utils.*; import com.template.config.ControlConfig; import com.template.model.pojo.*; import com.template.model.result.CommonResult; import com.template.model.vo.LastSevenDaysTrackVo; import com.template.services.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URLDecoder; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import static com.template.common.utils.AesTestOne.decrypt; /** *

* 前端控制器 *

* * @author ceshi * @since 2024-01-18 */ @RestController //返回参数加密注解 @DESRespondSecret public class SmartFaceDiscernController implements SmartFaceDiscernControllerAPI { private static Logger logger = LoggerFactory.getLogger(SmartFaceDiscernController.class); @Autowired SmartFaceDiscernService smartFaceDiscernService; @Autowired SmartQrcodeService smartQrcodeService; @Autowired SmartCarAccessService smartCarAccessService; @Autowired SmartAttendanceService smartAttendanceService; @Autowired SmartUserService smartUserService; @Autowired SmartClassService smartClassService; @Autowired SmartUploadService smartUploadService; @Autowired SmartNotificationService smartNotificationService; @Autowired SmartDeviceService smartDeviceService; @Autowired SmartAccessService smartAccessService; @Override @DESRespondSecret(validated = true) public CommonResult track(Integer id, int dateTime) { JSONObject date = getDate(dateTime); String stateTime = date.getString("stateTime"); String endTime = date.getString("endTime"); List smartFaceDiscerns = smartFaceDiscernService.track(stateTime, endTime, id); ArrayList vos = new ArrayList<>(); for (SmartFaceDiscern faceDiscern : smartFaceDiscerns) { LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo(); lastSevenDaysTrackVo.setName(faceDiscern.getName()); lastSevenDaysTrackVo.setType(faceDiscern.getType()); lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation()); lastSevenDaysTrackVo.setImage(faceDiscern.getImage()); lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime()); vos.add(lastSevenDaysTrackVo); } List attendances = smartAttendanceService.track(stateTime, endTime, id); // 获取班级名称 SmartUser smartUser = smartUserService.getSmartById(id); SmartClass smartClass = smartClassService.getSmartClassById(smartUser.getSchoolClass()); String className = smartClass.getName(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (SmartAttendance attendance : attendances) { LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo(); lastSevenDaysTrackVo.setName(attendance.getXwUserName()); lastSevenDaysTrackVo.setType("打卡"); lastSevenDaysTrackVo.setLocation(className); Date attendTime = attendance.getAttendTime(); lastSevenDaysTrackVo.setDateTime(sdf.format(attendTime)); vos.add(lastSevenDaysTrackVo); } // 门禁信息 List smartAccesses = smartAccessService.track(stateTime, endTime, id); for (SmartAccess faceDiscern : smartAccesses) { LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo(); lastSevenDaysTrackVo.setName(faceDiscern.getName()); lastSevenDaysTrackVo.setType(faceDiscern.getType()); lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation()); lastSevenDaysTrackVo.setImage(faceDiscern.getImage()); lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime()); vos.add(lastSevenDaysTrackVo); } // 排序 Collections.sort(vos, Comparator.comparing((h) -> { return h.getDateTime(); })); return CommonResult.ok(vos); } @Override @DESRespondSecret(validated = true) public CommonResult access() { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); JSONArray jsonArray = new JSONArray(); for (int i = 0; i < 30; i++) { LocalDateTime stateTime = now.minusDays(i + 1); LocalDateTime endTime = now.minusDays(i); String dateTime = endTime.format(dateTimeFormatter); LambdaQueryWrapper smartAccessWrapper = new LambdaQueryWrapper<>(); smartAccessWrapper.between(SmartAccess::getDateTime, stateTime, endTime); int faceDiscernCount = smartAccessService.count(smartAccessWrapper); LambdaQueryWrapper qrcodeWrapper = new LambdaQueryWrapper<>(); qrcodeWrapper.between(SmartQrcode::getCreateTime, stateTime, endTime); int qrcodeCount = smartQrcodeService.count(qrcodeWrapper); LambdaQueryWrapper smartCarAccessWrapper = new LambdaQueryWrapper<>(); smartCarAccessWrapper.between(SmartCarAccess::getEnterTime, stateTime, endTime); int carCount = smartCarAccessService.count(smartCarAccessWrapper); JSONObject jsonObject = new JSONObject(); jsonObject.put("date", dateTime); jsonObject.put("face", faceDiscernCount); jsonObject.put("code", qrcodeCount); jsonObject.put("car", carCount); jsonArray.add(jsonObject); } return CommonResult.ok(jsonArray); } @Override @DESRespondSecret(validated = true) public CommonResult lastSevenDaysTrack(int userId) { LocalDateTime end = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).plusDays(1); LocalDateTime satrt = end.minusDays(7); DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String endTime = end.format(dateTimeFormatter1); String startTime = satrt.format(dateTimeFormatter1); ArrayList vos = new ArrayList<>(); // 人脸抓拍 List faceDiscerns = smartFaceDiscernService.track(startTime, endTime, userId); for (SmartFaceDiscern faceDiscern : faceDiscerns) { LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo(); lastSevenDaysTrackVo.setName(faceDiscern.getName()); lastSevenDaysTrackVo.setType(faceDiscern.getType()); lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation()); lastSevenDaysTrackVo.setImage(faceDiscern.getImage()); lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime()); vos.add(lastSevenDaysTrackVo); } // 打卡 List attendances = smartAttendanceService.track(startTime, endTime, userId); // 获取班级名称 SmartUser smartUser = smartUserService.getSmartById(userId); SmartClass smartClass = smartClassService.getSmartClassById(smartUser.getSchoolClass()); String className = smartClass.getName(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (SmartAttendance attendance : attendances) { LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo(); lastSevenDaysTrackVo.setName(attendance.getXwUserName()); lastSevenDaysTrackVo.setType("打卡"); lastSevenDaysTrackVo.setLocation(className); Date attendTime = attendance.getAttendTime(); lastSevenDaysTrackVo.setDateTime(sdf.format(attendTime)); vos.add(lastSevenDaysTrackVo); } // 门禁信息 List smartAccesses = smartAccessService.track(startTime, endTime, userId); for (SmartAccess faceDiscern : smartAccesses) { LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo(); lastSevenDaysTrackVo.setName(faceDiscern.getName()); lastSevenDaysTrackVo.setType(faceDiscern.getType()); lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation()); lastSevenDaysTrackVo.setImage(faceDiscern.getImage()); lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime()); vos.add(lastSevenDaysTrackVo); } // 排序 Collections.sort(vos, Comparator.comparing((h) -> { return h.getDateTime(); })); return CommonResult.ok(vos); } @Override @PassToken @DESRespondSecret(validated = false) public String callBack(HttpServletRequest request, HttpServletResponse response) { try { BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8")); StringBuilder responseStrBuilder = new StringBuilder(); String inputStr; while ((inputStr = streamReader.readLine()) != null) { responseStrBuilder.append(inputStr); } JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString()); DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 比对时间 String time = jsonObject.getString("time"); logger.info("time = " + time); // LocalDateTime localDateTime = LocalDateTime.now().withHour(0).withSecond(0).withMinute(0); // LocalDateTime localDateTime2 = LocalDateTime.parse(time, dateTimeFormatter1); //// 只获取当天的 // if (localDateTime.isBefore(localDateTime2)) { // 比对结果 Integer resultStatus = jsonObject.getInteger("resultStatus"); // if (1 == resultStatus) { // 设备sn String sn = jsonObject.getString("sn"); SmartDevice smartDevice = smartDeviceService.getNum(sn); String address = ""; String type = ""; if (ObjectUtils.isNotEmpty(smartDevice)) { // 地点 address = smartDevice.getAddress(); // 类型 type = smartDevice.getName(); } // 名字,学生会加班级[] String name = jsonObject.getString("name"); System.out.println("name = " + name); String[] split = name.split("\\["); String s = split[0]; logger.info("name = " + s); // 百胜门禁编号 String idNum = jsonObject.getString("idNum"); logger.info("idNum = " + idNum); Integer userId = 0; SmartUser smartUser = null; if (ObjectUtils.isNotEmpty(idNum)) { smartUser = smartUserService.getBsStudentNo(idNum); if (ObjectUtils.isNotEmpty(smartUser)) { userId = smartUser.getId(); } else { userId = 0; } } // 出入标识: 1-进, 0-出 Integer inout = jsonObject.getInteger("inout"); // 开门方式:0-白名单比对,1-人证比对,2-IC卡比对 Integer openType = jsonObject.getInteger("openType"); SmartAccess smartFaceDiscern = new SmartAccess(); smartFaceDiscern.setName(s); smartFaceDiscern.setLocation(address); smartFaceDiscern.setType(type); smartFaceDiscern.setUserId(userId); smartFaceDiscern.setDateTime(time); smartFaceDiscern.setIdNum(idNum); smartFaceDiscern.setSn(sn); smartFaceDiscern.setInOut(inout); smartFaceDiscern.setOpenType(openType); smartFaceDiscern.setResultStatus(resultStatus); if (userId != 0) { // 判断是否已经添加 LambdaQueryWrapper wrapperFD = new LambdaQueryWrapper<>(); wrapperFD.eq(SmartAccess::getDateTime, smartFaceDiscern.getDateTime()) .eq(SmartAccess::getUserId, userId); List list = smartAccessService.list(wrapperFD); if (ObjectUtils.isEmpty(list) && list.size() == 0) { // 抓拍的照片 base64字符串 String scenePhoto = jsonObject.getString("scenePhoto"); scenePhoto = "data:image/jpeg;base64," + scenePhoto; logger.info("scenePhoto =" + scenePhoto.substring(0, 50)); // base64转文件 MultipartFile multipartFile = MultipartFileUtils.base64ToMultipartFile(scenePhoto); String image = ""; try { // 上传到cos桶,并生成图片地址 image = smartUploadService.upload(new MultipartFile[]{multipartFile}); } catch (Exception e) { e.printStackTrace(); logger.error("上传cos桶失败"); } smartFaceDiscern.setImage(image); smartAccessService.save(smartFaceDiscern); // 通过学生id找到关联的家长affiliate,并找到公众号,如果openid为空则不传 List userList = smartUserService.getAffiliateList(userId); if (ObjectUtils.isNotEmpty(userList) && userList.size() > 0) { for (SmartUser user : userList) { String gzhOpenId = user.getGzhOpenId(); if (ObjectUtils.isNotEmpty(gzhOpenId)) { String pushType = ""; if (type.contains("进校")) { pushType = "进入大门"; } else if (type.contains("出校")) { pushType = "离开大门"; } LocalDateTime date = LocalDateTime.now(); String format = date.format(dateTimeFormatter1); // 公众号信息推送 Message2.send(gzhOpenId, pushType, address, format); SmartNotification smartNotification = new SmartNotification(); smartNotification.setUserId(smartUser.getId()); smartNotification.setUserName(smartUser.getName()); smartNotification.setTypeName(pushType); smartNotification.setLocation(address); smartNotification.setImage(image); smartNotification.setDateTime(time); smartNotification.setType(2); smartNotificationService.save(smartNotification); } } } } } else { smartFaceDiscern.setUserId(0); // 判断是否已经添加 LambdaQueryWrapper wrapperFD = new LambdaQueryWrapper<>(); wrapperFD.eq(SmartAccess::getDateTime, time) .eq(SmartAccess::getName, s) .eq(SmartAccess::getType, type); List list = smartAccessService.list(wrapperFD); if (ObjectUtils.isEmpty(list) && list.size() == 0) { // 抓拍的照片 base64字符串 String scenePhoto = jsonObject.getString("scenePhoto"); scenePhoto = "data:image/jpeg;base64," + scenePhoto; logger.info("scenePhoto =" + scenePhoto.substring(0, 50)); // base64转文件 MultipartFile multipartFile = MultipartFileUtils.base64ToMultipartFile(scenePhoto); String image = ""; try { // 上传到cos桶,并生成图片地址 image = smartUploadService.upload(new MultipartFile[]{multipartFile}); } catch (Exception e) { e.printStackTrace(); logger.error("上传cos桶失败"); } smartFaceDiscern.setImage(image); smartAccessService.save(smartFaceDiscern); } } // } // } } catch (Exception e) { e.printStackTrace(); JSONObject r = new JSONObject(); r.put("message", "Success"); r.put("result", 0); return r.toJSONString(); } JSONObject r = new JSONObject(); r.put("message", "Success"); r.put("result", 0); return r.toJSONString(); } @Override public CommonResult selectTrack(Integer userId, String startTime, String endTime) { ArrayList vos = new ArrayList<>(); // 人脸抓拍 List faceDiscerns = smartFaceDiscernService.track(startTime, endTime, userId); for (SmartFaceDiscern faceDiscern : faceDiscerns) { LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo(); lastSevenDaysTrackVo.setName(faceDiscern.getName()); lastSevenDaysTrackVo.setType(faceDiscern.getType()); lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation()); lastSevenDaysTrackVo.setImage(faceDiscern.getImage()); lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime()); vos.add(lastSevenDaysTrackVo); } // 打卡 List attendances = smartAttendanceService.track(startTime, endTime, userId); // 获取班级名称 SmartUser smartUser = smartUserService.getSmartById(userId); SmartClass smartClass = smartClassService.getSmartClassById(smartUser.getSchoolClass()); String className = smartClass.getName(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (SmartAttendance attendance : attendances) { LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo(); lastSevenDaysTrackVo.setName(attendance.getXwUserName()); lastSevenDaysTrackVo.setType("打卡"); lastSevenDaysTrackVo.setLocation(className); Date attendTime = attendance.getAttendTime(); lastSevenDaysTrackVo.setDateTime(sdf.format(attendTime)); vos.add(lastSevenDaysTrackVo); } // 门禁信息 List smartAccesses = smartAccessService.track(startTime, endTime, userId); for (SmartAccess faceDiscern : smartAccesses) { LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo(); lastSevenDaysTrackVo.setName(faceDiscern.getName()); lastSevenDaysTrackVo.setType(faceDiscern.getType()); lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation()); lastSevenDaysTrackVo.setImage(faceDiscern.getImage()); lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime()); vos.add(lastSevenDaysTrackVo); } // 排序 Collections.sort(vos, Comparator.comparing((h) -> { return h.getDateTime(); })); return CommonResult.ok(vos); } public static JSONObject getDate(Integer date) { JSONObject jsonObject = new JSONObject(); DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime now = LocalDateTime.now(); LocalDateTime stateTime = now.withHour(0).withMinute(0).withSecond(0).minusDays(date); LocalDateTime endTime = now.withHour(23).withMinute(59).withSecond(59).minusDays(date); jsonObject.put("stateTime", stateTime.format(dateTimeFormatter1)); jsonObject.put("endTime", endTime.format(dateTimeFormatter1)); return jsonObject; } public static void main(String[] args) { LocalDateTime dateTime1 = LocalDateTime.of(2022, 8, 29, 12, 0, 0); LocalDateTime dateTime2 = LocalDateTime.of(2022, 8, 30, 12, 0, 0); LocalDateTime dateTime3 = LocalDateTime.of(2022, 8, 28, 12, 0, 0); boolean isBefore = dateTime1.isBefore(dateTime2); boolean isBefore2 = dateTime1.isBefore(dateTime3); System.out.println("dateTime1 is before dateTime2: " + isBefore); System.out.println("dateTime1 is before dateTime2: " + isBefore2); } }