From 06762a6e8abbd4aa651d09c9655a6ee91b19d86e Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Mon, 3 Nov 2025 10:34:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E9=80=89=E5=A4=9A=E4=B8=AA=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhgd/redis/config/RedisConfig.java | 4 +- .../java/com/zhgd/xmgl/call/Mcs8Call.java | 104 +++++++++++++++--- .../call/api/PoliceCameraManufacturer.java | 3 +- .../policecamera/entity/WorkTicket.java | 6 +- .../policecamera/entity/vo/WorkTicketVo.java | 5 + .../service/IPoliceCameraItemService.java | 2 + .../impl/PoliceCameraItemServiceImpl.java | 11 ++ .../ProjectPoliceCameraConfigServiceImpl.java | 6 + .../service/impl/WorkTicketServiceImpl.java | 15 +++ .../java/com/zhgd/xmgl/task/Mcs8Task.java | 4 +- 10 files changed, 140 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/zhgd/redis/config/RedisConfig.java b/src/main/java/com/zhgd/redis/config/RedisConfig.java index af0bb8ff2..667b283ab 100644 --- a/src/main/java/com/zhgd/redis/config/RedisConfig.java +++ b/src/main/java/com/zhgd/redis/config/RedisConfig.java @@ -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; diff --git a/src/main/java/com/zhgd/xmgl/call/Mcs8Call.java b/src/main/java/com/zhgd/xmgl/call/Mcs8Call.java index b5f871a3d..52a9883dc 100644 --- a/src/main/java/com/zhgd/xmgl/call/Mcs8Call.java +++ b/src/main/java/com/zhgd/xmgl/call/Mcs8Call.java @@ -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 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 itemList = policeCameraItemService.list(new LambdaQueryWrapper() - .eq(PoliceCameraItem::getProjectSn, config.getProjectSn())); + List 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 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 itemList, JSONArray devList) { + Map devSnMap = devList.stream() + .collect(Collectors.toMap( + o -> ((JSONObject) o).getString("deviceId"), + o -> (JSONObject) o, + (o1, o2) -> o1 + )); + + // 分组处理:在线设备和离线设备 + List onlineIds = new ArrayList<>(); + List 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() + .set(PoliceCameraItem::getDeviceState, 1) + .in(PoliceCameraItem::getItemId, onlineIds) + ); + } + + // 批量更新离线设备 + if (CollUtil.isNotEmpty(offlineIds)) { + policeCameraItemService.update(new LambdaUpdateWrapper() + .set(PoliceCameraItem::getDeviceState, 2) + .in(PoliceCameraItem::getItemId, offlineIds) + ); + } } public boolean configIsBlank() { diff --git a/src/main/java/com/zhgd/xmgl/call/api/PoliceCameraManufacturer.java b/src/main/java/com/zhgd/xmgl/call/api/PoliceCameraManufacturer.java index f5d1aa9d1..6d87a294c 100644 --- a/src/main/java/com/zhgd/xmgl/call/api/PoliceCameraManufacturer.java +++ b/src/main/java/com/zhgd/xmgl/call/api/PoliceCameraManufacturer.java @@ -35,6 +35,7 @@ public interface PoliceCameraManufacturer { /** * 更新状态 + * @param cacheSeconds 缓存第三方设备在线接口时间s */ - void updateStatus(); + void updateStatus(Long cacheSeconds); } diff --git a/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/WorkTicket.java b/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/WorkTicket.java index 80d05b0df..be65ec9f1 100644 --- a/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/WorkTicket.java +++ b/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/WorkTicket.java @@ -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; } diff --git a/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/vo/WorkTicketVo.java b/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/vo/WorkTicketVo.java index 1b971e84e..79e536f9a 100644 --- a/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/vo/WorkTicketVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/vo/WorkTicketVo.java @@ -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; } diff --git a/src/main/java/com/zhgd/xmgl/modules/policecamera/service/IPoliceCameraItemService.java b/src/main/java/com/zhgd/xmgl/modules/policecamera/service/IPoliceCameraItemService.java index 502e7f145..12e82928d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/policecamera/service/IPoliceCameraItemService.java +++ b/src/main/java/com/zhgd/xmgl/modules/policecamera/service/IPoliceCameraItemService.java @@ -100,4 +100,6 @@ public interface IPoliceCameraItemService extends IService { Map getItemMapByProjectSn(String projectSn); VideoItemInfoVo getVideoItemInfo(Map map); + + List getListByProjectSn(String projectSn); } diff --git a/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/PoliceCameraItemServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/PoliceCameraItemServiceImpl.java index f8cc27d2f..4789eb789 100644 --- a/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/PoliceCameraItemServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/PoliceCameraItemServiceImpl.java @@ -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 getListByProjectSn(String projectSn) { + return this.list(new LambdaQueryWrapper() + .eq(PoliceCameraItem::getProjectSn, projectSn)); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/ProjectPoliceCameraConfigServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/ProjectPoliceCameraConfigServiceImpl.java index 3f115906a..03d7eed96 100644 --- a/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/ProjectPoliceCameraConfigServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/ProjectPoliceCameraConfigServiceImpl.java @@ -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 map) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(ProjectPoliceCameraConfig::getProjectSn, MapUtils.getString(map, "projectSn")) @@ -54,6 +57,7 @@ public class ProjectPoliceCameraConfigServiceImpl extends ServiceImpl map) { ProjectPoliceCameraConfig projectPoliceCameraConfig = new ProjectPoliceCameraConfig(); projectPoliceCameraConfig.setProjectSn(MapUtils.getString(map, "projectSn")); @@ -79,6 +83,7 @@ public class ProjectPoliceCameraConfigServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(ProjectPoliceCameraConfig::getProjectSn, projectPoliceCameraConfig.getProjectSn()) @@ -93,6 +98,7 @@ public class ProjectPoliceCameraConfigServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(ProjectPoliceCameraConfig::getProjectSn, projectSn); diff --git a/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/WorkTicketServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/WorkTicketServiceImpl.java index c40ea99f0..39f8c2506 100644 --- a/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/WorkTicketServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/policecamera/service/impl/WorkTicketServiceImpl.java @@ -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 queryPageList(HashMap param) { @@ -128,6 +134,8 @@ public class WorkTicketServiceImpl extends ServiceImpl teamInfoMap = teamInfoService.list(new LambdaQueryWrapper() + .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 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);