package com.template.services.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.template.common.utils.*; import com.template.config.ScheduleConfig; import com.template.model.pojo.SmartFaceDiscern; import com.template.mapper.SmartFaceDiscernMapper; import com.template.model.pojo.SmartNotification; import com.template.model.pojo.SmartUser; import com.template.services.SmartFaceDiscernService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.template.services.SmartNotificationService; import com.template.services.SmartUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.net.URLDecoder; import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashSet; import java.util.List; import java.util.Set; import static com.template.common.utils.AesTestOne.decrypt; /** *

* 服务实现类 *

* * @author ceshi * @since 2024-01-18 */ @Service public class SmartFaceDiscernServiceImpl extends ServiceImpl implements SmartFaceDiscernService { @Autowired SmartUserService smartUserService; @Autowired SmartNotificationService smartNotificationService; @Resource private ScheduleConfig scheduleConfig; // static String appid = "sc5efc60f2bd373df9"; static String appid = "sc1eb792c1ea3237e9"; // static String appSecret = "fe0d767a2a394d1b81ccda6fc0ce5ecc"; static String appSecret = "61afd794ed3244e995c5e894e5788193"; // static String schoolCode = "SL1701743624375793"; static String schoolCode = "SL1704880825203963"; private Integer page = 1; private Integer size = 50; // @Scheduled(cron = "0 0/50 * * * ? ") @Async @Scheduled(cron = "0 0/20 * * * ? ") public void baiS() { if(scheduleConfig.getIsOpen().equals("1")){ try { getFaceDiscern(page, size); } catch (Exception e) { throw new RuntimeException(e); } } } public void getFaceDiscern(Integer pageindex, Integer pagesize) throws Exception { // String url = "http://schoolopenapi.szymzh.com/openapi/record/searchrecord"; String url = "https://schoolopenapi.ymiot.net/openapi/record/searchrecord"; JSONObject jsonObject = new JSONObject(); jsonObject.put("appid", appid); String timestamp = TimeExchange.DateNowTimeStamo(); jsonObject.put("timestamp", timestamp); jsonObject.put("schoolno", schoolCode); JSONObject data = new JSONObject(); data.put("pageindex", pageindex + ""); data.put("pagesize", pagesize + ""); // 时间 DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime now = LocalDateTime.now(); LocalDateTime stateTime = now.withHour(0).withMinute(0).withSecond(0); LocalDateTime endTime = now.withHour(23).withMinute(59).withSecond(59); // 开始时间 data.put("record_begintime", stateTime.format(dateTimeFormatter1)); // data.put("record_begintime", "2024-01-22 00:00:00"); // 结束时间 data.put("record_endtime", endTime.format(dateTimeFormatter1)); // data.put("record_endtime", "2024-01-22 23:59:59"); String dataString = data.toJSONString(); // 加密 String aesStr = URLEncoder.encode(AesTestOne.encrypt(dataString, appSecret), "UTF-8"); jsonObject.put("data", aesStr); String stringA = "appid=" + appid + "&data=" + dataString + "&schoolno=" + schoolCode + "×tamp=" + timestamp + "&key=" + appSecret; String sign = CommonUtil.MD5(stringA); jsonObject.put("sign", sign); String s = RequestUtils.httpPost(url, jsonObject.toJSONString()); JSONObject jsonObject1 = JSONObject.parseObject(s); String data1 = jsonObject1.getString("data"); // URL解码 String decodedUrl = URLDecoder.decode(data1, "UTF-8"); String decrypt = decrypt(decodedUrl, appSecret); // logger.info("decrypt = " + decrypt); if (ObjectUtils.isNotEmpty(decrypt)&& decrypt!="") { JSONObject jsonObject2 = JSONObject.parseObject(decrypt); if (ObjectUtils.isNotEmpty(jsonObject2)) { // 获取总数 Integer total = Integer.valueOf(jsonObject2.getString("total")); // logger.info("total = " + total); if (total > pageindex * pagesize) { page = pageindex + 1; } else { page = pageindex - 1; } JSONArray data2 = jsonObject2.getJSONArray("data"); // 去重 HashSet smartFaceDiscerns = new HashSet<>(); for (int i = 0; i < data2.size(); i++) { JSONObject jsonObject3 = data2.getJSONObject(i); SmartFaceDiscern smartFaceDiscern = new SmartFaceDiscern(); // 事件 String deviceName = jsonObject3.getString("device_name"); smartFaceDiscern.setType(deviceName); // 地点 String deviceArea = jsonObject3.getString("device_area"); smartFaceDiscern.setLocation(deviceArea); // 图片 String recordPhoto = jsonObject3.getString("record_photo"); smartFaceDiscern.setImage(recordPhoto); // 时间 String recordAddtime = jsonObject3.getString("record_addtime"); smartFaceDiscern.setDateTime(recordAddtime); // 名字 String student_name = jsonObject3.getString("student_name"); smartFaceDiscern.setName(student_name); // 学号 String student_number = jsonObject3.getString("student_number"); // 编号 String student_no = jsonObject3.getString("student_no"); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SmartUser::getBsStudentNo, student_no); wrapper.eq(SmartUser::getName, student_name); SmartUser smartUser = smartUserService.getOne(wrapper); if (ObjectUtils.isNotEmpty(smartUser)) { smartFaceDiscern.setUserId(smartUser.getId()); } else { smartFaceDiscern.setUserId(0); } smartFaceDiscerns.add(smartFaceDiscern); } for (SmartFaceDiscern smartFaceDiscern : smartFaceDiscerns) { Integer userId = smartFaceDiscern.getUserId(); String deviceName = smartFaceDiscern.getType(); String deviceArea = smartFaceDiscern.getLocation(); String recordPhoto = smartFaceDiscern.getImage(); String recordAddtime = smartFaceDiscern.getDateTime(); String student_name = smartFaceDiscern.getName(); if (userId != 0) { // 判断是否已经添加 LambdaQueryWrapper wrapperFD = new LambdaQueryWrapper<>(); wrapperFD.eq(SmartFaceDiscern::getDateTime, smartFaceDiscern.getDateTime()) .eq(SmartFaceDiscern::getUserId, userId); List list = this.list(wrapperFD); if (ObjectUtils.isEmpty(list) && list.size() == 0) { this.save(smartFaceDiscern); // 通过学生id找到关联的家长affiliate,并找到公众号,如果openid为空则不传 List userList = smartUserService.getAffiliateList(userId); if (ObjectUtils.isNotEmpty(userList) && userList.size() > 0) { SmartUser smartUser = smartUserService.getById(userId); for (SmartUser user : userList) { String gzhOpenId = user.getGzhOpenId(); if (ObjectUtils.isNotEmpty(gzhOpenId)) { String pushType = ""; if (deviceName.contains("进校")) { pushType = "进入大门"; } else if (deviceName.contains("出校")) { pushType = "离开大门"; } // 时间格式是 yyyy-MM-dd HH:mm:ss,当前时间格式有问题 LocalDateTime date = LocalDateTime.now(); String format = date.format(dateTimeFormatter1); // 公众号信息推送 Message2.send(gzhOpenId, pushType, deviceArea, format); SmartNotification smartNotification = new SmartNotification(); smartNotification.setUserId(smartUser.getId()); smartNotification.setUserName(smartUser.getName()); smartNotification.setTypeName(pushType); smartNotification.setLocation(deviceArea); smartNotification.setImage(recordPhoto); smartNotification.setDateTime(recordAddtime); smartNotification.setType(2); smartNotificationService.save(smartNotification); } } } } } else { smartFaceDiscern.setUserId(0); // 判断是否已经添加 LambdaQueryWrapper wrapperFD = new LambdaQueryWrapper<>(); wrapperFD.eq(SmartFaceDiscern::getDateTime, recordAddtime) .eq(SmartFaceDiscern::getName, student_name) .eq(SmartFaceDiscern::getType, deviceName); List list = this.list(wrapperFD); if (ObjectUtils.isEmpty(list) && list.size() == 0) { this.save(smartFaceDiscern); } } } } } } @Override public List track(String stateTime, String endTime, Integer id) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.between(SmartFaceDiscern::getDateTime, stateTime, endTime) .eq(SmartFaceDiscern::getUserId, id) .orderByDesc(SmartFaceDiscern::getDateTime); List list = this.list(wrapper); return list; } }