优选多个提交

This commit is contained in:
guoshengxiong 2025-11-03 10:34:58 +08:00
parent 5ce08baa5e
commit 06762a6e8a
10 changed files with 140 additions and 20 deletions

View File

@ -47,8 +47,8 @@ public class RedisConfig {
//.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new RedisObjectSerializer()));
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()))
//.entryTtl(Duration.ofMinutes(30L))
.entryTtl(Duration.ofHours(1))
.disableCachingNullValues();
.entryTtl(Duration.ofHours(1));
// .disableCachingNullValues();
// 初始化RedisCacheManager
RedisCacheManager redisCacheManager = new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
return redisCacheManager;

View File

@ -6,8 +6,10 @@ import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zhgd.jeecg.common.execption.OpenAlertException;
import com.zhgd.jeecg.common.util.pass.HttpUtils;
import com.zhgd.redis.lock.RedisRepository;
import com.zhgd.xmgl.call.api.PoliceCameraManufacturer;
import com.zhgd.xmgl.call.util.Mcs8Util;
import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraItem;
@ -22,6 +24,7 @@ import com.zhgd.xmgl.modules.policecamera.service.IPoliceCameraItemService;
import com.zhgd.xmgl.modules.policecamera.service.IWorkTicketHistoryService;
import com.zhgd.xmgl.util.PathUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
@ -53,6 +56,9 @@ public class Mcs8Call implements PoliceCameraManufacturer {
private IWorkTicketHistoryService workTicketHistoryService;
@Value("${mcs8.download.http.type:pubUrl}")
private String downloadType;
@Lazy
@Autowired
private RedisRepository redisRepository;
public void setConfig(ProjectPoliceCameraConfig config) {
this.config = config;
@ -92,7 +98,6 @@ public class Mcs8Call implements PoliceCameraManufacturer {
}
}
@Override
public void pullFile(Date begin, Date end) {
Map<String, PoliceCameraItem> cameraItemMap = policeCameraItemService.list(null).stream().collect(Collectors.toMap(PoliceCameraItem::getDevSn, Function.identity(), (o1, o2) -> o1));
@ -103,7 +108,9 @@ public class Mcs8Call implements PoliceCameraManufacturer {
JSONObject jsonObject = Mcs8Util.getRecordFileList(config, page, pageSize, begin, end, true);
bos = BeanUtil.copyToList(jsonObject.getJSONArray("data"), Mcs8FileBo.class);
for (Mcs8FileBo bo : bos) {
downloadFileAndSave(bo, cameraItemMap);
if (!Objects.equals(bo.getFType(),3)) {
downloadFileAndSave(bo, cameraItemMap);
}
}
page++;
} while (CollUtil.isNotEmpty(bos) && bos.size() == pageSize);
@ -163,34 +170,103 @@ public class Mcs8Call implements PoliceCameraManufacturer {
return pubUrl;
}
@Override
public void updateStatus() {
public void updateStatus(Long cacheSeconds) {
if (configIsBlank()) {
return;
}
List<PoliceCameraItem> itemList = policeCameraItemService.list(new LambdaQueryWrapper<PoliceCameraItem>()
.eq(PoliceCameraItem::getProjectSn, config.getProjectSn()));
List<PoliceCameraItem> itemList = policeCameraItemService.getListByProjectSn(config.getProjectSn());
Integer page = 1;
int pageSize = 1000;
JSONArray devList = new JSONArray();
JSONArray tempList = new JSONArray();
// 生成缓存key
String cacheKey = null;
if (cacheSeconds != null && cacheSeconds > 0) {
cacheKey = "mcs8:devList:full:" + Mcs8Util.getHost(config) + ":" + config.getPort() + ":" + config.getAccount() + ":" + config.getPassword();
// 尝试从缓存获取完整设备列表
try {
String cachedData = (String) redisRepository.get(cacheKey);
if (StringUtils.isNotBlank(cachedData)) {
devList = JSONArray.parseArray(cachedData);
log.debug("从缓存获取完整设备列表,数量: {}", devList.size());
// 直接使用缓存数据更新设备状态
updateDeviceStatus(itemList, devList);
return;
}
} catch (Exception e) {
log.warn("从缓存获取设备列表失败,继续从接口获取", e);
}
}
// 缓存不存在或禁用缓存从接口获取数据
do {
tempList = Mcs8Util.getDevList(config, page, pageSize, true);
devList.addAll(tempList);
page++;
} while (CollUtil.isNotEmpty(tempList) && tempList.size() == pageSize);
Map<String, JSONObject> devSnMap = devList.stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("deviceId"), o -> (JSONObject) o, (o1, o2) -> o1));
for (PoliceCameraItem item : itemList) {
JSONObject jsonObject = devSnMap.get(item.getDevSn());
if (jsonObject != null) {
item.setDeviceState(jsonObject.getInteger("status") == 1 ? 1 : 2);
} else {
item.setDeviceState(2);
// 如果启用缓存将完整设备列表存入缓存
if (cacheSeconds != null && cacheSeconds > 0 && cacheKey != null && CollUtil.isNotEmpty(devList)) {
try {
redisRepository.setExpire(cacheKey, devList.toJSONString(), cacheSeconds);
log.debug("设备列表已缓存,数量: {}, 缓存时间: {}s", devList.size(), cacheSeconds);
} catch (Exception e) {
log.warn("设备列表缓存失败", e);
}
policeCameraItemService.updateById(item);
}
// 更新设备状态
updateDeviceStatus(itemList, devList);
}
/**
* 从接口数据更新设备状态
*/
private void updateDeviceStatus(List<PoliceCameraItem> itemList, JSONArray devList) {
Map<String, JSONObject> devSnMap = devList.stream()
.collect(Collectors.toMap(
o -> ((JSONObject) o).getString("deviceId"),
o -> (JSONObject) o,
(o1, o2) -> o1
));
// 分组处理在线设备和离线设备
List<Long> onlineIds = new ArrayList<>();
List<Long> offlineIds = new ArrayList<>();
for (PoliceCameraItem item : itemList) {
JSONObject jsonObject = devSnMap.get(item.getDevSn());
Integer newState = (jsonObject != null && jsonObject.getInteger("status") == 1) ? 1 : 2;
Integer oldState = item.getDeviceState();
if (oldState == null || !oldState.equals(newState)) {
if (newState == 1) {
onlineIds.add(item.getItemId());
} else {
offlineIds.add(item.getItemId());
}
}
}
// 批量更新在线设备
if (CollUtil.isNotEmpty(onlineIds)) {
policeCameraItemService.update(new LambdaUpdateWrapper<PoliceCameraItem>()
.set(PoliceCameraItem::getDeviceState, 1)
.in(PoliceCameraItem::getItemId, onlineIds)
);
}
// 批量更新离线设备
if (CollUtil.isNotEmpty(offlineIds)) {
policeCameraItemService.update(new LambdaUpdateWrapper<PoliceCameraItem>()
.set(PoliceCameraItem::getDeviceState, 2)
.in(PoliceCameraItem::getItemId, offlineIds)
);
}
}
public boolean configIsBlank() {

View File

@ -35,6 +35,7 @@ public interface PoliceCameraManufacturer {
/**
* 更新状态
* @param cacheSeconds 缓存第三方设备在线接口时间s
*/
void updateStatus();
void updateStatus(Long cacheSeconds);
}

View File

@ -125,5 +125,9 @@ public class WorkTicket implements Serializable {
*/
@ApiModelProperty(value = "施工地点")
private java.lang.String constructionAddr;
/**
* 班组ids
*/
@ApiModelProperty(value = "班组ids")
private java.lang.String teamIds;
}

View File

@ -32,4 +32,9 @@ public class WorkTicketVo extends WorkTicket {
*/
@ApiModelProperty(value = "项目sn")
private java.lang.String typeName;
/**
* 班组名称s
*/
@ApiModelProperty(value = "班组名称s")
private java.lang.String teamNames;
}

View File

@ -100,4 +100,6 @@ public interface IPoliceCameraItemService extends IService<PoliceCameraItem> {
Map<Long, PoliceCameraItem> getItemMapByProjectSn(String projectSn);
VideoItemInfoVo getVideoItemInfo(Map<String, Object> map);
List<PoliceCameraItem> getListByProjectSn(String projectSn);
}

View File

@ -42,6 +42,8 @@ import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -130,6 +132,7 @@ public class PoliceCameraItemServiceImpl extends ServiceImpl<PoliceCameraItemMap
}
@Override
@CacheEvict(value = "policeCameraItem", key = "'listByProjectSn:' + #policeCameraItem.projectSn")
public void savePoliceCameraItem(PoliceCameraItem policeCameraItem) {
ProjectPoliceCameraConfig projectPoliceCameraConfig = projectPoliceCameraConfigMapper.selectById(policeCameraItem.getConfigId());
if (projectPoliceCameraConfig == null || projectPoliceCameraConfig.getIsEnable() == null || projectPoliceCameraConfig.getIsEnable() == 0) {
@ -164,6 +167,7 @@ public class PoliceCameraItemServiceImpl extends ServiceImpl<PoliceCameraItemMap
}
@Override
@CacheEvict(value = "policeCameraItem", key = "'listByProjectSn:' + #policeCameraItem.projectSn")
public void updatePoliceCameraItem(PoliceCameraItem policeCameraItem) {
ProjectPoliceCameraConfig projectPoliceCameraConfig = projectPoliceCameraConfigMapper.selectById(policeCameraItem.getConfigId());
if (Objects.equals(projectPoliceCameraConfig.getFactoryType(), ProjectPoliceCameraConfigVideoTypeEnum.ISC.getValue())) {
@ -197,6 +201,7 @@ public class PoliceCameraItemServiceImpl extends ServiceImpl<PoliceCameraItemMap
}
@Override
@CacheEvict(value = "policeCameraItem", allEntries = true)
public void deletePoliceCameraItem(String itemId) {
PoliceCameraItem policeCameraItem = policeCameraItemMapper.selectById(itemId);
if (policeCameraItem == null) {
@ -338,5 +343,11 @@ public class PoliceCameraItemServiceImpl extends ServiceImpl<PoliceCameraItemMap
return vo;
}
@Override
@Cacheable(value = "policeCameraItem", key = "'listByProjectSn:' + #projectSn")
public List<PoliceCameraItem> getListByProjectSn(String projectSn) {
return this.list(new LambdaQueryWrapper<PoliceCameraItem>()
.eq(PoliceCameraItem::getProjectSn, projectSn));
}
}

View File

@ -9,6 +9,8 @@ import com.zhgd.xmgl.modules.policecamera.mapper.ProjectPoliceCameraConfigMapper
import com.zhgd.xmgl.modules.policecamera.service.IProjectPoliceCameraConfigService;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -31,6 +33,7 @@ public class ProjectPoliceCameraConfigServiceImpl extends ServiceImpl<ProjectPol
@Override
@Cacheable(value = "policeCamera", key = "'useConfig:' + #map['projectSn']")
public ProjectPoliceCameraConfig getUseProjectPoliceCameraConfig(Map<String, Object> map) {
QueryWrapper<ProjectPoliceCameraConfig> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(ProjectPoliceCameraConfig::getProjectSn, MapUtils.getString(map, "projectSn"))
@ -54,6 +57,7 @@ public class ProjectPoliceCameraConfigServiceImpl extends ServiceImpl<ProjectPol
}
@Override
@CacheEvict(value = {"policeCamera"}, key = "'useConfig:' + #map['projectSn']")
public void updateVideoConfigEnable(Map<String, Object> map) {
ProjectPoliceCameraConfig projectPoliceCameraConfig = new ProjectPoliceCameraConfig();
projectPoliceCameraConfig.setProjectSn(MapUtils.getString(map, "projectSn"));
@ -79,6 +83,7 @@ public class ProjectPoliceCameraConfigServiceImpl extends ServiceImpl<ProjectPol
}
@Override
@CacheEvict(value = {"policeCamera"}, key = "'useConfig:' + #projectPoliceCameraConfig.projectSn")
public void editProjectPoliceCameraConfig(ProjectPoliceCameraConfig projectPoliceCameraConfig) {
QueryWrapper<ProjectPoliceCameraConfig> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(ProjectPoliceCameraConfig::getProjectSn, projectPoliceCameraConfig.getProjectSn())
@ -93,6 +98,7 @@ public class ProjectPoliceCameraConfigServiceImpl extends ServiceImpl<ProjectPol
}
@Override
@CacheEvict(value = {"policeCamera"}, key = "'useConfig:' + #projectSn")
public void deleteProjectVideo(String projectSn) {
QueryWrapper<ProjectPoliceCameraConfig> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(ProjectPoliceCameraConfig::getProjectSn, projectSn);

View File

@ -25,6 +25,8 @@ import com.zhgd.xmgl.modules.project.service.IProjectConfigService;
import com.zhgd.xmgl.modules.quality.entity.QualityRegion;
import com.zhgd.xmgl.modules.quality.service.IQualityRegionService;
import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo;
import com.zhgd.xmgl.modules.worker.entity.TeamInfo;
import com.zhgd.xmgl.modules.worker.service.ITeamInfoService;
import com.zhgd.xmgl.modules.worker.service.impl.EnterpriseInfoServiceImpl;
import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl;
import com.zhgd.xmgl.util.*;
@ -36,6 +38,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@ -88,6 +91,9 @@ public class WorkTicketServiceImpl extends ServiceImpl<WorkTicketMapper, WorkTic
@Autowired
@Qualifier("doubleCarbonExecutor")
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Lazy
@Autowired
private ITeamInfoService teamInfoService;
@Override
public IPage<WorkTicketVo> queryPageList(HashMap<String, Object> param) {
@ -128,6 +134,8 @@ public class WorkTicketServiceImpl extends ServiceImpl<WorkTicketMapper, WorkTic
CollUtils.filteringNull()
)
));
Map<Long, TeamInfo> teamInfoMap = teamInfoService.list(new LambdaQueryWrapper<TeamInfo>()
.eq(TeamInfo::getProjectSn, projectSn)).stream().collect(Collectors.toMap(TeamInfo::getId, Function.identity(), (o1, o2) -> o1));
for (WorkTicketVo ticketVo : list) {
// 设置申请人名称
ticketVo.setApplicantNames(EntityUtils.convertIdsToNames(
@ -142,6 +150,13 @@ public class WorkTicketServiceImpl extends ServiceImpl<WorkTicketMapper, WorkTic
QualityRegion::getRegionName
));
ticketVo.setItemList(ticketMap.get(ticketVo.getId()));
// 设置班组名称
ticketVo.setTeamNames(EntityUtils.convertIdsToNames(
ticketVo.getTeamIds(),
teamInfoMap,
TeamInfo::getTeamName
));
ticketVo.setItemList(ticketMap.get(ticketVo.getId()));
}
}
return list;

View File

@ -64,7 +64,7 @@ public class Mcs8Task {
/**
* 定时更新执法仪设备状态
*/
@Scheduled(cron = "*/10 * * * * ?")
@Scheduled(cron = "*/5 * * * * ?")
@RequestMapping("updateStatus")
public void updateStatus() {
List<Project> projects = projectService.list();
@ -72,7 +72,7 @@ public class Mcs8Task {
try {
PoliceCameraManufacturer manufacturer = policeCameraManufacturerFactory.getPoliceCameraManufacturer(project.getProjectSn());
if (manufacturer != null) {
manufacturer.updateStatus();
manufacturer.updateStatus(3L);
}
} catch (Exception e) {
log.error("定时更新执法仪设备状态err{}", project.getProjectName(), e);