package com.zhgd.xmgl.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.CharSequenceUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zhgd.xmgl.config.RundeWSClient; import com.zhgd.xmgl.modules.dangerous.entity.HiddenDangerInspectionStatistics; import com.zhgd.xmgl.modules.dangerous.mapper.HiddenDangerInspectRecordMapper; import com.zhgd.xmgl.modules.dangerous.service.IHiddenDangerInspectionStatisticsService; import com.zhgd.xmgl.modules.helmet.entity.RundeGroup; import com.zhgd.xmgl.modules.helmet.service.RundeGroupService; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.service.IProjectService; import com.zhgd.xmgl.util.RundeSafeyHatUtils; import lombok.extern.slf4j.Slf4j; import net.javacrumbs.shedlock.core.SchedulerLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.websocket.WebSocketContainer; import java.net.URI; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * @author 邱平毅 * @ClassName RundeTask * @date 2022/10/24 13:44 * @Version 1.0 */ @Slf4j @Component public class RundeTask { @Autowired IProjectService projectService; @Autowired WebSocketContainer webSocketContainer; @Autowired RundeWSClient rundeClient; @Autowired RundeGroupService rundeGroupService; @Autowired HiddenDangerInspectRecordMapper hiddenDangerInspectRecordMapper; @Autowired IHiddenDangerInspectionStatisticsService hiddenDangerInspectionStatisticsService; /** * 获取安全帽最新数量 */ @SchedulerLock(name = "getHelmet", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 7) @Scheduled(cron = "0 0/15 * * * ?") public void getHelmet() { try { List projectList = projectService.list(Wrappers.lambdaQuery().isNotNull(Project::getHelmetUser)); if (CollUtil.isNotEmpty(projectList)) { webSocketContainer.connectToServer(rundeClient, new URI("wss://caps.runde.pro/wss")); for (Project project : projectList) { JSONObject token = RundeSafeyHatUtils.getToken(project.getHelmetUser(), project.getHelmetPassword()); if (token != null && CharSequenceUtil.isNotBlank(token.getString("session_id"))) { String sessionId = token.getString("session_id"); project.setRundeToken(sessionId); rundeClient.send("{\"act\":\"ma_login\",\"user_name\":\"" + project.getHelmetUser() + "\",\"access_token\":\"" + sessionId + "\"}"); } } } List tokenProjectList = projectList.stream().filter(project -> CharSequenceUtil.isNotBlank(project.getRundeToken())).collect(Collectors.toList()); Set snSet = tokenProjectList.stream().map(Project::getProjectSn).collect(Collectors.toSet()); if (snSet.isEmpty()) { return; } Thread.sleep(tokenProjectList.size() * 1000L); List existGroupList = rundeGroupService.list(Wrappers.lambdaQuery().in(RundeGroup::getProjectsn, snSet)); Map gIdGroupMap = existGroupList.stream().collect(Collectors.toMap(RundeGroup::getGId, Function.identity())); Map rundeUserMap = rundeClient.getRundeUserMap(); List addRundeGroups = new LinkedList<>(); List updateRundeGroups = new LinkedList<>(); for (Project project : tokenProjectList) { JSONArray groupList = RundeSafeyHatUtils.getGroupList(rundeUserMap.get(project.getHelmetUser()), project.getRundeToken()); for (int i = 0; i < groupList.size(); i++) { JSONObject group = groupList.getJSONObject(i); String gId = group.getString("g_id"); if (gIdGroupMap.containsKey(gId)) { RundeGroup originalGroup = gIdGroupMap.get(gId); updateRundeGroups.add(new RundeGroup(originalGroup.getId(), project.getProjectSn(), gId, group.getString("g_name"), group.getString("admin_name"), group.getString("admin_id"), group.getInteger("num"), group.getInteger("mine"), group.getInteger("online"))); } else { addRundeGroups.add(new RundeGroup(null, project.getProjectSn(), gId, group.getString("g_name"), group.getString("admin_name"), group.getString("admin_id"), group.getInteger("num"), group.getInteger("mine"), group.getInteger("online"))); } } } rundeGroupService.saveBatch(addRundeGroups); rundeGroupService.updateBatchById(updateRundeGroups); } catch (Exception e) { log.error(String.valueOf(e)); } } /** * 按状态统计每天的隐患数量 */ @Scheduled(cron = "0 0 0 * * ?") public void hiddenDangerStatistics() { DateTime createTime = DateUtil.offsetDay(new Date(), -1); DateTime startTime = DateUtil.beginOfDay(createTime); DateTime endTime = DateUtil.endOfDay(createTime); List projectSns = hiddenDangerInspectRecordMapper.getGroupByProjectSn(); List list = new ArrayList<>(); for (String projectSn : projectSns) { HiddenDangerInspectionStatistics statistics = hiddenDangerInspectRecordMapper.statisticsByStatue(startTime, endTime, projectSn); statistics.setProjectSn(projectSn); statistics.setCreateTime(createTime); list.add(statistics); //删除原来 hiddenDangerInspectionStatisticsService.remove(new LambdaQueryWrapper() .eq(HiddenDangerInspectionStatistics::getProjectSn, projectSn) .eq(HiddenDangerInspectionStatistics::getCreateTime, DateUtil.formatDate(createTime))); } hiddenDangerInspectionStatisticsService.saveBatch(list); } }