Browse Source

Merge remote-tracking branch 'remotes/origin/dev_grid_platform' into dev

dev
jianjun 4 years ago
parent
commit
39ead8e4e4
  1. 41
      epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java
  2. 33
      epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/PointOperationLogListener.java
  3. 33
      epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java
  4. 15
      epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java
  5. 13
      epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/MQUserPropertys.java
  6. 16
      epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java
  7. 27
      epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/OrgOrStaffMQMsg.java
  8. 21
      epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/StaffPatrolMQMsg.java
  9. 5
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java
  10. 13
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java
  11. 12
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
  12. 11
      epmet-gateway/pom.xml
  13. 10
      epmet-gateway/src/main/resources/bootstrap.yml
  14. 12
      epmet-module/data-statistical/data-statistical-client/pom.xml
  15. 21
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java
  16. 143
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/result/EventInfoResultDTO.java
  17. 145
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerAgencyDTO.java
  18. 129
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerGridDTO.java
  19. 103
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/GridBaseInfoDTO.java
  20. 2
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenCustomerGridDTO.java
  21. 3
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java
  22. 3
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java
  23. 29
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/param/MidPatrolFormDTO.java
  24. 182
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/GridUserInfoDTO.java
  25. 56
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolDetailResult.java
  26. 137
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolRecordResult.java
  27. 71
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java
  28. 73
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java
  29. 6
      epmet-module/data-statistical/data-statistical-server/pom.xml
  30. 105
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java
  31. 16
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java
  32. 8
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java
  33. 12
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java
  34. 2
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java
  35. 1
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java
  36. 3
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java
  37. 41
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java
  38. 73
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java
  39. 19
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerAgencyService.java
  40. 18
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerGridService.java
  41. 11
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenProjectDataService.java
  42. 33
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java
  43. 41
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java
  44. 53
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java
  45. 235
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java
  46. 7
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java
  47. 15
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java
  48. 12
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java
  49. 22
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java
  50. 9
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java
  51. 10
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/CustomerProjectCategoryDictService.java
  52. 19
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/impl/CustomerProjectCategoryDictServiceImpl.java
  53. 17
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java
  54. 21
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java
  55. 37
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml
  56. 18
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml
  57. 62
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml
  58. 5
      epmet-module/epmet-job/epmet-job-server/pom.xml
  59. 23
      epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerService.java
  60. 22
      epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerServiceImpl.java
  61. 25
      epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/BlockedMQSystemMessageScanner.java
  62. 25
      epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/PenddingMQSystemMessageScanner.java
  63. 50
      epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java
  64. 13
      epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/SystemMsgFormDTO.java
  65. 24
      epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/EpmetMessageOpenFeignClient.java
  66. 10
      epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/fallback/EpmetMessageOpenFeignClientFallback.java
  67. 60
      epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java
  68. 40
      epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java
  69. 35
      epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/SystemMessagePenddingDao.java
  70. 61
      epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/entity/SystemMessagePenddingEntity.java
  71. 30
      epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java
  72. 207
      epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java
  73. 14
      epmet-module/epmet-message/epmet-message-server/src/main/resources/db/migration/V0.3.18__create_sys_msg_pendding.sql
  74. 26
      epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/SystemMessagePenddingDao.xml
  75. 35
      epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java
  76. 5
      epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/DeleteGridFormDTO.java
  77. 3
      epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/EditGridFormDTO.java
  78. 4
      epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/RemoveAgencyFormDTO.java
  79. 6
      epmet-module/gov-org/gov-org-server/pom.xml
  80. 1
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java
  81. 2
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/GridController.java
  82. 34
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java
  83. 53
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java
  84. 34
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerGridServiceImpl.java
  85. 21
      epmet-module/open-data-worker/open-data-worker-client/pom.xml
  86. 207
      epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseDisputeProcessDTO.java
  87. 136
      epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridInfoDTO.java
  88. 191
      epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridUserDTO.java
  89. 34
      epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/GridBaseInfoFormDTO.java
  90. 33
      epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/StaffBaseInfoFormDTO.java
  91. 33
      epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java
  92. 11
      epmet-module/open-data-worker/open-data-worker-server/Dockerfile
  93. 18
      epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-dev.yml
  94. 18
      epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-prod.yml
  95. 18
      epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-test.yml
  96. 282
      epmet-module/open-data-worker/open-data-worker-server/pom.xml
  97. 26
      epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/OpenDataApplication.java
  98. 40
      epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/aspect/RequestLogAspect.java
  99. 26
      epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/ModuleConfigImpl.java
  100. 161
      epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/NacosServiceListListenerRegisterer.java

41
epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java

@ -2,22 +2,19 @@ package com.epmet.mq.listener.listener;
import com.alibaba.fastjson.JSON;
import com.epmet.auth.constants.AuthOperationEnum;
import com.epmet.commons.rocketmq.constants.MQUserPropertys;
import com.epmet.commons.rocketmq.messages.LoginMQMsg;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.feign.ResultDataResolver;
import com.epmet.commons.tools.utils.IpUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.utils.SpringContextUtils;
import com.epmet.dto.CustomerStaffDTO;
import com.epmet.entity.LogOperationEntity;
import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.mq.listener.bean.log.LogOperationHelper;
import com.epmet.mq.listener.bean.log.OperatorInfo;
import com.epmet.service.LogOperationService;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
@ -40,8 +37,15 @@ public class AuthOperationLogListener implements MessageListenerConcurrently {
private Logger logger = LoggerFactory.getLogger(getClass());
private RedisUtils redisUtils;
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
if (redisUtils == null) {
redisUtils = SpringContextUtils.getBean(RedisUtils.class);
}
try {
msgs.forEach(msg -> consumeMessage(msg));
} catch (Exception e) {
@ -54,6 +58,7 @@ public class AuthOperationLogListener implements MessageListenerConcurrently {
private void consumeMessage(MessageExt messageExt) {
String tags = messageExt.getTags();
String msg = new String(messageExt.getBody());
String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL);
logger.info("认证操作日志监听器-收到消息内容:{}", msg);
LoginMQMsg msgObj = JSON.parseObject(msg, LoginMQMsg.class);
@ -91,5 +96,27 @@ public class AuthOperationLogListener implements MessageListenerConcurrently {
} finally {
distributedLock.unLock(lock);
}
if (StringUtils.isNotBlank(pendingMsgLabel)) {
try {
removePendingMqMsgCache(pendingMsgLabel);
} catch (Exception e) {
logger.error("【登录操作事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e));
}
}
}
/**
* @description
*
* @param pendingMsgLabel
* @return
* @author wxz
* @date 2021.10.14 16:32:32
*/
private void removePendingMqMsgCache(String pendingMsgLabel) {
String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel);
redisUtils.delete(key);
//logger.info("【登录操作事件监听器】删除pendingMsgLabel成功:{}", pendingMsgLabel);
}
}

33
epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/PointOperationLogListener.java

@ -1,10 +1,13 @@
package com.epmet.mq.listener.listener;
import com.alibaba.fastjson.JSON;
import com.epmet.commons.rocketmq.constants.MQUserPropertys;
import com.epmet.commons.rocketmq.messages.PointRuleChangedMQMsg;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.utils.SpringContextUtils;
import com.epmet.entity.LogOperationEntity;
import com.epmet.enums.SystemMessageTypeEnum;
@ -34,8 +37,15 @@ public class PointOperationLogListener implements MessageListenerConcurrently {
private Logger logger = LoggerFactory.getLogger(getClass());
private RedisUtils redisUtils;
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
if (redisUtils == null) {
redisUtils = SpringContextUtils.getBean(RedisUtils.class);
}
try {
msgs.forEach(msg -> consumeMessage(msg));
} catch (Exception e) {
@ -48,6 +58,7 @@ public class PointOperationLogListener implements MessageListenerConcurrently {
private void consumeMessage(MessageExt messageExt) {
String opeType = messageExt.getTags();
String msg = new String(messageExt.getBody());
String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL);
logger.info("积分操作日志监听器-收到消息内容:{}", msg);
PointRuleChangedMQMsg msgObj = JSON.parseObject(msg, PointRuleChangedMQMsg.class);
@ -87,5 +98,27 @@ public class PointOperationLogListener implements MessageListenerConcurrently {
} finally {
distributedLock.unLock(lock);
}
if (StringUtils.isNotBlank(pendingMsgLabel)) {
try {
removePendingMqMsgCache(pendingMsgLabel);
} catch (Exception e) {
logger.error("【积分操作事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e));
}
}
}
/**
* @description
*
* @param pendingMsgLabel
* @return
* @author wxz
* @date 2021.10.14 16:32:32
*/
private void removePendingMqMsgCache(String pendingMsgLabel) {
String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel);
redisUtils.delete(key);
//logger.info("【积分操作事件监听器】删除pendingMsgLabel成功{}", pendingMsgLabel);
}
}

33
epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java

@ -1,11 +1,14 @@
package com.epmet.mq.listener.listener;
import com.alibaba.fastjson.JSON;
import com.epmet.commons.rocketmq.constants.MQUserPropertys;
import com.epmet.commons.rocketmq.messages.LoginMQMsg;
import com.epmet.commons.rocketmq.messages.ProjectChangedMQMsg;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.utils.SpringContextUtils;
import com.epmet.entity.LogOperationEntity;
import com.epmet.mq.listener.bean.log.LogOperationHelper;
@ -34,8 +37,15 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently
private Logger logger = LoggerFactory.getLogger(getClass());
private RedisUtils redisUtils;
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
if (redisUtils == null) {
redisUtils = SpringContextUtils.getBean(RedisUtils.class);
}
try {
msgs.forEach(msg -> consumeMessage(msg));
} catch (Exception e) {
@ -48,6 +58,7 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently
private void consumeMessage(MessageExt messageExt) {
//String tags = messageExt.getTags();
String msg = new String(messageExt.getBody());
String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL);
logger.info("项目变动操作日志监听器-收到消息内容:{}", msg);
ProjectChangedMQMsg msgObj = JSON.parseObject(msg, ProjectChangedMQMsg.class);
@ -87,6 +98,14 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently
} finally {
distributedLock.unLock(lock);
}
if (StringUtils.isNotBlank(pendingMsgLabel)) {
try {
removePendingMqMsgCache(pendingMsgLabel);
} catch (Exception e) {
logger.error("【项目操作事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e));
}
}
}
private String getOperationTypeDisplay(String type) {
@ -107,4 +126,18 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently
return null;
}
}
/**
* @description
*
* @param pendingMsgLabel
* @return
* @author wxz
* @date 2021.10.14 16:32:32
*/
private void removePendingMqMsgCache(String pendingMsgLabel) {
String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel);
redisUtils.delete(key);
//logger.info("【项目操作事件监听器】删除pendingMsgLabel成功{}", pendingMsgLabel);
}
}

15
epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java

@ -45,4 +45,19 @@ public interface ConsomerGroupConstants {
*/
String POINT_OPERATION_LOG_GROUP = "point_operation_log_group";
/**
* 开放的对接数据(中间库) 组织变更事件监听器分组
*/
String OPEN_DATA_ORG_CHANGE_EVENT_LISTENER_GROUP = "open_data_org_change_event_listener_group";
/**
* 开放的对接数据(中间库) 工作人员变更事件监听器分组
*/
String OPEN_DATA_STAFF_CHANGE_EVENT_LISTENER_GROUP = "open_data_staff_change_event_listener_group";
/**
* 开放的对接数据(中间库) 巡查记录变更事件监听器分组
*/
String OPEN_DATA_PATROL_CHANGE_EVENT_LISTENER_GROUP = "open_data_patrol_change_event_listener_group";
}

13
epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/MQUserPropertys.java

@ -0,0 +1,13 @@
package com.epmet.commons.rocketmq.constants;
/**
* @Description MQ用户自定义属性
* @author wxz
* @date 2021.10.14 15:47:03
*/
public interface MQUserPropertys {
//阻塞消息label
String BLOCKED_MSG_LABEL = "blockedMsgLabel";
}

16
epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java

@ -13,6 +13,7 @@ public interface TopicConstants {
* 项目变动
*/
String PROJECT_CHANGED = "project_changed";
/**
* 小组成就
*/
@ -27,4 +28,19 @@ public interface TopicConstants {
* 积分系统话题
*/
String POINT = "point";
/**
* 组织信息
*/
String ORG = "org";
/**
* 工作人员
*/
String STAFF = "staff";
/**
* 巡查记录
*/
String PATROL = "patrol";
}

27
epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/OrgOrStaffMQMsg.java

@ -0,0 +1,27 @@
package com.epmet.commons.rocketmq.messages;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 组织网格人员中间库数据上报MQ
* @author sun
*/
@Data
public class OrgOrStaffMQMsg implements Serializable {
//客户Id
private String customerId;
//组织、网格、人员Id
private String orgId;
//数据类型【组织:agency 网格:grid 人员:staff】
private String orgType;
//操作类型【组织新增:agency_create 组织变更:agency_change 网格新增:grid_create 网格变更:grid_change 人员新增:staff_create 人员变更:staff_change】
private String type;
}

21
epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/StaffPatrolMQMsg.java

@ -0,0 +1,21 @@
package com.epmet.commons.rocketmq.messages;
import lombok.Data;
/**
* 用户巡查消息体
* @author liujianjun
*/
@Data
public class StaffPatrolMQMsg {
/**
* 客户Id
*/
private String customerId;
/**
* 巡查记录id
*/
private String patrolId;
}

5
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/StrConstant.java

@ -44,6 +44,11 @@ public interface StrConstant {
*/
String COLON = ":";
/**
* 英文分号
*/
String SEMICOLON = ";";
/**
* 中文顿号
*/

13
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/PageFormDTO.java

@ -20,8 +20,17 @@ public class PageFormDTO {
}
@NotNull(message = "页码不能为空", groups = AddUserInternalGroup.class)
private Integer pageNo;
private Integer pageNo = 1;
@NotNull(message = "每页数量不能为空", groups = AddUserInternalGroup.class)
private Integer pageSize;
private Integer pageSize = 20;
/**
* 偏移量 从多少条开始
*/
private Integer offset;
public Integer getOffset() {
return (pageNo-1)*pageSize;
}
}

12
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java

@ -547,4 +547,16 @@ public class RedisKeys {
public static String getQuestionnaireAccessKey(String userId, String qKey) {
return rootPrefix.concat("questionnaire:accesskey:").concat(userId).concat(":").concat(qKey);
}
/**
* @description 检查message MQ阻塞消息
*
* @param blockedMsgLabel 滞留消息的label
* @return
* @author wxz
* @date 2021.10.14 14:33:53
*/
public static String blockedMqMsgKey(String blockedMsgLabel) {
return rootPrefix.concat("message:mq:blocked:").concat(blockedMsgLabel);
}
}

11
epmet-gateway/pom.xml

@ -223,6 +223,9 @@
<!-- 35、多数据源服务 -->
<gateway.routes.data-aggregator-server.url>lb://data-aggregator-server</gateway.routes.data-aggregator-server.url>
<!-- <gateway.routes.data-aggregator-server.url>http://127.0.0.1:8114</gateway.routes.data-aggregator-server.url>-->
<!-- 36、中间库服务 -->
<gateway.routes.open-data-worker-server.url>lb://open-data-worker-server</gateway.routes.open-data-worker-server.url>
<!--<gateway.routes.open-data-worker-server.url>http://127.0.0.1:8117</gateway.routes.open-data-worker-server.url>-->
<!--宣传服务-->
<gateway.routes.epmet-openapi-adv-server.url>lb://epmet-openapi-adv-server</gateway.routes.epmet-openapi-adv-server.url>
@ -361,6 +364,10 @@
<gateway.routes.data-aggregator-server.url>lb://data-aggregator-server</gateway.routes.data-aggregator-server.url>
<!-- <gateway.routes.data-aggregator-server.url>http://127.0.0.1:8114</gateway.routes.data-aggregator-server.url>-->
<!-- 36、中间库服务 -->
<!-- <gateway.routes.open-data-worker-server.url>lb://open-data-worker-server</gateway.routes.open-data-worker-server.url>-->
<gateway.routes.open-data-worker-server.url>http://127.0.0.1:8117</gateway.routes.open-data-worker-server.url>
<!--宣传服务-->
<gateway.routes.epmet-openapi-adv-server.url>lb://epmet-openapi-adv-server</gateway.routes.epmet-openapi-adv-server.url>
<!--<gateway.routes.epmet-openapi-adv-server.url>http://localhost:8115</gateway.routes.epmet-openapi-adv-server.url>-->
@ -469,6 +476,8 @@
<gateway.routes.data-aggregator-server.url>lb://data-aggregator-server</gateway.routes.data-aggregator-server.url>
<!--问卷服务-->
<gateway.routes.tduck-api.url>lb://tduck-api</gateway.routes.tduck-api.url>
<!-- 36、中间库服务 -->
<gateway.routes.open-data-worker-server.url>lb://open-data-worker-server</gateway.routes.open-data-worker-server.url>
<!--宣传服务-->
<gateway.routes.epmet-openapi-adv-server.url>lb://epmet-openapi-adv-server</gateway.routes.epmet-openapi-adv-server.url>
@ -570,6 +579,8 @@
<gateway.routes.epmet-ext-server.url>lb://epmet-ext-server</gateway.routes.epmet-ext-server.url>
<!-- 35、多数据源服务 -->
<gateway.routes.data-aggregator-server.url>lb://data-aggregator-server</gateway.routes.data-aggregator-server.url>
<!-- 36、中间库服务 -->
<gateway.routes.open-data-worker-server.url>lb://open-data-worker-server</gateway.routes.open-data-worker-server.url>
<!--宣传服务-->
<gateway.routes.epmet-openapi-adv-server.url>lb://epmet-openapi-adv-server</gateway.routes.epmet-openapi-adv-server.url>

10
epmet-gateway/src/main/resources/bootstrap.yml

@ -350,6 +350,16 @@ spring:
filters:
- StripPrefix=1
- CpAuth=true
#政府工作端议题管理
- id: open-data-worker-server
uri: @gateway.routes.gov-issue-server.uri@
order: 38
predicates:
- Path=${server.servlet.context-path}/opendata/**
filters:
- StripPrefix=1
- CpAuth=true
nacos:
discovery:
server-addr: @nacos.server-addr@

12
epmet-module/data-statistical/data-statistical-client/pom.xml

@ -17,6 +17,18 @@
<artifactId>epmet-commons-tools</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>open-data-worker-client</artifactId>
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>open-data-worker-client</artifactId>
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

21
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/form/EventInfoFormDTO.java

@ -0,0 +1,21 @@
package com.epmet.dto.basereport.form;
import lombok.Data;
import java.io.Serializable;
/**
* @Description
* @Author zhaoqifeng
* @Date 2021/10/15 10:55
*/
@Data
public class EventInfoFormDTO implements Serializable {
private static final long serialVersionUID = 8479649048108914555L;
private String customerId;
private String projectId;
/**
* 操作类型新增:add 修改删除:edit
*/
private String type;
}

143
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/basereport/result/EventInfoResultDTO.java

@ -0,0 +1,143 @@
package com.epmet.dto.basereport.result;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description
* @Author zhaoqifeng
* @Date 2021/10/15 10:57
*/
@Data
public class EventInfoResultDTO implements Serializable {
private static final long serialVersionUID = -6483163020737762044L;
/**
* 客户Id
*/
private String customerId;
/**
* 网格编码
*/
private String orgCode;
/**
* 网格名称
*/
private String orgName;
/**
* 事件名称
*/
private String eventName;
/**
* 事件类别
*/
private String eventCategory;
/**
* 上报时间 YYYY-MM-DD HH:MM:SS
*/
private Date reportTime;
/**
* 发生时间 格式为YYYY-MM-DD
*/
private Date happenDate;
/**
* 发生地点
*/
private String happenPlace;
/**
* 事件简述
*/
private String eventDescription;
/**
* 办结方式 01自办02上报 源于居民端的最终结案的项目为02工作端立项的项目最终结案的01
*/
private String waysOfResolving;
/**
* 是否办结 YN
*/
private String successfulOrNo;
/**
* 办结层级01省自治区直辖市02地盟03县旗04乡镇街道05片区06村社区07网格
*/
private String completeLevel;
/**
* 基础信息主键
*/
private String baseInfoId;
/**
* 办结时间
*/
private Date completeTime;
/**
* 经度
*/
private BigDecimal lng;
/**
* 纬度
*/
private BigDecimal lat;
/**
* 主要当事人姓名
*/
private String name;
/**
* 涉及人数
*/
private Integer numberInvolved;
/**
* 涉及单位
*/
private String relatedUnits;
/**
* 重点场所类别 01九小场所, 02公共场所
*/
private String keyAreaType;
/**
* 宗教活动规模 01 0-50人,02 51-200人,03 201人以上
*/
private String religionScale;
/**
* 宗教类别 01道教 02佛教 03基督教 04伊斯兰教 05其他
*/
private String religionType;
/**
* 重点场所是否变动 YN
*/
private String isKeyareaState;
/**
* 重点人员是否在当地 YN
*/
private String isKeypeopleLocate;
/**
* 重点人员现状
*/
private String keypeopleStatus;
}

145
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerAgencyDTO.java

@ -0,0 +1,145 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.dto.org.result;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 机关单位信息表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2020-04-20
*/
@Data
public class CustomerAgencyDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* ID
*/
private String id;
/**
* 客户ID
*/
private String customerId;
/**
* 上级组织机构ID
*/
private String pid;
/**
* 所有上级组织机构ID(以英文:隔开)
*/
private String pids;
/**
* 所有上级名称,-连接
*/
private String allParentName;
/**
* 组织名称
*/
private String organizationName;
/**
* 机关级别社区级community
街道:street,
区县级: district,
市级: city
省级:province 机关级别社区级community街道:street,区县级: district,市级: city省级:province
*/
private String level;
/**
* 地区编码
*/
private String areaCode;
/**
* 删除标识
*/
private String delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
* 创建人
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdTime;
/**
* 更新人
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedTime;
/**
* 总人数
*/
private Integer totalUser;
/**
*
*/
private String province;
/**
*
*/
private String city;
/**
* 区县
*/
private String district;
/**
* 当前组织的上级行政地区编码add0204;举例平阴县对应的是济南市3701
*/
private String parentAreaCode;
/**
* 街道
*/
private String street;
/**
* 社区
*/
private String community;
}

129
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/CustomerGridDTO.java

@ -0,0 +1,129 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.dto.org.result;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 客户网格表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2020-03-16
*/
@Data
public class CustomerGridDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* ID 唯一标识
*/
private String id;
/**
* 客户ID
*/
private String customerId;
/**
* 网格名称
*/
private String gridName;
/** 组织-网格 */
private String gridNamePath;
/**
* 中心位置经度
*/
private String longitude;
/**
* 中心位置纬度
*/
private String latitude;
/**
* 所属地区码所属组织地区码
*/
private String areaCode;
/**
* 删除标识:0.未删除 1.已删除
*/
private Integer delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
* 创建人
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdTime;
/**
* 更新人
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedTime;
/**
* 管辖区域
*/
private String manageDistrict;
/**
* 当前网格总人数
*/
private Integer totalUser;
/**
* 所属组织机构IDcustomer_organization.id
*/
private String pid;
/**
* 所有上级组织ID
*/
private String pids;
/**
* 所属组织机构名
*/
private String agencyName;
/**
* 所有上级组织名
*/
private String allParentName;
}

103
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/org/result/GridBaseInfoDTO.java

@ -0,0 +1,103 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.dto.org.result;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 网格员基础信息表
*/
@Data
public class GridBaseInfoDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 网格Id
*/
private String gridId;
/**
* 工作人员Id
*/
private String staffId;
/**
* 客户Id
*/
private String customerId;
/**
* 网格编码
*/
private String code;
/**
* 网格名称
*/
private String gridName;
/**
* 网格员姓名
*/
private String GRID_LEVEL;
/**
* 专属网格类型[01:党政机关; 02:医院; 03:学校; 04:企业; 05:园区; 06:商圈; 07:市场; 08:景区;
*/
private String GRID_TYPE;
/**
* 网格内人口规模[01:500人以下含500人; 02:500-1000人含1000人; 03:1000-1500人含1500人; 04:1500人以上]
*/
private String POPULATION_SIZE;
/**
* 是否成立网格党支部或网格党小组[YN]
*/
private String IS_PARTY_BRANCH;
/**
* 网格党组织类型[01:网格党支部; 02:网格党小组]
*/
private String PARTY_BRANCH_TYPE;
/**
* 中心点质心经度
*/
private String LNG;
/**
* 中心点质心纬度
*/
private String LAT;
/**
* 网格颜色
*/
private Date GRID_COLOR;
/**
* 空间范围
*/
private String SHAPE;
}

2
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenCustomerGridDTO.java

@ -43,7 +43,7 @@ public class ScreenCustomerGridDTO implements Serializable {
* 客户id
*/
private String customerId;
private String code;
/**
* 网格id
*/

3
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/ScreenProjectDataDTO.java

@ -170,7 +170,7 @@ public class ScreenProjectDataDTO implements Serializable {
/**
* 结案日期
*/
private String closeCaseTime;
private Date closeCaseTime;
/**
* 数据更新至: yyyy|yyyMM|yyyyMMdd
@ -196,4 +196,5 @@ public class ScreenProjectDataDTO implements Serializable {
* fact_origin_project_main_daily.grid_id对应的网格名称
*/
private String tempGridName;
}

3
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/ScreenProjectDataInfoFormDTO.java

@ -115,7 +115,8 @@ public class ScreenProjectDataInfoFormDTO implements Serializable {
/**
* 结案日期
*/
private String closeCaseTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date closeCaseTime;
/**
* 所有上级ID用英文逗号分开

29
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/param/MidPatrolFormDTO.java

@ -0,0 +1,29 @@
package com.epmet.dto.user.param;
import com.epmet.commons.tools.dto.form.PageFormDTO;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* desc:查询巡查 参数
*
* @author zhaoqifeng
* @dscription
* @date 2021/6/7 16:23
*/
@NoArgsConstructor
@Data
public class MidPatrolFormDTO extends PageFormDTO implements Serializable {
private static final long serialVersionUID = 4411051728689886810L;
/**
* 客户Id
*/
private String customerId;
/**
* 巡查记录id 没有则查询全部
*/
private String patrolId;
}

182
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/GridUserInfoDTO.java

@ -0,0 +1,182 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.dto.user.result;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 网格员基础信息表
*/
@Data
public class GridUserInfoDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 网格Id
*/
private String gridId;
/**
* 工作人员Id
*/
private String staffId;
/**
* 客户Id
*/
private String customerId;
/**
* 网格编码
*/
private String code;
/**
* 网格名称
*/
private String gridName;
/**
* 网格员姓名
*/
private String nickName;
/**
* 专属网格类型[01:党政机关; 02:医院; 03:学校; 04:企业; 05:园区; 06:商圈; 07:市场; 08:景区;
*/
private String cardNum;
/**
* 网格员类型[01:专职网格员; 02:兼职网格员; 03:网格长; 04:综治机构人员; 05:职能部门人员]
*/
private String userType;
/**
* 手机号码
*/
private String phonenumber;
/**
* 性别[1:男性; 2:女性; 9:未说明的性别]
*/
private String sex;
/**
* 民族[字典表主键]
*/
private String nation;
/**
* 政治面貌[字典表主键]
*/
private String paerty;
/**
* 出生日期[YYYY-MM-DD]
*/
private Date birthday;
/**
* 学历[字典表主键]
*/
private String education;
/**
* 入职时间
*/
private Date entryDate;
/**
* 是否离职
*/
private String isLeave;
/**
* 离职时间
*/
private Date leaveDate;
/**
* 网格员年收入
*/
private String income;
/**
* 是否社区两委委员[YN]
*/
private String isCommittee;
/**
* 是否社区工作者[YN]
*/
private String isCommunityWorkers;
/**
* 是否社会工作者[YN]
*/
private String isSocialWorker;
/**
* 是否村民小组长[YN
*/
private String isVillageLeader;
/**
* 是否警务助理[YN]
*/
private String isPoliceAssistant;
/**
* 是否人民调解员[YN]
*/
private String isMediator;
/**
* 删除标识 0.未删除 1.已删除
*/
private Integer delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
* 创建人
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdTime;
/**
* 更新人
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedTime;
}

56
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolDetailResult.java

@ -0,0 +1,56 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.dto.user.result;
import lombok.Data;
import java.io.Serializable;
/**
* 工作人员巡查明细记录
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2021-06-07
*/
@Data
public class MidPatrolDetailResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private String id;
/**
* 客户Id
*/
private String customerId;
/**
* 维度
*/
private String latitude;
/**
* 经度
*/
private String longitude;
}

137
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/user/result/MidPatrolRecordResult.java

@ -0,0 +1,137 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.dto.user.result;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 工作人员巡查主记录
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2021-06-07
*/
@Data
public class MidPatrolRecordResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private String id;
/**
* 客户Id
*/
private String customerId;
/**
* 网格id
*/
private String grid;
/**
* 网格所有上级id
*/
private String gridPids;
/**
* 工作人员用户id
*/
private String staffId;
/**
* 工作人员所属组织id=网格所属的组织id
*/
private String agencyId;
/**
* 巡查开始时间
*/
private Date patrolStartTime;
/**
* 巡查结束时间,前端传入
*/
private Date patrolEndTime;
/**
* 实际结束时间=操作结束巡查的时间
*/
private Date actrualEndTime;
/**
* 本次巡查总耗时单位秒结束巡查时写入
*/
private Integer totalTime;
/**
* 正在巡查中patrolling结束end
*/
private String status;
/**
* 删除标识 0.未删除 1.已删除
*/
private Integer delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
* 创建人
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdTime;
/**
* 更新人
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedTime;
/**
* 维度
*/
private String latitude;
/**
* 精度
*/
private String longitude;
/**
* 经纬度组合成的路线 经度,维度;
*/
private String route;
}

71
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/DataStatisticalOpenFeignClient.java

@ -3,17 +3,31 @@ package com.epmet.feign;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.StatsFormDTO;
import com.epmet.dto.extract.form.*;
import com.epmet.dto.basereport.form.EventInfoFormDTO;
import com.epmet.dto.extract.form.BizDataFormDTO;
import com.epmet.dto.extract.form.ExtractIndexFormDTO;
import com.epmet.dto.extract.form.ExtractOriginFormDTO;
import com.epmet.dto.extract.form.ExtractScreenFormDTO;
import com.epmet.dto.group.form.GroupStatsFormDTO;
import com.epmet.dto.group.form.GroupTotalFormDTO;
import com.epmet.dto.org.result.CustomerAgencyDTO;
import com.epmet.dto.org.result.CustomerGridDTO;
import com.epmet.dto.screen.form.InitCustomerIndexForm;
import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO;
import com.epmet.feign.impl.DataStatisticalOpenFeignClientFallBack;
import com.epmet.dto.user.param.MidPatrolFormDTO;
import com.epmet.dto.user.result.GridUserInfoDTO;
import com.epmet.dto.user.result.MidPatrolDetailResult;
import com.epmet.dto.user.result.MidPatrolRecordResult;
import com.epmet.feign.impl.DataStatisticalOpenFeignClientFallBackFactory;
import com.epmet.opendata.dto.BaseDisputeProcessDTO;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* desc: 数据统计 对外feign client
*
@ -274,4 +288,57 @@ public interface DataStatisticalOpenFeignClient {
*/
@PostMapping("/data/stats/statsgroup/groupandhottopic")
Result groupAndHotTopicTask(@RequestBody GroupTotalFormDTO formDTO);
/**
* @dscription 批量查询客户组织基础信息
* @author sun
*/
@PostMapping("/data/stats/datareporting/agencybaseinfo")
Result<List<CustomerAgencyDTO>> getAgencyBaseInfo(@RequestBody GridBaseInfoFormDTO formDTO);
/**
* @dscription 批量查询客户网格基础信息
* @author sun
*/
@PostMapping("/data/stats/datareporting/gridbaseinfo")
Result<List<CustomerGridDTO>> getGridBaseInfo(@RequestBody GridBaseInfoFormDTO formDTO);
/**
* @dscription 批量查询客户网格员基础信息
* @author sun
*/
@PostMapping("/data/stats/datareporting/staffbaseinfo")
Result<List<GridUserInfoDTO>> getStaffBaseInfo(@RequestBody StaffBaseInfoFormDTO formDTO);
/**
* 根据巡查记录id 获取巡查主记录信息
*
* @param midPatrolFormDTO
* @return
* @author yinzuomei
* @date 2021/9/10 8:56 上午
*/
@PostMapping(value = "/data/stats/datareporting/getPatrolRecordList")
Result<List<MidPatrolRecordResult>> getPatrolRecordList(@RequestBody MidPatrolFormDTO midPatrolFormDTO);
/**
* 根据巡查记录id 获取巡查轨迹明细信息
*
* @param midPatrolFormDTO
* @return
* @author yinzuomei
* @date 2021/9/10 8:56 上午
*/
@PostMapping(value = "/data/stats/datareporting/getPatrolDetailList")
Result<List<MidPatrolDetailResult>> getPatrolDetailList(@RequestBody MidPatrolFormDTO midPatrolFormDTO);
/**
* 事件上报
* @Param formDTO
* @Return {@link Result<List<BaseDisputeProcessDTO>>}
* @Author zhaoqifeng
* @Date 2021/10/15 16:50
*/
@PostMapping("/data/stats/datareporting/eventinfo")
Result<List<BaseDisputeProcessDTO>> getEventInfo(@RequestBody EventInfoFormDTO formDTO);
}

73
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/feign/impl/DataStatisticalOpenFeignClientFallBack.java

@ -4,13 +4,27 @@ import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.utils.ModuleUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.StatsFormDTO;
import com.epmet.dto.extract.form.*;
import com.epmet.dto.basereport.form.EventInfoFormDTO;
import com.epmet.dto.extract.form.BizDataFormDTO;
import com.epmet.dto.extract.form.ExtractIndexFormDTO;
import com.epmet.dto.extract.form.ExtractOriginFormDTO;
import com.epmet.dto.extract.form.ExtractScreenFormDTO;
import com.epmet.dto.group.form.GroupStatsFormDTO;
import com.epmet.dto.group.form.GroupTotalFormDTO;
import com.epmet.dto.org.result.CustomerAgencyDTO;
import com.epmet.dto.org.result.CustomerGridDTO;
import com.epmet.dto.screen.form.InitCustomerIndexForm;
import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO;
import com.epmet.dto.user.param.MidPatrolFormDTO;
import com.epmet.dto.user.result.GridUserInfoDTO;
import com.epmet.dto.user.result.MidPatrolDetailResult;
import com.epmet.dto.user.result.MidPatrolRecordResult;
import com.epmet.feign.DataStatisticalOpenFeignClient;
import org.springframework.stereotype.Component;
import com.epmet.opendata.dto.BaseDisputeProcessDTO;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import java.util.List;
/**
* desc:
@ -265,4 +279,59 @@ public class DataStatisticalOpenFeignClientFallBack implements DataStatisticalOp
public Result groupAndHotTopicTask(GroupTotalFormDTO formDTO) {
return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "groupAndHotTopic", formDTO);
}
@Override
public Result<List<CustomerAgencyDTO>> getAgencyBaseInfo(GridBaseInfoFormDTO formDTO) {
return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getAgencyBaseInfo", formDTO);
}
@Override
public Result<List<CustomerGridDTO>> getGridBaseInfo(GridBaseInfoFormDTO formDTO) {
return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getGridBaseInfo", formDTO);
}
@Override
public Result<List<GridUserInfoDTO>> getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) {
return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getStaffBaseInfo", formDTO);
}
/**
* 根据巡查记录id 获取巡查主记录信息
*
* @param midPatrolFormDTO
* @return
* @author yinzuomei
* @date 2021/9/10 8:56 上午
*/
@Override
public Result<List<MidPatrolRecordResult>> getPatrolRecordList(MidPatrolFormDTO midPatrolFormDTO) {
return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getPatrolRecordList", midPatrolFormDTO);
}
/**
* 根据巡查记录id 获取巡查轨迹明细信息
*
* @param midPatrolFormDTO
* @return
* @author yinzuomei
* @date 2021/9/10 8:56 上午
*/
@Override
public Result<List<MidPatrolDetailResult>> getPatrolDetailList(MidPatrolFormDTO midPatrolFormDTO) {
return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getPatrolDetailList", midPatrolFormDTO);
}
/**
* 事件上报
*
* @param formDTO
* @Param formDTO
* @Return {@link Result<List< BaseDisputeProcessDTO >>}
* @Author zhaoqifeng
* @Date 2021/10/15 16:50
*/
@Override
public Result<List<BaseDisputeProcessDTO>> getEventInfo(EventInfoFormDTO formDTO) {
return ModuleUtils.feignConError(ServiceConstant.DATA_STATISTICAL_SERVER, "getEventInfo", formDTO);
}
}

6
epmet-module/data-statistical/data-statistical-server/pom.xml

@ -116,6 +116,12 @@
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>open-data-worker-client</artifactId>
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

105
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DataReportingController.java

@ -0,0 +1,105 @@
package com.epmet.controller;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.dto.basereport.form.EventInfoFormDTO;
import com.epmet.dto.org.result.CustomerAgencyDTO;
import com.epmet.dto.org.result.CustomerGridDTO;
import com.epmet.dto.user.param.MidPatrolFormDTO;
import com.epmet.dto.user.result.GridUserInfoDTO;
import com.epmet.dto.user.result.MidPatrolDetailResult;
import com.epmet.dto.user.result.MidPatrolRecordResult;
import com.epmet.opendata.dto.BaseDisputeProcessDTO;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import com.epmet.service.DataReportingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @dscription 省网格化平台数据上报--数据查询
* @author sun
*/
@RequestMapping("datareporting")
@RestController
public class DataReportingController {
@Autowired
private DataReportingService dataReportingService;
/**
* @Author sun
* @Description 批量查询客户组织基础信息
**/
@PostMapping("agencybaseinfo")
public Result<List<CustomerAgencyDTO>> getAgencyBaseInfo(@RequestBody(required = false) GridBaseInfoFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO, GridBaseInfoFormDTO.Grid.class);
return new Result<List<CustomerAgencyDTO>>().ok(dataReportingService.getAgencyBaseInfo(formDTO));
}
/**
* @Author sun
* @Description 批量查询客户网格基础信息
**/
@PostMapping("gridbaseinfo")
public Result<List<CustomerGridDTO>> getGridBaseInfo(@RequestBody(required = false) GridBaseInfoFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO, GridBaseInfoFormDTO.Grid.class);
return new Result<List<CustomerGridDTO>>().ok(dataReportingService.getGridBaseInfo(formDTO));
}
/**
* @Author sun
* @Description 批量查询客户网格员基础信息
**/
@PostMapping("staffbaseinfo")
public Result<List<GridUserInfoDTO>> getStaffBaseInfo(@RequestBody(required = false) StaffBaseInfoFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO, StaffBaseInfoFormDTO.Staff.class);
return new Result<List<GridUserInfoDTO>>().ok(dataReportingService.getStaffBaseInfo(formDTO));
}
/**
* desc: 条件获取巡查主表信息
*
* @param formDTO
* @return com.epmet.commons.tools.utils.Result<java.util.List<com.epmet.dto.user.result.MidPatrolRecordResult>>
* @author LiuJanJun
* @date 2021/10/15 12:01 下午
*/
@PostMapping("getPatrolRecordList")
public Result<List<MidPatrolRecordResult>> getPatrolRecordList(@RequestBody(required = false) MidPatrolFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO, StaffBaseInfoFormDTO.Staff.class);
return new Result<List<MidPatrolRecordResult>>().ok(dataReportingService.getPatrolRecordList(formDTO));
}
/**
* desc: 条件获取巡查明细信息
*
* @param formDTO
* @return com.epmet.commons.tools.utils.Result<java.util.List<com.epmet.dto.user.result.CustomerStaffDTO>>
* @author LiuJanJun
* @date 2021/10/15 12:01 下午
*/
@PostMapping("getPatrolDetailList")
public Result<List<MidPatrolDetailResult>> getPatrolDetailList(@RequestBody(required = false) MidPatrolFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO, StaffBaseInfoFormDTO.Staff.class);
return new Result<List<MidPatrolDetailResult>>().ok(dataReportingService.getPatrolDetailList(formDTO));
}
/**
* @Description 事件上报
* @Param formDTO
* @Return {@link Result<List<BaseDisputeProcessDTO>>}
* @Author zhaoqifeng
* @Date 2021/10/15 14:09
*/
@PostMapping("eventinfo")
public Result<List<BaseDisputeProcessDTO>> getEventInfo(@RequestBody(required = false) EventInfoFormDTO formDTO) {
return new Result<List<BaseDisputeProcessDTO>>().ok(dataReportingService.getEventInfo(formDTO));
}
}

16
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/CustomerGridDao.java

@ -23,7 +23,11 @@ import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO;
import com.epmet.dto.group.result.GridIdListByCustomerResultDTO;
import com.epmet.dto.org.CustomerStaffGridDTO;
import com.epmet.dto.org.GridInfoDTO;
import com.epmet.dto.org.result.CustomerGridDTO;
import com.epmet.dto.user.result.GridUserInfoDTO;
import com.epmet.entity.org.CustomerGridEntity;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -95,4 +99,16 @@ public interface CustomerGridDao extends BaseDao<CustomerGridEntity> {
* @Description 查询客户已删除网格列表
**/
List<String> selectDelGridList(@Param("customerId") String customerId);
/**
* @Author sun
* @Description 批量查询客户网格基础信息
**/
List<CustomerGridDTO> getGridBaseInfo(GridBaseInfoFormDTO formDTO);
/**
* @Author sun
* @Description 查询工作人员所属网格信息
**/
List<GridUserInfoDTO> getStaffGrid(StaffBaseInfoFormDTO formDTO);
}

8
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/org/StatsCustomerAgencyDao.java

@ -2,9 +2,11 @@ package com.epmet.dao.org;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.AgencySubTreeDto;
import com.epmet.dto.org.result.CustomerAgencyDTO;
import com.epmet.dto.org.result.CustomerAreaCodeResultDTO;
import com.epmet.dto.org.result.OrgStaffDTO;
import com.epmet.entity.org.CustomerAgencyEntity;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -71,4 +73,10 @@ public interface StatsCustomerAgencyDao extends BaseDao<CustomerAgencyEntity> {
CustomerAgencyEntity selectByDeptId(String deptId);
CustomerAgencyEntity selecByAreaCode(@Param("customerId")String customerId, @Param("areaCode")String areaCode);
/**
* @Author sun
* @Description 批量查询客户组织基础信息
**/
List<CustomerAgencyDTO> getAgencyBaseInfo(GridBaseInfoFormDTO formDTO);
}

12
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/user/UserDao.java

@ -5,8 +5,10 @@ import com.epmet.dto.extract.form.StaffPatrolStatsFormDTO;
import com.epmet.dto.extract.result.UserPartyResultDTO;
import com.epmet.dto.screen.ScreenProjectDataDTO;
import com.epmet.dto.stats.form.GmUploadEventFormDTO;
import com.epmet.dto.user.param.MidPatrolFormDTO;
import com.epmet.dto.user.result.*;
import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -252,5 +254,15 @@ public interface UserDao {
* @author sun
*/
int saveOrUpGmUploadEvent(@Param("list") List<GmUploadEventFormDTO.DataList> list);
/**
* @Author sun
* @Description 批量查询客户网格员基础信息
**/
List<CustomerStaffDTO> getStaffBaseInfo(StaffBaseInfoFormDTO formDTO);
List<MidPatrolRecordResult> getPatrolRecordList(MidPatrolFormDTO formDTO);
List<MidPatrolDetailResult> getPatrolDetailList(MidPatrolFormDTO formDTO);
}

2
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerAgencyEntity.java

@ -92,7 +92,7 @@ public class ScreenCustomerAgencyEntity extends BaseEpmetEntity {
* 行政地区编码
*/
private String areaCode;
private String code;
private String sourceType;
/**

1
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenCustomerGridEntity.java

@ -39,6 +39,7 @@ public class ScreenCustomerGridEntity extends BaseEpmetEntity {
* 客户id
*/
private String customerId;
private String code;
/**
* 网格id

3
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenProjectDataEntity.java

@ -143,7 +143,7 @@ public class ScreenProjectDataEntity extends BaseEpmetEntity {
/**
* 结案日期
*/
private String closeCaseTime;
private Date closeCaseTime;
/**
* 数据更新至: yyyy|yyyMM|yyyyMMdd
@ -159,4 +159,5 @@ public class ScreenProjectDataEntity extends BaseEpmetEntity {
* 满意度得分
*/
private BigDecimal satisfactionScore;
}

41
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/mq/ProjectChangedCustomListener.java

@ -1,8 +1,10 @@
package com.epmet.mq;
import com.alibaba.fastjson.JSON;
import com.epmet.commons.rocketmq.constants.MQUserPropertys;
import com.epmet.commons.rocketmq.messages.ProjectChangedMQMsg;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
@ -45,12 +47,18 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
long start = System.currentTimeMillis();
try {
List<String> msgStrs = msgs.stream().map(messageExt -> new String(messageExt.getBody())).distinct().collect(Collectors.toList());
for (String msgStr : msgStrs) {
consumeMessage(msgStr);
//List<String> msgStrs = msgs.stream().map(messageExt -> new String(messageExt.getBody())).distinct().collect(Collectors.toList());
//for (String msgStr : msgStrs) {
// consumeMessage(msgStr);
//}
for (MessageExt msgExt : msgs) {
consumeMessage(msgExt);
}
} catch (Exception e) {
//失败不重发
logger.error("consumeMessage fail,msg:{}",e.getMessage());
@ -60,7 +68,10 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
private void consumeMessage(String msg) {
private void consumeMessage(MessageExt msgExt) {
String msg = new String(msgExt.getBody());
String pendingMsgLabel = msgExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL);
logger.info("receive customerId:{}", JSON.toJSONString(msg));
ProjectChangedMQMsg msgObj = JSON.parseObject(msg, ProjectChangedMQMsg.class);
if (msgObj == null){
@ -87,6 +98,14 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently
} else {
log.info("该客户的项目变动消息刚刚消费,请等待30秒,customer id:{}", msgObj.getCustomerId());
}
if (org.apache.commons.lang.StringUtils.isNotBlank(pendingMsgLabel)) {
try {
removePendingMqMsgCache(pendingMsgLabel);
} catch (Exception e) {
logger.error("【项目变动事件监听器】-删除mq滞留消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e));
}
}
}
public void consumeMessage(ProjectChangedMQMsg msgObj) {
@ -151,6 +170,20 @@ public class ProjectChangedCustomListener implements MessageListenerConcurrently
}
/**
* @description
*
* @param pendingMsgLabel
* @return
* @author wxz
* @date 2021.10.14 16:32:32
*/
private void removePendingMqMsgCache(String pendingMsgLabel) {
String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel);
redisUtils.delete(key);
//logger.info("【项目变动事件监听器】删除mq阻塞消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel);
}
/*@Override
public ConsumerConfigProperties getConsumerProperty() {
ConsumerConfigProperties configProperties = new ConsumerConfigProperties();

73
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/DataReportingService.java

@ -0,0 +1,73 @@
package com.epmet.service;
import com.epmet.dto.basereport.form.EventInfoFormDTO;
import com.epmet.dto.basereport.result.EventInfoResultDTO;
import com.epmet.dto.org.result.CustomerAgencyDTO;
import com.epmet.dto.org.result.CustomerGridDTO;
import com.epmet.dto.user.param.MidPatrolFormDTO;
import com.epmet.dto.user.result.GridUserInfoDTO;
import com.epmet.dto.user.result.MidPatrolDetailResult;
import com.epmet.dto.user.result.MidPatrolRecordResult;
import com.epmet.opendata.dto.BaseDisputeProcessDTO;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import java.util.List;
/**
* @dscription 省网格化平台数据上报--数据查询
* @author sun
*/
public interface DataReportingService {
/**
* @Author sun
* @Description 批量查询客户组织基础信息
*
* @return*/
List<CustomerAgencyDTO> getAgencyBaseInfo(GridBaseInfoFormDTO formDTO);
/**
* @Author sun
* @Description 批量查询客户网格基础信息
*
* @return*/
List<CustomerGridDTO> getGridBaseInfo(GridBaseInfoFormDTO formDTO);
/**
* @Author sun
* @Description 批量查询客户网格员基础信息
*
* @return*/
List<GridUserInfoDTO> getStaffBaseInfo(StaffBaseInfoFormDTO formDTO);
/**
* desc: 获取巡查记录列表
*
* @param formDTO
* @return java.util.List<com.epmet.dto.user.result.CustomerStaffDTO>
* @author LiuJanJun
* @date 2021/10/15 1:21 下午
*/
List<MidPatrolRecordResult> getPatrolRecordList(MidPatrolFormDTO formDTO);
/**
* desc: 获取巡查明细列表
*
* @param formDTO
* @return java.util.List<com.epmet.dto.user.result.MidPatrolDetailResult>
* @author LiuJanJun
* @date 2021/10/15 1:22 下午
*/
List<MidPatrolDetailResult> getPatrolDetailList(MidPatrolFormDTO formDTO);
/**
* 事件上报
* @Param formDTO
* @Return {@link List<EventInfoResultDTO>}
* @Author zhaoqifeng
* @Date 2021/10/15 14:10
*/
List<BaseDisputeProcessDTO> getEventInfo(EventInfoFormDTO formDTO);
}

19
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerAgencyService.java

@ -17,6 +17,7 @@
package com.epmet.service.evaluationindex.screen;
import com.epmet.commons.mybatis.service.BaseService;
import com.epmet.dto.CustomerAgencyDTO;
import com.epmet.dto.extract.form.PartyBaseInfoFormDTO;
import com.epmet.dto.extract.form.ScreenPartyBranchDataFormDTO;
@ -35,7 +36,7 @@ import java.util.Map;
* @author generator generator@elink-cn.com
* @since v1.0.0 2020-09-22
*/
public interface ScreenCustomerAgencyService{
public interface ScreenCustomerAgencyService extends BaseService<ScreenCustomerAgencyEntity> {
/**
* @Description 根据agencyId查询所有子级agencyId当机关的级别为 community时所有子级为gridId
@ -137,5 +138,21 @@ public interface ScreenCustomerAgencyService{
* @author sun
*/
List<CustomerAgencyDTO> getByCustomerId(String customerId);
/**
* @Description 根据ID获取组织
* @Param agencyId
* @Return {@link ScreenCustomerAgencyEntity}
* @Author zhaoqifeng
* @Date 2021/10/15 15:44
*/
ScreenCustomerAgencyEntity getAgencyById(String agencyId);
/**
* @Description 获取组织列表
* @Param customerId
* @Return {@link Map< String, ScreenCustomerAgencyEntity>}
* @Author zhaoqifeng
* @Date 2021/10/15 15:44
*/
Map<String, ScreenCustomerAgencyEntity> getAgencyList(String customerId);
}

18
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerGridService.java

@ -28,6 +28,7 @@ import com.epmet.entity.evaluationindex.screen.ScreenCustomerGridEntity;
import com.epmet.entity.org.CustomerGridEntity;
import java.util.List;
import java.util.Map;
/**
* 网格(党支部)信息
@ -111,4 +112,21 @@ public interface ScreenCustomerGridService extends BaseService<ScreenCustomerGri
List<ScreenProjectGridDailyDTO> selectGridInfoList(String customerId, String pids);
List<ScreenCustomerGridEntity> selectEntityByAgencyId(String customerId, String parentAgencyId);
/**
* @Description 根据ID获取网格
* @Param gridId
* @Return {@link ScreenCustomerGridDTO}
* @Author zhaoqifeng
* @Date 2021/10/15 15:50
*/
ScreenCustomerGridDTO getGridById(String gridId);
/**
* @Description 获取网格列表
* @Param customerId
* @Return {@link Map<String, ScreenCustomerGridDTO>}
* @Author zhaoqifeng
* @Date 2021/10/15 15:50
*/
Map<String, ScreenCustomerGridDTO> getGridList(String customerId);
}

11
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenProjectDataService.java

@ -127,4 +127,15 @@ public interface ScreenProjectDataService extends BaseService<ScreenProjectDataE
void insertOrUpdateBatch(String customerId,String dateId,List<ScreenProjectDataDTO> meta,List<ScreenProjectDataDTO> orient);
int updateProjectSatisfactionScore(String projectId, BigDecimal calProjectSatisfactionScore);
/**
* 获取项目
* @Param customerId
* @Param projectId
* @Return {@link List<ScreenProjectDataDTO>}
* @Author zhaoqifeng
* @Date 2021/10/15 14:22
*/
List<ScreenProjectDataDTO> getProjectList(String customerId, String projectId);
}

33
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java

@ -17,7 +17,9 @@
package com.epmet.service.evaluationindex.screen.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.epmet.commons.dynamic.datasource.annotation.DataSource;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.constant.DataSourceConstant;
@ -36,13 +38,14 @@ import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity;
import com.epmet.entity.org.CustomerAgencyEntity;
import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@ -54,7 +57,7 @@ import java.util.stream.Collectors;
@Service
@Slf4j
@DataSource(DataSourceConstant.EVALUATION_INDEX)
public class ScreenCustomerAgencyServiceImpl implements ScreenCustomerAgencyService {
public class ScreenCustomerAgencyServiceImpl extends BaseServiceImpl<ScreenCustomerAgencyDao, ScreenCustomerAgencyEntity> implements ScreenCustomerAgencyService {
@Autowired
private ScreenCustomerAgencyDao screenCustomerAgencyDao;
@ -304,4 +307,30 @@ public class ScreenCustomerAgencyServiceImpl implements ScreenCustomerAgencyServ
return screenCustomerAgencyDao.selectByCustomerId(customerId);
}
@Override
public ScreenCustomerAgencyEntity getAgencyById(String agencyId) {
LambdaQueryWrapper<ScreenCustomerAgencyEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScreenCustomerAgencyEntity::getAgencyId, agencyId);
return baseDao.selectOne(wrapper);
}
/**
* @param customerId
* @Description 获取组织列表
* @Param customerId
* @Return {@link Map< String, ScreenCustomerAgencyEntity>}
* @Author zhaoqifeng
* @Date 2021/10/15 15:44
*/
@Override
public Map<String, ScreenCustomerAgencyEntity> getAgencyList(String customerId) {
LambdaQueryWrapper<ScreenCustomerAgencyEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(customerId), ScreenCustomerAgencyEntity::getAgencyId, customerId);
List<ScreenCustomerAgencyEntity> list = baseDao.selectList(wrapper);
if (CollectionUtils.isEmpty(list)) {
return Collections.emptyMap();
}
return list.stream().collect(Collectors.toMap(ScreenCustomerAgencyEntity::getAgencyId, Function.identity()));
}
}

41
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java

@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.epmet.commons.dynamic.datasource.annotation.DataSource;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.constant.DataSourceConstant;
import com.epmet.constant.OrgSourceTypeConstant;
@ -34,15 +35,15 @@ import com.epmet.dto.screen.ScreenProjectGridDailyDTO;
import com.epmet.entity.evaluationindex.screen.ScreenCustomerGridEntity;
import com.epmet.entity.org.CustomerGridEntity;
import com.epmet.service.evaluationindex.screen.ScreenCustomerGridService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 网格(党支部)信息
@ -215,4 +216,36 @@ public class ScreenCustomerGridServiceImpl extends BaseServiceImpl<ScreenCustome
public List<ScreenCustomerGridEntity> selectEntityByAgencyId(String customerId, String parentAgencyId) {
return baseDao.selectEntityByAgencyId(customerId,parentAgencyId);
}
/**
* @param gridId
* @Description 根据ID获取网格
* @Param gridId
* @Return {@link ScreenCustomerGridDTO}
* @Author zhaoqifeng
* @Date 2021/10/15 15:50
*/
@Override
public ScreenCustomerGridDTO getGridById(String gridId) {
LambdaQueryWrapper<ScreenCustomerGridEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScreenCustomerGridEntity::getGridId, gridId);
ScreenCustomerGridEntity entity = baseDao.selectOne(wrapper);
return ConvertUtils.sourceToTarget(entity, ScreenCustomerGridDTO.class);
}
/**
* @param customerId
* @Description 获取网格列表
* @Param customerId
* @Return {@link Map <String, ScreenCustomerGridDTO>}
* @Author zhaoqifeng
* @Date 2021/10/15 15:50
*/
@Override
public Map<String, ScreenCustomerGridDTO> getGridList(String customerId) {
LambdaQueryWrapper<ScreenCustomerGridEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(customerId), ScreenCustomerGridEntity::getGridId, customerId);
List<ScreenCustomerGridEntity> list = baseDao.selectList(wrapper);
return ConvertUtils.sourceToTarget(list, ScreenCustomerGridDTO.class).stream().collect(Collectors.toMap(ScreenCustomerGridDTO::getGridId, Function.identity()));
}
}

53
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectDataServiceImpl.java

@ -17,6 +17,7 @@
package com.epmet.service.evaluationindex.screen.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.epmet.commons.dynamic.datasource.annotation.DataSource;
@ -26,7 +27,8 @@ import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.constant.DataSourceConstant;
import com.epmet.dao.evaluationindex.screen.*;
import com.epmet.dao.evaluationindex.screen.ScreenProjectDataDao;
import com.epmet.dao.evaluationindex.screen.ScreenProjectImgDataDao;
import com.epmet.dto.screen.ScreenProjectDataDTO;
import com.epmet.dto.screen.form.ScreenProjectDataInfoFormDTO;
import com.epmet.dto.screencoll.ScreenCollFormDTO;
@ -42,7 +44,6 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
@ -134,22 +135,18 @@ public class ScreenProjectDataServiceImpl extends BaseServiceImpl<ScreenProjectD
//todo 动态获取超时时间
//如果结案 结案时间立项时间;
if ("closed_case".equals(projectStatusCode)) {
try {
Date createTime = item.getProjectCreateTime();
Date closeCaseTime = sdf.parse(item.getCloseCaseTime());
Date createTime = item.getProjectCreateTime();
Date closeCaseTime = item.getCloseCaseTime();
if (closeCaseTime.getTime() - createTime.getTime() <= 1000 * 60 * 60 * 24 * 4) {
//如果结案时间-立项时间小于等于4天 未超期 level3
item.setProjectLevel(3);
} else if (closeCaseTime.getTime() - createTime.getTime() <= 1000 * 60 * 60 * 24 * 5) {
//如果结案时间-立项时间大于4天小于5天 即将超期 level2
item.setProjectLevel(2);
} else {
//大于5天 已超期 level1
item.setProjectLevel(1);
}
} catch (ParseException e) {
e.printStackTrace();
if (closeCaseTime.getTime() - createTime.getTime() <= 1000 * 60 * 60 * 24 * 4) {
//如果结案时间-立项时间小于等于4天 未超期 level3
item.setProjectLevel(3);
} else if (closeCaseTime.getTime() - createTime.getTime() <= 1000 * 60 * 60 * 24 * 5) {
//如果结案时间-立项时间大于4天小于5天 即将超期 level2
item.setProjectLevel(2);
} else {
//大于5天 已超期 level1
item.setProjectLevel(1);
}
} else if ("pending".equals(projectStatusCode)) {
//如果处理中 当前时间-立项时间;
@ -275,4 +272,26 @@ public class ScreenProjectDataServiceImpl extends BaseServiceImpl<ScreenProjectD
return baseDao.updateProjectSatisfactionScore(projectId,score);
}
/**
* 获取项目
*
* @param customerId
* @param projectId
* @Param customerId
* @Param projectId
* @Return {@link List<ScreenProjectDataDTO>}
* @Author zhaoqifeng
* @Date 2021/10/15 14:22
*/
@Override
public List<ScreenProjectDataDTO> getProjectList(String customerId, String projectId) {
LambdaQueryWrapper<ScreenProjectDataEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(customerId), ScreenProjectDataEntity::getCustomerId, customerId);
wrapper.eq(StringUtils.isNotBlank(projectId), ScreenProjectDataEntity::getProjectId, projectId);
wrapper.ne(ScreenProjectDataEntity::getCategoryCode, null);
wrapper.ne(ScreenProjectDataEntity::getCategoryCode, "");
List<ScreenProjectDataEntity> list = baseDao.selectList(wrapper);
return ConvertUtils.sourceToTarget(list, ScreenProjectDataDTO.class);
}
}

235
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/impl/DataReportingServiceImpl.java

@ -0,0 +1,235 @@
package com.epmet.service.impl;
import com.epmet.commons.tools.constant.StrConstant;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.constant.OrgTypeConstant;
import com.epmet.constant.ProjectConstant;
import com.epmet.dto.basereport.form.EventInfoFormDTO;
import com.epmet.dto.org.result.CustomerAgencyDTO;
import com.epmet.dto.org.result.CustomerGridDTO;
import com.epmet.dto.screen.ScreenCustomerGridDTO;
import com.epmet.dto.screen.ScreenProjectDataDTO;
import com.epmet.dto.user.param.MidPatrolFormDTO;
import com.epmet.dto.user.result.CustomerStaffDTO;
import com.epmet.dto.user.result.GridUserInfoDTO;
import com.epmet.dto.user.result.MidPatrolDetailResult;
import com.epmet.dto.user.result.MidPatrolRecordResult;
import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity;
import com.epmet.entity.stats.CustomerProjectCategoryDictEntity;
import com.epmet.opendata.dto.BaseDisputeProcessDTO;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import com.epmet.service.DataReportingService;
import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService;
import com.epmet.service.evaluationindex.screen.ScreenCustomerGridService;
import com.epmet.service.evaluationindex.screen.ScreenProjectDataService;
import com.epmet.service.org.CustomerAgencyService;
import com.epmet.service.org.CustomerGridService;
import com.epmet.service.stats.CustomerProjectCategoryDictService;
import com.epmet.service.user.StatsStaffPatrolService;
import com.epmet.service.user.UserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @dscription 省网格化平台数据上报--数据查询
* @author sun
*/
@Slf4j
@Service
public class DataReportingServiceImpl implements DataReportingService {
@Autowired
private CustomerAgencyService customerAgencyService;
@Autowired
private CustomerGridService customerGridService;
@Autowired
private UserService userService;
@Resource
private ScreenProjectDataService screenProjectDataService;
@Resource
private ScreenCustomerAgencyService screenCustomerAgencyService;
@Resource
private ScreenCustomerGridService screenCustomerGridService;
@Autowired
private StatsStaffPatrolService statsStaffPatrolService;
@Resource
private CustomerProjectCategoryDictService customerProjectCategoryDictService;
/**
* @Author sun
* @Description 批量查询客户组织基础信息
**/
@Override
public List<CustomerAgencyDTO> getAgencyBaseInfo(GridBaseInfoFormDTO formDTO) {
//批量查询客户组织信息
List<CustomerAgencyDTO> resultList = customerAgencyService.getAgencyBaseInfo(formDTO);
return resultList;
}
/**
* @Author sun
* @Description 批量查询客户网格基础信息
**/
@Override
public List<CustomerGridDTO> getGridBaseInfo(GridBaseInfoFormDTO formDTO) {
//批量查询客户网格信息
List<CustomerGridDTO> resultList = customerGridService.getGridBaseInfo(formDTO);
return resultList;
}
/**
* @Author sun
* @Description 批量查询客户网格员基础信息
**/
@Override
public List<GridUserInfoDTO> getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) {
//1.查询工作人员所属网格信息
List<GridUserInfoDTO> resultList = customerGridService.getStaffGrid(formDTO);
//2.查询工作人员基础信息
List<CustomerStaffDTO> staffDTOList = userService.getStaffBaseInfo(formDTO);
if (CollectionUtils.isEmpty(staffDTOList)) {
return new ArrayList<>();
}
Map<String, CustomerStaffDTO> staffMap = new HashMap<>();
staffDTOList.forEach(staff -> staffMap.put(staff.getUserId(), staff));
//3.封装数据
resultList.forEach(st -> {
if (staffMap.containsKey(st.getStaffId())) {
CustomerStaffDTO dto = staffMap.get(st.getStaffId());
st.setNickName(dto.getRealName());
st.setCardNum("01");
st.setUserType(dto.getWorkType().equals("fulltime") ? "01" : "02");
st.setPhonenumber(dto.getMobile());
st.setSex(0 == dto.getGender() ? "9" : dto.getGender().toString());
st.setNation("01");
st.setPaerty("13");
st.setBirthday(new Date());
st.setEducation("20");
st.setEntryDate(new Date());
st.setIsLeave("N");
//st.setLeaveDate();
st.setIncome("05");
st.setIsCommittee("Y");
st.setIsCommunityWorkers("Y");
st.setIsSocialWorker("Y");
st.setIsVillageLeader("Y");
st.setIsPoliceAssistant("N");
st.setIsMediator("Y");
st.setDelFlag(dto.getDelFlag());
st.setCreatedBy(dto.getCreatedBy());
st.setCreatedTime(dto.getCreatedTime());
st.setUpdatedBy(dto.getUpdatedBy());
st.setUpdatedTime(dto.getUpdatedTime());
}
});
return resultList;
}
/**
* 事件上报
*
* @param formDTO
* @Param formDTO
* @Return {@link List<BaseDisputeProcessDTO>}
* @Author zhaoqifeng
* @Date 2021/10/15 14:10
*/
@Override
public List<BaseDisputeProcessDTO> getEventInfo(EventInfoFormDTO formDTO) {
List<BaseDisputeProcessDTO> list;
//根据入参,获取项目
List<ScreenProjectDataDTO> projectList = screenProjectDataService.getProjectList(formDTO.getCustomerId(), formDTO.getProjectId());
//项目列表为空,返回空数组
if(CollectionUtils.isEmpty(projectList)) {
return Collections.emptyList();
}
//项目ID不为空时,因为只有一条,可以直接处理
if (StringUtils.isNotEmpty(formDTO.getProjectId())) {
list = projectList.stream().map(project -> {
BaseDisputeProcessDTO dto = getBaseDisputeProcessDTO(project);
if (OrgTypeConstant.AGENCY.equals(project.getOrgType())) {
ScreenCustomerAgencyEntity agency = screenCustomerAgencyService.getAgencyById(project.getOrgId());
dto.setOrgCode(agency.getCode());
dto.setOrgName(agency.getAgencyName());
} else {
ScreenCustomerGridDTO grid = screenCustomerGridService.getGridById(project.getOrgId());
dto.setOrgCode(grid.getCode());
dto.setOrgName(grid.getGridName());
}
return dto;
}).collect(Collectors.toList());
} else {
//项目ID不为空时,提前取出客户下的组织和网格
Map<String, ScreenCustomerAgencyEntity> agencyMap = screenCustomerAgencyService.getAgencyList(formDTO.getCustomerId());
Map<String, ScreenCustomerGridDTO> gridMap = screenCustomerGridService.getGridList(formDTO.getCustomerId());
list = projectList.stream().map(project -> {
BaseDisputeProcessDTO dto = getBaseDisputeProcessDTO(project);
if (OrgTypeConstant.AGENCY.equals(project.getOrgType())) {
ScreenCustomerAgencyEntity agency = agencyMap.get(project.getOrgId());
dto.setOrgCode(agency.getCode());
dto.setOrgName(agency.getAgencyName());
} else {
ScreenCustomerGridDTO grid = gridMap.get(project.getOrgId());
dto.setOrgCode(grid.getCode());
dto.setOrgName(grid.getGridName());
}
return dto;
}).collect(Collectors.toList());
}
return list.stream().filter(item -> StringUtils.isNotBlank(item.getEventCategory())).collect(Collectors.toList());
}
private BaseDisputeProcessDTO getBaseDisputeProcessDTO(ScreenProjectDataDTO project) {
BaseDisputeProcessDTO dto = new BaseDisputeProcessDTO();
dto.setId(project.getProjectId());
dto.setCustomerId(project.getCustomerId());
dto.setEventName(project.getProjectTitle());
String categoryCode = project.getCategoryCode().split(StrConstant.COMMA)[0];
//如果是孔村、榆山、锦水的项目需要关联分类字典表
if("2fe0065f70ca0e23ce4c26fca5f1d933".equals(project.getCustomerId()) ||
"44876154d10d7cb7affd92000f84f833".equals(project.getCustomerId()) ||
"46c55cb862d6d5e6d05d2ab61a1cc07e".equals(project.getCustomerId())) {
CustomerProjectCategoryDictEntity categoryEntity = customerProjectCategoryDictService.getByCategoryCode(project.getCustomerId(), categoryCode);
if (null != categoryEntity) {
categoryCode = categoryEntity.getEpmetCategoryCode();
} else {
categoryCode = null;
}
}
dto.setReportTime(project.getProjectCreateTime());
dto.setHappenDate(DateUtils.parseDate(DateUtils.format(project.getProjectCreateTime()), DateUtils.DATE_PATTERN));
dto.setEventDescription(project.getProjectContent());
//TODO 办结方式
dto.setWaysOfResolving("01");
dto.setSuccessfulOrNo(ProjectConstant.CLOSED_CASE.equals(project.getProjectStatusCode())?"Y":"N");
//TODO 办结层级
dto.setCompleteLevel("01");
dto.setCompleteTime(project.getCloseCaseTime());
dto.setLat(project.getLatitude());
dto.setLng(project.getLongitude());
return dto;
}
@Override
public List<MidPatrolRecordResult> getPatrolRecordList(MidPatrolFormDTO formDTO) {
return userService.getPatrolRecordList(formDTO);
}
@Override
public List<MidPatrolDetailResult> getPatrolDetailList(MidPatrolFormDTO formDTO) {
return userService.getPatrolDetailList(formDTO);
}
}

7
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerAgencyService.java

@ -1,8 +1,10 @@
package com.epmet.service.org;
import com.epmet.dto.org.result.CustomerAgencyDTO;
import com.epmet.dto.org.result.CustomerAreaCodeResultDTO;
import com.epmet.dto.org.result.OrgStaffDTO;
import com.epmet.entity.org.CustomerAgencyEntity;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import java.util.Date;
import java.util.List;
@ -58,4 +60,9 @@ public interface CustomerAgencyService {
*/
void sysAgencyInfo(String fromCustomerId, String toCustomerId);
/**
* @Author sun
* @Description 批量查询客户组织基础信息
**/
List<CustomerAgencyDTO> getAgencyBaseInfo(GridBaseInfoFormDTO formDTO);
}

15
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/CustomerGridService.java

@ -6,7 +6,11 @@ import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO;
import com.epmet.dto.group.result.GridIdListByCustomerResultDTO;
import com.epmet.dto.org.CustomerStaffGridDTO;
import com.epmet.dto.org.GridInfoDTO;
import com.epmet.dto.org.result.CustomerGridDTO;
import com.epmet.dto.user.result.GridUserInfoDTO;
import com.epmet.entity.org.CustomerGridEntity;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import java.util.Date;
import java.util.List;
@ -77,4 +81,15 @@ public interface CustomerGridService extends BaseService<CustomerGridEntity> {
**/
List<String> getdelGridProjectIdList(String customerId);
/**
* @Author sun
* @Description 批量查询客户网格基础信息
**/
List<CustomerGridDTO> getGridBaseInfo(GridBaseInfoFormDTO formDTO);
/**
* @Author sun
* @Description 查询工作人员所属网格信息
**/
List<GridUserInfoDTO> getStaffGrid(StaffBaseInfoFormDTO formDTO);
}

12
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerAgencyServiceImpl.java

@ -5,12 +5,14 @@ import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.constant.StrConstant;
import com.epmet.constant.DataSourceConstant;
import com.epmet.dao.org.StatsCustomerAgencyDao;
import com.epmet.dto.org.result.CustomerAgencyDTO;
import com.epmet.dto.org.result.CustomerAreaCodeResultDTO;
import com.epmet.dto.org.result.OrgStaffDTO;
import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity;
import com.epmet.entity.evaluationindex.screen.ScreenCustomerGridEntity;
import com.epmet.entity.org.CustomerAgencyEntity;
import com.epmet.entity.org.CustomerGridEntity;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService;
import com.epmet.service.evaluationindex.screen.ScreenCustomerGridService;
import com.epmet.service.org.CustomerAgencyService;
@ -271,4 +273,14 @@ public class CustomerAgencyServiceImpl implements CustomerAgencyService {
}
}
}
/**
* @Author sun
* @Description 批量查询客户组织基础信息
**/
@Override
public List<CustomerAgencyDTO> getAgencyBaseInfo(GridBaseInfoFormDTO formDTO) {
return customerAgencyDao.getAgencyBaseInfo(formDTO);
}
}

22
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/org/impl/CustomerGridServiceImpl.java

@ -10,7 +10,11 @@ import com.epmet.dto.group.result.AgencyGridTotalCountResultDTO;
import com.epmet.dto.group.result.GridIdListByCustomerResultDTO;
import com.epmet.dto.org.CustomerStaffGridDTO;
import com.epmet.dto.org.GridInfoDTO;
import com.epmet.dto.org.result.CustomerGridDTO;
import com.epmet.dto.user.result.GridUserInfoDTO;
import com.epmet.entity.org.CustomerGridEntity;
import com.epmet.opendata.dto.form.GridBaseInfoFormDTO;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import com.epmet.service.Issue.IssueService;
import com.epmet.service.org.CustomerGridService;
import org.springframework.beans.factory.annotation.Autowired;
@ -115,4 +119,22 @@ public class CustomerGridServiceImpl extends BaseServiceImpl<CustomerGridDao, Cu
return resultList;
}
/**
* @Author sun
* @Description 批量查询客户网格基础信息
**/
@Override
public List<CustomerGridDTO> getGridBaseInfo(GridBaseInfoFormDTO formDTO) {
return customerGridDao.getGridBaseInfo(formDTO);
}
/**
* @Author sun
* @Description 查询工作人员所属网格信息
**/
@Override
public List<GridUserInfoDTO> getStaffGrid(StaffBaseInfoFormDTO formDTO) {
return customerGridDao.getStaffGrid(formDTO);
}
}

9
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/project/impl/ProjectProcessServiceImpl.java

@ -20,7 +20,6 @@ package com.epmet.service.project.impl;
import com.epmet.commons.dynamic.datasource.annotation.DataSource;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.constant.DataSourceConstant;
import com.epmet.dao.project.ProjectProcessDao;
import com.epmet.dto.ProjectProcessDTO;
@ -40,7 +39,9 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -144,7 +145,7 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao
list = list.stream().flatMap(target -> closedInfo.stream().filter(closedCase -> StringUtils.equals(closedCase.getProjectId(),target.getProjectId())).map(
merge -> {
target.setProjectStatusCode("closed_case");
target.setCloseCaseTime(DateUtils.format(merge.getCreatedTime(),DateUtils.DATE_TIME_PATTERN));
target.setCloseCaseTime(merge.getCreatedTime());
return target;
}
)).collect(Collectors.toList());
@ -166,7 +167,7 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessDao
list = list.stream().flatMap(target -> closedInfo.stream().filter(closedCase -> StringUtils.equals(closedCase.getProjectId(),target.getProjectId())).map(
merge -> {
//target.setProjectStatusCode("closed_case");
target.setCloseCaseTime(DateUtils.format(merge.getCreatedTime(),DateUtils.DATE_TIME_PATTERN));
target.setCloseCaseTime(merge.getCreatedTime());
return target;
}
)).collect(Collectors.toList());

10
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/CustomerProjectCategoryDictService.java

@ -55,4 +55,14 @@ public interface CustomerProjectCategoryDictService extends BaseService<Customer
* @Date 16:03 2021-03-22
**/
void uploadCategoryDict(ScreenCollFormDTO<CategoryDictFormDTO> formDTO);
/**
* @Description 获取分类信息
* @Param customerId
* @Param categoryCode
* @Return {@link CustomerProjectCategoryDictEntity}
* @Author zhaoqifeng
* @Date 2021/10/15 16:33
*/
CustomerProjectCategoryDictEntity getByCategoryCode(String customerId, String categoryCode);
}

19
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/impl/CustomerProjectCategoryDictServiceImpl.java

@ -17,6 +17,7 @@
package com.epmet.service.stats.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.epmet.commons.dynamic.datasource.annotation.DataSource;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.constant.NumConstant;
@ -116,4 +117,22 @@ public class CustomerProjectCategoryDictServiceImpl extends BaseServiceImpl<Cust
baseDao.batchInsertCustomerProjectCategoryDict(formDTO.getDataList(), formDTO.getCustomerId());
}
}
/**
* @param customerId
* @param categoryCode
* @Description 获取分类信息
* @Param customerId
* @Param categoryCode
* @Return {@link CustomerProjectCategoryDictEntity}
* @Author zhaoqifeng
* @Date 2021/10/15 16:33
*/
@Override
public CustomerProjectCategoryDictEntity getByCategoryCode(String customerId, String categoryCode) {
LambdaQueryWrapper<CustomerProjectCategoryDictEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CustomerProjectCategoryDictEntity::getCategoryCode, categoryCode);
wrapper.eq(CustomerProjectCategoryDictEntity::getCustomerId, customerId);
return baseDao.selectOne(wrapper);
}
}

17
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/UserService.java

@ -7,11 +7,10 @@ import com.epmet.dto.org.result.OrgStaffDTO;
import com.epmet.dto.screen.ScreenProjectDataDTO;
import com.epmet.dto.stats.form.GmUploadEventFormDTO;
import com.epmet.dto.stats.user.result.UserStatisticalData;
import com.epmet.dto.user.result.StaffRoleInfoDTO;
import com.epmet.dto.user.result.CustomerStaffDTO;
import com.epmet.dto.user.result.StaffPatrolRecordResult;
import com.epmet.dto.user.result.StatsStaffPatrolRecordDailyDTO;
import com.epmet.dto.user.param.MidPatrolFormDTO;
import com.epmet.dto.user.result.*;
import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import com.epmet.util.DimIdGenerator;
import java.util.Date;
@ -137,4 +136,14 @@ public interface UserService {
* @author sun
*/
void saveOrUpGmUploadEvent(List<GmUploadEventFormDTO.DataList> list);
/**
* @Author sun
* @Description 批量查询客户网格员基础信息
**/
List<CustomerStaffDTO> getStaffBaseInfo(StaffBaseInfoFormDTO formDTO);
List<MidPatrolRecordResult> getPatrolRecordList(MidPatrolFormDTO formDTO);
List<MidPatrolDetailResult> getPatrolDetailList(MidPatrolFormDTO formDTO);
}

21
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/user/impl/UserServiceImpl.java

@ -17,8 +17,10 @@ import com.epmet.dto.screen.ScreenProjectDataDTO;
import com.epmet.dto.stats.form.GmUploadEventFormDTO;
import com.epmet.dto.stats.user.*;
import com.epmet.dto.stats.user.result.UserStatisticalData;
import com.epmet.dto.user.param.MidPatrolFormDTO;
import com.epmet.dto.user.result.*;
import com.epmet.entity.evaluationindex.screen.ScreenPartyUserRankDataEntity;
import com.epmet.opendata.dto.form.StaffBaseInfoFormDTO;
import com.epmet.service.user.UserService;
import com.epmet.util.DimIdGenerator;
import com.epmet.util.ModuleConstant;
@ -1088,4 +1090,23 @@ public class UserServiceImpl implements UserService {
userDao.saveOrUpGmUploadEvent(list);
}
/**
* @Author sun
* @Description 批量查询客户网格员基础信息
**/
@Override
public List<CustomerStaffDTO> getStaffBaseInfo(StaffBaseInfoFormDTO formDTO) {
return userDao.getStaffBaseInfo(formDTO);
}
@Override
public List<MidPatrolRecordResult> getPatrolRecordList(MidPatrolFormDTO formDTO) {
return userDao.getPatrolRecordList(formDTO);
}
@Override
public List<MidPatrolDetailResult> getPatrolDetailList(MidPatrolFormDTO formDTO) {
return userDao.getPatrolDetailList(formDTO);
}
}

37
epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/CustomerGridDao.xml

@ -126,4 +126,41 @@
AND customer_id = #{customerId}
</select>
<select id="getGridBaseInfo" resultType="com.epmet.dto.org.result.CustomerGridDTO">
SELECT
*
FROM
customer_grid
WHERE 1=1
<if test="orgIdList == null">
AND del_flag = '0'
</if>
AND customer_id = #{customerId}
<if test="orgIdList != null and orgIdList.size() > 0">
<foreach collection="orgIdList" item="gridId" open="AND id IN (" separator="," close=")">
#{gridId}
</foreach>
</if>
</select>
<select id="getStaffGrid" resultType="com.epmet.dto.user.result.GridUserInfoDTO">
SELECT
csg.customer_id customerId,
csg.grid_id gridId,
csg.user_id staffId,
cg.grid_name gridName,
cg.`code` code
FROM
customer_staff_grid csg
INNER JOIN customer_grid cg ON csg.grid_id = cg.id
WHERE
csg.del_flag = '0'
AND csg.customer_id = #{customerId}
<if test="staffIdList != null and staffIdList.size() > 0">
<foreach collection="staffIdList" item="staffId" open="AND csg.user_id IN (" separator="," close=")">
#{staffId}
</foreach>
</if>
</select>
</mapper>

18
epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/org/StatsCustomerAgencyDao.xml

@ -203,4 +203,22 @@
AND ca.CUSTOMER_ID = #{customerId}
AND ca.AREA_CODE = #{areaCode}
</select>
<select id="getAgencyBaseInfo" resultType="com.epmet.dto.org.result.CustomerAgencyDTO">
SELECT
*
FROM
customer_agency
WHERE 1=1
<if test="orgIdList == null">
AND del_flag = '0'
</if>
AND customer_id = #{customerId}
<if test="orgIdList != null and orgIdList.size() > 0">
<foreach collection="orgIdList" item="agencyId" open="AND id IN (" separator="," close=")">
#{agencyId}
</foreach>
</if>
</select>
</mapper>

62
epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/user/UserDao.xml

@ -991,4 +991,66 @@
updated_time = NOW()
</insert>
<select id="getStaffBaseInfo" resultType="com.epmet.dto.user.result.CustomerStaffDTO">
SELECT
cs.*
FROM
customer_staff cs
WHERE 1=1
AND cs.customer_id = #{customerId}
<if test="staffIdList != null and staffIdList.size() > 0">
<foreach collection="staffIdList" item="staffId" open="AND cs.user_id IN (" separator="," close=")">
#{staffId}
</foreach>
</if>
</select>
<select id="getPatrolRecordList" resultType="com.epmet.dto.user.result.MidPatrolRecordResult">
SELECT
m.id,
m.customer_id,
m.grid,
m.grid_pids,
m.staff_id,
m.agency_id,
m.patrol_start_time,
m.patrol_end_time,
m.actrual_end_time,
m.total_time,
m.STATUS,
m.del_flag,
m.revision,
m.created_by,
m.created_time,
m.updated_by,
m.updated_time,
GROUP_CONCAT(d.LATITUDE,',',d.LONGITUDE ORDER BY d.CREATED_TIME ASC SEPARATOR ';') AS route
FROM
staff_patrol_record m
LEFT JOIN staff_patrol_detail d ON m.ID = d.STAFF_PATROL_REC_ID
WHERE
1 =1
<if test="patrolId != null and patrolId != ''">
AND m.ID = #{patrolId}
</if>
and m.CUSTOMER_ID = #{customerId}
AND m.DEL_FLAG = '0'
GROUP BY m.ID
order by m.created_time
LIMIT #{offset},#{pageSize}
</select>
<select id="getPatrolDetailList" resultType="com.epmet.dto.user.result.MidPatrolDetailResult">
select
id, customer_id, staff_patrol_rec_id,latitude, longitude, del_flag, revision, created_by, created_time, updated_by, updated_time
from staff_patrol_detail
WHERE
1=1
<if test="patrolId != null and patrolId != ''">
AND staff_patrol_rec_id = #{patrolId}
</if>
and CUSTOMER_ID = #{customerId}
AND DEL_FLAG = '0'
order by created_time
LIMIT #{offset},#{pageSize}
</select>
</mapper>

5
epmet-module/epmet-job/epmet-job-server/pom.xml

@ -38,6 +38,11 @@
<artifactId>epmet-third-client</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-message-client</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>

23
epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerService.java

@ -0,0 +1,23 @@
package com.epmet.service;
public interface SystemMessageScannerService {
/**
* @description 扫描未成功发送到MQ的消息
*
* @param
* @return
* @author wxz
* @date 2021.10.16 23:24:05
*/
void scanPenddingSystemMQMessage();
/**
* @description 扫描发送成功但是未正常处理的MQ的消息
*
* @param
* @return
* @author wxz
* @date 2021.10.16 23:24:27
*/
void scanBlockedSystemMQMessage();
}

22
epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/service/SystemMessageScannerServiceImpl.java

@ -0,0 +1,22 @@
package com.epmet.service;
import com.epmet.feign.EpmetMessageOpenFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SystemMessageScannerServiceImpl implements SystemMessageScannerService {
@Autowired
private EpmetMessageOpenFeignClient messageOpenFeignClient;
@Override
public void scanPenddingSystemMQMessage() {
messageOpenFeignClient.penddingMqMsgScan();
}
@Override
public void scanBlockedSystemMQMessage() {
messageOpenFeignClient.blockedMqMsgScan();
}
}

25
epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/BlockedMQSystemMessageScanner.java

@ -0,0 +1,25 @@
package com.epmet.task;
import com.epmet.service.SystemMessageScannerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("blockedMQSystemMessageScanner")
@Slf4j
public class BlockedMQSystemMessageScanner implements ITask {
@Autowired
private SystemMessageScannerService systemMessageScannerService;
@Override
public void run(String params) {
try {
//log.info("【blockedMQSystemMessageScanner】开始执行scanBlockedSystemMQMessage任务");
systemMessageScannerService.scanBlockedSystemMQMessage();
log.info("【blockedMQSystemMessageScanner】执行scanBlockedSystemMQMessage任务完成");
} catch (Exception e) {
log.error("【blockedMQSystemMessageScanner】执行scanBlockedSystemMQMessage任务失败");
}
}
}

25
epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/PenddingMQSystemMessageScanner.java

@ -0,0 +1,25 @@
package com.epmet.task;
import com.epmet.service.SystemMessageScannerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("penddingMQSystemMessageScanner")
@Slf4j
public class PenddingMQSystemMessageScanner implements ITask {
@Autowired
private SystemMessageScannerService systemMessageScannerService;
@Override
public void run(String params) {
try {
//log.info("【blockedMQSystemMessageScanner】开始执行scanBlockedSystemMQMessage任务");
systemMessageScannerService.scanPenddingSystemMQMessage();
log.info("【blockedMQSystemMessageScanner】执行scanPenddingSystemMQMessage任务完成");
} catch (Exception e) {
log.error("【blockedMQSystemMessageScanner】执行scanPenddingSystemMQMessage任务失败");
}
}
}

50
epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java

@ -25,4 +25,54 @@ public interface SystemMessageType {
*/
String POINT_RULE_CHANGED = "point_rule_changed";
/**
* 网格新增
*/
String GRID_CREATE = "grid_create";
/**
* 网格信息变更
*/
String GRID_CHANGE = "grid_change";
/**
* agency机构新增
*/
String AGENCY_CREATE = "agency_create";
/**
* agency机构信息变更
*/
String AGENCY_CHANGE = "agency_change";
/**
* 部门新增
*/
String DEPARTMENT_CREATE = "department_create";
/**
* 部门信息变更
*/
String DEPARTMENT_CHANGE = "department_change";
/**
* 工作人员新增
*/
String STAFF_CREATE = "staff_create";
/**
* 工作人员变更
*/
String STAFF_CHANGE = "staff_change";
/**
* 用户开始巡查
*/
String USER_PATROL_START = "user_patrol_start";
/**
* 用户结束巡查
*/
String USER_PATROL_STOP = "user_patrol_stop";
}

13
epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/SystemMsgFormDTO.java

@ -7,9 +7,18 @@ import javax.validation.constraints.NotNull;
@Data
public class SystemMsgFormDTO {
@NotNull(message = "消息类型不能为空")
// 发送mq消息分组
public interface SendMsgByMQ {}
// 应答mq消息
public interface AckMsgByMQ {}
@NotNull(message = "消息类型不能为空", groups = { SendMsgByMQ.class })
private String messageType;
@NotNull(message = "消息内容不能为空")
@NotNull(message = "消息内容不能为空", groups = { SendMsgByMQ.class })
private Object content;
@NotNull(message = "pendingMsgLabel不能为空", groups = { AckMsgByMQ.class })
private String pendingMsgLabel;
}

24
epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/EpmetMessageOpenFeignClient.java

@ -27,7 +27,7 @@ import java.util.List;
* @author yinzuomei@elink-cn.com
* @date 2020/6/4 13:47
*/
//@FeignClient(name = ServiceConstant.EPMET_MESSAGE_SERVER, fallback = EpmetMessageOpenFeignClientFallback.class,url = "http://127.0.0.1:8085")
//@FeignClient(name = ServiceConstant.EPMET_MESSAGE_SERVER, fallbackFactory = EpmetMessageOpenFeignClientFallbackFactory.class, url = "http://127.0.0.1:8085")
@FeignClient(name = ServiceConstant.EPMET_MESSAGE_SERVER, fallbackFactory = EpmetMessageOpenFeignClientFallbackFactory.class)
public interface EpmetMessageOpenFeignClient {
/**
@ -107,4 +107,26 @@ public interface EpmetMessageOpenFeignClient {
*/
@PostMapping("/message/system/send-by-mq")
Result sendSystemMsgByMQ(@RequestBody SystemMsgFormDTO form);
/**
* @description 检查MQ阻塞消息(MQ收到消息但是往监听者发送消息或者监听者处理逻辑问题导致无法消费消息)
*
* @param
* @return
* @author wxz
* @date 2021.10.16 22:07:38
*/
@PostMapping("/message/system/blocked-mq-msg-scan")
Result blockedMqMsgScan();
/**
* @description 检查MQ滞留消息(往MQ发送消息失败MQ未收到消息)
*
* @param
* @return
* @author wxz
* @date 2021.10.16 22:08:32
*/
@PostMapping("/message/system/pendding-mq-msg-scan")
Result penddingMqMsgScan();
}

10
epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/feign/fallback/EpmetMessageOpenFeignClientFallback.java

@ -69,4 +69,14 @@ public class EpmetMessageOpenFeignClientFallback implements EpmetMessageOpenFeig
public Result sendSystemMsgByMQ(SystemMsgFormDTO form) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_MESSAGE_SERVER, "sendSystemMsgByMQ", form);
}
@Override
public Result blockedMqMsgScan() {
return ModuleUtils.feignConError(ServiceConstant.EPMET_MESSAGE_SERVER, "blockedMqMsgScan");
}
@Override
public Result penddingMqMsgScan() {
return ModuleUtils.feignConError(ServiceConstant.EPMET_MESSAGE_SERVER, "penddingMqMsgScan");
}
}

60
epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java

@ -1,9 +1,7 @@
package com.epmet.send;
import com.alibaba.fastjson.JSON;
import com.epmet.commons.rocketmq.messages.PointRuleChangedMQMsg;
import com.epmet.commons.rocketmq.messages.ProjectChangedMQMsg;
import com.epmet.commons.rocketmq.messages.GroupAchievementMQMsg;
import com.epmet.commons.rocketmq.messages.*;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.utils.Result;
import com.epmet.constant.SystemMessageType;
@ -128,4 +126,60 @@ public class SendMqMsgUtil {
}
/**
* @Description 发送巡查相关消息
* @return
* @author wxz
* @date 2021.06.21 12:46
*/
public boolean sendPatrolMqMsg(StaffPatrolMQMsg msg,String messageType) {
try {
SystemMsgFormDTO msgForm = new SystemMsgFormDTO();
msgForm.setMessageType(messageType);
msgForm.setContent(msg);
Result sendMsgResult = null;
log.info("sendPatrolMqMsg param:{}",msgForm);
int retryTime = 0;
do {
sendMsgResult = epmetMessageOpenFeignClient.sendSystemMsgByMQ(msgForm);
} while ((sendMsgResult == null || !sendMsgResult.success()) && retryTime++ < NumConstant.TWO);
if (sendMsgResult != null && sendMsgResult.success()) {
return true;
}
log.error("发送(巡查相关)系统消息到message服务失败:{},msg:{}", JSON.toJSONString(sendMsgResult), JSON.toJSONString(msgForm));
} catch (Exception e) {
log.error("sendMqMsg exception", e);
}
return false;
}
/**
* @Description 组织网格人员中间库信息同步Mq
* @author sun
*/
public boolean sendOrgStaffMqMsg(OrgOrStaffMQMsg msg) {
try {
SystemMsgFormDTO msgForm = new SystemMsgFormDTO();
msgForm.setMessageType(msg.getType());
msgForm.setContent(msg);
Result sendMsgResult;
log.info("sendOrgStaffMqMsg param:{}",msgForm);
int retryTime = 0;
do {
sendMsgResult = epmetMessageOpenFeignClient.sendSystemMsgByMQ(msgForm);
} while ((sendMsgResult == null || !sendMsgResult.success()) && retryTime++ < NumConstant.TWO);
if (sendMsgResult != null && sendMsgResult.success()) {
return true;
}
log.error("发送(组织、网格、人员同步中间库)系统消息到message服务失败:{},msg:{}", JSON.toJSONString(sendMsgResult), JSON.toJSONString(msgForm));
} catch (Exception e) {
log.error("sendOrgStaffMqMsg exception", e);
}
return false;
}
}

40
epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/SystemMessageController.java

@ -17,10 +17,46 @@ public class SystemMessageController {
@Autowired
private SystemMessageService systemMessageService;
/**
* @description 发送mq消息
*
* @param form
* @return
* @author wxz
* @date 2021.10.14 16:07:07
*/
@PostMapping("send-by-mq")
public Result sendSystemMsgByMQ(@RequestBody SystemMsgFormDTO form) {
ValidatorUtils.validateEntity(form);
systemMessageService.sendMQMessage(form.getMessageType(), form.getContent());
ValidatorUtils.validateEntity(form, SystemMsgFormDTO.SendMsgByMQ.class);
systemMessageService.persistAndSendMQMessage(form.getMessageType(), form.getContent());
return new Result();
}
/**
* @description 检查MQ阻塞消息(MQ收到消息但是往监听者发送消息或者监听者处理逻辑问题导致无法消费消息)
*
* @param
* @return
* @author wxz
* @date 2021.10.16 22:07:38
*/
@PostMapping("blocked-mq-msg-scan")
public Result blockedMqMsgScan() {
systemMessageService.blockedMqMsgScan();
return new Result();
}
/**
* @description 检查MQ滞留消息(往MQ发送消息失败MQ未收到消息)
*
* @param
* @return
* @author wxz
* @date 2021.10.16 22:08:32
*/
@PostMapping("pendding-mq-msg-scan")
public Result penddingMqMsgScan() {
systemMessageService.penddingMqMsgScan();
return new Result();
}

35
epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/SystemMessagePenddingDao.java

@ -0,0 +1,35 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.entity.SystemMessagePenddingEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 系统消息表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2021-10-16
*/
@Mapper
public interface SystemMessagePenddingDao extends BaseDao<SystemMessagePenddingEntity> {
void physicalDeleteById(@Param("penddingId") String penddingId);
}

61
epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/entity/SystemMessagePenddingEntity.java

@ -0,0 +1,61 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 系统消息表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2021-10-16
*/
@Data
@EqualsAndHashCode(callSuper=false)
@TableName("system_message_pendding")
public class SystemMessagePenddingEntity extends BaseEpmetEntity {
private static final long serialVersionUID = 1L;
/**
* 消息类型init_customer:客户初始化,login登录logout退出
*/
private String msgType;
/**
* 消息主表id
*/
private String msgId;
/**
* 消息发送途径
*/
private String sendApproach;
/**
* 消息内容
*/
private String content;
}

30
epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/SystemMessageService.java

@ -2,6 +2,34 @@ package com.epmet.service;
public interface SystemMessageService {
void sendMQMessage(String messageType, Object content);
/**
* @description 持久化和发送mq消息
*
* @param messageType
* @param content
* @return
* @author wxz
* @date 2021.10.14 15:07:02
*/
void persistAndSendMQMessage(String messageType, Object content);
/**
* @description 扫描阻塞的消息
*
* @param
* @return
* @author wxz
* @date 2021.10.15 10:13:37
*/
void blockedMqMsgScan();
/**
* @description 扫描待办的消息(因为发送到MQ失败而堆积)
*
* @param
* @return
* @author wxz
* @date 2021.10.16 12:11:39
*/
void penddingMqMsgScan();
}

207
epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java

@ -2,16 +2,23 @@ package com.epmet.service.impl;
import com.alibaba.fastjson.JSON;
import com.epmet.auth.constants.AuthOperationConstants;
import com.epmet.auth.constants.AuthOperationEnum;
import com.epmet.commons.rocketmq.constants.MQUserPropertys;
import com.epmet.commons.rocketmq.constants.TopicConstants;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.constant.SystemMessageSendApproach;
import com.epmet.constant.SystemMessageType;
import com.epmet.dao.SystemMessageDao;
import com.epmet.dao.SystemMessagePenddingDao;
import com.epmet.entity.SystemMessageEntity;
import com.epmet.entity.SystemMessagePenddingEntity;
import com.epmet.service.SystemMessageService;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
@ -21,37 +28,118 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
import java.util.UUID;
@Service
public class SystemMessageServiceImpl implements SystemMessageService {
private Logger logger = LoggerFactory.getLogger(getClass());
// 消息堆积时间阈值,单位s
private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L1 = 1 * 60;
private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L2 = 2 * 60;
private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L3 = 5 * 60;
private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L4 = 10 * 60;
private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L5 = 30 * 60;
private static final long PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L6 = 60 * 60;
// 堆积消息告警间隔时长,单位s
public static final long PENDDING_MQ_MSG_ALERT_SECONDS_DELTA = 60 * 60;
// 各个级别上次告警时间
private LocalDateTime l1LastAlertTime;
private LocalDateTime l6LastAlertTime;
@Autowired
private SystemMessageDao systemMessageDao;
@Autowired
private SystemMessagePenddingDao systemMessagePenddingDao;
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Transactional(rollbackFor = Exception.class)
@Autowired
private RedisUtils redisUtils;
@Override
public void sendMQMessage(String messageType, Object content) {
public void persistAndSendMQMessage(String messageType, Object content) {
String contentStr = JSON.toJSONString(content);
//存储消息到表
SystemMessageEntity systemMessageEntity = new SystemMessageEntity();
systemMessageEntity.setMsgType(messageType);
systemMessageEntity.setSendApproach(SystemMessageSendApproach.MQ);
systemMessageEntity.setContent(contentStr);
systemMessageDao.insert(systemMessageEntity);
//发送mq消息
logger.info("【发送MQ系统消息】-落盘并发送-messageType:{}, contentStr:{}", messageType, contentStr);
// 1.消息落盘
String penddingMsgId = persistMessage(messageType, contentStr);
// 2.发送消息
sendMQMessage(messageType, contentStr, penddingMsgId);
}
/**
* @description 消息落盘有事务
*
* @param messageType
* @param contentStr
* @return
* @author wxz
* @date 2021.10.16 11:04:53
*/
@Transactional(rollbackFor = Exception.class)
public String persistMessage(String messageType, String contentStr) {
SystemMessageEntity message = new SystemMessageEntity();
message.setMsgType(messageType);
message.setSendApproach(SystemMessageSendApproach.MQ);
message.setContent(contentStr);
systemMessageDao.insert(message);
SystemMessagePenddingEntity pendding = new SystemMessagePenddingEntity();
pendding.setMsgType(messageType);
pendding.setSendApproach(SystemMessageSendApproach.MQ);
pendding.setContent(contentStr);
pendding.setMsgId(message.getId());
systemMessagePenddingDao.insert(pendding);
logger.info("【发送MQ系统消息】-落盘完成");
return pendding.getId();
}
private void sendMQMessage(String messageType, String contentStr, String penddingId) {
String topic = getTopicByMsgType(messageType);
// 缓存下来,供滞留消息扫描。TTL -1,永不过期
String pendingMsgLabel = null;
String pendingMsgKey = null;
try {
Message meMessage = new Message(getTopicByMsgType(messageType), messageType, contentStr.getBytes(RemotingHelper.DEFAULT_CHARSET));
MessageCacheBean mcb = new MessageCacheBean(LocalDateTime.now(), messageType, topic, contentStr);
pendingMsgLabel = UUID.randomUUID().toString().replace("-", "");
pendingMsgKey = RedisKeys.blockedMqMsgKey(pendingMsgLabel);
redisUtils.set(pendingMsgKey, mcb, -1);
//logger.info("【发送MQ系统消息】-存入redis堆积列表成功-{}-{}-{}", topic, messageType, pendingMsgLabel);
} catch (Exception e) {
logger.error("【发送MQ系统消息】将系统MQ消息存储到Redis堆积列表失败,业务继续执行,{}", ExceptionUtils.getThrowableErrorStackTrace(e));
}
// 3.发送mq消息
try {
Message meMessage = new Message(topic, messageType, contentStr.getBytes(RemotingHelper.DEFAULT_CHARSET));
meMessage.putUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL, pendingMsgLabel);
rocketMQTemplate.getProducer().send(meMessage);
logger.info("【发送MQ系统消息】-发送到MQ成功");
} catch (Exception e) {
String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
logger.error("发送系统消息失败,堆栈信息:{}", errorStackTrace);
logger.error("【发送MQ系统消息】发送系统MQ消息失败,堆栈信息:{}", errorStackTrace);
// 清理阻塞中的消息缓存
redisUtils.delete(pendingMsgKey);
throw new RenException(EpmetErrorCode.SYSTEM_MQ_MSG_SEND_FAIL.getCode());
}
// 删除消息堆积
systemMessagePenddingDao.physicalDeleteById(penddingId);
}
/**
@ -79,7 +167,100 @@ public class SystemMessageServiceImpl implements SystemMessageService {
case SystemMessageType.POINT_RULE_CHANGED:
topic = TopicConstants.POINT;
break;
case SystemMessageType.GRID_CREATE:
case SystemMessageType.GRID_CHANGE:
case SystemMessageType.AGENCY_CREATE:
case SystemMessageType.AGENCY_CHANGE:
case SystemMessageType.DEPARTMENT_CREATE:
case SystemMessageType.DEPARTMENT_CHANGE:
topic = TopicConstants.ORG;
break;
case SystemMessageType.STAFF_CREATE:
case SystemMessageType.STAFF_CHANGE:
topic = TopicConstants.STAFF;
break;
case SystemMessageType.USER_PATROL_START:
case SystemMessageType.USER_PATROL_STOP:
topic = TopicConstants.PATROL;
break;
}
return topic;
}
@Override
public void blockedMqMsgScan() {
String scanKey = RedisKeys.blockedMqMsgKey("*");
Set<String> keys = redisUtils.keys(scanKey);
//System.out.println(keys);
for (String key : keys) {
MessageCacheBean mcb = (MessageCacheBean) redisUtils.get(key);
LocalDateTime createTime = mcb.getCreateTime();
LocalDateTime now = LocalDateTime.now();
//long deltaSeconds = ChronoUnit.SECONDS.between(createTime, now);
// 此处暂时使用粗粒度的Topic判断,耕细粒度的应该使用SystemMessageType
switch (mcb.getTopic()) {
case TopicConstants.AUTH:
case TopicConstants.GROUP_ACHIEVEMENT:
case TopicConstants.INIT_CUSTOMER:
case TopicConstants.ORG:
case TopicConstants.PATROL:
case TopicConstants.POINT:
case TopicConstants.STAFF:
// 耗时较短。一个小时最多发送一次告警
if (l1LastAlertTime == null || (
createTime.plusSeconds(PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L1).isBefore(now)
&& l1LastAlertTime.plusSeconds(PENDDING_MQ_MSG_ALERT_SECONDS_DELTA).isBefore(now))
) {
logger.error("【MQ阻塞消息扫描】Topic:{},messageType:{},redisKey:{},等{}个消息发生阻塞", mcb.topic, mcb.messageType, key, keys.size());
l1LastAlertTime = now;
}
break;
case TopicConstants.PROJECT_CHANGED:
// 耗时较长,一个小时最多发送一次告警
if (l1LastAlertTime == null || (
createTime.plusSeconds(PENDDING_MQ_MSG_EXEC_THRESHOLD_DELTA_L6).isBefore(now)
&& l6LastAlertTime.plusSeconds(PENDDING_MQ_MSG_ALERT_SECONDS_DELTA).isBefore(now))
) {
logger.error("【MQ阻塞消息扫描】Topic:{},messageType:{},redisKey:{},等{}个消息发生阻塞", mcb.topic, mcb.messageType, key, keys.size());
l1LastAlertTime = now;
}
break;
}
}
}
@Override
public void penddingMqMsgScan() {
Integer count = systemMessagePenddingDao.selectCount(null);
if (count == 0) {
return;
}
// 扫描并且重新投递
List<SystemMessagePenddingEntity> penddingMsgs = systemMessagePenddingDao.selectList(null);
for (SystemMessagePenddingEntity penddingMsg : penddingMsgs) {
try {
sendMQMessage(penddingMsg.getMsgType(), penddingMsg.getContent(), penddingMsg.getId());
} catch (Exception e) {
// 投递失败不应影响后续消息的投递
logger.error("【重新投递MQ消息】失败, msgType:{}, penddingMsgId:{}, 错误:{}", penddingMsg.getMsgType(), penddingMsg.getId() , ExceptionUtils.getErrorStackTrace(e));
}
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
static class MessageCacheBean {
private LocalDateTime createTime;
private String messageType;
private String topic;
private Object content;
}
}

14
epmet-module/epmet-message/epmet-message-server/src/main/resources/db/migration/V0.3.18__create_sys_msg_pendding.sql

@ -0,0 +1,14 @@
CREATE TABLE `system_message_pendding` (
`ID` varchar(64) NOT NULL COMMENT '主键',
`MSG_ID` varchar(64) NOT NULL COMMENT '消息主表id',
`MSG_TYPE` varchar(32) NOT NULL COMMENT '消息类型。init_customer:客户初始化,login登录,logout退出',
`SEND_APPROACH` varchar(32) NOT NULL COMMENT '消息发送途径',
`CONTENT` varchar(1024) NOT NULL COMMENT '消息内容',
`REVISION` int(11) DEFAULT NULL COMMENT '乐观锁',
`CREATED_BY` varchar(32) NOT NULL COMMENT '创建人(发布消息的人)',
`CREATED_TIME` datetime NOT NULL COMMENT '创建时间',
`UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人',
`UPDATED_TIME` datetime NOT NULL COMMENT '更新时间',
`DEL_FLAG` varchar(1) NOT NULL COMMENT '删除标记 0:未删除,1:已删除',
PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='系统消息滞留表'

26
epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/SystemMessagePenddingDao.xml

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.epmet.dao.SystemMessagePenddingDao">
<resultMap type="com.epmet.entity.SystemMessagePenddingEntity" id="systemMessagePenddingMap">
<result property="id" column="ID"/>
<result property="msgId" column="MSG_ID"/>
<result property="msgType" column="MSG_TYPE"/>
<result property="sendApproach" column="SEND_APPROACH"/>
<result property="content" column="CONTENT"/>
<result property="revision" column="REVISION"/>
<result property="createdBy" column="CREATED_BY"/>
<result property="createdTime" column="CREATED_TIME"/>
<result property="updatedBy" column="UPDATED_BY"/>
<result property="updatedTime" column="UPDATED_TIME"/>
<result property="delFlag" column="DEL_FLAG"/>
</resultMap>
<!--物理删除消息堆积-->
<delete id="physicalDeleteById">
delete from system_message_pendding where ID = #{penddingId}
</delete>
</mapper>

35
epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/mq/listener/IssueProjectCategoryTagInitListener.java

@ -1,12 +1,17 @@
package com.epmet.mq.listener;
import com.alibaba.fastjson.JSON;
import com.epmet.commons.rocketmq.constants.MQUserPropertys;
import com.epmet.commons.rocketmq.messages.InitCustomerMQMsg;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.utils.SpringContextUtils;
import com.epmet.dto.form.CategoryTagInitFormDTO;
import com.epmet.service.IssueProjectCategoryDictService;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
@ -32,8 +37,15 @@ public class IssueProjectCategoryTagInitListener implements MessageListenerConcu
@Autowired
private DistributedLock distributedLock;
private RedisUtils redisUtils;
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
if (redisUtils == null) {
redisUtils = SpringContextUtils.getBean(RedisUtils.class);
}
try {
msgs.forEach(msg -> consumeMessage(msg));
} catch (Exception e) {
@ -45,6 +57,7 @@ public class IssueProjectCategoryTagInitListener implements MessageListenerConcu
public void consumeMessage(MessageExt messageExt) {
String msg = new String(messageExt.getBody());
String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL);
logger.info("初始化客户-初始化议题、项目的分类、标签数据-收到消息内容:{}", msg);
InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class);
@ -66,5 +79,27 @@ public class IssueProjectCategoryTagInitListener implements MessageListenerConcu
} finally {
distributedLock.unLock(lock);
}
if (StringUtils.isNotBlank(pendingMsgLabel)) {
try {
removePendingMqMsgCache(pendingMsgLabel);
} catch (Exception e) {
logger.error("【议题/项目分类标签初始化事件监听器】-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e));
}
}
}
/**
* @description
*
* @param pendingMsgLabel
* @return
* @author wxz
* @date 2021.10.14 16:32:32
*/
private void removePendingMqMsgCache(String pendingMsgLabel) {
String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel);
redisUtils.delete(key);
//logger.info("【议题/项目分类标签初始化事件监听器】删除mq阻塞消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel);
}
}

5
epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/DeleteGridFormDTO.java

@ -27,4 +27,9 @@ public class DeleteGridFormDTO implements Serializable {
* userId
*/
private String userId;
/**
* 客户Id
*/
private String customerId;
}

3
epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/EditGridFormDTO.java

@ -40,4 +40,7 @@ public class EditGridFormDTO implements Serializable {
*/
private String manageDistrict;
//客户Id
private String customerId;
}

4
epmet-module/gov-org/gov-org-client/src/main/java/com/epmet/dto/form/RemoveAgencyFormDTO.java

@ -38,5 +38,9 @@ public class RemoveAgencyFormDTO implements Serializable {
*/
@NotBlank(message = "机关组织ID不能为空")
private String agencyId;
/**
* 客户Id
*/
private String customerId;
}

6
epmet-module/gov-org/gov-org-server/pom.xml

@ -107,6 +107,12 @@
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-message-client</artifactId>
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

1
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/AgencyController.java

@ -141,6 +141,7 @@ public class AgencyController {
@RequirePermission(requirePermission = RequirePermissionEnum.ORG_SUBAGENCY_DELETE)
public Result removeAgency(@LoginUser TokenDto tokenDTO, @RequestBody RemoveAgencyFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO);
formDTO.setCustomerId(tokenDTO.getCustomerId());
return agencyService.removeAgency(formDTO);
}

2
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/controller/GridController.java

@ -58,6 +58,7 @@ public class GridController {
@RequirePermission(requirePermission = RequirePermissionEnum.ORG_GRID_UPDATE)
public Result editGrid(@LoginUser TokenDto tokenDto, @RequestBody EditGridFormDTO editGridFormDTO){
ValidatorUtils.validateEntity(editGridFormDTO, EditGridFormDTO.EditGrid.class);
editGridFormDTO.setCustomerId(tokenDto.getCustomerId());
return customerGridService.editGrid(tokenDto,editGridFormDTO);
}
@ -68,6 +69,7 @@ public class GridController {
@PostMapping("deletegrid")
@RequirePermission(requirePermission = RequirePermissionEnum.ORG_GRID_DELETE)
public Result deleteGrid(@LoginUser TokenDto tokenDto, @RequestBody DeleteGridFormDTO deleteGridFormDTO){
deleteGridFormDTO.setCustomerId(tokenDto.getCustomerId());
return customerGridService.deleteGrid(tokenDto,deleteGridFormDTO);
}

34
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/mq/listener/InitCustomerOrgRolesListener.java

@ -1,16 +1,20 @@
package com.epmet.mq.listener;
import com.alibaba.fastjson.JSON;
import com.epmet.commons.rocketmq.constants.MQUserPropertys;
import com.epmet.commons.rocketmq.messages.InitCustomerMQMsg;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.utils.SpringContextUtils;
import com.epmet.constant.UserWorkType;
import com.epmet.dto.CustomerAgencyDTO;
import com.epmet.dto.form.AddAgencyAndStaffFormDTO;
import com.epmet.dto.form.AdminStaffFromDTO;
import com.epmet.service.AgencyService;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
@ -32,8 +36,15 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently
private Logger logger = LoggerFactory.getLogger(getClass());
private RedisUtils redisUtils;
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
if (redisUtils == null) {
redisUtils = SpringContextUtils.getBean(RedisUtils.class);
}
try {
msgs.forEach(msg -> consumeMessage(msg));
} catch (Exception e) {
@ -45,6 +56,7 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently
private void consumeMessage(MessageExt messageExt) {
String msg = new String(messageExt.getBody());
String pendingMsgLabel = messageExt.getUserProperty(MQUserPropertys.BLOCKED_MSG_LABEL);
logger.info("初始化客户-初始化组织信息-收到消息内容:{}", msg);
InitCustomerMQMsg msgObj = JSON.parseObject(msg, InitCustomerMQMsg.class);
@ -65,6 +77,14 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently
} finally {
distributedLock.unLock(lock);
}
if (StringUtils.isNotBlank(pendingMsgLabel)) {
try {
removePendingMqMsgCache(pendingMsgLabel);
} catch (Exception e) {
logger.error("【客户初始化事件监听器】-orgRole-删除mq阻塞消息缓存失败:{}", ExceptionUtils.getErrorStackTrace(e));
}
}
}
/**
@ -100,6 +120,20 @@ public class InitCustomerOrgRolesListener implements MessageListenerConcurrently
return agencyAndStaff;
}
/**
* @description
*
* @param pendingMsgLabel
* @return
* @author wxz
* @date 2021.10.14 16:32:32
*/
private void removePendingMqMsgCache(String pendingMsgLabel) {
String key = RedisKeys.blockedMqMsgKey(pendingMsgLabel);
redisUtils.delete(key);
//logger.info("【客户初始化事件监听器】删除mq阻塞消息缓存成功,penddingMsgLabel:{}", pendingMsgLabel);
}
/* @Override
public ConsumerConfigProperties getConsumerProperty() {
ConsumerConfigProperties configProperties = new ConsumerConfigProperties();

53
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/AgencyServiceImpl.java

@ -18,6 +18,7 @@
package com.epmet.service.impl;
import com.alibaba.fastjson.JSON;
import com.epmet.commons.rocketmq.messages.OrgOrStaffMQMsg;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.constant.StrConstant;
import com.epmet.commons.tools.exception.EpmetErrorCode;
@ -35,8 +36,10 @@ import com.epmet.dto.form.*;
import com.epmet.dto.result.*;
import com.epmet.entity.CustomerAgencyEntity;
import com.epmet.feign.EpmetCommonServiceOpenFeignClient;
import com.epmet.feign.EpmetMessageOpenFeignClient;
import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.redis.CustomerAgencyRedis;
import com.epmet.send.SendMqMsgUtil;
import com.epmet.service.AgencyService;
import com.epmet.service.CustomerAgencyService;
import com.epmet.service.CustomerOrgParameterService;
@ -80,6 +83,8 @@ public class AgencyServiceImpl implements AgencyService {
private CustomerOrgParameterService customerOrgParameterService;
@Autowired
private EpmetCommonServiceOpenFeignClient epmetCommonServiceOpenFeignClient;
@Autowired
private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient;
/**
@ -176,6 +181,16 @@ public class AgencyServiceImpl implements AgencyService {
//5.redis缓存
customerAgencyRedis.delete(formDTO.getAgencyId());
//2021-10-18 推送mq,数据同步到中介库 start【中介库只放了组织的名称、级别,所以涉及批量修改pname的操作不涉及同步中间库】
OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg();
mq.setCustomerId(originalEntity.getCustomerId());
mq.setOrgId(formDTO.getAgencyId());
mq.setOrgType("agency");
mq.setType("agency_change");
SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq);
//2021-10-18 end
return result;
}
@ -215,6 +230,16 @@ public class AgencyServiceImpl implements AgencyService {
log.error(CustomerAgencyConstant.DEL_EXCEPTION);
throw new RenException(CustomerAgencyConstant.DEL_EXCEPTION);
}
//2021-10-18 推送mq,数据同步到中介库 start
OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg();
mq.setCustomerId(formDTO.getCustomerId());
mq.setOrgId(formDTO.getAgencyId());
mq.setOrgType("agency");
mq.setType("agency_change");
SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq);
//2021-10-18 end
return result;
}
@ -370,6 +395,16 @@ public class AgencyServiceImpl implements AgencyService {
entity.setTotalUser(0);
entity.setCustomerId(form.getCustomerId());
customerAgencyDao.insert(entity);
//2021-10-18 推送mq,数据同步到中介库 start
OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg();
mq.setCustomerId(form.getCustomerId());
mq.setOrgId(entity.getId());
mq.setOrgType("agency");
mq.setType("agency_create");
SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq);
//2021-10-18 end
return entity.getId();
}
@ -430,6 +465,15 @@ public class AgencyServiceImpl implements AgencyService {
throw new RenException(EpmetErrorCode.OPER_ADD_CUSTOMER_MANAGER_ERROR.getCode(), staffResult.getMsg());
}
//2021-10-18 推送mq,数据同步到中介库 start
OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg();
mq.setCustomerId(agencyDTO.getCustomerId());
mq.setOrgId(entity.getId());
mq.setOrgType("agency");
mq.setType("agency_create");
SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq);
//2021-10-18 end
}
/**
@ -474,6 +518,15 @@ public class AgencyServiceImpl implements AgencyService {
//3:返回新组织Id
resultDTO.setAgencyId(insertEntity.getId());
resultDTO.setAreaCode(insertEntity.getAreaCode());
//2021-10-18 推送mq,数据同步到中介库 start
OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg();
mq.setCustomerId(parent.getCustomerId());
mq.setOrgId(insertEntity.getId());
mq.setOrgType("agency");
mq.setType("agency_create");
SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq);
//2021-10-18 end
return resultDTO;
}

34
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/service/impl/CustomerGridServiceImpl.java

@ -21,6 +21,7 @@ import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.rocketmq.messages.OrgOrStaffMQMsg;
import com.epmet.commons.tools.constant.FieldConstant;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.constant.StrConstant;
@ -41,8 +42,10 @@ import com.epmet.dto.form.*;
import com.epmet.dto.result.*;
import com.epmet.entity.CustomerAgencyEntity;
import com.epmet.entity.CustomerGridEntity;
import com.epmet.feign.EpmetMessageOpenFeignClient;
import com.epmet.feign.EpmetUserFeignClient;
import com.epmet.feign.OperCrmOpenFeignClient;
import com.epmet.send.SendMqMsgUtil;
import com.epmet.service.CustomerAgencyService;
import com.epmet.service.CustomerGridService;
import com.epmet.util.ModuleConstant;
@ -79,9 +82,10 @@ public class CustomerGridServiceImpl extends BaseServiceImpl<CustomerGridDao, Cu
private OperCrmOpenFeignClient operCrmOpenFeignClient;
@Autowired
private CustomerGridDao customerGridDao;
@Autowired
private RedisUtils redisUtils;
@Autowired
private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient;
@Override
public PageData<CustomerGridDTO> page(Map<String, Object> params) {
@ -270,6 +274,16 @@ public class CustomerGridServiceImpl extends BaseServiceImpl<CustomerGridDao, Cu
baseDao.insert(customerGridEntity);
AddGridResultDTO resultDTO = new AddGridResultDTO();
resultDTO.setGridId(customerGridEntity.getId());
//2021-10-18 推送mq,数据同步到中介库 start
OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg();
mq.setCustomerId(customerAgencyDTO.getCustomerId());
mq.setOrgId(customerGridEntity.getId());
mq.setOrgType("grid");
mq.setType("grid_create");
SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq);
//2021-10-18 end
return new Result<AddGridResultDTO>().ok(resultDTO);
}
@ -291,6 +305,16 @@ public class CustomerGridServiceImpl extends BaseServiceImpl<CustomerGridDao, Cu
customerGridDTO.setUpdatedBy(tokenDto.getUserId());
customerGridDTO.setId(editGridFormDTO.getGridId());
baseDao.editGrid(customerGridDTO);
//2021-10-18 推送mq,数据同步到中介库 start
OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg();
mq.setCustomerId(editGridFormDTO.getCustomerId());
mq.setOrgId(editGridFormDTO.getGridId());
mq.setOrgType("grid");
mq.setType("grid_change");
SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq);
//2021-10-18 end
return new Result();
}
@ -310,6 +334,14 @@ public class CustomerGridServiceImpl extends BaseServiceImpl<CustomerGridDao, Cu
return new Result().error(EpmetErrorCode.NOT_DEL_GRID.getCode());
}
}
//2021-10-18 推送mq,数据同步到中介库 start
OrgOrStaffMQMsg mq = new OrgOrStaffMQMsg();
mq.setCustomerId(deleteGridFormDTO.getCustomerId());
mq.setOrgId(deleteGridFormDTO.getGridId());
mq.setOrgType("grid");
mq.setType("grid_change");
SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendOrgStaffMqMsg(mq);
//2021-10-18 end
return new Result();
}

21
epmet-module/open-data-worker/open-data-worker-client/pom.xml

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>open-data-worker</artifactId>
<groupId>com.epmet</groupId>
<version>2.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>open-data-worker-client</artifactId>
<dependencies>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-commons-tools</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</project>

207
epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseDisputeProcessDTO.java

@ -0,0 +1,207 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.opendata.dto;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 事件信息表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2021-10-15
*/
@Data
public class BaseDisputeProcessDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private String id;
/**
* 客户Id
*/
private String customerId;
/**
* 网格编码
*/
private String orgCode;
/**
* 网格名称
*/
private String orgName;
/**
* 事件名称
*/
private String eventName;
/**
* 事件类别
*/
private String eventCategory;
/**
* 上报时间 YYYY-MM-DD HH:MM:SS
*/
private Date reportTime;
/**
* 发生时间 格式为YYYY-MM-DD
*/
private Date happenDate;
/**
* 发生地点
*/
private String happenPlace;
/**
* 事件简述
*/
private String eventDescription;
/**
* 办结方式 01自办02上报 源于居民端的最终结案的项目为02工作端立项的项目最终结案的01
*/
private String waysOfResolving;
/**
* 是否办结 YN
*/
private String successfulOrNo;
/**
* 办结层级
01省自治区直辖市
02地
03县
04乡镇街道
05片区
06村社区
07网格
*/
private String completeLevel;
/**
* 基础信息主键
*/
private String baseInfoId;
/**
* 办结时间
*/
private Date completeTime;
/**
* 经度
*/
private BigDecimal lng;
/**
* 纬度
*/
private BigDecimal lat;
/**
* 主要当事人姓名
*/
private String name;
/**
* 涉及人数
*/
private Integer numberInvolved;
/**
* 涉及单位
*/
private String relatedUnits;
/**
* 重点场所类别 01九小场所, 02公共场所
*/
private String keyAreaType;
/**
* 宗教活动规模 01 0-50人,02 51-200人,03 201人以上
*/
private String religionScale;
/**
* 宗教类别 01道教 02佛教 03基督教 04伊斯兰教 05其他
*/
private String religionType;
/**
* 重点场所是否变动 YN
*/
private String isKeyareaState;
/**
* 重点人员是否在当地 YN
*/
private String isKeypeopleLocate;
/**
* 重点人员现状
*/
private String keypeopleStatus;
/**
* 删除标识 0.未删除 1.已删除
*/
private Long delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
* 创建人
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdTime;
/**
* 更新人
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedTime;
}

136
epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridInfoDTO.java

@ -0,0 +1,136 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.opendata.dto;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 网格基础信息表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2021-10-15
*/
@Data
public class BaseGridInfoDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private String id;
/**
* 客户Id
*/
private String customerId;
/**
* 组织/网格Id
*/
private String orgId;
/**
* 网格编码
*/
private String code;
/**
* 网格名称
*/
private String gridName;
/**
* 网格层级[07:网格]
*/
private String gridLevel;
/**
* 专属网格类型[01:党政机关; 02:医院; 03:学校; 04:企业; 05:园区; 06:商圈; 07:市场; 08:景区;
*/
private String gridType;
/**
* 网格内人口规模[01:500人以下含500人; 02:500-1000人含1000人; 03:1000-1500人含1500人; 04:1500人以上]
*/
private String populationSize;
/**
* 是否成立网格党支部或网格党小组[YN]
*/
private String isPartyBranch;
/**
* 网格党组织类型[01:网格党支部; 02:网格党小组]
*/
private String partyBranchType;
/**
* 中心点质心经度
*/
private String lng;
/**
* 中心点质心纬度
*/
private String lat;
/**
* 网格颜色
*/
private String gridColor;
/**
* 空间范围
*/
private String shape;
/**
* 删除标识 0.未删除 1.已删除
*/
private Long delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
* 创建人
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdTime;
/**
* 更新人
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedTime;
}

191
epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/BaseGridUserDTO.java

@ -0,0 +1,191 @@
/**
* Copyright 2018 人人开源 https://www.renren.io
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.epmet.opendata.dto;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 网格员基础信息表
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2021-10-15
*/
@Data
public class BaseGridUserDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private String id;
/**
* 客户Id
*/
private String customerId;
/**
* 网格Id
*/
private String gridId;
/**
* 人员Id
*/
private String staffId;
/**
* 网格编码
*/
private String code;
/**
* 网格名称
*/
private String gridName;
/**
* 网格员姓名
*/
private String nickName;
/**
* 专属网格类型[01:党政机关; 02:医院; 03:学校; 04:企业; 05:园区; 06:商圈; 07:市场; 08:景区;
*/
private String cardNum;
/**
* 网格员类型[01:专职网格员; 02:兼职网格员; 03:网格长; 04:综治机构人员; 05:职能部门人员]
*/
private String userType;
/**
* 手机号码
*/
private String phonenumber;
/**
* 性别[1:男性; 2:女性; 9:未说明的性别]
*/
private String sex;
/**
* 民族[字典表主键]
*/
private String nation;
/**
* 政治面貌[字典表主键]
*/
private String paerty;
/**
* 出生日期[YYYY-MM-DD]
*/
private Date birthday;
/**
* 学历[字典表主键]
*/
private String education;
/**
* 入职时间
*/
private Date entryDate;
/**
* 是否离职
*/
private String isLeave;
/**
* 离职时间
*/
private Date leaveDate;
/**
* 网格员年收入
*/
private String income;
/**
* 是否社区两委委员[YN]
*/
private String isCommittee;
/**
* 是否社区工作者[YN]
*/
private String isCommunityWorkers;
/**
* 是否社会工作者[YN]
*/
private String isSocialWorker;
/**
* 是否村民小组长[YN
*/
private String isVillageLeader;
/**
* 是否警务助理[YN]
*/
private String isPoliceAssistant;
/**
* 是否人民调解员[YN]
*/
private String isMediator;
/**
* 删除标识 0.未删除 1.已删除
*/
private Long delFlag;
/**
* 乐观锁
*/
private Integer revision;
/**
* 创建人
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdTime;
/**
* 更新人
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedTime;
}

34
epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/GridBaseInfoFormDTO.java

@ -0,0 +1,34 @@
package com.epmet.opendata.dto.form;
import com.epmet.commons.tools.validator.group.CustomerClientShowGroup;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.List;
/**
* @dscription 插叙客户网格基础信息--接口入参
* @author sun
*/
@Data
public class GridBaseInfoFormDTO implements Serializable {
private static final long serialVersionUID = -3634745091993094743L;
/**
* 客户Id
*/
@NotBlank(message = "事件标识不能为空", groups = {Grid.class})
private String customerId = "";
/**
* 网格Id
*/
private List<String> orgIdList;
/**
* 操作类型新增:add 修改删除:edit
*/
private String type;
public interface Grid extends CustomerClientShowGroup {}
}

33
epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/StaffBaseInfoFormDTO.java

@ -0,0 +1,33 @@
package com.epmet.opendata.dto.form;
import com.epmet.commons.tools.validator.group.CustomerClientShowGroup;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.List;
/**
* @dscription 插叙客户网格人员基础信息--接口入参
* @author sun
*/
@Data
public class StaffBaseInfoFormDTO implements Serializable {
private static final long serialVersionUID = -3634745091993094743L;
/**
* 客户Id
*/
@NotBlank(message = "事件标识不能为空", groups = {Staff.class})
private String customerId = "";
/**
* 人员Id
*/
private List<String> staffIdList;
/**
* 操作类型新增:add 修改删除:edit
*/
private String type;
public interface Staff extends CustomerClientShowGroup {}
}

33
epmet-module/open-data-worker/open-data-worker-client/src/main/java/com/epmet/opendata/dto/form/UpsertPatrolRecordForm.java

@ -0,0 +1,33 @@
package com.epmet.opendata.dto.form;
import com.epmet.commons.tools.dto.form.PageFormDTO;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 插入或更新巡查记录主表
* @author liujianjun
*/
@Data
public class UpsertPatrolRecordForm extends PageFormDTO {
/**
* 客户Id
*/
@NotEmpty(message = "customerId不能为空")
private String customerId;
/**
* 巡查记录id
*/
private String patrolId;
/**
* 操作类型
* SystemMessageType.USER_PATROL_START
* SystemMessageTypSTOP
*/
@NotEmpty(message = "actionType不能为空")
private String actionType;
}

11
epmet-module/open-data-worker/open-data-worker-server/Dockerfile

@ -0,0 +1,11 @@
FROM java:8
RUN export LANG="zh_CN.UTF-8"
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
COPY ./target/*.jar ./open-data-worker.jar
EXPOSE 8107
ENTRYPOINT ["sh", "-c", "exec $RUN_INSTRUCT"]

18
epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-dev.yml

@ -0,0 +1,18 @@
version: "3.7"
services:
gov-voice-server:
container_name: open-data-worker-server-dev
image: 192.168.1.140:5000/epmet-cloud-dev/open-data-worker-server:version_placeholder
ports:
- "8107:8107"
network_mode: host # 使用现有网络
volumes:
- "/opt/epmet-cloud-logs/dev:/logs"
environment:
RUN_INSTRUCT: "java -Xms32m -Xmx200m -jar ./open-data-worker.jar"
restart: "unless-stopped"
deploy:
resources:
limits:
cpus: '0.1'
memory: 250M

18
epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-prod.yml

@ -0,0 +1,18 @@
version: "3.7"
services:
gov-voice-server:
container_name: open-data-worker-server-prod
image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/open-data-worker-server:0.3.69
ports:
- "8107:8107"
network_mode: host # 使用现有网络
volumes:
- "/opt/epmet-cloud-logs/prod:/logs"
environment:
RUN_INSTRUCT: "java -Xms256m -Xmx512m -jar ./open-data-worker.jar"
restart: "unless-stopped"
deploy:
resources:
limits:
cpus: '0.1'
memory: 600M

18
epmet-module/open-data-worker/open-data-worker-server/deploy/docker-compose-test.yml

@ -0,0 +1,18 @@
version: "3.7"
services:
gov-voice-server:
container_name: open-data-worker-server-test
image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/open-data-worker-server:version_placeholder
ports:
- "8107:8107"
network_mode: host # 使用现有网络
volumes:
- "/opt/epmet-cloud-logs/test:/logs"
environment:
RUN_INSTRUCT: "java -Xms32m -Xmx300m -jar ./open-data-worker.jar"
restart: "unless-stopped"
deploy:
resources:
limits:
cpus: '0.1'
memory: 350M

282
epmet-module/open-data-worker/open-data-worker-server/pom.xml

@ -0,0 +1,282 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>open-data-worker</artifactId>
<groupId>com.epmet</groupId>
<version>2.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>open-data-worker-server</artifactId>
<dependencies>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-commons-tools</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-commons-mybatis</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>${spring.boot.admin.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 替换Feign原生httpclient -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>10.3.0</version>
</dependency>
<!--rocketmq-->
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-commons-rocketmq</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-message-client</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>open-data-worker-client</artifactId>
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-user-client</artifactId>
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>data-statistical-client</artifactId>
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<resources>
<resource>
<filtering>true</filtering>
<directory>${basedir}/src/main/resources</directory>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>dev</id>
<properties>
<server.port>8117</server.port>
<spring.profiles.active>dev</spring.profiles.active>
<!-- 数据库配置-->
<spring.datasource.druid.url>
<![CDATA[jdbc:mysql://192.168.1.140:3306/epmet_open_data?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai]]>
</spring.datasource.druid.url>
<spring.datasource.druid.username>epmet_open_data_user</spring.datasource.druid.username>
<spring.datasource.druid.password>EpmEt-db-UsEr</spring.datasource.druid.password>
<!-- redis配置 -->
<spring.redis.index>0</spring.redis.index>
<spring.redis.host>192.168.1.140</spring.redis.host>
<spring.redis.port>6379</spring.redis.port>
<spring.redis.password>123456</spring.redis.password>
<!-- nacos -->
<nacos.register-enabled>true</nacos.register-enabled>
<nacos.server-addr>192.168.1.140:8848</nacos.server-addr>
<nacos.discovery.namespace>1fecc730-5e6e-464c-aae9-7567944e7936</nacos.discovery.namespace>
<nacos.config.namespace></nacos.config.namespace>
<nacos.config.group></nacos.config.group>
<nacos.config-enabled>false</nacos.config-enabled>
<nacos.ip/>
<!--是否开启服务列表变更监听-->
<nacos.service-list-changed-listening.enable>true</nacos.service-list-changed-listening.enable>
<!--flyway migration 数据库迁移工具-->
<spring.flyway.enabled>false</spring.flyway.enabled>
<!--钉钉 机器人地址-->
<dingTalk.robot.webHook>https://oapi.dingtalk.com/robot/send?access_token=e894e5690f9d6a527722974c71548ff6c0fe29bd956589a09e21b16442a35ed4</dingTalk.robot.webHook>
<dingTalk.robot.secret>SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd</dingTalk.robot.secret>
<!--rocketmq-->
<rocketmq.enable>true</rocketmq.enable>
<rocketmq.nameserver>192.168.1.140:9876;192.168.1.141:9876</rocketmq.nameserver>
</properties>
</profile>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<server.port>8117</server.port>
<spring.profiles.active>local</spring.profiles.active>
<!-- 数据库配置-->
<spring.datasource.druid.url>
<![CDATA[jdbc:mysql://192.168.1.140:3306/epmet_open_data?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai]]>
</spring.datasource.druid.url>
<spring.datasource.druid.username>epmet_open_data_user</spring.datasource.druid.username>
<spring.datasource.druid.password>EpmEt-db-UsEr</spring.datasource.druid.password>
<!-- redis配置 -->
<spring.redis.index>0</spring.redis.index>
<spring.redis.host>192.168.1.140</spring.redis.host>
<spring.redis.port>6379</spring.redis.port>
<spring.redis.password>123456</spring.redis.password>
<!-- nacos -->
<nacos.register-enabled>false</nacos.register-enabled>
<nacos.server-addr>192.168.1.140:8848</nacos.server-addr>
<nacos.discovery.namespace>1fecc730-5e6e-464c-aae9-7567944e7936</nacos.discovery.namespace>
<nacos.config.namespace></nacos.config.namespace>
<nacos.config.group></nacos.config.group>
<nacos.config-enabled>false</nacos.config-enabled>
<nacos.ip/>
<!--是否开启服务列表变更监听-->
<nacos.service-list-changed-listening.enable>false</nacos.service-list-changed-listening.enable>
<!--flyway migration 数据库迁移工具-->
<spring.flyway.enabled>false</spring.flyway.enabled>
<!--钉钉 机器人地址-->
<dingTalk.robot.webHook>https://oapi.dingtalk.com/robot/send?access_token=e894e5690f9d6a527722974c71548ff6c0fe29bd956589a09e21b16442a35ed4</dingTalk.robot.webHook>
<dingTalk.robot.secret>SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd</dingTalk.robot.secret>
<!--rocketmq-->
<rocketmq.enable>false</rocketmq.enable>
<rocketmq.nameserver>192.168.1.140:9876;192.168.1.141:9876</rocketmq.nameserver>
</properties>
</profile>
<profile>
<id>test</id>
<!--<activation>
<activeByDefault>true</activeByDefault>
</activation>-->
<properties>
<server.port>8117</server.port>
<spring.profiles.active>test</spring.profiles.active>
<!-- 数据库配置-->
<spring.datasource.druid.url>
<![CDATA[jdbc:mysql://rm-m5ef9t617j6o5eup7.mysql.rds.aliyuncs.com:3306/epmet_open_data?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai]]>
</spring.datasource.druid.url>
<spring.datasource.druid.username>epmet</spring.datasource.druid.username>
<spring.datasource.druid.password>elink@833066</spring.datasource.druid.password>
<!-- redis配置 -->
<spring.redis.index>0</spring.redis.index>
<spring.redis.host>r-m5eoz5b6tkx09y6bpz.redis.rds.aliyuncs.com</spring.redis.host>
<spring.redis.port>6379</spring.redis.port>
<spring.redis.password>EpmEtrEdIs!q@w</spring.redis.password>
<!-- nacos -->
<nacos.register-enabled>true</nacos.register-enabled>
<nacos.server-addr>192.168.10.150:8848</nacos.server-addr>
<nacos.discovery.namespace>67e3c350-533e-4d7c-9f8f-faf1b4aa82ae</nacos.discovery.namespace>
<nacos.config.namespace></nacos.config.namespace>
<nacos.config.group></nacos.config.group>
<nacos.config-enabled>false</nacos.config-enabled>
<nacos.ip/>
<!--是否开启服务列表变更监听-->
<nacos.service-list-changed-listening.enable>true</nacos.service-list-changed-listening.enable>
<!--flyway migration 数据库迁移工具-->
<spring.flyway.enabled>true</spring.flyway.enabled>
<!--钉钉 机器人地址-->
<dingTalk.robot.webHook>https://oapi.dingtalk.com/robot/send?access_token=e894e5690f9d6a527722974c71548ff6c0fe29bd956589a09e21b16442a35ed4</dingTalk.robot.webHook>
<dingTalk.robot.secret>SECfcc020bdc83bb17a2c00f39977b1fbc409ef4188c7beaea11c5caa90eeaf87fd</dingTalk.robot.secret>
<!--rocketmq-->
<rocketmq.enable>true</rocketmq.enable>
<rocketmq.nameserver>192.168.10.161:9876</rocketmq.nameserver>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<server.port>8117</server.port>
<spring.profiles.active>prod</spring.profiles.active>
<!-- 数据库配置-->
<spring.datasource.druid.url>
<![CDATA[jdbc:mysql://rm-m5e3vzs2637224wj9.mysql.rds.aliyuncs.com:3306/epmet_open_data?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai]]>
</spring.datasource.druid.url>
<spring.datasource.druid.username>epmet_open_data_user</spring.datasource.druid.username>
<spring.datasource.druid.password>EpmEt-db-UsEr</spring.datasource.druid.password>
<!-- redis配置 -->
<spring.redis.index>0</spring.redis.index>
<spring.redis.host>r-m5ez3n1j0qc3ykq2ut.redis.rds.aliyuncs.com</spring.redis.host>
<spring.redis.port>6379</spring.redis.port>
<spring.redis.password>EpmEtclOUdrEdIs!Q2w</spring.redis.password>
<!-- nacos -->
<nacos.register-enabled>true</nacos.register-enabled>
<nacos.server-addr>192.168.11.180:8848</nacos.server-addr>
<nacos.discovery.namespace>bd205d23-e696-47be-b995-916313f86e99</nacos.discovery.namespace>
<nacos.config.namespace></nacos.config.namespace>
<nacos.config.group></nacos.config.group>
<nacos.config-enabled>false</nacos.config-enabled>
<nacos.ip/>
<!--是否开启服务列表变更监听-->
<nacos.service-list-changed-listening.enable>true</nacos.service-list-changed-listening.enable>
<!--flyway migration 数据库迁移工具-->
<spring.flyway.enabled>true</spring.flyway.enabled>
<!--生产钉钉 机器人地址-->
<dingTalk.robot.webHook>https://oapi.dingtalk.com/robot/send?access_token=a5f66c3374b1642fe2142dbf56d5997e280172d4e8f2b546c9423a68c82ece6c</dingTalk.robot.webHook>
<dingTalk.robot.secret>SEC95f4f40b533ad379ea6a6d1af6dd37029383cfe1b7cd96dfac2678be2c1c3ed1</dingTalk.robot.secret>
<!--rocketmq-->
<rocketmq.enable>true</rocketmq.enable>
<rocketmq.nameserver>192.168.11.187:9876;192.168.11.184:9876</rocketmq.nameserver>
</properties>
</profile>
</profiles>
</project>

26
epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/OpenDataApplication.java

@ -0,0 +1,26 @@
package com.epmet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
/**
* @Description OpenData服务启动类
* 注意此处要使用@ComponentScan的原因是启动类处于包com.epmet.opendata下想用com.epmet.commons包下的一些Spring对象需要
* 手动指定扫描包否则无法扫描
* @author wxz
* @date 2021.10.13 15:16:05
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@ServletComponentScan
//@ComponentScan(value = { "com.epmet" })
public class OpenDataApplication {
public static void main(String[] args) {
SpringApplication.run(OpenDataApplication.class, args);
}
}

40
epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/aspect/RequestLogAspect.java

@ -0,0 +1,40 @@
package com.epmet.opendata.aspect;
import com.epmet.commons.tools.aspect.BaseRequestLogAspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* 日志/异常处理切面实现调用父类方法完成日志记录和异常处理
*/
@Aspect
@Component
@Order(0)
public class RequestLogAspect extends BaseRequestLogAspect {
@Override
@Around(value = "execution(* com.epmet.opendata.controller.*Controller*.*(..)) ")
public Object proceed(ProceedingJoinPoint point) throws Throwable {
return super.proceed(point, getRequest());
}
/**
* 获取Request对象
*
* @return
*/
private HttpServletRequest getRequest() {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
return sra.getRequest();
}
}

26
epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/ModuleConfigImpl.java

@ -0,0 +1,26 @@
/**
* Copyright (c) 2018 人人开源 All rights reserved.
*
* https://www.renren.io
*
* 版权所有侵权必究
*/
package com.epmet.opendata.config;
import com.epmet.commons.tools.config.ModuleConfig;
import org.springframework.stereotype.Service;
/**
* 模块配置信息
*
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@Service
public class ModuleConfigImpl implements ModuleConfig {
@Override
public String getName() {
return "govvoice";
}
}

161
epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/config/NacosServiceListListenerRegisterer.java

@ -0,0 +1,161 @@
package com.epmet.opendata.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<String> 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<String> serviceListView = null;
try {
serviceListView = namingService.getServicesOfServer(1, 100);
//启动监听
if (serviceListView == null || serviceListView.getCount() == 0) {
log.info("【Nacos服务列表定时刷新】当前无任何可添加监听的服务");
return;
}
List<String> 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();
}
}
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save