diff --git a/pom.xml b/pom.xml index 7ce73d73..bacecbde 100644 --- a/pom.xml +++ b/pom.xml @@ -89,12 +89,12 @@ prod prod - 53.16.17.13:8848 + 10.129.128.114:8848 DEFAULT_GROUP DEFAULT_GROUP nacos nacos - 53.16.17.13:4560 + 10.129.128.114:4560 diff --git a/stwzhj-common/stwzhj-common-dubbo/pom.xml b/stwzhj-common/stwzhj-common-dubbo/pom.xml index e515b05f..024fb983 100644 --- a/stwzhj-common/stwzhj-common-dubbo/pom.xml +++ b/stwzhj-common/stwzhj-common-dubbo/pom.xml @@ -40,6 +40,10 @@ org.apache.dubbo dubbo-metadata-report-redis + + io.lettuce + lettuce-core + redis.clients jedis @@ -51,6 +55,11 @@ jedis 5.1.0 + + + io.lettuce + lettuce-core + org.projectlombok lombok diff --git a/stwzhj-common/stwzhj-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java b/stwzhj-common/stwzhj-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java index 9d6af3af..84202fdf 100644 --- a/stwzhj-common/stwzhj-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java +++ b/stwzhj-common/stwzhj-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java @@ -49,10 +49,15 @@ import static org.apache.dubbo.metadata.report.support.Constants.DEFAULT_METADAT public class RedisMetadataReport extends AbstractMetadataReport { private static final String REDIS_DATABASE_KEY = "database"; + + private static final String SENTINEL_KEY = "sentinel"; private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(RedisMetadataReport.class); // protected , for test protected JedisPool pool; + + protected JedisSentinelPool sentinelPool; + private Set jedisClusterNodes; private int timeout; private String password; @@ -75,6 +80,14 @@ public class RedisMetadataReport extends AbstractMetadataReport { for (URL tmpUrl : urls) { jedisClusterNodes.add(new HostAndPort(tmpUrl.getHost(), tmpUrl.getPort())); } + } else if (url.getParameter(SENTINEL_KEY,false)) { + Set sentinels = new HashSet<>(); + List urls = url.getBackupUrls(); + for (URL tmpUrl : urls) { + sentinels.add(tmpUrl.getHost()+":"+ tmpUrl.getPort()); + } + int database = url.getParameter(REDIS_DATABASE_KEY, 0); + sentinelPool = new JedisSentinelPool("mymaster",sentinels ,new GenericObjectPoolConfig<>(), timeout, password, database); } else { int database = url.getParameter(REDIS_DATABASE_KEY, 0); pool = new JedisPool(new JedisPoolConfig(), url.getHost(), url.getPort(), timeout, password, database); @@ -128,11 +141,25 @@ public class RedisMetadataReport extends AbstractMetadataReport { private void storeMetadata(BaseMetadataIdentifier metadataIdentifier, String v) { if (pool != null) { storeMetadataStandalone(metadataIdentifier, v); + }else if(sentinelPool != null) { + storeMetadataInSentinel(metadataIdentifier, v); } else { storeMetadataInCluster(metadataIdentifier, v); } } + private void storeMetadataInSentinel(BaseMetadataIdentifier metadataIdentifier, String v) { + try (Jedis jedisSentinel = sentinelPool.getResource()) { + jedisSentinel.set(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY), v, jedisParams); + } catch (Throwable e) { + String msg = + "Failed to put " + metadataIdentifier + " to redis cluster " + v + ", cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + private void storeMetadataInCluster(BaseMetadataIdentifier metadataIdentifier, String v) { try (JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { @@ -158,11 +185,24 @@ public class RedisMetadataReport extends AbstractMetadataReport { private void deleteMetadata(BaseMetadataIdentifier metadataIdentifier) { if (pool != null) { deleteMetadataStandalone(metadataIdentifier); + }else if(sentinelPool != null) { + deleteMetadataSentinel(metadataIdentifier); } else { deleteMetadataInCluster(metadataIdentifier); } } + private void deleteMetadataSentinel(BaseMetadataIdentifier metadataIdentifier) { + try (Jedis jedisSentinel = sentinelPool.getResource()) { + jedisSentinel.del(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY)); + } catch (Throwable e) { + String msg = "Failed to delete " + metadataIdentifier + " from redis , cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + private void deleteMetadataInCluster(BaseMetadataIdentifier metadataIdentifier) { try (JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { @@ -187,11 +227,24 @@ public class RedisMetadataReport extends AbstractMetadataReport { private String getMetadata(BaseMetadataIdentifier metadataIdentifier) { if (pool != null) { return getMetadataStandalone(metadataIdentifier); + }else if(sentinelPool != null) { + return getMetadataSentinel(metadataIdentifier); } else { return getMetadataInCluster(metadataIdentifier); } } + private String getMetadataSentinel(BaseMetadataIdentifier metadataIdentifier) { + try (Jedis jedisSentinel = sentinelPool.getResource()) { + return jedisSentinel.get(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY)); + } catch (Throwable e) { + String msg = "Failed to get " + metadataIdentifier + " from redis , cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + private String getMetadataInCluster(BaseMetadataIdentifier metadataIdentifier) { try (JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { @@ -243,6 +296,8 @@ public class RedisMetadataReport extends AbstractMetadataReport { private boolean storeMapping(String key, String field, String value, String ticket) { if (pool != null) { return storeMappingStandalone(key, field, value, ticket); + }else if(sentinelPool != null) { + return storeMappingSentinel(key, field, value, ticket); } else { return storeMappingInCluster(key, field, value, ticket); } @@ -278,6 +333,33 @@ public class RedisMetadataReport extends AbstractMetadataReport { return false; } + /** + * use 'watch' to implement cas. + * Find information about slot distribution by key. + */ + private boolean storeMappingSentinel(String key, String field, String value, String ticket) { + try (Jedis jedisSentinel = sentinelPool.getResource()) { + jedisSentinel.watch(key); + String oldValue = jedisSentinel.hget(key, field); + if (null == oldValue || null == ticket || oldValue.equals(ticket)) { + Transaction transaction = jedisSentinel.multi(); + transaction.hset(key, field, value); + List result = transaction.exec(); + if (null != result) { + jedisSentinel.publish(buildPubSubKey(), field); + return true; + } + } + jedisSentinel.unwatch(); + } catch (Throwable e) { + String msg = "Failed to put " + key + ":" + field + " to redis " + value + ", cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + return false; + } + + /** * use 'watch' to implement cas. * Find information about slot distribution by key. @@ -339,6 +421,8 @@ public class RedisMetadataReport extends AbstractMetadataReport { private String getMappingData(String key, String field) { if (pool != null) { return getMappingDataStandalone(key, field); + }else if(sentinelPool != null) { + return getMappingDataSentinel(key, field); } else { return getMappingDataInCluster(key, field); } @@ -355,6 +439,17 @@ public class RedisMetadataReport extends AbstractMetadataReport { } } + private String getMappingDataSentinel(String key, String field) { + try (Jedis jedisSentinel = sentinelPool.getResource()) { + return jedisSentinel.hget(key, field); + } catch (Throwable e) { + String msg = "Failed to get " + key + ":" + field + " from redis , cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + private String getMappingDataStandalone(String key, String field) { try (Jedis jedis = pool.getResource()) { return jedis.hget(key, field); @@ -502,6 +597,14 @@ public class RedisMetadataReport extends AbstractMetadataReport { logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); throw new RpcException(msg, e); } + } else if (sentinelPool != null) { + try (Jedis jedisSentinel = sentinelPool.getResource()) { + jedisSentinel.subscribe(notifySub, path); + } catch (Throwable e) { + String msg = "Failed to subscribe " + path + ", cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } } else { try (JedisCluster jedisCluster = new JedisCluster( jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { diff --git a/stwzhj-common/stwzhj-common-dubbo/src/main/resources/common-dubbo.yml b/stwzhj-common/stwzhj-common-dubbo/src/main/resources/common-dubbo.yml index 79092151..02638409 100644 --- a/stwzhj-common/stwzhj-common-dubbo/src/main/resources/common-dubbo.yml +++ b/stwzhj-common/stwzhj-common-dubbo/src/main/resources/common-dubbo.yml @@ -23,15 +23,27 @@ dubbo: address: redis://${spring.data.redis.host}:${spring.data.redis.port} group: DUBBO_GROUP username: dubbo - password: ${spring.data.redis.password} + password: ruoyi123 # 集群开关 - cluster: false + sentinel: false parameters: namespace: ${spring.profiles.active} database: ${spring.data.redis.database} timeout: ${spring.data.redis.timeout} - # 集群地址 cluster 为 true 生效 - backup: 127.0.0.1:6379,127.0.0.1:6381 + backup: 10.129.128.116:26380,10.129.128.115:26380,10.129.128.114:26380 +# metadata-report: +# address: redis://${spring.data.redis.host}:${spring.data.redis.port} +# group: DUBBO_GROUP +# username: dubbo +# password: ${spring.data.redis.password} +# # 集群开关 +# cluster: false +# parameters: +# namespace: ${spring.profiles.active} +# database: ${spring.data.redis.database} +# timeout: ${spring.data.redis.timeout} +# # 集群地址 cluster 为 true 生效 +# backup: 127.0.0.1:6379,127.0.0.1:6381 # 消费者相关配置 consumer: # 结果缓存(LRU算法) @@ -43,3 +55,12 @@ dubbo: retries: 0 # 初始化检查 check: false + +logging: + level: + # 设置 Dubbo 核心包的日志级别为 DEBUG + org.apache.dubbo: DEBUG + # 如果需要更细粒度的调试,可指定元数据报告模块 + org.apache.dubbo.metadata: DEBUG + # Redis 客户端日志(可选) + io.lettuce.core: WARN # 避免 Redis 连接日志过多 diff --git a/stwzhj-common/stwzhj-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfiguration.java b/stwzhj-common/stwzhj-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfiguration.java index f7e76c5d..56dcecbd 100644 --- a/stwzhj-common/stwzhj-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfiguration.java +++ b/stwzhj-common/stwzhj-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfiguration.java @@ -25,6 +25,7 @@ import org.springframework.core.task.VirtualThreadTaskExecutor; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Objects; import java.util.TimeZone; /** @@ -94,6 +95,22 @@ public class RedisConfiguration { .setReadMode(clusterServersConfig.getReadMode()) .setSubscriptionMode(clusterServersConfig.getSubscriptionMode()); } + // 哨兵模式 + RedissonProperties.Sentinel sentinel = redissonProperties.getSentinel(); + if (Objects.nonNull(sentinel)) { + config.useSentinelServers() + .setNameMapper(new KeyPrefixHandler(redissonProperties.getKeyPrefix())) + .setTimeout(sentinel.getTimeout()) + .setClientName(sentinel.getClientName()) + .setIdleConnectionTimeout(sentinel.getIdleConnectionTimeout()) + .setSubscriptionConnectionPoolSize(sentinel.getSubscriptionConnectionPoolSize()) + .setMasterConnectionMinimumIdleSize(sentinel.getMasterConnectionMinimumIdleSize()) + .setMasterConnectionPoolSize(sentinel.getMasterConnectionPoolSize()) + .setSlaveConnectionMinimumIdleSize(sentinel.getSlaveConnectionMinimumIdleSize()) + .setSlaveConnectionPoolSize(sentinel.getSlaveConnectionPoolSize()) + .setReadMode(sentinel.getReadMode()) + .setSubscriptionMode(sentinel.getSubscriptionMode()); + } log.info("初始化 redis 配置"); }; } diff --git a/stwzhj-common/stwzhj-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java b/stwzhj-common/stwzhj-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java index ebec7861..799c0a68 100644 --- a/stwzhj-common/stwzhj-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java +++ b/stwzhj-common/stwzhj-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java @@ -40,6 +40,8 @@ public class RedissonProperties { */ private ClusterServersConfig clusterServersConfig; + private Sentinel sentinel; + @Data @NoArgsConstructor public static class SingleServerConfig { @@ -132,4 +134,60 @@ public class RedissonProperties { } + @Data + @NoArgsConstructor + public static class Sentinel { + + /** + * 客户端名称 + */ + private String clientName; + + /** + * master最小空闲连接数 + */ + private int masterConnectionMinimumIdleSize; + + /** + * master连接池大小 + */ + private int masterConnectionPoolSize; + + /** + * slave最小空闲连接数 + */ + private int slaveConnectionMinimumIdleSize; + + /** + * slave连接池大小 + */ + private int slaveConnectionPoolSize; + + /** + * 连接空闲超时,单位:毫秒 + */ + private int idleConnectionTimeout; + + /** + * 命令等待超时,单位:毫秒 + */ + private int timeout; + + /** + * 发布和订阅连接池大小 + */ + private int subscriptionConnectionPoolSize; + + /** + * 读取模式 + */ + private ReadMode readMode; + + /** + * 订阅模式 + */ + private SubscriptionMode subscriptionMode; + + } + } diff --git a/stwzhj-modules/stwzhj-data2es/src/main/java/org/dromara/data2es/handler/DataInsertBatchHandler.java b/stwzhj-modules/stwzhj-data2es/src/main/java/org/dromara/data2es/handler/DataInsertBatchHandler.java index 1e328c0e..04448c4d 100644 --- a/stwzhj-modules/stwzhj-data2es/src/main/java/org/dromara/data2es/handler/DataInsertBatchHandler.java +++ b/stwzhj-modules/stwzhj-data2es/src/main/java/org/dromara/data2es/handler/DataInsertBatchHandler.java @@ -49,7 +49,7 @@ public class DataInsertBatchHandler implements CommandLineRunner { log.info("batch size={}", list.size()); if(CollectionUtil.isNotEmpty(list)) { gpsService.saveDataBatch(list); - storeDataService.saveDataByPersonTypeBatch(list); +// storeDataService.saveDataByPersonTypeBatch(list); } } catch (Exception e) { log.error("缓存队列批量消费异常:{}", e.getMessage()); diff --git a/stwzhj-modules/stwzhj-data2es/src/main/java/org/dromara/data2es/service/impl/GpsServiceImpl.java b/stwzhj-modules/stwzhj-data2es/src/main/java/org/dromara/data2es/service/impl/GpsServiceImpl.java index 85400564..aa572c7c 100644 --- a/stwzhj-modules/stwzhj-data2es/src/main/java/org/dromara/data2es/service/impl/GpsServiceImpl.java +++ b/stwzhj-modules/stwzhj-data2es/src/main/java/org/dromara/data2es/service/impl/GpsServiceImpl.java @@ -153,7 +153,7 @@ public class GpsServiceImpl implements IGpsService { //地市版本没用批量插入 requestHandler.redisOnlineUser(info); //发送到勤务 - storeDataService.saveDataByPersonType(info); +// storeDataService.saveDataByPersonType(info); CompletableFuture.allOf(esFuture); EsGpsInfo esGpsInfo1 = esFuture.get(); diff --git a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/controller/system/IndexStaticsController.java b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/controller/system/IndexStaticsController.java index 9d28f3ff..0fb2b008 100644 --- a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/controller/system/IndexStaticsController.java +++ b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/controller/system/IndexStaticsController.java @@ -1,25 +1,20 @@ package org.dromara.system.controller.system; +import cn.hutool.core.date.DateUtil; import jdk.dynalink.linker.LinkerServices; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.DeviceRedis; +import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.bo.TDeviceBo; -import org.dromara.system.domain.vo.DeviceStaticsVo; -import org.dromara.system.domain.vo.SysDeptVo; -import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.*; import org.dromara.system.service.*; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @RequiredArgsConstructor @RestController @@ -34,14 +29,50 @@ public class IndexStaticsController extends BaseController { private final IDeviceRedisService redisService; + /* - * 首页顶部统计 全省各个终端数量及在在线数 + * 在线终端数量 + * */ + @PostMapping("/onlineCount") + public R onlineCount(TDeviceBo deviceInfo){ + List list = deviceService.queryList(deviceInfo); + String keys = "online_users:"; + //List strs = redisUtil.match(keys); + Date date = new Date(); + Integer count = 0; + + return R.ok(count); + } + + /* + * 首页顶部统计 各个终端数量及在在线数 * */ @GetMapping("/topPan") - public R topPan(String zzjgdm){ + public R topPan(){ DeviceRedis redis = new DeviceRedis(); - redis.setZzjgdm(zzjgdm); - return R.ok(redisService.countByCondition(redis)); + List list = redisService.countByCondition(redis); + return R.ok(list); + } + + /* + * 通过Redis的数据来判断服务是否正常 + * */ + @RequestMapping("/serviceStatus") + public R serviceStatus(){ + DeviceRedis redis = new DeviceRedis(); + List list = redisService.countByCondition(redis); + List maps = new ArrayList<>(); + for (DeviceRedisVo redisVo : list) { + HashMap map = new HashMap(); + Integer status = 1; + map.put("deviceType",redisVo.getDeviceType()); + if (0 == redisVo.getOnline()){ + status = 0; + } + map.put("status",status); + maps.add(map); + } + return R.ok(maps); } /* @@ -142,7 +173,47 @@ public class IndexStaticsController extends BaseController { } + /* + * 终端种类占比 + * */ + @PostMapping("/deviceTypePen") + public R deviceTypePen(TDeviceBo deviceInfo){ + List dataList = dictTypeService.selectDictDataByType("zd_device_type"); + List list = new ArrayList<>(); + for (SysDictDataVo data : dataList) { + HashMap map = new HashMap(); + deviceInfo.setDeviceType(data.getDictValue()); + Long count = deviceService.countByCondition(deviceInfo); + map.put("name",data.getDictLabel()); + map.put("value",count); + list.add(map); + } + return R.ok(list); + } + /* + *终端单位分布 + * */ + @PostMapping("/deviceBar") + public R deviceBar(TDeviceBo deviceInfo){ + + SysDeptBo dept = new SysDeptBo(); + dept.setParentId(deviceInfo.getZzjgdm()); + //dept.setIsStuck("1"); + List depts = deptService.selectDeptList(dept); + HashMap map = new HashMap(); + List names = new ArrayList<>(); + List datas = new ArrayList<>(); + for (SysDeptVo sysDept : depts) { + names.add(sysDept.getDeptName()); + deviceInfo.setZzjgdm(sysDept.getDeptId()); + Long count = deviceService.countByCondition(deviceInfo); + datas.add(count); + } + map.put("name",names); + map.put("data",datas); + return R.ok(map); + } } diff --git a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/controller/system/TDeviceController.java b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/controller/system/TDeviceController.java index edd4248c..ac6b3bb1 100644 --- a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/controller/system/TDeviceController.java +++ b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/controller/system/TDeviceController.java @@ -124,6 +124,12 @@ public class TDeviceController extends BaseController { return toAjax(tDeviceService.updateByBo(bo)); } + @RequestMapping("/updateBatch") + public R updateBatch(@RequestBody TDeviceBo deviceInfo){ + int num = tDeviceService.updateBatch(deviceInfo.getDeviceCode(),deviceInfo.getZzjgdm(),deviceInfo.getZzjgmc()); + return toAjax(num); + } + /** * 删除device * diff --git a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/domain/vo/DeviceRedisVo.java b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/domain/vo/DeviceRedisVo.java index fa9f329f..d35a4896 100644 --- a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/domain/vo/DeviceRedisVo.java +++ b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/domain/vo/DeviceRedisVo.java @@ -14,7 +14,7 @@ public class DeviceRedisVo { private String deviceType; - private String online; +// private String online; private String zzjgdm; @@ -22,6 +22,6 @@ public class DeviceRedisVo { private Integer co; - private Integer onlien; + private Integer online; } diff --git a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/mapper/TDeviceMapper.java b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/mapper/TDeviceMapper.java index b834effd..1a49ab3e 100644 --- a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/mapper/TDeviceMapper.java +++ b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/mapper/TDeviceMapper.java @@ -13,6 +13,7 @@ import org.dromara.system.domain.vo.TDeviceExportVo; import org.dromara.system.domain.vo.TDeviceVo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import java.util.HashMap; import java.util.List; /** @@ -35,4 +36,6 @@ public interface TDeviceMapper extends BaseMapperPlus { }) Page selectPageDevicetList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + int updateBatch(HashMap map); + } diff --git a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/ITDeviceService.java b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/ITDeviceService.java index eac8b717..c2eeeb66 100644 --- a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/ITDeviceService.java +++ b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/ITDeviceService.java @@ -63,6 +63,8 @@ public interface ITDeviceService { */ Boolean updateByBo(TDeviceBo bo); + int updateBatch(String deviceCodes,String zzjgdm,String zzjgmc); + /** * 校验并批量删除device信息 * diff --git a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 96eecc22..879ce35e 100644 --- a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -351,7 +351,7 @@ public class SysDeptServiceImpl implements ISysDeptService { @Override public List deviceStatics(String deviceType,String manageDeptId) { - if(!manageDeptId.equals("341800000000")){ + if(!manageDeptId.equals("341300000000")){ String subManageId = manageDeptId.substring(0,findLastNonZeroIndex(manageDeptId) + 1); return baseMapper.deviceStaticsByDeptId(deviceType,subManageId); diff --git a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/impl/TDeviceServiceImpl.java b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/impl/TDeviceServiceImpl.java index 89be59d7..bcbf2257 100644 --- a/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/impl/TDeviceServiceImpl.java +++ b/stwzhj-modules/stwzhj-system/src/main/java/org/dromara/system/service/impl/TDeviceServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.system.service.impl; +import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -190,6 +191,16 @@ public class TDeviceServiceImpl implements ITDeviceService { return baseMapper.updateById(update) > 0; } + @Override + public int updateBatch(String deviceCodes, String zzjgdm, String zzjgmc) { + String[] ids = Convert.toStrArray(deviceCodes); + HashMap map = new HashMap<>(); + map.put("zzjgdm",zzjgdm); + map.put("deviceCode",ids); + map.put("zzjgmc",zzjgmc); + return baseMapper.updateBatch(map); + } + /** * 保存前的数据校验 */ diff --git a/stwzhj-modules/stwzhj-system/src/main/resources/mapper/system/DeviceRedisMapper.xml b/stwzhj-modules/stwzhj-system/src/main/resources/mapper/system/DeviceRedisMapper.xml index 8065277e..997e2f2f 100644 --- a/stwzhj-modules/stwzhj-system/src/main/resources/mapper/system/DeviceRedisMapper.xml +++ b/stwzhj-modules/stwzhj-system/src/main/resources/mapper/system/DeviceRedisMapper.xml @@ -24,7 +24,7 @@ + + update t_device set zzjgdm = #{zzjgdm},zzjgmc = #{zzjgmc} + where device_code in + + #{deviceCode} + + + diff --git a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/controller/DeviceGPSController.java b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/controller/DeviceGPSController.java index 650b419e..a75c75b2 100644 --- a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/controller/DeviceGPSController.java +++ b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/controller/DeviceGPSController.java @@ -15,6 +15,7 @@ import org.dromara.extract.util.PathUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; @@ -38,9 +39,13 @@ public class DeviceGPSController { @DubboReference RemoteDataToEsService dataToEsService; + @Value("${ruansi.start_update_time}") + private String startUpdateTime; + private String jlyUpdateTime; - private String lastUpdateTime = "2024-06-05 11:40:00"; + @Value("${ruansi.last_update_time}") + private String lastUpdateTime; @RequestMapping("/maxId") public String getMaxId(){ @@ -55,7 +60,7 @@ public class DeviceGPSController { return DateUtil.formatDateTime(info.getGpsTime()); } - @Scheduled(cron = "0/30 * * * * ?") + @Scheduled(cron = "0/10 * * * * ?") @Async public void bdgcGps(){ if(StringUtils.isBlank(lastUpdateTime)){ @@ -73,8 +78,8 @@ public class DeviceGPSController { List list = deviceGpsService.selectBDGCGPS(gpsInfo); Instant finish = Instant.now(); long timeElapsed = Duration.between(start, finish).toMillis(); - logger.info("查询耗时:"+timeElapsed); - logger.info("数据大小size"+list.size()); + logger.info("公车查询耗时:"+timeElapsed); + logger.info("公车数据大小size"+list.size()); Date nowDate = new Date(); for (int i = 0; i < list.size(); i++) { @@ -83,7 +88,7 @@ public class DeviceGPSController { lastUpdateTime = DateUtil.formatDateTime(info.getGpsTime()); // resetUpdateTime(info.getId()+""); } - if (DateUtil.between(nowDate,info.getGpsTime(),DateUnit.MINUTE) > 30){ + if (DateUtil.between(new Date(),info.getGpsTime(),DateUnit.MINUTE) > 10){ info.setOnline("0"); }else { info.setOnline("1"); @@ -93,9 +98,7 @@ public class DeviceGPSController { } ArrayList collect = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(EsGpsInfo::getDeviceCode))), ArrayList::new)); - logger.info("去重前size={},去重后size={}",list.size(),collect.size()); -// List remoteGpsInfos = new ArrayList<>(); -// remoteGpsInfos.add() + logger.info("公车去重前size={},公车去重后size={}",list.size(),collect.size()); dataToEsService.saveDataBatch(BeanUtil.copyToList(collect,RemoteGpsInfo.class)); Instant end = Instant.now(); long timeEnd = Duration.between(finish, end).toMillis(); @@ -103,6 +106,60 @@ public class DeviceGPSController { } + @Scheduled(cron = "0/8 * * * * ?") + @Async + public void jlyGps(){ + if(StringUtils.isBlank(jlyUpdateTime)){ + jlyUpdateTime = startUpdateTime; + } + EsGpsInfo gpsInfo = new EsGpsInfo(); + gpsInfo.setGpsTime(DateUtil.parse(jlyUpdateTime)); + logger.info("更新时间:"+jlyUpdateTime); + Instant start = Instant.now(); + List list = deviceGpsService.selectJlyGPS(gpsInfo); + Instant finish = Instant.now(); + long timeElapsed = Duration.between(start, finish).toMillis(); + logger.info("查询耗时:"+timeElapsed); + logger.info("数据大小size"+list.size()); + for (int i = 0; i < list.size(); i++) { + EsGpsInfo info = list.get(i); + if(i == 0){ + jlyUpdateTime = DateUtil.format(info.getGpsTime(),"yyyy-MM-dd HH:mm:ss") ; + } + if (DateUtil.between(new Date(),info.getGpsTime(),DateUnit.MINUTE) > 5){ + info.setOnline("0"); + }else { + info.setOnline("1"); + } + } + ArrayList collect = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> + new TreeSet<>(Comparator.comparing(EsGpsInfo::getDeviceCode))), ArrayList::new)); + dataToEsService.saveDataBatch(BeanUtil.copyToList(collect,RemoteGpsInfo.class)); + Instant end = Instant.now(); + long timeEnd = Duration.between(finish, end).toMillis(); + logger.info("方法执行逻辑耗时:"+timeEnd); + + } + + @Scheduled(cron = "0/30 * * * * ?") + public void jlyGpsStatus(){ + if(StringUtils.isBlank(jlyUpdateTime)){ + jlyUpdateTime = startUpdateTime; + } + EsGpsInfo gpsInfo = new EsGpsInfo(); + gpsInfo.setGpsTime(DateUtil.parse(jlyUpdateTime)); + List list = deviceGpsService.selectJlyStatus(gpsInfo); + for (int i = 0; i < list.size(); i++) { + EsGpsInfo info = list.get(i); + if(i == 0){ + jlyUpdateTime = DateUtil.format(info.getGpsTime(),"yyyy-MM-dd HH:mm:ss") ; + } + info.setGpsTime(null); + } + dataToEsService.updateOnlineStatusBatch(BeanUtil.copyToList(list,RemoteGpsInfo.class)); + + } + private void resetUpdateTime(String lastUpdateTime) { try { diff --git a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/domain/Device.java b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/domain/Device.java new file mode 100644 index 00000000..5da92747 --- /dev/null +++ b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/domain/Device.java @@ -0,0 +1,144 @@ +package org.dromara.extract.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

description:

+ * 设备基本信息 + * @author luya + * @date 2021-10-12 16:10 + */ +public class Device implements Serializable { + private static final long serialVersionUID = -25321078267627110L; + private Long id; + private String deviceCode; + private int deviceType; + private String zzjgdm; + private String zzjgmc; + private String policeNo; + private String policeName; + private String phoneNum; + private String carNum; + private String remark1; + private String remark2; + private int valid; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDeviceCode() { + return deviceCode; + } + + public void setDeviceCode(String deviceCode) { + this.deviceCode = deviceCode; + } + + public int getDeviceType() { + return deviceType; + } + + public void setDeviceType(int deviceType) { + this.deviceType = deviceType; + } + + public String getZzjgdm() { + return zzjgdm; + } + + public void setZzjgdm(String zzjgdm) { + this.zzjgdm = zzjgdm; + } + + public String getZzjgmc() { + return zzjgmc; + } + + public void setZzjgmc(String zzjgmc) { + this.zzjgmc = zzjgmc; + } + + public String getPoliceNo() { + return policeNo; + } + + public void setPoliceNo(String policeNo) { + this.policeNo = policeNo; + } + + public String getPoliceName() { + return policeName; + } + + public void setPoliceName(String policeName) { + this.policeName = policeName; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public String getCarNum() { + return carNum; + } + + public void setCarNum(String carNum) { + this.carNum = carNum; + } + + public String getRemark1() { + return remark1; + } + + public void setRemark1(String remark1) { + this.remark1 = remark1; + } + + public String getRemark2() { + return remark2; + } + + public void setRemark2(String remark2) { + this.remark2 = remark2; + } + + public int getValid() { + return valid; + } + + public void setValid(int valid) { + this.valid = valid; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} diff --git a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/mapper/DeviceGpsMapper.java b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/mapper/DeviceGpsMapper.java index 1bb591ed..439fc6a1 100644 --- a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/mapper/DeviceGpsMapper.java +++ b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/mapper/DeviceGpsMapper.java @@ -14,6 +14,11 @@ public interface DeviceGpsMapper { List selectBDGCGPS(EsGpsInfo esGpsInfo); + List selectJlyGPS(EsGpsInfo esGpsInfo); + + List selectJlyStatus(EsGpsInfo esGpsInfo); + + EsGpsInfo selectBDGCMaxTime(); } diff --git a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/mapper/DeviceMapper.java b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/mapper/DeviceMapper.java new file mode 100644 index 00000000..3f0e50ca --- /dev/null +++ b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/mapper/DeviceMapper.java @@ -0,0 +1,22 @@ +package org.dromara.extract.mapper; + + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.extract.domain.Device; + +import java.util.List; + +@Mapper +public interface DeviceMapper { + + List selectPDT(Device tDevice); + + List selectYDJW(Device tDevice); + + List selectBDGC(Device tDevice); + + List selectJly(Device tDevice); + + Device deviceByCode(String deviceCode); + +} diff --git a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/schedule/JJDeviceSchedule.java b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/schedule/JJDeviceSchedule.java new file mode 100644 index 00000000..08913859 --- /dev/null +++ b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/schedule/JJDeviceSchedule.java @@ -0,0 +1,52 @@ +package org.dromara.extract.schedule; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.extract.domain.Device; +import org.dromara.extract.service.IDeviceService; +import org.dromara.system.api.RemoteDeviceService; +import org.dromara.system.api.domain.bo.RemoteDeviceBo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.List; + +@Configuration +@Slf4j +/* +* 交警记录仪基础信息定时抽取 +* */ +public class JJDeviceSchedule { + + @Autowired + IDeviceService deviceService; + + @DubboReference + RemoteDeviceService remoteDeviceService; + + @Value("${ruansi.start_jlyupdate_time}") + private String startUpdateTime; + + private String lastUpdateTime = ""; + + + @Scheduled(cron = "0 0/10 * * * ?") + public void saveORUpdateJly(){ + if(StringUtils.isBlank(lastUpdateTime)){ + lastUpdateTime = startUpdateTime; + } + Device device = new Device(); + device.setUpdateTime(DateUtil.parse(lastUpdateTime)); + List list = deviceService.selectJly(device); + remoteDeviceService.batchSaveDevice(BeanUtil.copyToList(list, RemoteDeviceBo.class)); + if (list.size() != 0){ + lastUpdateTime = DateUtil.format(list.get(0).getUpdateTime(),"yyyy-MM-dd HH:mm:ss") ; + } + } + +} diff --git a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/IDeviceService.java b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/IDeviceService.java new file mode 100644 index 00000000..5e3e3dd1 --- /dev/null +++ b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/IDeviceService.java @@ -0,0 +1,23 @@ +package org.dromara.extract.service; + + + + +import org.dromara.extract.domain.Device; + +import java.util.List; + +public interface IDeviceService { + + public List selectPDT(Device device); + + List selectYDJW(Device tDevice); + + List selectBDGC(Device tDevice); + + List selectJly(Device tDevice); + + Device deviceByCode(String deviceCode); + + +} diff --git a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/ITDeviceGpsService.java b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/ITDeviceGpsService.java index f9cb7850..e355c7cf 100644 --- a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/ITDeviceGpsService.java +++ b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/ITDeviceGpsService.java @@ -10,6 +10,10 @@ public interface ITDeviceGpsService { List selectBDGCGPS(EsGpsInfo esGpsInfo); + List selectJlyGPS(EsGpsInfo esGpsInfo); + + List selectJlyStatus(EsGpsInfo esGpsInfo); + EsGpsInfo selectBDGCMaxTime(); } diff --git a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/impl/DeviceServiceImpl.java b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/impl/DeviceServiceImpl.java new file mode 100644 index 00000000..12c3c820 --- /dev/null +++ b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/impl/DeviceServiceImpl.java @@ -0,0 +1,44 @@ +package org.dromara.extract.service.impl; + + + +import org.dromara.extract.domain.Device; +import org.dromara.extract.mapper.DeviceMapper; +import org.dromara.extract.service.IDeviceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DeviceServiceImpl implements IDeviceService { + + @Autowired + DeviceMapper deviceMapper; + + @Override + public List selectPDT(Device device) { + List list = deviceMapper.selectPDT(device); + return list; + } + + @Override + public List selectYDJW(Device tDevice) { + return deviceMapper.selectYDJW(tDevice); + } + + @Override + public List selectBDGC(Device tDevice) { + return deviceMapper.selectBDGC(tDevice); + } + + @Override + public List selectJly(Device tDevice) { + return deviceMapper.selectJly(tDevice); + } + + @Override + public Device deviceByCode(String deviceCode) { + return deviceMapper.deviceByCode(deviceCode); + } +} diff --git a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/impl/TDeviceGpsServiceImpl.java b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/impl/TDeviceGpsServiceImpl.java index ddaf97b5..ab08cbbf 100644 --- a/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/impl/TDeviceGpsServiceImpl.java +++ b/stwzhj-modules/wzhj-extract/src/main/java/org/dromara/extract/service/impl/TDeviceGpsServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.extract.service.impl; +import com.baomidou.dynamic.datasource.annotation.DS; import org.dromara.extract.domain.EsGpsInfo; import org.dromara.extract.mapper.DeviceGpsMapper; import org.dromara.extract.service.ITDeviceGpsService; @@ -17,11 +18,22 @@ public class TDeviceGpsServiceImpl implements ITDeviceGpsService { DeviceGpsMapper deviceMapper; + @DS("bdgc") @Override public List selectBDGCGPS(EsGpsInfo esGpsInfo) { return deviceMapper.selectBDGCGPS(esGpsInfo); } + @Override + public List selectJlyGPS(EsGpsInfo esGpsInfo) { + return deviceMapper.selectJlyGPS(esGpsInfo); + } + + @Override + public List selectJlyStatus(EsGpsInfo esGpsInfo) { + return deviceMapper.selectJlyStatus(esGpsInfo); + } + @Override public EsGpsInfo selectBDGCMaxTime() { return deviceMapper.selectBDGCMaxTime(); diff --git a/stwzhj-modules/wzhj-extract/src/main/resources/mapper/DeviceGpsMapper.xml b/stwzhj-modules/wzhj-extract/src/main/resources/mapper/DeviceGpsMapper.xml index ac1a372c..f65ecaa5 100644 --- a/stwzhj-modules/wzhj-extract/src/main/resources/mapper/DeviceGpsMapper.xml +++ b/stwzhj-modules/wzhj-extract/src/main/resources/mapper/DeviceGpsMapper.xml @@ -36,13 +36,11 @@ + + diff --git a/stwzhj-modules/wzhj-extract/src/main/resources/mapper/DeviceMapper.xml b/stwzhj-modules/wzhj-extract/src/main/resources/mapper/DeviceMapper.xml new file mode 100644 index 00000000..3d9f2723 --- /dev/null +++ b/stwzhj-modules/wzhj-extract/src/main/resources/mapper/DeviceMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stwzhj-modules/wzhj-udp/pom.xml b/stwzhj-modules/wzhj-udp/pom.xml index 25d8699f..7b2d63a8 100644 --- a/stwzhj-modules/wzhj-udp/pom.xml +++ b/stwzhj-modules/wzhj-udp/pom.xml @@ -12,7 +12,7 @@ wzhj-udp - wzhj-udp UDP数据接收服务 + wzhj-udp 数据抽取服务 diff --git a/stwzhj-modules/wzhj-webscoket/src/main/java/org/dromara/webscoket/schedule/DeviceSchedule.java b/stwzhj-modules/wzhj-webscoket/src/main/java/org/dromara/webscoket/schedule/DeviceSchedule.java index a1561b63..9dca727f 100644 --- a/stwzhj-modules/wzhj-webscoket/src/main/java/org/dromara/webscoket/schedule/DeviceSchedule.java +++ b/stwzhj-modules/wzhj-webscoket/src/main/java/org/dromara/webscoket/schedule/DeviceSchedule.java @@ -132,8 +132,8 @@ public class DeviceSchedule { } if(Objects.isNull(one)){ // log.info("未找到该组织机构,civilCode={},civilCode + eqValue={}",civilCode,civilCode + eqValue); - newDevice.setZzjgdm("341800000000"); - newDevice.setZzjgmc("宣城市公安局"); + newDevice.setZzjgdm("341300000000"); + newDevice.setZzjgmc("宿州市公安局"); return; }