From 65a6e03c1d8087bbf4478650faec2b6b7422f153 Mon Sep 17 00:00:00 2001 From: luyya Date: Sun, 27 Apr 2025 09:46:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A3=E5=9F=8E=E6=96=B0=E7=89=88=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E6=B1=87=E8=81=9A=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/redis/RedisMetadataReport.java | 103 ++++++++++++++++++ .../src/main/resources/common-dubbo.yml | 29 ++++- .../redis/config/RedisConfiguration.java | 17 +++ .../config/properties/RedissonProperties.java | 58 ++++++++++ .../system/IndexStaticsController.java | 99 ++++++++++++++--- .../controller/system/TDeviceController.java | 6 + .../system/domain/vo/DeviceRedisVo.java | 4 +- .../dromara/system/mapper/TDeviceMapper.java | 3 + .../service/impl/TDeviceServiceImpl.java | 11 ++ .../mapper/system/DeviceRedisMapper.xml | 2 +- .../resources/mapper/system/TDeviceMapper.xml | 8 ++ 11 files changed, 319 insertions(+), 21 deletions(-) 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-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/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} + + +