|
@@ -0,0 +1,284 @@
|
|
|
+package com.sooka.sponest.monitor.dahua.controller;
|
|
|
+
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.ruoyi.common.core.domain.R;
|
|
|
+import com.sooka.sponest.monitor.dahua.domain.CenternonitorTDahuaOperateLog;
|
|
|
+import com.sooka.sponest.monitor.dahua.domain.CenternonitorTDahuaOperateLogUrl;
|
|
|
+import com.sooka.sponest.monitor.dahua.mapper.CenternonitorTDahuaOperateLogUrlMapper;
|
|
|
+import com.sooka.sponest.monitor.dahua.service.ICenternonitorTDahuaOperateLogService;
|
|
|
+import com.sooka.sponest.monitor.dahua.utils.HttpTestUtils;
|
|
|
+import com.sooka.sponest.monitor.dept.domain.SysDept;
|
|
|
+import com.sooka.sponest.monitor.dept.service.ISysDeptService;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.commons.lang3.ObjectUtils;
|
|
|
+import org.apache.http.HttpEntity;
|
|
|
+import org.apache.http.HttpResponse;
|
|
|
+import org.apache.http.client.HttpClient;
|
|
|
+import org.apache.http.client.methods.HttpPost;
|
|
|
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
|
|
|
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
|
|
|
+import org.apache.http.entity.ContentType;
|
|
|
+import org.apache.http.entity.StringEntity;
|
|
|
+import org.apache.http.impl.client.HttpClients;
|
|
|
+import org.apache.http.impl.client.LaxRedirectStrategy;
|
|
|
+import org.apache.http.ssl.SSLContextBuilder;
|
|
|
+import org.apache.http.util.EntityUtils;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import javax.net.ssl.HostnameVerifier;
|
|
|
+import javax.net.ssl.SSLContext;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+import static org.springframework.web.bind.annotation.RequestMethod.POST;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 对接大华云台日志定时任务Controller
|
|
|
+ * <p>
|
|
|
+ * "0": "登录",
|
|
|
+ * "1": "查询",
|
|
|
+ * "2": "新增",
|
|
|
+ * "3": "修改",
|
|
|
+ * "4": "删除",
|
|
|
+ * "5": "布控",
|
|
|
+ * "6": "撤控",
|
|
|
+ * "7": "控制",
|
|
|
+ * "8": "注销",
|
|
|
+ * "9": "审核",
|
|
|
+ * "10": "导入",
|
|
|
+ * "11": "导出",
|
|
|
+ * "14": "录像回放",
|
|
|
+ * "15": "录像下载",
|
|
|
+ * "16": "录像查询",
|
|
|
+ * "17": "本地录像",
|
|
|
+ * "18": "语音对讲",
|
|
|
+ * "19": "锁定录像",
|
|
|
+ * "20": "解锁录像",
|
|
|
+ * "21": "下载",
|
|
|
+ * "22": "远程录像",
|
|
|
+ * "90": "开启",
|
|
|
+ * "91": "停止",
|
|
|
+ * "92": "查看",
|
|
|
+ * "93": "处理",
|
|
|
+ * "94": "锁定",
|
|
|
+ * "95": "解锁",
|
|
|
+ * "96": "暂停",
|
|
|
+ * "97": "分享"
|
|
|
+ *
|
|
|
+ * @author ruoyi
|
|
|
+ * @date 2023-12-09
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+@RestController
|
|
|
+@RequestMapping("/dahuaBlackOperateLog")
|
|
|
+public class DahuaOperateLogBlackTask {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private ICenternonitorTDahuaOperateLogService centernonitorTDahuaOperateLogService;
|
|
|
+ @Resource
|
|
|
+ private CenternonitorTDahuaOperateLogUrlMapper centernonitorTDahuaOperateLogUrlMapper;
|
|
|
+ @Resource
|
|
|
+ private ISysDeptService sysDeptService;
|
|
|
+ private final List<String> operateTypeBlackList = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "14", "15", "16", "17", "18", "19", "20", "21", "22", "90", "91", "92", "93", "94", "95", "96", "97");
|
|
|
+
|
|
|
+
|
|
|
+ @Value("${sooka.dahua_interface_server.loginIp}")
|
|
|
+ private String loginIp;
|
|
|
+ @Value("${sooka.dahua_interface_server.loginPort}")
|
|
|
+ private String loginPort;
|
|
|
+ @Value("${sooka.dahua_interface_server.userName}")
|
|
|
+ private String userName;
|
|
|
+ @Value("${sooka.dahua_interface_server.userPwd}")
|
|
|
+ private String userPwd;
|
|
|
+ private final String url = "/SlsService/opreationlog/list";
|
|
|
+// private String loginIp = "10.53.0.35";
|
|
|
+// private String loginPort = "7901";
|
|
|
+// private String userName = "system";
|
|
|
+// private String userPwd = "Admin123";
|
|
|
+
|
|
|
+ @RequestMapping(value = "/configureBlackTasks", method = POST)
|
|
|
+ public void configureBlackTasks() {
|
|
|
+ long startTimeMillis = System.currentTimeMillis(); // 记录开始时间
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ Date now = new Date();
|
|
|
+ //设置入参开始时间
|
|
|
+ calendar.setTime(now);
|
|
|
+ // 获取当前时间前一天的日期
|
|
|
+ calendar.add(Calendar.DAY_OF_MONTH, -1);
|
|
|
+ // 设置时间为16:00:00
|
|
|
+ calendar.set(Calendar.HOUR_OF_DAY, 16);
|
|
|
+ calendar.set(Calendar.MINUTE, 0);
|
|
|
+ calendar.set(Calendar.SECOND, 0);
|
|
|
+ Date startTime = calendar.getTime();
|
|
|
+ //获取当前时间的15:59:59
|
|
|
+ calendar.setTime(now);
|
|
|
+ calendar.set(Calendar.HOUR_OF_DAY, 15);
|
|
|
+ calendar.set(Calendar.MINUTE, 59);
|
|
|
+ calendar.set(Calendar.SECOND, 59);
|
|
|
+ Date endTime = calendar.getTime();
|
|
|
+
|
|
|
+ try {
|
|
|
+ R<?> result = HttpTestUtils.getToken(loginIp, Integer.parseInt(loginPort), userName, userPwd);
|
|
|
+ if (result.getCode() != 200) {
|
|
|
+ log.error("调用获取token接口报错:{}", result);
|
|
|
+ }
|
|
|
+ String token = result.getData().toString();
|
|
|
+ log.error("获取token:{}", token);
|
|
|
+ extractedBlack(token, sdf.format(startTime), sdf.format(endTime));
|
|
|
+ long endTimeMillis = System.currentTimeMillis(); // 记录结束时间
|
|
|
+ // 计算耗时
|
|
|
+ long duration = endTimeMillis - startTimeMillis;
|
|
|
+ log.info("configureBlackTasks调用获取对接大华云台日志定时任务接口耗时:{} 毫秒", duration);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("configureBlackTasks background error:", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void extractedBlack(String token, String startTime, String endTime) throws Exception {
|
|
|
+ //取消证书认证
|
|
|
+ SSLContext sslContext = SSLContextBuilder.create()
|
|
|
+ .loadTrustMaterial(new TrustSelfSignedStrategy())
|
|
|
+ .build();
|
|
|
+ HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
|
|
|
+ HttpClient httpClient = HttpClients.custom()
|
|
|
+ .setSSLContext(sslContext)
|
|
|
+ .setSSLHostnameVerifier(hostnameVerifier)
|
|
|
+ .setRedirectStrategy(new LaxRedirectStrategy())
|
|
|
+ .build();
|
|
|
+ log.info("调用操作日志查询接口开始");
|
|
|
+ long startTimeDate = System.currentTimeMillis();
|
|
|
+ log.info("开始时间:{}", startTimeDate);
|
|
|
+ //3.调用操作日志查询接口
|
|
|
+ String proto = loginPort.equals("8320") ? "https://" : "http://";
|
|
|
+ HttpPost httpPost = new HttpPost(proto + loginIp + ":" + loginPort + url);
|
|
|
+ httpPost.setHeader("X-Subject-Token", token);
|
|
|
+ httpPost.setHeader("content-type", "application/json");
|
|
|
+
|
|
|
+ for (String str : operateTypeBlackList) {
|
|
|
+ extracted(startTime, endTime, str, httpPost, httpClient);
|
|
|
+ }
|
|
|
+ log.info("调用操作日志查询接口结束");
|
|
|
+ log.info("结束时间:{}", System.currentTimeMillis() - startTimeDate);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void extracted(String startTime, String endTime, String str, HttpPost httpPost, HttpClient httpClient) throws Exception {
|
|
|
+ //第三次请求入参入参
|
|
|
+ Integer pageNo = 1;
|
|
|
+ Integer nextPage = 1;
|
|
|
+ for (int i = 1; i <= pageNo; i++) {
|
|
|
+ if (nextPage > 0) {
|
|
|
+ //循环赋值第几页
|
|
|
+ String requestBody = "{\n" +
|
|
|
+ "\t\"condition\": {\n" +
|
|
|
+ "\t\t\"startTime\": \"" + startTime + "\",\n" +
|
|
|
+ "\t\t\"endTime\": \"" + endTime + "\",\n" +
|
|
|
+ "\t\t\"type\": 2,\n" +
|
|
|
+ "\t\t\"operateNames\": [],\n" +
|
|
|
+ "\t\t\"operateType\": \"" + str + "\",\n" +
|
|
|
+ "\t\t\"deptCode\": \"\",\n" +
|
|
|
+ "\t\t\"userName\": \"\",\n" +
|
|
|
+ "\t\t\"address\": \"\",\n" +
|
|
|
+ "\t\t\"eventDetail\": \"\"\n" +
|
|
|
+ "\t},\n" +
|
|
|
+ "\t\"order\": [\n" +
|
|
|
+ "\t\t{\n" +
|
|
|
+ "\t\t\t\"orderBy\": \"operateTime\",\n" +
|
|
|
+ "\t\t\t\"order\": \"desc\"\n" +
|
|
|
+ "\t\t}\n" +
|
|
|
+ "\t],\n" +
|
|
|
+ "\t\"page\": \"" + i + "\",\n" +
|
|
|
+ "\t\"pageSize\": 512\n" +
|
|
|
+ "}";
|
|
|
+ log.info("请求参数operateType:{}", str);
|
|
|
+ StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
|
|
|
+ httpPost.setEntity(requestEntity);
|
|
|
+ HttpResponse response = httpClient.execute(httpPost);
|
|
|
+ HttpEntity responseEntity = response.getEntity();
|
|
|
+ if (responseEntity != null) {
|
|
|
+ List<CenternonitorTDahuaOperateLogUrl> centernonitorTDahuaOperateLogUrlList = new ArrayList<>();
|
|
|
+ String responseBody = EntityUtils.toString(responseEntity);
|
|
|
+// log.info("configureBlackTasks=======>responseBody:{}", responseBody);
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(responseBody);
|
|
|
+ log.info("configureBlackTasks=======>jsonObject.totalCount():{}", jsonObject.get("totalCount"));
|
|
|
+ if (ObjectUtils.isNotEmpty(jsonObject.get("code")) && jsonObject.get("code").toString().equals("402")) {
|
|
|
+ //如果token过期重新走业务逻辑
|
|
|
+ getTokenBlack();
|
|
|
+ } else {
|
|
|
+ pageNo = (Integer) jsonObject.get("totalCount") / 512 + 1;
|
|
|
+ nextPage = (Integer) jsonObject.get("nextPage");
|
|
|
+ List<CenternonitorTDahuaOperateLog> list = JSONObject.parseArray(jsonObject.get("results").toString(), CenternonitorTDahuaOperateLog.class);
|
|
|
+ if (CollectionUtils.isNotEmpty(list)) {
|
|
|
+ for (CenternonitorTDahuaOperateLog item : list) {
|
|
|
+ SysDept selectDo = new SysDept();
|
|
|
+ selectDo.setUserName(item.getUserName());
|
|
|
+ SysDept sysDept = sysDeptService.findDeptIdByUserName(selectDo);
|
|
|
+ if (ObjectUtils.isNotEmpty(sysDept)) {
|
|
|
+ item.setDeptId(sysDept.getDeptId());
|
|
|
+ item.setDeptName(sysDept.getDeptName());
|
|
|
+ item.setAncestors(sysDept.getAncestors());
|
|
|
+ item.setParentId(sysDept.getParentId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ int count = centernonitorTDahuaOperateLogService.insertBatch(list);
|
|
|
+ list.stream().forEach(item -> {
|
|
|
+ if (CollectionUtils.isNotEmpty(item.getUrl())) {
|
|
|
+ item.getUrl().stream().forEach(var -> {
|
|
|
+ CenternonitorTDahuaOperateLogUrl centernonitorTDahuaOperateLogUrl = new CenternonitorTDahuaOperateLogUrl();
|
|
|
+ centernonitorTDahuaOperateLogUrl.setOperateId(item.getId());
|
|
|
+ centernonitorTDahuaOperateLogUrl.setUrl(var);
|
|
|
+ centernonitorTDahuaOperateLogUrlList.add(centernonitorTDahuaOperateLogUrl);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (CollectionUtils.isNotEmpty(centernonitorTDahuaOperateLogUrlList)) {
|
|
|
+ centernonitorTDahuaOperateLogUrlMapper.insertBatch(centernonitorTDahuaOperateLogUrlList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public R<?> getTokenBlack() {
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ Date now = new Date();
|
|
|
+ //设置入参开始时间
|
|
|
+ calendar.setTime(now);
|
|
|
+ // 获取当前时间前一天的日期
|
|
|
+ calendar.add(Calendar.DAY_OF_MONTH, -1);
|
|
|
+ // 设置时间为16:00:00
|
|
|
+ calendar.set(Calendar.HOUR_OF_DAY, 16);
|
|
|
+ calendar.set(Calendar.MINUTE, 0);
|
|
|
+ calendar.set(Calendar.SECOND, 0);
|
|
|
+ Date startTime = calendar.getTime();
|
|
|
+ //获取当前时间的15:59:59
|
|
|
+ calendar.setTime(now);
|
|
|
+ calendar.set(Calendar.HOUR_OF_DAY, 15);
|
|
|
+ calendar.set(Calendar.MINUTE, 59);
|
|
|
+ calendar.set(Calendar.SECOND, 59);
|
|
|
+ Date endTime = calendar.getTime();
|
|
|
+ try {
|
|
|
+ R<?> result = HttpTestUtils.getToken(loginIp, Integer.parseInt(loginPort), userName, userPwd);
|
|
|
+ if (result.getCode() != 200) {
|
|
|
+ return R.fail(result.getMsg());
|
|
|
+ }
|
|
|
+ String token = result.getData().toString();
|
|
|
+ extractedBlack(token, sdf.format(startTime), sdf.format(endTime));
|
|
|
+ return R.ok();
|
|
|
+ } catch (Exception e) {
|
|
|
+ return R.fail("调用操作日志接口报错");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|