package com.zhgd.xmgl.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpStatus; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zhgd.xmgl.async.AsyncCommon; import com.zhgd.xmgl.modules.basicdata.entity.CompanyConfig; import com.zhgd.xmgl.modules.basicdata.mapper.CompanyConfigMapper; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.entity.ProjectJqmDev; import com.zhgd.xmgl.modules.project.service.IProjectService; import com.zhgd.xmgl.modules.project.service.ProjectJqmDevService; import com.zhgd.xmgl.util.JinqianmaoUtil; import lombok.extern.slf4j.Slf4j; import net.javacrumbs.shedlock.core.SchedulerLock; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; /** * @author 邱平毅 * @ClassName JinqianmaoTask * @date 2022/8/17 13:48 * @Version 1.0 * 金钱猫定时任务 */ @Slf4j @Component @Transactional(rollbackFor = Exception.class) public class JinqianmaoTask { @Autowired IProjectService projectService; @Autowired ProjectJqmDevService projectJqmDevService; @Resource CompanyConfigMapper companyConfigMapper; @Value("${serverUrl}") String serverUrl; @Autowired AsyncCommon asyncCommon; /** * 获取金钱猫设备 每天七点执行 */ @SchedulerLock(name = "JQMDevTask", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5) @Scheduled(cron = "0 0 7 * * ?") public void JQMDevTask() { getProjectNameNumberMap(); saveJqmDev(); } /** * 设置回调地址 每月一号零时十分执行 */ @SchedulerLock(name = "setCallBack", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5) @Scheduled(cron = "0 10 0 1 * ?") @PostConstruct public void setCallBack() { List companyConfigs = companyConfigMapper.selectList(new QueryWrapper<>()); for (CompanyConfig companyConfig:companyConfigs){ if (StringUtils.isBlank(companyConfig.getUrl())) { return; } JSONObject jsonInfo = new JSONObject(); jsonInfo.put("URL", serverUrl + "/api/main/alarm"); HttpResponse httpResponse = HttpRequest.post(getUrl("setCallBack/alarm",companyConfig.getUrl(),companyConfig.getAk(),companyConfig.getSecret())) .body(jsonInfo.toJSONString()) .timeout(5 * 60 * 1000) .execute(); log.info("请求第三方接口setCallBack响应体:{}", httpResponse); if (!(httpResponse.getStatus() == HttpStatus.HTTP_OK && httpResponse.body() != null)) { log.error("设置金钱猫项目回调地址失败!设置为:{}失败!", serverUrl); } } } public void getProjectNameNumberMap() { List companyConfigs = companyConfigMapper.selectList(new QueryWrapper<>()); for (CompanyConfig companyConfig : companyConfigs) { JSONObject jsonInfo = new JSONObject(); jsonInfo.put("StartIndex", 0); jsonInfo.put("Count", 10000); String url = getUrl("getProjectList", companyConfig.getUrl(), companyConfig.getAk(), companyConfig.getSecret()); String body = jsonInfo.toJSONString(); log.info("getProjectNameNumberMap()调用http:getProjectList,url:{},body:{}", url, body); HttpResponse httpResponse = HttpRequest.post(url).body(body).timeout(5 * 60 * 1000).execute(); log.info("请求第三方接口getProjectList响应体:{}", httpResponse); if (httpResponse.getStatus() == HttpStatus.HTTP_OK && httpResponse.body() != null) { JSONObject projectListData = JSON.parseObject(httpResponse.body()); JSONObject data = projectListData.getJSONObject("data"); if (data != null) { JSONArray projectList = data.getJSONArray("data"); if (CollUtil.isNotEmpty(projectList)) { List> nameIdList = new LinkedList<>(); for (int i = 0; i < projectList.size(); i++) { HashMap nameIdMap = new LinkedHashMap<>(2); JSONObject project = projectList.getJSONObject(i); nameIdMap.put("name", project.getString("prjName")); nameIdMap.put("id", project.getString("proId")); nameIdList.add(nameIdMap); } nameIdList.forEach(nameIdMap -> projectService.update(Wrappers.lambdaUpdate().set(Project::getProjectNumber, nameIdMap.get("id")).eq(Project::getProjectName, nameIdMap.get("name")))); log.info("getProjectNameNumberMap()的nameIdList:{}", nameIdList); } } } } } public void saveJqmDev() { List companyConfigs = companyConfigMapper.selectList(new QueryWrapper<>()); for (CompanyConfig companyConfig:companyConfigs){ List projectList = projectService.list(Wrappers.lambdaQuery().isNotNull(Project::getProjectNumber)); JSONObject jsonInfo = new JSONObject(); jsonInfo.put("StartIndex", 0); jsonInfo.put("Count", 10000); for (Project project : projectList) { String projectNumber = project.getProjectNumber(); jsonInfo.put("proId", projectNumber); String url = getUrl("getDevList", companyConfig.getUrl(), companyConfig.getAk(), companyConfig.getSecret()); String body = jsonInfo.toJSONString(); log.info("saveJqmDev()调用http:url:{};body:{}", url, body); HttpResponse httpResponse = HttpRequest.post(url).body(body).timeout(5 * 60 * 1000).execute(); log.info("请求第三方接口getDevList响应体:{}", httpResponse); if (httpResponse.getStatus() == HttpStatus.HTTP_OK && httpResponse.body() != null) { JSONObject response = JSON.parseObject(httpResponse.body()); log.info("请求第三方接口getDevList响应体Data:{}", response.getJSONObject("data")); if (response.getJSONObject("data") != null) { JSONArray devList = response.getJSONObject("data").getJSONArray("data"); log.debug("devList:{}", devList); if (CollUtil.isNotEmpty(devList)) { List projectJqmDevList = new LinkedList<>(); String date = DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN); for (int i = 0; i < devList.size(); i++) { JSONObject dev = devList.getJSONObject(i); String devId = dev.getString("devId"); String devType = dev.getString("devType"); Integer devStatus = dev.getInteger("devStatus"); String devName = dev.getString("devName"); ProjectJqmDev projectJqmDev = projectJqmDevService.getOne(Wrappers.lambdaQuery(ProjectJqmDev.class) .eq(ProjectJqmDev::getDevSn, devId).eq(ProjectJqmDev::getProjectNumber, projectNumber)); Integer curFloor = getCurFloor(projectNumber, devId, companyConfig.getUrl(), companyConfig.getAk(), companyConfig.getSecret()); if (projectJqmDev != null) { if (!Objects.equals(curFloor, projectJqmDev.getLastFloorCount())) { asyncCommon.sendMqAndApp("楼层变动通知", "设备:" + devName + "的楼层发生变动,请及时进行巡检!", "楼层变动通知", project.getProjectSn(), "/pages/projectEnd/projectIndex/projectIndex"); } LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(ProjectJqmDev.class) .eq(ProjectJqmDev::getId, projectJqmDev.getId()) .set(ProjectJqmDev::getProjectSn, project.getProjectSn()).set(ProjectJqmDev::getProjectName, project.getProjectName()) .set(ProjectJqmDev::getDevType, devType).set(ProjectJqmDev::getDevName, devName) .set(ProjectJqmDev::getDevStatus, devStatus).set(ProjectJqmDev::getLastFloorCount, curFloor == null ? 0 : curFloor) .set(ProjectJqmDev::getUpdateDate, date); projectJqmDevService.update(null, updateWrapper); } else { asyncCommon.sendMqAndApp("全景成像设备通知", "新增设备:" + devName + ",请及时进行巡检!", "全景成像设备通知", project.getProjectSn(), "/pages/projectEnd/projectIndex/projectIndex"); projectJqmDevList.add(new ProjectJqmDev(null, projectNumber, project.getProjectSn(), project.getProjectName(), devId, devName, devType, devStatus, curFloor, date, date)); } } log.debug("saveBatch:projectJqmDevList:{}", projectJqmDevList); projectJqmDevService.saveBatch(projectJqmDevList); } } else { log.error("调用第三方接口错误:{}", response); } } } } } public Integer getCurFloor(String proId, String devId , String url,String ak,String secret) { JSONObject jsonInfo = new JSONObject(); jsonInfo.put("proId", proId); jsonInfo.put("devId", devId); HttpResponse httpResponse = HttpRequest.post(getUrl("getCurFloor",url,ak,secret)) .body(jsonInfo.toJSONString()) .timeout(5 * 60 * 1000) .execute(); log.info("请求第三方接口getCurFloor响应体:{}", httpResponse); if (httpResponse.getStatus() == HttpStatus.HTTP_OK && httpResponse.body() != null) { JSONObject response = JSON.parseObject(httpResponse.body()); JSONObject data = response.getJSONObject("data"); if (data != null) { return data.getInteger("FloorNum"); } } return null; } private String getUrl(String mappingUrl , String URL, String AK , String Secret) { StringBuilder url = new StringBuilder(); url.append(URL); url.append("/api/main/"); url.append(mappingUrl); url.append("?"); url.append("ak"); url.append("="); url.append(AK); url.append("&"); url.append("ts"); url.append("="); long currentTimeMillis = System.currentTimeMillis(); url.append(currentTimeMillis); url.append("&"); url.append("token"); url.append("="); url.append(JinqianmaoUtil.getTokenUrl(currentTimeMillis,AK,Secret)); //根据链接获取到项目信息 return url.toString(); } }