134 lines
6.4 KiB
Java

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<Project> projectList = projectService.list(Wrappers.<Project>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<Project> tokenProjectList = projectList.stream().filter(project -> CharSequenceUtil.isNotBlank(project.getRundeToken())).collect(Collectors.toList());
Set<String> snSet = tokenProjectList.stream().map(Project::getProjectSn).collect(Collectors.toSet());
if (snSet.isEmpty()) {
return;
}
Thread.sleep(tokenProjectList.size() * 1000L);
List<RundeGroup> existGroupList = rundeGroupService.list(Wrappers.<RundeGroup>lambdaQuery().in(RundeGroup::getProjectsn, snSet));
Map<String, RundeGroup> gIdGroupMap = existGroupList.stream().collect(Collectors.toMap(RundeGroup::getGId, Function.identity()));
Map<String, String> rundeUserMap = rundeClient.getRundeUserMap();
List<RundeGroup> addRundeGroups = new LinkedList<>();
List<RundeGroup> 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<String> projectSns = hiddenDangerInspectRecordMapper.getGroupByProjectSn();
List<HiddenDangerInspectionStatistics> 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<HiddenDangerInspectionStatistics>()
.eq(HiddenDangerInspectionStatistics::getProjectSn, projectSn)
.eq(HiddenDangerInspectionStatistics::getCreateTime, DateUtil.formatDate(createTime)));
}
hiddenDangerInspectionStatisticsService.saveBatch(list);
}
}