diff --git a/epmet-admin/epmet-admin-server/pom.xml b/epmet-admin/epmet-admin-server/pom.xml
index 43cf8ecd31..32cdbb8688 100644
--- a/epmet-admin/epmet-admin-server/pom.xml
+++ b/epmet-admin/epmet-admin-server/pom.xml
@@ -132,6 +132,8 @@
false
+
+ true
false
@@ -170,6 +172,9 @@
false
+
+ false
+
false
@@ -203,6 +208,8 @@
false
+
+ true
true
diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/config/NacosServiceListListenerRegisterer.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/config/NacosServiceListListenerRegisterer.java
new file mode 100644
index 0000000000..7d9a1fef05
--- /dev/null
+++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/config/NacosServiceListListenerRegisterer.java
@@ -0,0 +1,161 @@
+package com.epmet.config;
+
+import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.naming.NamingService;
+import com.alibaba.nacos.api.naming.listener.Event;
+import com.alibaba.nacos.api.naming.listener.EventListener;
+import com.alibaba.nacos.api.naming.listener.NamingEvent;
+import com.alibaba.nacos.api.naming.pojo.ListView;
+import com.epmet.commons.tools.exception.ExceptionUtils;
+import com.netflix.loadbalancer.DynamicServerListLoadBalancer;
+import com.netflix.loadbalancer.ILoadBalancer;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+
+/**
+ * @author wxz
+ * @Description Nacos服务列表刷新监听注册器
+ * @date 2021.09.22 14:33:11
+ */
+@Slf4j
+@Configuration
+@ConditionalOnProperty(prefix = "spring.cloud.nacos.discovery.serviceListChangedListening", name = "enable", havingValue = "true", matchIfMissing = false)
+public class NacosServiceListListenerRegisterer {
+
+ public static final String REFRESH_SERVER_LIST_METHOD_NAME = "restOfInit";
+ // 服务列表拉取间隔:10s
+ public static final long SERVICE_LIST_PULLING_DELAY_SECONDS = 10;
+
+ private NamingService namingService;
+
+ private ScheduledExecutorService executor;
+
+ @Autowired
+ private NacosDiscoveryProperties discoveryProperties;
+
+ @Autowired
+ private SpringClientFactory springClientFactory;
+
+ // 监听中的服务列表
+ private List observingServers = new ArrayList<>(33);
+
+ @PostConstruct
+ public void init() {
+ namingService = discoveryProperties.namingServiceInstance();
+ // 启动监听
+ executor = new ScheduledThreadPoolExecutor(2, new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread thread = new Thread(r);
+ thread.setDaemon(true);
+ thread.setName("NacosServiceListWatchingRegisterer");
+ return thread;
+ }
+ });
+
+ // 立即启动,并15s刷新一次服务列表,用于新服务列表的发现
+ ScheduledFuture> future = executor.scheduleAtFixedRate(new EpmetNacosServiceListListener(), 0, SERVICE_LIST_PULLING_DELAY_SECONDS, TimeUnit.SECONDS);
+ }
+
+ public class EpmetNacosServiceListListener implements Runnable {
+
+ @Override
+ public void run() {
+ doRefreshServerList();
+ }
+
+ /**
+ * @param
+ * @return
+ * @description 执行刷新
+ * @author wxz
+ * @date 2021.09.22 16:04:49
+ */
+ private synchronized void doRefreshServerList() {
+ ListView serviceListView = null;
+ try {
+ serviceListView = namingService.getServicesOfServer(1, 100);
+ //启动监听
+ if (serviceListView == null || serviceListView.getCount() == 0) {
+ log.info("【Nacos服务列表定时刷新】当前无任何可添加监听的服务");
+ return;
+ }
+ List serviceList = serviceListView.getData();
+ log.info("【Nacos服务列表定时刷新】Nacos服务端服务列表: {}", serviceList);
+
+ for (String service : serviceList) {
+ try {
+
+ // 如果该服务已经在监听列表中存在了,则不再注册监听。注:不能取消空服务的监听,因为空服务随时可能恢复运行,需要实时监听。
+ if (observingServers.contains(service)) {
+ continue;
+ }
+
+ namingService.subscribe(service, new EventListener() {
+ @Override
+ public void onEvent(Event event) {
+ if (event instanceof NamingEvent) {
+ NamingEvent namingEvent = (NamingEvent) event;
+ log.info("【Nacos服务列表刷新监听】收到事件:{}:[{}]", namingEvent.getServiceName(), namingEvent.getInstances());
+ doRefreshServerList(service);
+ }
+ }
+ });
+
+ // 将该服务加入到监听列表中
+ observingServers.add(service);
+ } catch (NacosException e) {
+ String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
+ log.error("【Nacos服务列表定时刷新】订阅ApplicationContext的刷新事件失败,错误信息:{}", errorStackTrace);
+ }
+ }
+
+ } catch (NacosException e) {
+ String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
+ log.error("【Nacos服务列表定时刷新】链接Nacos服务端失败,错误信息:{}", errorStackTrace);
+ }
+ }
+
+ /**
+ * @param serviceName
+ * @return
+ * @description 刷新ServerList
+ * @author wxz
+ * @date 2021.09.22 09:29:16
+ */
+ private void doRefreshServerList(String serviceName) {
+ // 刷新方式1:反射调用DynamicServerListLoadBalancer中的restOfInit()方法。该方法原来只执行一次,此处不推荐用
+ //ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(serviceName);
+ //if (loadBalancer instanceof ZoneAwareLoadBalancer) {
+ // ZoneAwareLoadBalancer zaLoadBalancer = (ZoneAwareLoadBalancer) loadBalancer;
+ // IClientConfig clientConfig = springClientFactory.getClientConfig(serviceName);
+ // try {
+ // Method restOfInitMethod = zaLoadBalancer.getClass().getSuperclass().getDeclaredMethod(REFRESH_SERVER_LIST_METHOD_NAME, IClientConfig.class);
+ // restOfInitMethod.setAccessible(true);
+ // restOfInitMethod.invoke(zaLoadBalancer, clientConfig);
+ // } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+ // String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
+ // log.error("【LoadBalancer刷新服务列表】失败:{}", errorStackTrace);
+ // }
+ //}
+
+ // 刷新方式2:DynamicServerListLoadBalancer#updateListOfServers()该方法为ribbon定时刷新服务列表的时候真正调用的方法,但是加了@VisibleForTesting
+ // 暂且 1 try
+ ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(serviceName);
+ if (loadBalancer instanceof DynamicServerListLoadBalancer) {
+ DynamicServerListLoadBalancer dslb = (DynamicServerListLoadBalancer) loadBalancer;
+ dslb.updateListOfServers();
+ }
+ }
+ }
+
+}
diff --git a/epmet-admin/epmet-admin-server/src/main/resources/bootstrap.yml b/epmet-admin/epmet-admin-server/src/main/resources/bootstrap.yml
index 74c6bc2567..fc45940737 100644
--- a/epmet-admin/epmet-admin-server/src/main/resources/bootstrap.yml
+++ b/epmet-admin/epmet-admin-server/src/main/resources/bootstrap.yml
@@ -61,6 +61,8 @@ spring:
#不把自己注册到注册中心的地址
register-enabled: @nacos.register-enabled@
ip: @nacos.ip@
+ serviceListChangedListening:
+ enable: @nacos.service-list-changed-listening.enable@
config:
enabled: @nacos.config-enabled@
server-addr: @nacos.server-addr@
diff --git a/epmet-auth/pom.xml b/epmet-auth/pom.xml
index d04c994992..5d8ac8a789 100644
--- a/epmet-auth/pom.xml
+++ b/epmet-auth/pom.xml
@@ -183,6 +183,8 @@
false
+
+ true
wxcb6ce2ed0c5ae54c
@@ -238,6 +240,8 @@
false
+
+ false
wxcb6ce2ed0c5ae54c
@@ -290,6 +294,8 @@
false
+
+ true
wxcb6ce2ed0c5ae54c
diff --git a/epmet-auth/src/main/java/com/epmet/config/NacosServiceListListenerRegisterer.java b/epmet-auth/src/main/java/com/epmet/config/NacosServiceListListenerRegisterer.java
new file mode 100644
index 0000000000..7d9a1fef05
--- /dev/null
+++ b/epmet-auth/src/main/java/com/epmet/config/NacosServiceListListenerRegisterer.java
@@ -0,0 +1,161 @@
+package com.epmet.config;
+
+import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.naming.NamingService;
+import com.alibaba.nacos.api.naming.listener.Event;
+import com.alibaba.nacos.api.naming.listener.EventListener;
+import com.alibaba.nacos.api.naming.listener.NamingEvent;
+import com.alibaba.nacos.api.naming.pojo.ListView;
+import com.epmet.commons.tools.exception.ExceptionUtils;
+import com.netflix.loadbalancer.DynamicServerListLoadBalancer;
+import com.netflix.loadbalancer.ILoadBalancer;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+
+/**
+ * @author wxz
+ * @Description Nacos服务列表刷新监听注册器
+ * @date 2021.09.22 14:33:11
+ */
+@Slf4j
+@Configuration
+@ConditionalOnProperty(prefix = "spring.cloud.nacos.discovery.serviceListChangedListening", name = "enable", havingValue = "true", matchIfMissing = false)
+public class NacosServiceListListenerRegisterer {
+
+ public static final String REFRESH_SERVER_LIST_METHOD_NAME = "restOfInit";
+ // 服务列表拉取间隔:10s
+ public static final long SERVICE_LIST_PULLING_DELAY_SECONDS = 10;
+
+ private NamingService namingService;
+
+ private ScheduledExecutorService executor;
+
+ @Autowired
+ private NacosDiscoveryProperties discoveryProperties;
+
+ @Autowired
+ private SpringClientFactory springClientFactory;
+
+ // 监听中的服务列表
+ private List observingServers = new ArrayList<>(33);
+
+ @PostConstruct
+ public void init() {
+ namingService = discoveryProperties.namingServiceInstance();
+ // 启动监听
+ executor = new ScheduledThreadPoolExecutor(2, new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread thread = new Thread(r);
+ thread.setDaemon(true);
+ thread.setName("NacosServiceListWatchingRegisterer");
+ return thread;
+ }
+ });
+
+ // 立即启动,并15s刷新一次服务列表,用于新服务列表的发现
+ ScheduledFuture> future = executor.scheduleAtFixedRate(new EpmetNacosServiceListListener(), 0, SERVICE_LIST_PULLING_DELAY_SECONDS, TimeUnit.SECONDS);
+ }
+
+ public class EpmetNacosServiceListListener implements Runnable {
+
+ @Override
+ public void run() {
+ doRefreshServerList();
+ }
+
+ /**
+ * @param
+ * @return
+ * @description 执行刷新
+ * @author wxz
+ * @date 2021.09.22 16:04:49
+ */
+ private synchronized void doRefreshServerList() {
+ ListView serviceListView = null;
+ try {
+ serviceListView = namingService.getServicesOfServer(1, 100);
+ //启动监听
+ if (serviceListView == null || serviceListView.getCount() == 0) {
+ log.info("【Nacos服务列表定时刷新】当前无任何可添加监听的服务");
+ return;
+ }
+ List serviceList = serviceListView.getData();
+ log.info("【Nacos服务列表定时刷新】Nacos服务端服务列表: {}", serviceList);
+
+ for (String service : serviceList) {
+ try {
+
+ // 如果该服务已经在监听列表中存在了,则不再注册监听。注:不能取消空服务的监听,因为空服务随时可能恢复运行,需要实时监听。
+ if (observingServers.contains(service)) {
+ continue;
+ }
+
+ namingService.subscribe(service, new EventListener() {
+ @Override
+ public void onEvent(Event event) {
+ if (event instanceof NamingEvent) {
+ NamingEvent namingEvent = (NamingEvent) event;
+ log.info("【Nacos服务列表刷新监听】收到事件:{}:[{}]", namingEvent.getServiceName(), namingEvent.getInstances());
+ doRefreshServerList(service);
+ }
+ }
+ });
+
+ // 将该服务加入到监听列表中
+ observingServers.add(service);
+ } catch (NacosException e) {
+ String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
+ log.error("【Nacos服务列表定时刷新】订阅ApplicationContext的刷新事件失败,错误信息:{}", errorStackTrace);
+ }
+ }
+
+ } catch (NacosException e) {
+ String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
+ log.error("【Nacos服务列表定时刷新】链接Nacos服务端失败,错误信息:{}", errorStackTrace);
+ }
+ }
+
+ /**
+ * @param serviceName
+ * @return
+ * @description 刷新ServerList
+ * @author wxz
+ * @date 2021.09.22 09:29:16
+ */
+ private void doRefreshServerList(String serviceName) {
+ // 刷新方式1:反射调用DynamicServerListLoadBalancer中的restOfInit()方法。该方法原来只执行一次,此处不推荐用
+ //ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(serviceName);
+ //if (loadBalancer instanceof ZoneAwareLoadBalancer) {
+ // ZoneAwareLoadBalancer zaLoadBalancer = (ZoneAwareLoadBalancer) loadBalancer;
+ // IClientConfig clientConfig = springClientFactory.getClientConfig(serviceName);
+ // try {
+ // Method restOfInitMethod = zaLoadBalancer.getClass().getSuperclass().getDeclaredMethod(REFRESH_SERVER_LIST_METHOD_NAME, IClientConfig.class);
+ // restOfInitMethod.setAccessible(true);
+ // restOfInitMethod.invoke(zaLoadBalancer, clientConfig);
+ // } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+ // String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
+ // log.error("【LoadBalancer刷新服务列表】失败:{}", errorStackTrace);
+ // }
+ //}
+
+ // 刷新方式2:DynamicServerListLoadBalancer#updateListOfServers()该方法为ribbon定时刷新服务列表的时候真正调用的方法,但是加了@VisibleForTesting
+ // 暂且 1 try
+ ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(serviceName);
+ if (loadBalancer instanceof DynamicServerListLoadBalancer) {
+ DynamicServerListLoadBalancer dslb = (DynamicServerListLoadBalancer) loadBalancer;
+ dslb.updateListOfServers();
+ }
+ }
+ }
+
+}
diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/CustomerStaffInfoCacheResult.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/CustomerStaffInfoCacheResult.java
index d8cf9a8265..c5db9c6718 100644
--- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/CustomerStaffInfoCacheResult.java
+++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/CustomerStaffInfoCacheResult.java
@@ -22,6 +22,11 @@ public class CustomerStaffInfoCacheResult implements Serializable {
*/
private String agencyId;
+ /**
+ * 工作人员所属组织ID的pids
+ */
+ private String agencyPIds;
+
/**
* 工作人员所属组织名称
*/
@@ -57,6 +62,11 @@ public class CustomerStaffInfoCacheResult implements Serializable {
*/
private String headPhoto;
+ /**
+ * 工作人员是从哪中组织添加的 组织Id
+ */
+ private String fromOrgId;
+
/**
* 工作人员是从哪中组织类型添加的 3个值:agency,grid,dept
* @see com.epmet.commons.tools.enums.OrgTypeEnum
diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
index c0011a3d6a..7c407e1b6b 100644
--- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
+++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
@@ -212,6 +212,15 @@ public class RedisKeys {
return rootPrefix.concat("gov:agency:").concat(agencyId);
}
+ /**
+ * 网格信息key
+ * @param gridId
+ * @return
+ */
+ public static String getGridByIdKey(String gridId) {
+ return rootPrefix.concat("gov:grid:").concat(gridId);
+ }
+
/**
* 客户标签排行 缓存Key
* @param customerId
@@ -535,4 +544,17 @@ public class RedisKeys {
public static String getGridInfoKey(String gridId) {
return rootPrefix.concat("gov:grid:").concat(gridId);
}
+
+ /**
+ * @description 调查问卷accessKey
+ *
+ * @param userId
+ * @param qKey
+ * @return
+ * @author wxz
+ * @date 2021.09.23 17:38:37
+ */
+ public static String getQuestionnaireAccessKey(String userId, String qKey) {
+ return rootPrefix.concat("questionnaire:accesskey:").concat(userId).concat(":").concat(qKey);
+ }
}
diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/common/bean/CustomerStaffInfoCache.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/common/bean/CustomerStaffInfoCache.java
index 577bdf3910..98adecdc97 100644
--- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/common/bean/CustomerStaffInfoCache.java
+++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/common/bean/CustomerStaffInfoCache.java
@@ -22,6 +22,11 @@ public class CustomerStaffInfoCache implements Serializable {
*/
private String agencyId;
+ /**
+ * 工作人员所属组织ID的pids
+ */
+ private String agencyPIds;
+
/**
* 工作人员所属组织名称
*/
diff --git a/epmet-gateway/pom.xml b/epmet-gateway/pom.xml
index ee2c68962d..8465f6b39f 100644
--- a/epmet-gateway/pom.xml
+++ b/epmet-gateway/pom.xml
@@ -133,6 +133,9 @@
false
+
+ true
+
@@ -264,6 +267,9 @@
false
+
+
+ false
@@ -398,6 +404,9 @@
false
+
+ true
+
lb://epmet-auth-server
diff --git a/epmet-gateway/src/main/java/com/epmet/config/NacosServiceListListenerRegisterer.java b/epmet-gateway/src/main/java/com/epmet/config/NacosServiceListListenerRegisterer.java
new file mode 100644
index 0000000000..7d9a1fef05
--- /dev/null
+++ b/epmet-gateway/src/main/java/com/epmet/config/NacosServiceListListenerRegisterer.java
@@ -0,0 +1,161 @@
+package com.epmet.config;
+
+import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.naming.NamingService;
+import com.alibaba.nacos.api.naming.listener.Event;
+import com.alibaba.nacos.api.naming.listener.EventListener;
+import com.alibaba.nacos.api.naming.listener.NamingEvent;
+import com.alibaba.nacos.api.naming.pojo.ListView;
+import com.epmet.commons.tools.exception.ExceptionUtils;
+import com.netflix.loadbalancer.DynamicServerListLoadBalancer;
+import com.netflix.loadbalancer.ILoadBalancer;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+
+/**
+ * @author wxz
+ * @Description Nacos服务列表刷新监听注册器
+ * @date 2021.09.22 14:33:11
+ */
+@Slf4j
+@Configuration
+@ConditionalOnProperty(prefix = "spring.cloud.nacos.discovery.serviceListChangedListening", name = "enable", havingValue = "true", matchIfMissing = false)
+public class NacosServiceListListenerRegisterer {
+
+ public static final String REFRESH_SERVER_LIST_METHOD_NAME = "restOfInit";
+ // 服务列表拉取间隔:10s
+ public static final long SERVICE_LIST_PULLING_DELAY_SECONDS = 10;
+
+ private NamingService namingService;
+
+ private ScheduledExecutorService executor;
+
+ @Autowired
+ private NacosDiscoveryProperties discoveryProperties;
+
+ @Autowired
+ private SpringClientFactory springClientFactory;
+
+ // 监听中的服务列表
+ private List observingServers = new ArrayList<>(33);
+
+ @PostConstruct
+ public void init() {
+ namingService = discoveryProperties.namingServiceInstance();
+ // 启动监听
+ executor = new ScheduledThreadPoolExecutor(2, new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread thread = new Thread(r);
+ thread.setDaemon(true);
+ thread.setName("NacosServiceListWatchingRegisterer");
+ return thread;
+ }
+ });
+
+ // 立即启动,并15s刷新一次服务列表,用于新服务列表的发现
+ ScheduledFuture> future = executor.scheduleAtFixedRate(new EpmetNacosServiceListListener(), 0, SERVICE_LIST_PULLING_DELAY_SECONDS, TimeUnit.SECONDS);
+ }
+
+ public class EpmetNacosServiceListListener implements Runnable {
+
+ @Override
+ public void run() {
+ doRefreshServerList();
+ }
+
+ /**
+ * @param
+ * @return
+ * @description 执行刷新
+ * @author wxz
+ * @date 2021.09.22 16:04:49
+ */
+ private synchronized void doRefreshServerList() {
+ ListView serviceListView = null;
+ try {
+ serviceListView = namingService.getServicesOfServer(1, 100);
+ //启动监听
+ if (serviceListView == null || serviceListView.getCount() == 0) {
+ log.info("【Nacos服务列表定时刷新】当前无任何可添加监听的服务");
+ return;
+ }
+ List serviceList = serviceListView.getData();
+ log.info("【Nacos服务列表定时刷新】Nacos服务端服务列表: {}", serviceList);
+
+ for (String service : serviceList) {
+ try {
+
+ // 如果该服务已经在监听列表中存在了,则不再注册监听。注:不能取消空服务的监听,因为空服务随时可能恢复运行,需要实时监听。
+ if (observingServers.contains(service)) {
+ continue;
+ }
+
+ namingService.subscribe(service, new EventListener() {
+ @Override
+ public void onEvent(Event event) {
+ if (event instanceof NamingEvent) {
+ NamingEvent namingEvent = (NamingEvent) event;
+ log.info("【Nacos服务列表刷新监听】收到事件:{}:[{}]", namingEvent.getServiceName(), namingEvent.getInstances());
+ doRefreshServerList(service);
+ }
+ }
+ });
+
+ // 将该服务加入到监听列表中
+ observingServers.add(service);
+ } catch (NacosException e) {
+ String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
+ log.error("【Nacos服务列表定时刷新】订阅ApplicationContext的刷新事件失败,错误信息:{}", errorStackTrace);
+ }
+ }
+
+ } catch (NacosException e) {
+ String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
+ log.error("【Nacos服务列表定时刷新】链接Nacos服务端失败,错误信息:{}", errorStackTrace);
+ }
+ }
+
+ /**
+ * @param serviceName
+ * @return
+ * @description 刷新ServerList
+ * @author wxz
+ * @date 2021.09.22 09:29:16
+ */
+ private void doRefreshServerList(String serviceName) {
+ // 刷新方式1:反射调用DynamicServerListLoadBalancer中的restOfInit()方法。该方法原来只执行一次,此处不推荐用
+ //ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(serviceName);
+ //if (loadBalancer instanceof ZoneAwareLoadBalancer) {
+ // ZoneAwareLoadBalancer zaLoadBalancer = (ZoneAwareLoadBalancer) loadBalancer;
+ // IClientConfig clientConfig = springClientFactory.getClientConfig(serviceName);
+ // try {
+ // Method restOfInitMethod = zaLoadBalancer.getClass().getSuperclass().getDeclaredMethod(REFRESH_SERVER_LIST_METHOD_NAME, IClientConfig.class);
+ // restOfInitMethod.setAccessible(true);
+ // restOfInitMethod.invoke(zaLoadBalancer, clientConfig);
+ // } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+ // String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
+ // log.error("【LoadBalancer刷新服务列表】失败:{}", errorStackTrace);
+ // }
+ //}
+
+ // 刷新方式2:DynamicServerListLoadBalancer#updateListOfServers()该方法为ribbon定时刷新服务列表的时候真正调用的方法,但是加了@VisibleForTesting
+ // 暂且 1 try
+ ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(serviceName);
+ if (loadBalancer instanceof DynamicServerListLoadBalancer) {
+ DynamicServerListLoadBalancer dslb = (DynamicServerListLoadBalancer) loadBalancer;
+ dslb.updateListOfServers();
+ }
+ }
+ }
+
+}
diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml
index dfd051a5d6..aaa119e446 100644
--- a/epmet-gateway/src/main/resources/bootstrap.yml
+++ b/epmet-gateway/src/main/resources/bootstrap.yml
@@ -358,6 +358,8 @@ spring:
#不把自己注册到注册中心的地址
register-enabled: @nacos.register-enabled@
ip: @nacos.ip@
+ serviceListChangedListening:
+ enable: @nacos.service-list-changed-listening.enable@
config:
enabled: @nacos.config-enabled@
server-addr: @nacos.server-addr@
diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/constant/TDuckConstant.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/constant/TDuckConstant.java
new file mode 100644
index 0000000000..87ef2de7cb
--- /dev/null
+++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/constant/TDuckConstant.java
@@ -0,0 +1,17 @@
+package com.epmet.dataaggre.constant;
+
+/**
+ * @Author zxc
+ * @DateTime 2021/9/23 4:06 下午
+ * @DESC
+ */
+public interface TDuckConstant {
+
+ String CLIENT_GOV = "gov";
+ String CLIENT_RESI = "resi";
+
+ String ORG_TYPE_AGENCY = "agency";
+ String ORG_TYPE_GRID = "grid";
+ String ORG_TYPE_DEPT = "dept";
+
+}
diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/form/TDuckDetailFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/form/TDuckDetailFormDTO.java
index 8796d3291b..3a9b934b69 100644
--- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/form/TDuckDetailFormDTO.java
+++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/form/TDuckDetailFormDTO.java
@@ -17,15 +17,22 @@ public class TDuckDetailFormDTO implements Serializable {
private static final long serialVersionUID = 3793280475377993346L;
public interface TDuckDetailForm{}
+ public interface PermissionValidate{}
/**
* 项目key
*/
- @NotBlank(message = "项目key不能为空",groups = TDuckDetailForm.class)
+ @NotBlank(message = "项目key不能为空",groups = { TDuckDetailForm.class, PermissionValidate.class })
private String key;
/**
* 是否显示类型
*/
@NotNull(message = "是否显示类型不能为空",groups = TDuckDetailForm.class)
private Boolean displayType;
+
+ /** 当前操作人所在的组织的类型(grid:网格,agency:单位) */
+ private String orgType;
+
+ /** 当前操作人所在的组织的ID(当orgType为grid的时候必填,为agency的时候留空) */
+ private String orgId;
}
diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/form/TDuckListFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/form/TDuckListFormDTO.java
index b8165ee2ce..83fc43fd6f 100644
--- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/form/TDuckListFormDTO.java
+++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/form/TDuckListFormDTO.java
@@ -30,11 +30,14 @@ public class TDuckListFormDTO implements Serializable {
@NotNull(message = "pageSize不能为空",groups = TDuckListForm.class)
private Integer pageSize;
- @NotBlank(message = "orgIds不能为空",groups = TDuckListForm.class)
- private String orgIds;
+ private String orgId;
+
+ private String orgType;
@NotBlank(message = "client不能为空",groups = TDuckListForm.class)
private String client;
private String userId;
+
+ private String customerId;
}
diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/result/CascaderDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/result/CascaderDTO.java
index 82904a64e9..3b5888a543 100644
--- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/result/CascaderDTO.java
+++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/result/CascaderDTO.java
@@ -29,11 +29,12 @@ public class CascaderDTO implements Serializable {
/**
* pid
*/
- private String pid;
+ private Integer pid;
/**
* 全路径名字
*/
private List labels;
+ public String pathName;
}
diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/result/ItemResDetailConcatResultDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/result/ItemResDetailConcatResultDTO.java
index f8b5acb128..8bb7fb8ccc 100644
--- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/result/ItemResDetailConcatResultDTO.java
+++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmettduck/result/ItemResDetailConcatResultDTO.java
@@ -5,9 +5,10 @@ import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
- * @Description TODO
+ * @Description 联系人组件
* @Author yinzuomei
* @Date 2021/9/22 2:54 下午
*/
@@ -15,11 +16,12 @@ import java.util.List;
public class ItemResDetailConcatResultDTO implements Serializable {
private static final long serialVersionUID = -3695200094740706700L;
private List tableHeaderList;
- private List> dataList;
+ private List