package com.xjrsoft.module.hikvision.controller; import cn.hutool.db.Db; import com.alibaba.fastjson.JSONObject; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.xjrsoft.common.constant.GlobalConstant; import com.xjrsoft.common.model.result.RT; import com.xjrsoft.common.utils.DatasourceUtil; import com.xjrsoft.config.HikvisionConfig; import com.xjrsoft.module.base.entity.BaseClass; import com.xjrsoft.module.base.service.IBaseClassService; import com.xjrsoft.module.concat.service.IXjrUserService; import com.xjrsoft.module.hikvision.util.ApiUtil; import com.xjrsoft.module.hikvision.util.OutInRecordUtil; import com.xjrsoft.module.organization.dto.WeChatSendMessageDto; import com.xjrsoft.module.organization.entity.UserStudent; import com.xjrsoft.module.organization.service.IWeChatService; import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll; import com.xjrsoft.module.teacher.entity.XjrUser; import com.xjrsoft.module.teacher.mapper.FaceImportMapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.sql.DataSource; import java.sql.SQLException; import java.text.ParseException; import java.util.List; import java.util.Objects; @RestController @RequestMapping("/event") @Api(value = "/event", tags = "订阅事件接收") @AllArgsConstructor @Slf4j public class EventController { private final OutInRecordUtil outInRecordUtil = new OutInRecordUtil(); DataSource datasource = DatasourceUtil.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY); private final Db use = Db.use(datasource); private final FaceImportMapper faceImportMapper; private final HikvisionConfig hikvisionConfig; private final IBaseClassService classService; private final IWeChatService weChatService; private final IXjrUserService xjrUserService; @PostMapping("/receiveCar") @ApiOperation(value = "接收车辆事件") public ResponseEntity receiveCarEvent(@RequestBody(required = false) String eventData) { log.info("Received event data: {}", eventData); new Thread(() -> { try { outInRecordUtil.GetVehicleRecordTest(use, faceImportMapper, eventData); } catch (SQLException | ParseException e) { log.error("Error processing event data", e); } }).start(); // 立即返回HTTP 200 OK响应 return ResponseEntity.ok().build(); } @PostMapping("/receivePeople") @ApiOperation(value = "接收人员事件") public ResponseEntity receivePeopleEvent(@RequestBody(required = false) String eventData) { log.info("Received event data: {}", eventData); new Thread(() -> { try { JsonObject data = new JsonParser().parse(eventData).getAsJsonObject(); outInRecordUtil.GetTeacherAndStudentRecordsTest(use, faceImportMapper, data); JsonObject paramsObject = data.getAsJsonObject("params"); JsonArray eventsArray = paramsObject.getAsJsonArray("events"); for (JsonElement eventElement : eventsArray) { JsonObject eventObject = eventElement.getAsJsonObject(); JsonObject dataObject = eventObject.getAsJsonObject("data"); String idNum = null; if (dataObject.has("ExtEventPersonNo")) { idNum = dataObject.get("ExtEventPersonNo").getAsString(); } String happenTime = eventObject.get("happenTime").getAsString(); String recordTimeStr = outInRecordUtil.ChangeTime(happenTime); int status = eventObject.get("status").getAsInt(); if (idNum == null) continue; if (!Objects.equals(faceImportMapper.IsStudentTypeByPersonId(Long.valueOf(idNum)), "学生")) { continue; } List userList = xjrUserService.list( new MPJLambdaWrapper() .select(XjrUser::getId) .leftJoin(UserStudent.class, UserStudent::getUserId, XjrUser::getId) .eq(UserStudent::getStudentId, idNum) ); for (XjrUser member : userList) { XjrUser student = xjrUserService.getById(idNum); BaseClass baseClass = classService.getOne( new MPJLambdaWrapper() .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getClassId, BaseClass::getId) .eq(BaseStudentSchoolRoll::getUserId, student.getId()) ); WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto(); weChatSendMessageDto.setUserId(member.getOpenId()); weChatSendMessageDto.setTemplateId("ERkMebHjsziZO6WBrlzsbENiEuRR4vrlhJw5LR4aDr8"); weChatSendMessageDto.setMsgId(member.getId().toString()); JSONObject paramJson = new JSONObject(); paramJson.put("thing1", student.getName()); paramJson.put("time3", recordTimeStr); paramJson.put("thing2", baseClass.getName()); if(status == 1){ paramJson.put("const4", "进校"); }else{ paramJson.put("const4", "出校"); } weChatSendMessageDto.setContent(paramJson); weChatService.sendTemplateMessage(weChatSendMessageDto); } } } catch (SQLException | ParseException e) { log.error("Error processing event data", e); } }).start(); return ResponseEntity.ok().build(); } @PostMapping("/subscribe") @ApiOperation(value = "订阅事件") public RT subscribeEvent() { ApiUtil apiUtil = new ApiUtil(); JsonArray eventList = new JsonArray(); String apiPath = "/api/eventService/v1/eventSubscriptionByEventTypes"; JsonObject paramJson = new JsonObject(); //*******手动更改**************************************************** // eventList.add(196893); //人脸匹配成功 // eventList.add(197151); //人脸匹配失败 eventList.add(771760130); //车辆入场压线事件 eventList.add(771760133); //车辆出场压线事件 paramJson.addProperty("eventDest", hikvisionConfig.getCarUrl()); //要修改第二个参数 //****************************************************************** paramJson.add("eventTypes", eventList); String response = apiUtil.doPost(apiPath, paramJson.toString(), null); log.info("Subscribe response: {}", response); return RT.ok(true); } @PostMapping("/query") @ApiOperation(value = "查询已订阅事件") public String queryEvent() { ApiUtil apiUtil = new ApiUtil(); String apiPath = "/api/eventService/v1/eventSubscriptionView"; String response = apiUtil.doPost(apiPath, null, null); System.out.println("output: " + response); // Gson gson = new GsonBuilder().setPrettyPrinting().create(); // // JsonElement jsonElement = JsonParser.parseString(response); // // String prettyJson = gson.toJson(jsonElement); return response; } @PostMapping("/cancel") @ApiOperation(value = "取消已订阅事件") public String cancelEvent() { ApiUtil apiUtil = new ApiUtil(); JsonArray eventList = new JsonArray(); //*******手动更改**************************************************** eventList.add(196893); // eventList.add(771760131); //正常过车 // eventList.add(771760134); //****************************************************************** JsonObject paramJson = new JsonObject(); paramJson.add("eventTypes", eventList); String apiPath = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; String response = apiUtil.doPost(apiPath, paramJson.toString(), null); System.out.println("output: " + response); return response; } }