Browse Source

Merge branch 'pingyin_master' of http://git.elinkit.com.cn:7070/r/epmet-cloud into pingyin_master

feature/evaluate
wangxianzhang 3 years ago
parent
commit
c5ebed102c
  1. 5
      epmet-admin/epmet-admin-client/src/main/java/com/epmet/dto/PasswordDTO.java
  2. 10
      epmet-admin/epmet-admin-server/src/main/resources/bootstrap.yml
  3. 5
      epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.22__jmreport_category.sql
  4. 8
      epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.23__party_publish_Time.sql
  5. 10
      epmet-auth/pom.xml
  6. 2
      epmet-auth/src/main/java/com/epmet/AuthApplication.java
  7. 8
      epmet-auth/src/main/java/com/epmet/controller/GovWebController.java
  8. 23
      epmet-auth/src/main/java/com/epmet/controller/LoginController.java
  9. 72
      epmet-auth/src/main/java/com/epmet/controller/ThirdLoginController.java
  10. 73
      epmet-auth/src/main/java/com/epmet/dto/dingres/DingUserDetailDTO.java
  11. 54
      epmet-auth/src/main/java/com/epmet/dto/dingres/V2UserGetuserinfoResDTO.java
  12. 41
      epmet-auth/src/main/java/com/epmet/dto/form/ResiDingAppLoginFormDTO.java
  13. 23
      epmet-auth/src/main/java/com/epmet/dto/form/ResiDingAppLoginMdFormDTO.java
  14. 23
      epmet-auth/src/main/java/com/epmet/dto/form/ThirdStaffOrgByAccountFormDTO.java
  15. 42
      epmet-auth/src/main/java/com/epmet/dto/result/ResiDingAppLoginResDTO.java
  16. 26
      epmet-auth/src/main/java/com/epmet/service/ThirdLoginService.java
  17. 402
      epmet-auth/src/main/java/com/epmet/service/impl/ThirdLoginServiceImpl.java
  18. 8
      epmet-auth/src/main/resources/bootstrap.yml
  19. 103
      epmet-cloud-generator/src/main/resources/template/index.vue.vm
  20. 24
      epmet-commons/epmet-commons-feignclient/pom.xml
  21. 0
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/.gitkeep
  22. 0
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/.gitkeep
  23. 22
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/JiMuPage.java
  24. 20
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/JiMuResult.java
  25. 33
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/form/JiMuReportFormDTO.java
  26. 27
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/form/JimuReportExportRequestDTO.java
  27. 17
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportBriefResultDTO.java
  28. 31
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportDetailResultDTO.java
  29. 26
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportResultDTO.java
  30. 18
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JimuReportDbDataResultDTO.java
  31. 26
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JimuReportFieldTreeResultDTO.java
  32. 0
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/.gitkeep
  33. 55
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/JiMuReportOpenFeignClient.java
  34. 58
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallback.java
  35. 24
      epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallbackFactory.java
  36. 6
      epmet-commons/epmet-commons-mybatis/pom.xml
  37. 10
      epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java
  38. 7
      epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java
  39. 23
      epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/PartyMeetingMessageMQMsg.java
  40. 6
      epmet-commons/epmet-commons-tools/pom.xml
  41. 1
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/MaskResponse.java
  42. 13
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/ReportRequest.java
  43. 86
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/ReportRequestAspect.java
  44. 5
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/AppClientConstant.java
  45. 1
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java
  46. 5
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/ServiceConstant.java
  47. 4
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/DictListFormDTO.java
  48. 26
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/DingMiniInfoFormDTO.java
  49. 24
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/HasOperPermissionFormDTO.java
  50. 13
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/OperResouce.java
  51. 22
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/YtHsjcResDTO.java
  52. 48
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/YtHsjcResDetailDTO.java
  53. 4
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/CoveragePlaceTypeEnum.java
  54. 79
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/DingMiniAppEnum.java
  55. 6
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/EventEnum.java
  56. 27
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/IdCardTypeEnum.java
  57. 1
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java
  58. 46
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/CommonOperAccessOpenFeignClient.java
  59. 24
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/CommonThirdFeignClient.java
  60. 2
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java
  61. 35
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/fallback/CommonOperAccessOpenFeignClientFallback.java
  62. 19
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/fallback/CommonOperAccessOpenFeignClientFallbackFactory.java
  63. 20
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/fallback/CommonThirdFeignClientFallBackFactory.java
  64. 24
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/fallback/CommonThirdFeignClientFallback.java
  65. 7
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/page/PageData.java
  66. 55
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/processor/MaskProcessor.java
  67. 73
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
  68. 58
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/common/CustomerDingDingRedis.java
  69. 52
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/common/bean/DingMiniInfoCache.java
  70. 6
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/password/BCryptPasswordEncoder.java
  71. 37
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/password/PasswordUtils.java
  72. 1
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/user/LoginUserUtil.java
  73. 9
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/CpUserDetailRedis.java
  74. 7
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/DateUtils.java
  75. 9
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/EpmetRequestHolder.java
  76. 28
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/HttpClientManager.java
  77. 155
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/IdCardRegexUtils.java
  78. 89
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/NameUtils.java
  79. 42
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/YtHsResUtils.java
  80. 51
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/poi/excel/converter/EasyExcelDateConverter.java
  81. 26
      epmet-gateway/src/main/java/com/epmet/GatewayApplication.java
  82. 70
      epmet-gateway/src/main/java/com/epmet/auth/InternalAuthProcessor.java
  83. 11
      epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java
  84. 5
      epmet-gateway/src/main/java/com/epmet/filter/EpmetGatewayFilter.java
  85. 5
      epmet-gateway/src/main/resources/bootstrap-urls.yml
  86. 8
      epmet-gateway/src/main/resources/bootstrap.yml
  87. 7
      epmet-module/data-aggregator/data-aggregator-server/pom.xml
  88. 17
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcPointNucleicMonitoringDao.java
  89. 17
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcPointVaccinesInoculationDao.java
  90. 1
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/govorg/CustomerGridDao.java
  91. 77
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/entity/epmetuser/IcPointNucleicMonitoringEntity.java
  92. 102
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/entity/epmetuser/IcPointVaccinesInoculationEntity.java
  93. 10
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/EpmetUserService.java
  94. 48
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java
  95. 2
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java
  96. 22
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/impl/CoverageServiceImpl.java
  97. 7
      epmet-module/data-aggregator/data-aggregator-server/src/main/resources/bootstrap.yml
  98. 4
      epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/UserBaseInfoDao.xml
  99. 16
      epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govorg/CustomerGridDao.xml
  100. 6
      epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govproject/ProjectDao.xml

5
epmet-admin/epmet-admin-client/src/main/java/com/epmet/dto/PasswordDTO.java

@ -23,7 +23,10 @@ import java.io.Serializable;
@Data
public class PasswordDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 旧密码
*/
private String oldPassword;
@NotBlank(message="{sysuser.password.require}")
private String password;

10
epmet-admin/epmet-admin-server/src/main/resources/bootstrap.yml

@ -32,6 +32,8 @@ spring:
cluster:
nodes: @spring.redis.cluster.nodes@
max-redirects: @spring.redis.cluster.max-redirects@
shardingsphere:
enabled: false
datasource:
druid:
#MySQL
@ -134,6 +136,12 @@ hystrix:
isolation:
thread:
timeoutInMilliseconds: 60000 #缺省为1000
threadpool:
default:
coreSize: 20
maximumSize: 50
maxQueueSize: 500
queueSizeRejectionThreshold: 200
ribbon:
ReadTimeout: 300000
@ -158,4 +166,4 @@ thread:
queueCapacity: @thread.threadPool.queue-capacity@
keepAliveSeconds: @thread.threadPool.keep-alive-seconds@
threadNamePrefix: @thread.threadPool.thread-name-prefix@
rejectedExecutionHandler: @thread.threadPool.rejected-execution-handler@
rejectedExecutionHandler: @thread.threadPool.rejected-execution-handler@

5
epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.22__jmreport_category.sql

@ -0,0 +1,5 @@
INSERT INTO `epmet_admin`.`sys_dict_type` (`id`, `dict_type`, `dict_name`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1556509011061993473', 'jmreport_category', '报表应用类别', '居民信息、房屋信息', 32, 0, 0, '1', '2022-08-08 13:14:01', '1', '2022-08-08 13:14:01');
INSERT INTO `epmet_admin`.`sys_dict_data` (`id`, `dict_type_id`, `dict_label`, `dict_value`, `dict_p_value`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1556509175185108994', 1556509011061993473, '房屋信息', 'house_info', '0', '', 2, 0, 0, '1', '2022-08-08 13:14:41', '1', '2022-08-08 13:14:41');
INSERT INTO `epmet_admin`.`sys_dict_data` (`id`, `dict_type_id`, `dict_label`, `dict_value`, `dict_p_value`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1556509102015475714', 1556509011061993473, '居民信息', 'resi_info', '0', '', 1, 0, 0, '1', '2022-08-08 13:14:23', '1', '2022-08-08 13:14:23');

8
epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.23__party_publish_Time.sql

@ -0,0 +1,8 @@
INSERT INTO `epmet_admin`.`sys_dict_type` (`id`, `dict_type`, `dict_name`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1560458000894500866', 'icpartyact_auto_publish_time', '党组织活动自动发布时间', '党组织活动自动发布时间', 35, 0, 0, '1', '2022-08-19 10:45:54', '1', '2022-08-19 10:46:11');
INSERT INTO `epmet_admin`.`sys_dict_data` (`id`, `dict_type_id`, `dict_label`, `dict_value`, `dict_p_value`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1560458233091170305', 1560458000894500866, '活动开始前1天', '1', '0', '活动开始前1天', 1, 0, 0, '1', '2022-08-19 10:46:49', '1', '2022-08-19 10:46:49');
INSERT INTO `epmet_admin`.`sys_dict_data` (`id`, `dict_type_id`, `dict_label`, `dict_value`, `dict_p_value`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1560458276439302146', 1560458000894500866, '活动开始前3天', '3', '0', '活动开始前3天', 2, 0, 0, '1', '2022-08-19 10:47:00', '1', '2022-08-19 10:47:00');
INSERT INTO `epmet_admin`.`sys_dict_data` (`id`, `dict_type_id`, `dict_label`, `dict_value`, `dict_p_value`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1560458332076744705', 1560458000894500866, '活动开始前5天', '5', '0', '活动开始前5天', 3, 0, 0, '1', '2022-08-19 10:47:13', '1', '2022-08-19 10:47:13');
INSERT INTO `epmet_admin`.`sys_dict_data` (`id`, `dict_type_id`, `dict_label`, `dict_value`, `dict_p_value`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1560458388007788545', 1560458000894500866, '活动开始前7天', '7', '0', '活动开始前7天', 4, 0, 0, '1', '2022-08-19 10:47:26', '1', '2022-08-19 10:47:26');
INSERT INTO `epmet_admin`.`sys_dict_data` (`id`, `dict_type_id`, `dict_label`, `dict_value`, `dict_p_value`, `remark`, `sort`, `DEL_FLAG`, `REVISION`, `CREATED_BY`, `CREATED_TIME`, `UPDATED_BY`, `UPDATED_TIME`) VALUES ('1561627442626142210', 1560458000894500866, '现在发布', '0', '0', '', 5, 0, 0, '1', '2022-08-22 16:12:51', '1', '2022-08-22 16:12:51');

10
epmet-auth/pom.xml

@ -138,6 +138,16 @@
<artifactId>epmet-auth-client</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<artifactId>dingtalk-spring-boot-starter</artifactId>
<groupId>com.taobao</groupId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
</dependencies>
<build>

2
epmet-auth/src/main/java/com/epmet/AuthApplication.java

@ -8,6 +8,7 @@
package com.epmet;
import com.taobao.dingtalk.spring.annotations.EnableDingTalk;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ -20,6 +21,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
* @author Mark sunlightcs@gmail.com
* @since 1.0.0
*/
@EnableDingTalk
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients

8
epmet-auth/src/main/java/com/epmet/controller/GovWebController.java

@ -1,6 +1,7 @@
package com.epmet.controller;
import com.epmet.auth.dto.result.BlockChainStaffAuthResultDTO;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.utils.RSASignature;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
@ -9,6 +10,7 @@ import com.epmet.dto.form.GovWebLoginFormDTO;
import com.epmet.dto.result.UserTokenResultDTO;
import com.epmet.service.GovWebService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
@ -44,10 +46,14 @@ public class GovWebController {
ValidatorUtils.validateEntity(formDTO);
try {
if (formDTO.getPassword().length() > 50) {
if (StringUtils.isNotBlank(formDTO.getPassword())&&formDTO.getPassword().length() > NumConstant.FIFTY) {
String newPassword = RSASignature.decryptByPrivateKey(formDTO.getPassword(), privateKey);
formDTO.setPassword(newPassword);
}
if (StringUtils.isNotBlank(formDTO.getPhone())&&formDTO.getPhone().length() > NumConstant.FIFTY) {
String phone = RSASignature.decryptByPrivateKey(formDTO.getPhone(), privateKey);
formDTO.setPhone(phone);
}
} catch (Exception e) {
log.error("method exception", e);

23
epmet-auth/src/main/java/com/epmet/controller/LoginController.java

@ -1,8 +1,10 @@
package com.epmet.controller;
import com.epmet.commons.tools.annotation.LoginUser;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.exception.ErrorCode;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.RSASignature;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.AssertUtils;
import com.epmet.commons.tools.validator.ValidatorUtils;
@ -15,6 +17,7 @@ import com.epmet.service.LoginService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.imageio.ImageIO;
@ -36,6 +39,8 @@ import java.util.Arrays;
@RestController
@RequestMapping("login")
public class LoginController {
@Value("${epmet.login.privateKey}")
private String privateKey;
@Autowired
private CaptchaService captchaService;
@ -90,11 +95,23 @@ public class LoginController {
* @Date 2020/3/14 19:46
**/
@PostMapping("/operweb/loginbypassword")
public Result<UserTokenResultDTO> loginByPassword(@RequestBody LoginByPassWordFormDTO formDTO) {
public Result<UserTokenResultDTO> loginByPassword(@RequestBody LoginByPassWordFormDTO formDTO) throws Exception {
//效验数据
ValidatorUtils.validateEntity(formDTO);
Result<UserTokenResultDTO> result = loginService.loginByPassword(formDTO);
return result;
//解密密码
if (StringUtils.isNotBlank(formDTO.getPhone())&&formDTO.getPhone().length() > NumConstant.FIFTY) {
String phone = RSASignature.decryptByPrivateKey(formDTO.getPhone(), privateKey);
formDTO.setPhone(phone);
}
if (StringUtils.isNotBlank(formDTO.getMobile())&&formDTO.getMobile().length() > NumConstant.FIFTY) {
String phone = RSASignature.decryptByPrivateKey(formDTO.getMobile(), privateKey);
formDTO.setMobile(phone);
}
if (StringUtils.isNotBlank(formDTO.getPassword())&&formDTO.getPassword().length() > NumConstant.FIFTY) {
String confirmNewPassWord = RSASignature.decryptByPrivateKey(formDTO.getPassword(), privateKey);
formDTO.setPassword(confirmNewPassWord);
}
return loginService.loginByPassword(formDTO);
}
/**

72
epmet-auth/src/main/java/com/epmet/controller/ThirdLoginController.java

@ -3,15 +3,13 @@ package com.epmet.controller;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.dto.form.*;
import com.epmet.dto.result.ResiDingAppLoginResDTO;
import com.epmet.dto.result.StaffOrgsResultDTO;
import com.epmet.dto.result.UserTokenResultDTO;
import com.epmet.service.ThirdLoginService;
import org.apache.commons.lang3.StringUtils;
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 org.springframework.web.bind.annotation.*;
import java.util.List;
@ -110,7 +108,7 @@ public class ThirdLoginController {
**/
@PostMapping(value = "/getmyorgbyaccount")
public Result<List<StaffOrgsResultDTO>> getMyOrgByAccount(@RequestBody ThirdStaffOrgByAccountFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO, StaffOrgByAccountFormDTO.AddUserShowGroup.class, StaffOrgByAccountFormDTO.GetMyOrgByPassWordGroup.class);
ValidatorUtils.validateEntity(formDTO);
List<StaffOrgsResultDTO> staffOrgs = thirdLoginService.getMyOrgByAccount(formDTO);
return new Result<List<StaffOrgsResultDTO>>().ok(staffOrgs);
}
@ -142,4 +140,68 @@ public class ThirdLoginController {
return new Result();
}
/**
* 钉钉应用的登录-居民端
* 产品服务商建立第三方企业应用
* 参考文档https://open.dingtalk.com/document/isvapp-server/unified-authorization-suite-access-process
* @param formDTO
* @return
*/
/**
* 接入流程https://open.dingtalk.com/document/isvapp-server/unified-authorization-suite-access-process
* 1获取个人用户tokenhttps://open.dingtalk.com/document/isvapp-server/obtain-user-token
* 2获取用户通讯录个人信息https://open.dingtalk.com/document/isvapp-server/dingtalk-retrieve-user-information
* 接口逻辑
* 1根据clientId去XXX表找到customerId
* 2通过12拿到手机号之后,根据mobile+customerId去user_base_info表找userId
* 是否注册居民register_relation
* 3没有则生成useruser_Base_info表记录
* @param formDTO
* @return
*/
@PostMapping("resilogin-ding")
public Result<ResiDingAppLoginResDTO> resiLoginDing(@RequestBody ResiDingAppLoginFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO,ResiDingAppLoginFormDTO.InnerMiniApp.class);
return new Result<ResiDingAppLoginResDTO>().ok(thirdLoginService.resiLoginDing(formDTO));
}
/**
* 烟台建立应用授权给我们走企业免登
* 企业简历内部应用授权给第三方
* 可参考文档 获取第三方应用授权企业的accessToken https://open.dingtalk.com/document/orgapp-server/obtain-the-access_token-of-the-authorized-enterprise
* https://open.dingtalk.com/document/orgapp-server/enterprise-internal-application-logon-free
* @param formDTO
* @return
*/
@PostMapping("resilogin-ding-md")
public Result<ResiDingAppLoginResDTO> resiLoginDingMd(@RequestBody ResiDingAppLoginMdFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO);
return new Result<ResiDingAppLoginResDTO>().ok(thirdLoginService.resiLoginDingMd(formDTO));
}
/**
* 企业内部应用开发不授权了 文档地址https://open.dingtalk.com/document/orgapp-server/enterprise-internal-application-logon-free
* https://open.dingtalk.com/document/orgapp-server/enterprise-internal-application-logon-free
* 建议用户信息保存在前端缓存中dd.setStorage或者cookie中避免每次进入应用都调用钉钉接口进行免登
*
* 获取免登授权码
* 小程序免登
* 微应用免登
* 获取AccessToken
* 调用接口获取access_token详情请参考获取企业内部应用的access_token
*
* 获取userid
* 调用接口获取用户的userid详情请参考通过免登码获取用户信息
*
* 获取用户详情
* 调用接口获取用户详细信息详情请参考根据userId获取用户详情
*
* @param formDTO
* @return
*/
@PostMapping("resilogin-internalding")
public Result<ResiDingAppLoginResDTO> resiLoginInternalDing(@RequestBody ResiDingAppLoginMdFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO);
return new Result<ResiDingAppLoginResDTO>().ok(thirdLoginService.resiLoginInternalDing(formDTO));
}
}

73
epmet-auth/src/main/java/com/epmet/dto/dingres/DingUserDetailDTO.java

@ -0,0 +1,73 @@
package com.epmet.dto.dingres;
import lombok.Data;
/**
* @Description
* @Author yzm
* @Date 2022/9/22 14:16
*/
@Data
public class DingUserDetailDTO {
// 接口文档:https://open.dingtalk.com/document/isvapp-server/query-user-details
/**
* 员工的userId
*/
private String userid;
/**
* 员工在当前开发者企业账号范围内的唯一标识
*/
private String unionid;
/**
* 员工姓名
*/
private String name;
/**
* 头像
* <p>
* 说明 员工使用默认头像不返回该字段手动设置头像会返回
*/
private String avatar;
/**
* 国际电话区号
* <p>
* 说明 第三方企业应用不返回该字段如需获取state_code可以使用钉钉统一授权套件方式获取
*/
private String state_code;
/**
* 手机号码
* <p>
* 说明
* 企业内部应用只有应用开通通讯录邮箱等个人信息权限才会返回该字段
* 第三方企业应用不返回该字段如需获取mobile可以使用钉钉统一授权套件方式获取
*/
private String mobile;
/**
* 是否号码隐藏
* <p>
* true隐藏
* <p>
* false不隐藏
* <p>
* 说明 隐藏手机号后手机号在个人资料页隐藏但仍可对其发DING发起钉钉免费商务电话
*/
private String hide_mobile;
/**
* 分机号
* <p>
* 说明 第三方企业应用不返回该参数
*/
private String telephone;
/**
* 员工的企业邮箱
*
* 如果员工的企业邮箱没有开通返回信息中不包含该数据
*
* 说明 第三方企业应用不返回该参数
*/
private String org_email;
}

54
epmet-auth/src/main/java/com/epmet/dto/dingres/V2UserGetuserinfoResDTO.java

@ -0,0 +1,54 @@
package com.epmet.dto.dingres;
import lombok.Data;
/**
* @Description
* @Author yzm
* @Date 2022/9/22 14:08
*/
@Data
public class V2UserGetuserinfoResDTO {
// 接口返参:https://open.dingtalk.com/document/orgapp-server/obtain-the-userid-of-a-user-by-using-the-log-free
/**
* 用户的userid
*/
private String userid;
/**
* 设备ID
*/
private String device_id;
/**
* 是否是管理员
* <p>
* true
* <p>
* false不是
*/
private Boolean sys;
/**
* 级别
* <p>
* 1主管理员
* <p>
* 2子管理员
* <p>
* 100老板
* <p>
* 0其他如普通员工
*/
private Number sys_level;
/**
* 用户关联的unionId
*/
private String associated_unionid;
/**
* 用户unionId
*/
private String unionid;
/**
* 用户名字
*/
private String name;
}

41
epmet-auth/src/main/java/com/epmet/dto/form/ResiDingAppLoginFormDTO.java

@ -0,0 +1,41 @@
package com.epmet.dto.form;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @Description
* @Author yzm
* @Date 2022/9/14 17:11
*/
@Data
public class ResiDingAppLoginFormDTO {
public interface InnerMiniApp {}
public interface ThirdMiniApp {}
/**
* 授权统一后的authCode
*/
@NotBlank(message = "authCode不能为空",groups = InnerMiniApp.class)
private String authCode;
// /**
// * 第三方企业应用传应用的SuiteKey
// */
// @NotBlank(message = "clientId不能为空")
// private String clientId;
/**
* 第三方企业应用传应用的SuiteKey
*/
@NotBlank(message = "miniAppId不能为空",groups = InnerMiniApp.class)
private String miniAppId;
// @NotBlank(message = "当前访问用户的企业corpId不能为空")
// private String corpId;
/**
* third第三方应用
* company_customize:企业定制应用
*/
private String appType="company_customize";
}

23
epmet-auth/src/main/java/com/epmet/dto/form/ResiDingAppLoginMdFormDTO.java

@ -0,0 +1,23 @@
package com.epmet.dto.form;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @Description
* @Author yzm
* @Date 2022/9/22 10:42
*/
@Data
public class ResiDingAppLoginMdFormDTO {
@NotBlank(message = "authCode不能为空")
private String authCode;
/**
* 第三方企业应用传应用的SuiteKey
*/
@NotBlank(message = "miniAppId不能为空")
private String miniAppId;
}

23
epmet-auth/src/main/java/com/epmet/dto/form/ThirdStaffOrgByAccountFormDTO.java

@ -1,6 +1,5 @@
package com.epmet.dto.form;
import com.epmet.commons.tools.validator.group.CustomerClientShowGroup;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@ -13,36 +12,20 @@ import java.io.Serializable;
@Data
public class ThirdStaffOrgByAccountFormDTO implements Serializable {
private static final long serialVersionUID = 4193133227120225342L;
/**
* 添加用户操作的用户可见异常分组
* 该分组用于校验需要返回给前端错误信息提示的列需要继承CustomerClientShowGroup
* 返回错误码为8999提示信息为DTO中具体的列的校验注解message的内容
*/
public interface AddUserShowGroup extends CustomerClientShowGroup {
}
public interface GetMyOrgByPassWordGroup extends CustomerClientShowGroup {
}
public interface GetMyOrgByLoginWxmp extends CustomerClientShowGroup{}
/**
* 小程序appId
*/
@NotBlank(message = "appId不能为空", groups = {AddUserShowGroup.class})
@NotBlank(message = "appId不能为空")
private String appId;
/**
* 手机号
*/
@NotBlank(message = "账号不能为空", groups = {AddUserShowGroup.class})
@NotBlank(message = "账号不能为空")
private String userAccount;
/**
* 验证码
*/
@NotBlank(message="验证码不能为空", groups = {GetMyOrgByLoginWxmp.class})
private String smsCode;
@NotBlank(message = "密码不能为空",groups ={GetMyOrgByPassWordGroup.class})
@NotBlank(message = "密码不能为空")
private String password;
}

42
epmet-auth/src/main/java/com/epmet/dto/result/ResiDingAppLoginResDTO.java

@ -0,0 +1,42 @@
package com.epmet.dto.result;
import lombok.Data;
/**
* @Description
* @Author yzm
* @Date 2022/9/14 17:20
*/
@Data
public class ResiDingAppLoginResDTO {
private String authorization;
private String customerId;
private String gridId;
/**
* 网格名
*/
private String gridName;
/**
* 网格所属的组织id
*/
private String agencyId;
/**
* 居民端用户id
*/
private String epmetUserId;
/**
* 5.获取用户手机号使用用户个人access_token调用获取用户通讯录个人信息接口获取
* 返参信息
* 接口文档https://open.dingtalk.com/document/isvapp-server/dingtalk-retrieve-user-information
*/
private String extInfo;
/**
* 是否注册居民
* true:已注册
* false:未注册
*/
private Boolean regFlag;
}

26
epmet-auth/src/main/java/com/epmet/service/ThirdLoginService.java

@ -1,6 +1,7 @@
package com.epmet.service;
import com.epmet.dto.form.*;
import com.epmet.dto.result.ResiDingAppLoginResDTO;
import com.epmet.dto.result.StaffOrgsResultDTO;
import com.epmet.dto.result.UserTokenResultDTO;
@ -84,4 +85,29 @@ public interface ThirdLoginService {
* @description 单客户-工作端微信小程序登录-发送验证码
**/
void sendSmsCode(ThirdSendSmsCodeFormDTO formDTO);
/**
* 钉钉应用的登录-居民端
* 产品服务商建立第三方企业应用
* 参考文档https://open.dingtalk.com/document/isvapp-server/unified-authorization-suite-access-process
* @param formDTO
* @return
*/
ResiDingAppLoginResDTO resiLoginDing(ResiDingAppLoginFormDTO formDTO);
/**
* 企业简历内部应用授权给第三方
* 可参考文档 获取第三方应用授权企业的accessToken https://open.dingtalk.com/document/orgapp-server/obtain-the-access_token-of-the-authorized-enterprise
* https://open.dingtalk.com/document/orgapp-server/enterprise-internal-application-logon-free
* @param formDTO
* @return
*/
ResiDingAppLoginResDTO resiLoginDingMd(ResiDingAppLoginMdFormDTO formDTO);
/**
* 企业内部应用免登 文档地址https://open.dingtalk.com/document/orgapp-server/enterprise-internal-application-logon-free
* @param formDTO
* @return
*/
ResiDingAppLoginResDTO resiLoginInternalDing(ResiDingAppLoginMdFormDTO formDTO);
}

402
epmet-auth/src/main/java/com/epmet/service/impl/ThirdLoginServiceImpl.java

@ -5,15 +5,23 @@ import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dingtalk.module.DingTalkResult;
import com.epmet.auth.constants.AuthOperationConstants;
import com.epmet.common.token.constant.LoginConstant;
import com.epmet.commons.rocketmq.messages.LoginMQMsg;
import com.epmet.commons.tools.constant.AppClientConstant;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.constant.StrConstant;
import com.epmet.commons.tools.enums.EnvEnum;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.EpmetException;
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.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.redis.common.CustomerDingDingRedis;
import com.epmet.commons.tools.redis.common.bean.DingMiniInfoCache;
import com.epmet.commons.tools.security.dto.GovTokenDto;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.security.password.PasswordUtils;
@ -23,6 +31,8 @@ import com.epmet.commons.tools.validator.PhoneValidatorUtils;
import com.epmet.constant.AuthHttpUrlConstant;
import com.epmet.constant.SmsTemplateConstant;
import com.epmet.dto.*;
import com.epmet.dto.dingres.DingUserDetailDTO;
import com.epmet.dto.dingres.V2UserGetuserinfoResDTO;
import com.epmet.dto.form.*;
import com.epmet.dto.result.*;
import com.epmet.feign.EpmetMessageOpenFeignClient;
@ -32,6 +42,11 @@ import com.epmet.jwt.JwtTokenProperties;
import com.epmet.jwt.JwtTokenUtils;
import com.epmet.redis.CaptchaRedis;
import com.epmet.service.ThirdLoginService;
import com.taobao.api.ApiException;
import com.taobao.dingtalk.client.DingTalkClientToken;
import com.taobao.dingtalk.client.DingTalkClientUser;
import com.taobao.dingtalk.vo.result.AccessTokenResult;
import com.taobao.dingtalk.vo.result.UserBaseInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
@ -73,6 +88,12 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol
private EpmetMessageOpenFeignClient messageOpenFeignClient;
@Autowired
private LoginUserUtil loginUserUtil;
@Autowired
private RedisUtils redisUtils;
@Autowired
private DingTalkClientToken dingTalkClientToken;
@Autowired
private DingTalkClientUser dingTalkClientUser;
/**
* @param formDTO
@ -599,11 +620,42 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol
result.getMsg()));
return new ArrayList<>();
}
//临时解决方案
private static final List<StaffOrgsResultDTO> resultTemp = new ArrayList<>();
static {
StaffOrgsResultDTO t = new StaffOrgsResultDTO();
t.setRootAgencyId("53613e1c5de6ed473467f0159a10b135");
t.setRootAgencyName("平阴县");
t.setCustomerId("6f203e30de1a65aab7e69c058826cd80");
t.setCustomerName("平音");
resultTemp.add(t);
}
@Override
public List<StaffOrgsResultDTO> getMyOrgByAccount(ThirdStaffOrgByAccountFormDTO formDTO) {
String appId = formDTO.getAppId();
String userAccount = formDTO.getUserAccount();
String password = formDTO.getPassword();
//{"code":0,"msg":"success","internalMsg":"","data":[{"rootAgencyId":"53613e1c5de6ed473467f0159a10b135","rootAgencyName":"平阴县","customerId":"6f203e30de1a65aab7e69c058826cd80","customerName":"平音"}]}
if ("wx2b75d556ba867750".equals(appId)){
if("18700011111".equals(userAccount)){
if (!"Py02222".equals(password)){
throw new RenException(EpmetErrorCode.PASSWORD_ERROR.getCode());
}
//String result = "[{\"rootAgencyId\":\"53613e1c5de6ed473467f0159a10b135\",\"rootAgencyName\":\"平阴县\",\"customerId\":\"6f203e30de1a65aab7e69c058826cd80\",\"customerName\":\"平音\"}]";
return resultTemp;
}
if (userAccount.startsWith("187000111")){
throw new EpmetException(EpmetErrorCode.GOV_STAFF_ACCOUNT_NOT_EXISTS.getCode());
}
}
//{"isNovice":false,"mobile":"","userAccount":"18700011111","password":"Py011111","appId":"wx2b75d556ba867750"}
logger.info("getMyOrgByAccountService at :{}",System.currentTimeMillis());
long start = System.currentTimeMillis();
//0.根据appId查询对应客户Id
PaCustomerDTO customer = this.getCustomerInfo(formDTO.getAppId());
logger.info("getMyOrgByAccountService getCustomerInfo cost:{}",System.currentTimeMillis() - start );
start = System.currentTimeMillis();
//7.28 上边根据appId只能锁定一条客户id,后边的批量循环操作暂不做调整,还是使用之前的代码 sun
//1、根据手机号查询到用户信息
ThirdCustomerStaffByAccountFormDTO dto = new ThirdCustomerStaffByAccountFormDTO();
@ -614,30 +666,31 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol
logger.warn(String.format("账户密码登录异常,账户[%s],code[%s],msg[%s]", formDTO.getUserAccount(), customerStaffResult.getCode(), customerStaffResult.getMsg()));
throw new RenException(customerStaffResult.getCode());
}
logger.info("getMyOrgByAccountService getCustsomerStaffByIdAndAccount cost:{}",System.currentTimeMillis()- start);
start = System.currentTimeMillis();
//2、密码是否正确
List<CustomerStaffDTO> customerStaffList=customerStaffResult.getData();
if (CollectionUtils.isEmpty(customerStaffList)){
throw new EpmetException(EpmetErrorCode.GOV_STAFF_ACCOUNT_NOT_EXISTS.getCode());
}
//3、查询用户所有的组织信息
List<String> customerIdList = new ArrayList<>();
//是否设置过密码
boolean havePasswordFlag=false;
//密码是否正确
boolean passwordRightFlag=false;
for (CustomerStaffDTO customerStaffDTO : customerStaffList) {
if(StringUtils.isNotBlank(customerStaffDTO.getPassword())){
havePasswordFlag=true;
}else{
logger.warn(String.format("当前用户:账户%s,客户Id%s下未设置密码.",formDTO.getUserAccount(),customerStaffDTO.getCustomerId()));
continue;
}
if (!PasswordUtils.matches(formDTO.getPassword(), customerStaffDTO.getPassword())) {
logger.warn(String.format("当前用户:账户%s,客户Id%s密码匹配错误.",formDTO.getUserAccount(),customerStaffDTO.getCustomerId()));
CustomerStaffDTO customerStaffDTO = customerStaffList.get(0);
}else{
logger.warn(String.format("当前用户:账户%s,客户Id%s密码匹配正确.",formDTO.getUserAccount(),customerStaffDTO.getCustomerId()));
passwordRightFlag=true;
customerIdList.add(customerStaffDTO.getCustomerId());
}
if (StringUtils.isNotBlank(customerStaffDTO.getPassword())) {
havePasswordFlag = true;
}
long start2 = System.currentTimeMillis();
if (PasswordUtils.matches(formDTO.getPassword(), customerStaffDTO.getPassword())) {
passwordRightFlag = true;
customerIdList.add(customerStaffDTO.getCustomerId());
}
logger.info("getMyOrgByAccountService PasswordUtils.matches cost:{}", System.currentTimeMillis() - start2);
//根据手机号查出来所有用户,密码都为空,表明用户未激活账户,未设置密码
if(!havePasswordFlag){
logger.warn(String.format("当前账户(%s)下所有账户都未设置密码,请先使用验证码登录激活账户",formDTO.getUserAccount()));
@ -648,11 +701,27 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol
logger.warn(String.format("根据当前账户(%s)密码未找到所属组织,密码错误",formDTO.getUserAccount()));
throw new RenException(EpmetErrorCode.PASSWORD_ERROR.getCode());
}
logger.info("getMyOrgByAccountService checkpassword cost:{}",System.currentTimeMillis() - start);
start = System.currentTimeMillis();
String tempKey = RedisKeys.getCustomerStaffTempKey(customerStaffDTO.getUserId());
List<StaffOrgsResultDTO> redisTemp = (List<StaffOrgsResultDTO>)redisUtils.get(tempKey);
if (redisTemp != null){
logger.info("getMyOrgByAccountService end redis :{}",System.currentTimeMillis());
return redisTemp;
}
logger.info("getMyOrgByAccountService getCustomerStaffTempKey cost:{}",System.currentTimeMillis()-start);
start = System.currentTimeMillis();
StaffOrgFormDTO staffOrgFormDTO = new StaffOrgFormDTO();
staffOrgFormDTO.setCustomerIdList(customerIdList);
Result<List<StaffOrgsResultDTO>> result = govOrgOpenFeignClient.getStaffOrgList(staffOrgFormDTO);
if(result.success()&&null!=result.getData()){
return result.getData();
List<StaffOrgsResultDTO> data = result.getData();
logger.info("getMyOrgByAccountService getStaffOrgList from db cost:{}",System.currentTimeMillis() -start);
start = System.currentTimeMillis();
redisUtils.set(tempKey,data);
logger.info("getMyOrgByAccountService getCustomerStaffTempKey set redis cost:{}",System.currentTimeMillis()-start);
logger.info("getMyOrgByAccountService end DB :{}",System.currentTimeMillis());
return data;
}
logger.warn(String .format("手机验证码获取组织,调用%s服务失败,入参账户%s,密码%s,返回错误码%s,错误提示信息%s",
ServiceConstant.GOV_ORG_SERVER,
@ -669,6 +738,11 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol
* @author zxc
*/
public PaCustomerDTO getCustomerInfo(String appId){
String redisKey = RedisKeys.getThirdCustomerInfoByAppId(appId);
PaCustomerDTO customer = (PaCustomerDTO) redisUtils.get(redisKey);
if (customer != null && StringUtils.isNotBlank(customer.getId())){
return customer;
}
JSONObject jsonObject = new JSONObject();
String data = HttpClientManager.getInstance().sendPostByJSON(AuthHttpUrlConstant.CUSTOMER_MSG_URL + appId, JSON.toJSONString(jsonObject)).getData();
logger.info("ThirdLoginServiceImpl.getCustomerInfo:httpclient->url:"+AuthHttpUrlConstant.CUSTOMER_MSG_URL+",结果->"+data);
@ -684,8 +758,9 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol
Object PublicCustomerResultDTO = mapToResult.getData();
JSONObject json = JSON.parseObject(PublicCustomerResultDTO.toString());
Map<String,Object> map = (Map)json.get("customer");
PaCustomerDTO customer = ConvertUtils.mapToEntity(map, PaCustomerDTO.class);
customer = ConvertUtils.mapToEntity(map, PaCustomerDTO.class);
logger.info("小程序登陆third服务获取客户用户信息PaCustomerDTO->"+customer);
redisUtils.set(redisKey,customer);
return customer;
}
@ -815,4 +890,297 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol
//getResultDataOrThrowsException(result, ServiceConstant.EPMET_MESSAGE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "调用Message服务,发送登录事件到MQ失败");
}
// 接入流程:https://open.dingtalk.com/document/isvapp-server/unified-authorization-suite-access-process
// 1、获取个人用户token:https://open.dingtalk.com/document/isvapp-server/obtain-user-token
// 2、获取用户通讯录个人信息:https://open.dingtalk.com/document/isvapp-server/dingtalk-retrieve-user-information
// 接口逻辑:
// (1)根据clientId去XXX表找到customerId
// (2)通过1、2拿到手机号之后,根据mobile+customerId去user_base_info表找userId,
// 是否注册居民:register_relation
// (3)没有则生成user、user_Base_info表记录
/**
* 钉钉应用的登录-居民端
*
* @param formDTO
* @return
*/
@Override
public ResiDingAppLoginResDTO resiLoginDing(ResiDingAppLoginFormDTO formDTO) {
//获取用户手机号
log.info("1、钉钉居民端应用登录入参:"+ JSON.toJSONString(formDTO));
ResiDingAppLoginResDTO resDTO= null;
try {
resDTO = new ResiDingAppLoginResDTO();
resDTO.setCustomerId(getCurrentCustomerId());
//1、获取用户手机号
String miniAppId = formDTO.getMiniAppId();
DingMiniInfoCache dingMiniInfo = CustomerDingDingRedis.getDingMiniInfo(miniAppId);
DingTalkResult<AccessTokenResult> userAccessToken = dingTalkClientToken.getUserAccessToken(formDTO.getAuthCode(), dingMiniInfo.getSuiteKey(), dingMiniInfo.getSuiteSecret());
log.info("2、resiLoginDing userAccessToken:{}",JSON.toJSONString(userAccessToken));
if (!userAccessToken.success() || null == userAccessToken.getData()) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "调用微信api异常:" + JSON.toJSONString(userAccessToken), EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getMsg());
}
DingTalkResult<UserBaseInfo> me = dingTalkClientUser.getUserInfo("me", userAccessToken.getData().getAccessToken());
log.info("3、resiLoginDing me:{}",JSON.toJSONString(me));
resDTO.setExtInfo(JSON.toJSONString(me.getData()));
if (!me.success() || StringUtils.isBlank(me.getData().getMobile())) {
log.error("resilogin-ding登录接口报错,入参:" + JSON.toJSONString(formDTO) + ";获取手机号为空, userAccessToken.getData().getAccessToken()=" + userAccessToken.getData().getAccessToken());
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取手机号为空", "获取手机号为空");
}
// 2、调用userfeign接口获取userId、注册网格相关信息 todo
DingLoginResiFormDTO dingLoginResiFormDTO=ConvertUtils.sourceToTarget(me.getData(),DingLoginResiFormDTO.class);
dingLoginResiFormDTO.setCustomerId(resDTO.getCustomerId());
Result<DingLoginResiResDTO> loginResiResDTOResult = epmetUserOpenFeignClient.dingResiLogin(dingLoginResiFormDTO);
if (!loginResiResDTOResult.success() || null == loginResiResDTOResult.getData()) {
//临时打个日志
log.error(String.format("resilogin-ding获取epmetUserId异常,入参:%s,user服务返参:%s", JSON.toJSONString(formDTO), JSON.toJSONString(loginResiResDTOResult)));
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取epmetUserId异常:" + JSON.toJSONString(loginResiResDTOResult), EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getMsg());
}
DingLoginResiResDTO resiResDTO=loginResiResDTOResult.getData();
resDTO.setGridId(resiResDTO.getGridId());
resDTO.setGridName(resiResDTO.getGridName());
resDTO.setAgencyId(resiResDTO.getAgencyId());
resDTO.setEpmetUserId(resiResDTO.getEpmetUserId());
resDTO.setRegFlag(resiResDTO.getRegFlag());
//3.生成token,并且存放Redis
String token=this.saveTokenDtoDing(formDTO.getMiniAppId(),AppClientConstant.APP_RESI,AppClientConstant.MINI_DING, resDTO.getEpmetUserId(), resDTO.getCustomerId());
resDTO.setAuthorization(token);
} catch (ApiException e) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), e.getErrMsg(), EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getMsg());
}
return resDTO;
}
private String saveTokenDtoDing(String miniAppId,String app,String client, String userId,String customerId) {
//生成token串
Map<String, Object> map = new HashMap<>();
map.put(AppClientConstant.APP, app);
// map.put(AppClientConstant.CLIENT, client);
// 第三方企业应用传应用的SuiteKey 作为client
map.put(AppClientConstant.CLIENT, client.concat(miniAppId));
map.put("userId", userId);
String token = jwtTokenUtils.createToken(map);
int expire = jwtTokenProperties.getExpire();
TokenDto tokenDto = new TokenDto();
tokenDto.setCustomerId(customerId);
tokenDto.setApp(app);
tokenDto.setClient(client.concat(miniAppId));
tokenDto.setUserId(userId);
tokenDto.setToken(token);
tokenDto.setUpdateTime(System.currentTimeMillis());
tokenDto.setExpireTime(jwtTokenUtils.getExpiration(token).getTime());
cpUserDetailRedis.set(tokenDto, expire);
// cpUserDetailRedis.setForDingApp(miniAppId,tokenDto, expire);
logger.info("截止时间:" + DateUtils.format(jwtTokenUtils.getExpiration(token), "yyyy-MM-dd HH:mm:ss"));
return token;
}
@Override
public ResiDingAppLoginResDTO resiLoginDingMd(ResiDingAppLoginMdFormDTO formDTO) {
// 获取用户手机号
log.info("1、钉钉居民端应用登录入参:" + JSON.toJSONString(formDTO));
ResiDingAppLoginResDTO resDTO = null;
resDTO = new ResiDingAppLoginResDTO();
resDTO.setCustomerId(getCurrentCustomerId());
// 1、获取用户手机号
DingLoginResiFormDTO dingLoginResiFormDTO = getDingLoginResiFormDTOMd(formDTO.getMiniAppId(), formDTO.getAuthCode());
dingLoginResiFormDTO.setCustomerId(resDTO.getCustomerId());
// 2、调用userfeign接口获取userId、注册网格相关信息
Result<DingLoginResiResDTO> loginResiResDTOResult = epmetUserOpenFeignClient.dingResiLogin(dingLoginResiFormDTO);
if (!loginResiResDTOResult.success() || null == loginResiResDTOResult.getData()) {
// 临时打个日志
log.error(String.format("resiLoginDingMd获取epmetUserId异常,入参:%s,user服务返参:%s", JSON.toJSONString(formDTO), JSON.toJSONString(loginResiResDTOResult)));
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取epmetUserId异常:" + JSON.toJSONString(loginResiResDTOResult), EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getMsg());
}
DingLoginResiResDTO resiResDTO = loginResiResDTOResult.getData();
resDTO.setGridId(resiResDTO.getGridId());
resDTO.setGridName(resiResDTO.getGridName());
resDTO.setAgencyId(resiResDTO.getAgencyId());
resDTO.setEpmetUserId(resiResDTO.getEpmetUserId());
resDTO.setRegFlag(resiResDTO.getRegFlag());
// 3.生成token,并且存放Redis
String token = this.saveTokenDtoDing(formDTO.getMiniAppId(), AppClientConstant.APP_RESI, AppClientConstant.MINI_DING, resDTO.getEpmetUserId(), resDTO.getCustomerId());
resDTO.setAuthorization(token);
return resDTO;
}
private DingLoginResiFormDTO getDingLoginResiFormDTOMd(String miniAppId, String authCode) {
DingMiniInfoCache dingMiniInfo = CustomerDingDingRedis.getDingMiniInfo(miniAppId);
// 1、服务商获取第三方应用授权企业的access_token,文档地址:https://open.dingtalk.com/document/orgapp-server/obtains-the-enterprise-authorized-credential
// 烟台的CorpId: dingaae55cbc47a96845f5bf40eda33b7ba0
String yantaiCorpId = "dingaae55cbc47a96845f5bf40eda33b7ba0";
DingTalkResult<String> res = dingTalkClientToken.getThirdAuthCorpAccessToken(dingMiniInfo.getSuiteKey(), dingMiniInfo.getSuiteSecret(), "abc", yantaiCorpId);
if (!res.success() || StringUtils.isBlank(res.getData())) {
log.error(String.format("企业内部应用免登服务商获取第三方应用授权企业的access_token失败,customKey:%s,customSecret:%s,corpId:%s", dingMiniInfo.getSuiteSecret(), dingMiniInfo.getSuiteSecret(), yantaiCorpId));
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "服务商获取第三方应用授权企业的access_token", "服务商获取第三方应用授权企业的access_token");
}
String accessToken = res.getData();
log.info(String.format("1、服务商获取第三方应用授权企业的access_token返参:%s", accessToken));
// 2、通过免登码获取用户信息,文档地址:https://open.dingtalk.com/document/orgapp-server/obtain-the-userid-of-a-user-by-using-the-log-free
DingTalkResult<String> v2UserGetuserinfoRes = dingTalkClientToken.getUserInfo(accessToken, authCode);
if (!v2UserGetuserinfoRes.success() || StringUtils.isBlank(v2UserGetuserinfoRes.getData())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "通过免登码获取用户信息异常", "通过免登码获取用户信息异常");
}
log.info(String.format("2、通过免登码获取用户信息返参:%s", v2UserGetuserinfoRes.getData()));
V2UserGetuserinfoResDTO v2UserGetuserinfoResDTO = JSON.parseObject(v2UserGetuserinfoRes.getData(), V2UserGetuserinfoResDTO.class);
if (null == v2UserGetuserinfoResDTO || StringUtils.isBlank(v2UserGetuserinfoResDTO.getUserid())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取钉钉用户userid为空", "获取钉钉用户userid为空");
}
// 3、查询用户详情,文档地址:https://open.dingtalk.com/document/isvapp-server/query-user-details
DingTalkResult<String> v2UserGetRes = dingTalkClientToken.getUserDetail(v2UserGetuserinfoResDTO.getUserid(), accessToken);
if (!v2UserGetRes.success() || StringUtils.isBlank(v2UserGetRes.getData())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "根据userId查询用户详情失败", "根据userId查询用户详情失败");
}
log.info(String.format("3、查询用户详情:%s", v2UserGetRes.getData()));
DingUserDetailDTO dingUserDetailDTO = JSON.parseObject(v2UserGetRes.getData(), DingUserDetailDTO.class);
if (null == dingUserDetailDTO || StringUtils.isBlank(dingUserDetailDTO.getMobile())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取手机号为空", "获取手机号为空");
}
DingLoginResiFormDTO dingLoginResiFormDTO = new DingLoginResiFormDTO();
dingLoginResiFormDTO.setAvatarUrl(dingUserDetailDTO.getAvatar());
dingLoginResiFormDTO.setEmail(dingUserDetailDTO.getOrg_email());
dingLoginResiFormDTO.setMobile(dingUserDetailDTO.getMobile());
dingLoginResiFormDTO.setNick(dingUserDetailDTO.getName());
dingLoginResiFormDTO.setOpenId(StrConstant.EPMETY_STR);
dingLoginResiFormDTO.setStateCode(dingUserDetailDTO.getState_code());
dingLoginResiFormDTO.setUnionId(dingUserDetailDTO.getUnionid());
return dingLoginResiFormDTO;
}
/**
* 企业内部应用开发不授权了
* https://open.dingtalk.com/document/orgapp-server/enterprise-internal-application-logon-free
* 建议用户信息保存在前端缓存中dd.setStorage或者cookie中避免每次进入应用都调用钉钉接口进行免登
*
* 获取免登授权码
* 小程序免登
* 微应用免登
* 获取AccessToken
* 调用接口获取access_token详情请参考获取企业内部应用的access_token
*
* 获取userid
* 调用接口获取用户的userid详情请参考通过免登码获取用户信息
*
* 获取用户详情
* 调用接口获取用户详细信息详情请参考根据userId获取用户详情
*
* @param formDTO
* @return
*/
@Override
public ResiDingAppLoginResDTO resiLoginInternalDing(ResiDingAppLoginMdFormDTO formDTO) {
// 获取用户手机号
log.info("1、钉钉居民端应用登录入参:" + JSON.toJSONString(formDTO));
ResiDingAppLoginResDTO resDTO = null;
resDTO = new ResiDingAppLoginResDTO();
resDTO.setCustomerId(getCurrentCustomerId());
// 1、获取用户手机号
DingLoginResiFormDTO dingLoginResiFormDTO = getDingLoginResiFormDTOInternal(formDTO.getMiniAppId(), formDTO.getAuthCode());
dingLoginResiFormDTO.setCustomerId(resDTO.getCustomerId());
// 2、调用userfeign接口获取userId、注册网格相关信息
Result<DingLoginResiResDTO> loginResiResDTOResult = epmetUserOpenFeignClient.dingResiLogin(dingLoginResiFormDTO);
if (!loginResiResDTOResult.success() || null == loginResiResDTOResult.getData()) {
// 临时打个日志
log.error(String.format("resiLoginInternalDing获取epmetUserId异常,入参:%s", JSON.toJSONString(dingLoginResiFormDTO)));
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取epmetUserId异常:"+ JSON.toJSONString(loginResiResDTOResult), "获取epmetUserId异常");
}
DingLoginResiResDTO resiResDTO = loginResiResDTOResult.getData();
resDTO.setGridId(resiResDTO.getGridId());
resDTO.setGridName(resiResDTO.getGridName());
resDTO.setAgencyId(resiResDTO.getAgencyId());
resDTO.setEpmetUserId(resiResDTO.getEpmetUserId());
resDTO.setRegFlag(resiResDTO.getRegFlag());
// 3.生成token,并且存放Redis
String token = this.saveTokenDtoDing(formDTO.getMiniAppId(), AppClientConstant.APP_RESI, AppClientConstant.MINI_DING, resDTO.getEpmetUserId(), resDTO.getCustomerId());
resDTO.setAuthorization(token);
return resDTO;
}
/**
* 最原始的企业内部应用开发不授权给产品服务商
* @param miniAppId
* @param authCode
* @return
*/
private DingLoginResiFormDTO getDingLoginResiFormDTOInternal(String miniAppId, String authCode) {
DingMiniInfoCache dingMiniInfo = CustomerDingDingRedis.getDingMiniInfo(miniAppId);
// 1、获取企业内部应用的accessToken文档地址:https://open.dingtalk.com/document/orgapp-server/obtain-the-access_token-of-an-internal-app
String accessToken = "";
DingTalkResult<String> dingTalkResult = dingTalkClientToken.getAppAccessTokenToken(dingMiniInfo.getSuiteKey(), dingMiniInfo.getSuiteSecret());
if (!dingTalkResult.success() || StringUtils.isBlank(dingTalkResult.getData())) {
log.error(String.format("获取企业内部应用的accessToken失败,customKey:%s,customSecret:%s", dingMiniInfo.getSuiteSecret(), dingMiniInfo.getSuiteSecret()));
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取企业内部应用的accessToken异常", "获取企业内部应用的accessToken");
}
accessToken = dingTalkResult.getData();
log.info(String.format("1、获取企业内部应用的accessToken返参:%s", accessToken));
// 2、通过免登码获取用户信息,文档地址:https://open.dingtalk.com/document/orgapp-server/obtain-the-userid-of-a-user-by-using-the-log-free
DingTalkResult<String> v2UserGetuserinfoRes = dingTalkClientToken.getUserInfo(accessToken, authCode);
if (!v2UserGetuserinfoRes.success() || StringUtils.isBlank(v2UserGetuserinfoRes.getData())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "通过免登码获取用户信息异常", "通过免登码获取用户信息异常");
}
log.info(String.format("2、通过免登码获取用户信息返参:%s", v2UserGetuserinfoRes.getData()));
V2UserGetuserinfoResDTO v2UserGetuserinfoResDTO = JSON.parseObject(v2UserGetuserinfoRes.getData(), V2UserGetuserinfoResDTO.class);
if (null == v2UserGetuserinfoResDTO || StringUtils.isBlank(v2UserGetuserinfoResDTO.getUserid())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取钉钉用户userid为空", "获取钉钉用户userid为空");
}
// 3、查询用户详情,文档地址:https://open.dingtalk.com/document/isvapp-server/query-user-details
DingTalkResult<String> v2UserGetRes = dingTalkClientToken.getUserDetail(v2UserGetuserinfoResDTO.getUserid(), accessToken);
if (!v2UserGetRes.success() || StringUtils.isBlank(v2UserGetRes.getData())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "根据userId查询用户详情失败", "根据userId查询用户详情失败");
}
log.info(String.format("3、查询用户详情:%s", v2UserGetRes.getData()));
DingUserDetailDTO dingUserDetailDTO = JSON.parseObject(v2UserGetRes.getData(), DingUserDetailDTO.class);
if (null == dingUserDetailDTO || StringUtils.isBlank(dingUserDetailDTO.getMobile())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取手机号为空", "获取手机号为空");
}
DingLoginResiFormDTO dingLoginResiFormDTO = new DingLoginResiFormDTO();
dingLoginResiFormDTO.setAvatarUrl(dingUserDetailDTO.getAvatar());
dingLoginResiFormDTO.setEmail(dingUserDetailDTO.getOrg_email());
dingLoginResiFormDTO.setMobile(dingUserDetailDTO.getMobile());
dingLoginResiFormDTO.setNick(dingUserDetailDTO.getName());
dingLoginResiFormDTO.setOpenId(StrConstant.EPMETY_STR);
dingLoginResiFormDTO.setStateCode(dingUserDetailDTO.getState_code());
dingLoginResiFormDTO.setUnionId(dingUserDetailDTO.getUnionid());
return dingLoginResiFormDTO;
}
/**
* 客户写死吧
* @return
*/
private String getCurrentCustomerId() {
String customerId="";
EnvEnum currentEnv = EnvEnum.getCurrentEnv();
if (EnvEnum.PROD.getCode().equals(currentEnv.getCode())) {
// 烟台的客户id
customerId="1535072605621841922";
} else if (EnvEnum.TEST.getCode().equals(currentEnv.getCode())) {
// 最美琴岛
customerId="0c41b272ee9ee95ac6f184ad548a30eb";
} else {
// 其余统一走开发环境
customerId="45687aa479955f9d06204d415238f7cc";
}
return customerId;
}
}

8
epmet-auth/src/main/resources/bootstrap.yml

@ -91,6 +91,12 @@ hystrix:
isolation:
thread:
timeoutInMilliseconds: 60000 #缺省为1000
threadpool:
default:
coreSize: 20
maximumSize: 50
maxQueueSize: 500
queueSizeRejectionThreshold: 200
ribbon:
ReadTimeout: 300000
@ -178,4 +184,4 @@ thread:
queueCapacity: @thread.threadPool.queue-capacity@
keepAliveSeconds: @thread.threadPool.keep-alive-seconds@
threadNamePrefix: @thread.threadPool.thread-name-prefix@
rejectedExecutionHandler: @thread.threadPool.rejected-execution-handler@
rejectedExecutionHandler: @thread.threadPool.rejected-execution-handler@

103
epmet-cloud-generator/src/main/resources/template/index.vue.vm

@ -1,52 +1,52 @@
<template>
<el-card shadow="never" class="aui-card--fill">
<div class="mod-${moduleName}__${pathName}}">
<div class="mod-${moduleName}__${pathName}} resi-container">
<el-card ref="searchCard" class="search-card">
<el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
<el-form-item>
<el-input v-model="dataForm.${pk.attrname}" placeholder="${pk.attrname}" clearable></el-input>
<el-input size="small" v-model="dataForm.${pk.attrname}" placeholder="${pk.attrname}" clearable></el-input>
</el-form-item>
<el-form-item>
<el-button @click="getDataList()">{{ $t('query') }}</el-button>
</el-form-item>
<el-form-item>
<el-button v-if="$hasPermission('${moduleName}:${pathName}:save')" type="primary" @click="addOrUpdateHandle()">{{ $t('add') }}</el-button>
</el-form-item>
<el-form-item>
<el-button v-if="$hasPermission('${moduleName}:${pathName}:delete')" type="danger" @click="deleteHandle()">{{ $t('deleteBatch') }}</el-button>
<el-button type="primary" size="small" @click="getDataList()">{{ $t('query') }}</el-button>
</el-form-item>
</el-form>
<el-table v-loading="dataListLoading" :data="dataList" border @selection-change="dataListSelectionChangeHandle" style="width: 100%;">
</el-card>
<el-card class="resi-card-table">
<div class="resi-row-btn">
<el-button class="diy-button--add" type="primary" size="small" @click="addOrUpdateHandle()">{{ $t('add') }}</el-button>
<el-button class="diy-button--add" type="danger" size="small" @click="deleteHandle()">{{ $t('deleteBatch') }}</el-button>
</div>
<el-table v-loading="dataListLoading" class="resi-table" :data="dataList" border @selection-change="dataListSelectionChangeHandle" style="width: 100%" :height="tableHeight">
<el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
#foreach($column in $columns)
<el-table-column prop="${column.attrname}" label="${column.comments}" header-align="center" align="center"></el-table-column>
#end
#foreach($column in $columns)
<el-table-column prop="${column.attrname}" label="${column.comments}" header-align="center" align="center"></el-table-column>
#end
<el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150">
<template slot-scope="scope">
<el-button v-if="$hasPermission('${moduleName}:${pathName}:update')" type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">{{ $t('update') }}</el-button>
<el-button v-if="$hasPermission('${moduleName}:${pathName}:delete')" type="text" size="small" @click="deleteHandle(scope.row.id)">{{ $t('delete') }}</el-button>
<el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">{{ $t('update') }}</el-button>
<el-button type="text" size="small" @click="deleteHandle(scope.row.id)">{{ $t('delete') }}</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
:current-page="page"
:page-sizes="[10, 20, 50, 100]"
:page-size="limit"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="pageSizeChangeHandle"
@current-change="pageCurrentChangeHandle">
:current-page="page"
:page-sizes="[10, 20, 50, 100]"
:page-size="limit"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="pageSizeChangeHandle"
@current-change="pageCurrentChangeHandle">
</el-pagination>
<!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
</div>
</el-card>
</el-card>
<!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
</div>
</template>
<script>
import mixinViewModule from '@/mixins/view-module'
import AddOrUpdate from './'
export default {
import mixinViewModule from '@/mixins/view-module'
import AddOrUpdate from './${pathName}-add-or-update'
import { mapGetters } from 'vuex'
export default {
mixins: [mixinViewModule],
data () {
return {
@ -56,13 +56,52 @@
deleteURL: '/${moduleName}/${pathName}',
deleteIsBatch: true
},
dataForm: {;
dataForm: {
${pk.attrname}: ''
}
}
},
components: {
AddOrUpdate
},
computed: {
...mapGetters(["clientHeight", "iframeHeight"]),
tableHeight() {
const h = this.clientHeight - 360 + this.iframeHeight;
const _h = this.clientHeight - 360;
return this.$store.state.inIframe ? h : _h;
},
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/scss/buttonstyle.scss";
.resi-container .resi-card-table {
::v-deep .el-table th {
color: #fff;
background-color: rgba(33, 149, 254, 1);
}
}
.resi-table {
::v-deep .el-button--text {
text-decoration: underline;
}
}
.search-card {
.el-card__body {
padding: 20px 20px 0 20px;
}
}
.resi-row-btn {
margin-bottom: 13px;
.upload-btn {
display: inline-block;
margin: 0 10px;
}
}
</style>

24
epmet-commons/epmet-commons-feignclient/pom.xml

@ -0,0 +1,24 @@
<?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>epmet-commons</artifactId>
<groupId>com.epmet</groupId>
<version>2.0.0</version>
<!--<relativePath>../../pom.xml</relativePath>-->
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>epmet-commons-feignclient</artifactId>
<dependencies>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-commons-tools</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</project>

0
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/.gitkeep

0
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/.gitkeep

22
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/JiMuPage.java

@ -0,0 +1,22 @@
package com.epmet.commons.feignclient.dtos;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 积木报表的返回值Page对象
* @param <T>
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JiMuPage<T> {
private int pageNo;
private int pageSize;
private int total;
private int pages;
private List<?> records;
}

20
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/JiMuResult.java

@ -0,0 +1,20 @@
package com.epmet.commons.feignclient.dtos;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 积木报表的返回值Result对象
* @param <T>
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JiMuResult<T> {
private boolean success = true;
private String message = "";
private Integer code = 0;
private T result;
private T data;
}

33
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/form/JiMuReportFormDTO.java

@ -0,0 +1,33 @@
package com.epmet.commons.feignclient.dtos.form;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @Author zxc
* @DateTime 2022/8/8 15:08
* @DESC
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JiMuReportFormDTO implements Serializable {
private static final long serialVersionUID = 3590609549416867701L;
/**
* 报表IDs
*/
private List<String> reportIds;
/**
* 类别
*/
private List<String> categoryKeys;
private String id;
}

27
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/form/JimuReportExportRequestDTO.java

@ -0,0 +1,27 @@
package com.epmet.commons.feignclient.dtos.form;
import lombok.Data;
/**
* 批量导出用的requst dto
*/
@Data
public class JimuReportExportRequestDTO {
private String excelConfigId;
private ExportRequestQueryParam queryParam = new ExportRequestQueryParam();
/**
* 批量导出用的请求参数
*/
@Data
public static class ExportRequestQueryParam {
private String id;
private String token;
private String paramKey;
private String pageNo;
private Integer pageSize;
private String currentPageNo;
private Integer currentPageSize;
}
}

17
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportBriefResultDTO.java

@ -0,0 +1,17 @@
package com.epmet.commons.feignclient.dtos.result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 报表简要信息result dto
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JiMuReportBriefResultDTO {
private String id;
private String code;
private String name;
}

31
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportDetailResultDTO.java

@ -0,0 +1,31 @@
package com.epmet.commons.feignclient.dtos.result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.Map;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class JiMuReportDetailResultDTO {
private String id;
private String code;
private String name;
private String note;
private String status;
private String type;
private String jsonStr;
private String apiUrl;
private String apiMethod;
private String apiCode;
private String thumb;
private Integer template;
private String createBy;
private Date createTime;
private String updateBy;
private Date updateTime;
private Map<String, Object> dataList;
}

26
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportResultDTO.java

@ -0,0 +1,26 @@
package com.epmet.commons.feignclient.dtos.result;
import lombok.Data;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2022/8/8 15:10
* @DESC
*/
@Data
public class JiMuReportResultDTO implements Serializable {
private static final long serialVersionUID = -4048477731892329569L;
private String code;
private String name;
private String id;
private String reportId;
private String reportName;
private Boolean isList = false;
}

18
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JimuReportDbDataResultDTO.java

@ -0,0 +1,18 @@
package com.epmet.commons.feignclient.dtos.result;
import lombok.Data;
@Data
public class JimuReportDbDataResultDTO {
private ReportDB reportDb;
@Data
public static class ReportDB {
private String apiUrl;
private String apiMethod;
private String isList;
private String dbChName;
}
}

26
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JimuReportFieldTreeResultDTO.java

@ -0,0 +1,26 @@
package com.epmet.commons.feignclient.dtos.result;
import lombok.Data;
import java.util.List;
/**
* 积木报表报表字段列表
*/
@Data
public class JimuReportFieldTreeResultDTO {
private Boolean expand;
private String code;
private List<Child> children;
private String dbId;
private String type;
private String isList;
@Data
public static class Child {
private Boolean expand;
private String title;
private String fieldText;
}
}

0
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/.gitkeep

55
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/JiMuReportOpenFeignClient.java

@ -0,0 +1,55 @@
package com.epmet.commons.feignclient.feigns;
import com.epmet.commons.feignclient.dtos.JiMuPage;
import com.epmet.commons.feignclient.dtos.JiMuResult;
import com.epmet.commons.feignclient.dtos.form.JimuReportExportRequestDTO;
import com.epmet.commons.feignclient.dtos.result.JiMuReportBriefResultDTO;
import com.epmet.commons.feignclient.dtos.result.JiMuReportDetailResultDTO;
import com.epmet.commons.feignclient.dtos.result.JimuReportDbDataResultDTO;
import com.epmet.commons.feignclient.dtos.result.JimuReportFieldTreeResultDTO;
import com.epmet.commons.feignclient.feigns.fallback.JiMuReportOpenFeignClientFallbackFactory;
import com.epmet.commons.tools.constant.ServiceConstant;
import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @Author zxc
* @DateTime 2022/8/8 13:52
* @DESC
*/
@FeignClient(name = ServiceConstant.EPMET_JM_REPORT, fallbackFactory = JiMuReportOpenFeignClientFallbackFactory.class)
//@FeignClient(name = ServiceConstant.EPMET_JM_REPORT, fallbackFactory = JiMuReportOpenFeignClientFallbackFactory.class, url = "localhost:8118")
public interface JiMuReportOpenFeignClient {
@GetMapping(value = "jmreport/excelQuery")
JiMuResult<JiMuPage<JiMuReportDetailResultDTO>> getList(@RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize,
@RequestParam("name") String name,
@RequestParam("reportType") String reportType,
@RequestParam("token") String token,
@RequestHeader MultiValueMap<String, String> headers);
@GetMapping("jmreport/show")
JiMuResult<Map<String,Object>> getReport(@RequestParam("id") String id,@RequestParam("apiUrl") String apiUrl,@RequestParam("params") String params,@RequestHeader MultiValueMap<String, String> headers);
@GetMapping("/jmreport/field/tree/{report-id}")
JiMuResult<List<List<JimuReportFieldTreeResultDTO>>> fieldTree(@PathVariable("report-id") String reportId);
@GetMapping("jmreport/loadDbData/{report-id}")
JiMuResult<JimuReportDbDataResultDTO> loadDbData(@PathVariable("report-id") String reportId);
@PostMapping("jmreport/exportAllExcelStream")
Response exportAllExcelStream(JimuReportExportRequestDTO param);
/**
* 报表简要信息
* @return
*/
@GetMapping("jmreport/get/{report-id}")
JiMuResult<JiMuReportBriefResultDTO> getReportBrief(@PathVariable("report-id") String reportId);
}

58
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallback.java

@ -0,0 +1,58 @@
package com.epmet.commons.feignclient.feigns.fallback;
import com.epmet.commons.feignclient.dtos.JiMuPage;
import com.epmet.commons.feignclient.dtos.JiMuResult;
import com.epmet.commons.feignclient.dtos.form.JimuReportExportRequestDTO;
import com.epmet.commons.feignclient.dtos.result.JiMuReportBriefResultDTO;
import com.epmet.commons.feignclient.dtos.result.JiMuReportDetailResultDTO;
import com.epmet.commons.feignclient.dtos.result.JimuReportDbDataResultDTO;
import com.epmet.commons.feignclient.dtos.result.JimuReportFieldTreeResultDTO;
import com.epmet.commons.feignclient.feigns.JiMuReportOpenFeignClient;
import feign.Response;
import org.springframework.util.MultiValueMap;
import java.util.List;
import java.util.Map;
/**
* @Author zxc
* @DateTime 2022/8/8 13:53
* @DESC
*/
public class JiMuReportOpenFeignClientFallback implements JiMuReportOpenFeignClient {
@Override
public JiMuResult<JiMuPage<JiMuReportDetailResultDTO>> getList(Integer pageNo, Integer pageSize, String name, String reportType, String token, MultiValueMap<String, String> headers) {
JiMuResult<JiMuPage<JiMuReportDetailResultDTO>> rst = new JiMuResult<>(false, "请求失败", 200, null,null);
return rst;
}
@Override
public JiMuResult<Map<String,Object>> getReport(String id,String apiUrl,String params,MultiValueMap<String, String> headers) {
JiMuResult<Map<String,Object>> rst = new JiMuResult<>(false, "请求失败", 200, null,null);
return rst;
}
@Override
public JiMuResult<JimuReportDbDataResultDTO> loadDbData(String reportId) {
JiMuResult<JimuReportDbDataResultDTO> rst = new JiMuResult<>(false, "请求失败", 200, null,null);
return rst;
}
@Override
public Response exportAllExcelStream(JimuReportExportRequestDTO param) {
return null;
}
@Override
public JiMuResult<List<List<JimuReportFieldTreeResultDTO>>> fieldTree(String reportId) {
JiMuResult rst = new JiMuResult<>(false, "请求失败", 200, null,null);
return rst;
}
@Override
public JiMuResult<JiMuReportBriefResultDTO> getReportBrief(String reportID) {
JiMuResult rst = new JiMuResult<>(false, "请求失败", 200, null,null);
return rst;
}
}

24
epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallbackFactory.java

@ -0,0 +1,24 @@
package com.epmet.commons.feignclient.feigns.fallback;
import com.epmet.commons.tools.exception.ExceptionUtils;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @Author zxc
* @DateTime 2022/8/9 13:27
* @DESC
*/
@Slf4j
@Component
public class JiMuReportOpenFeignClientFallbackFactory implements FallbackFactory<JiMuReportOpenFeignClientFallback> {
private JiMuReportOpenFeignClientFallback fallback = new JiMuReportOpenFeignClientFallback();
@Override
public JiMuReportOpenFeignClientFallback create(Throwable cause) {
log.error(String.format("FeignClient调用发生异常,异常信息:%s", ExceptionUtils.getThrowableErrorStackTrace(cause)));
return fallback;
}
}

6
epmet-commons/epmet-commons-mybatis/pom.xml

@ -70,6 +70,12 @@
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
<!--读写分离-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
<!--flyway 数据库迁移工具-->
<dependency>

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

@ -98,4 +98,14 @@ public interface ConsomerGroupConstants {
* 创建党员居民信息消费者组将user库的党员信息同步到partymember库的党员表
*/
String CREATE_RESI_PARTYMEMBER_SYNC_GROUP = "create_resi_sync_group";
/**
* 党建小助手监听器分组
*/
String PARTY_MEETING_MESSAGE = "party_meeting_message";
/**
* 党建积分操作消费组
*/
String PARTY_BUILDING_GROUP = "party_building_group";
}

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

@ -84,4 +84,11 @@ public interface TopicConstants {
* 居民的党员信息
*/
String PARTYMEMBER_RESI = "partymember_resi";
/**
* 消息-党建小助手
*/
String IC_MESSAGE = "ic_message";
String PARTY_BUILDING = "party_building";
}

23
epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/PartyMeetingMessageMQMsg.java

@ -0,0 +1,23 @@
package com.epmet.commons.rocketmq.messages;
import com.epmet.commons.tools.dto.form.mq.MqBaseFormDTO;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 党建小助手发布活动活动到期提醒活动发布提醒推送MQ
* @author sun
*/
@Data
public class PartyMeetingMessageMQMsg extends MqBaseFormDTO implements Serializable {
//客户Id
private String customerId;
//活动/日程Id
private String icPartyActId;
//动作类型 发布活动:publish 提前提醒:remind 日程通知:notify
private String type;
}

6
epmet-commons/epmet-commons-tools/pom.xml

@ -75,6 +75,12 @@
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons.fileupload.version}</version>
<exclusions>
<exclusion>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-io</groupId>

1
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/MaskResponse.java

@ -15,6 +15,7 @@ public @interface MaskResponse {
*/
String MASK_TYPE_ID_CARD = "ID_CARD";
String MASK_TYPE_MOBILE = "MOBILE";
String MASK_TYPE_CHINESE_NAME = "CHINESE_NAME";
///**
// * 默认的一些字段,如果没有手动指定,就会使用默认的。如果手动指定了,就不再使用默认的

13
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/ReportRequest.java

@ -0,0 +1,13 @@
package com.epmet.commons.tools.annotation;
import java.lang.annotation.*;
/**
* 标记一个接口它会被报表服务所调用
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ReportRequest {
}

86
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aspect/ReportRequestAspect.java

@ -0,0 +1,86 @@
package com.epmet.commons.tools.aspect;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.EpmetException;
import com.epmet.commons.tools.redis.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.lang.reflect.Parameter;
import java.util.Map;
/**
* 需要被报表服务请求的api需要加上这个注解
* 1.该注解会取url中固定的key去redis获取参数给入参dto复制
*/
@Aspect
@Component
@Order(20)
@Slf4j
public class ReportRequestAspect {
/**
* 从redis中取参数用
*/
public static final String REPORT_REDIS_KEY = "paramKey";
@Autowired
private RedisUtils redisUtils;
@Before("@annotation(com.epmet.commons.tools.annotation.ReportRequest)")
public void before(JoinPoint point) {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
String paramKey = sra.getRequest().getParameter(REPORT_REDIS_KEY);
if (StringUtils.isBlank(paramKey)) {
// 没有携带key参数,直接跳过
return;
}
Map<String, Object> cachedParams = redisUtils.hGetAll(paramKey);
if (cachedParams == null || cachedParams.size() == 0) {
log.warn("【报表服务】根据paramKey:{}未获取到有效的参数缓存。", paramKey);
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "参数失效", "参数失效");
// redis中没有此参数
}
// 使用方法签名获取出参数class列表
Object[] args = point.getArgs();
MethodSignature signature = (MethodSignature) point.getSignature();
Parameter[] parameters = signature.getMethod().getParameters();
fillArgsToRequestBody(args, cachedParams, parameters);
}
/**
* 将redis中取出的参数赋值到指定的入参dto上
* @param args
* @param storedParams
*/
private void fillArgsToRequestBody(Object[] args, Map<String, Object> storedParams, Parameter[] parameters) {
for (int i = 0; i < args.length; i++) {
Object arg = args[i];
RequestBody requestBodyAnno = parameters[i].getAnnotation(RequestBody.class);
if (arg != null && requestBodyAnno != null) {
Object argBean = BeanUtil.mapToBean(storedParams, arg.getClass(), true);
// "pageSize", "pageNo", "isPage"三个属性不从redis拷贝,而是取传递雇来的
// redis里面的字段如果是null,则不会赋值给arg
BeanUtil.copyProperties(argBean, arg, new CopyOptions(null, true, "pageSize", "pageNo", "isPage"));
return;
}
}
}
}

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

@ -32,6 +32,11 @@ public interface AppClientConstant {
*/
String CLIENT_WXMP = "wxmp";
/**
* 钉钉小程序
*/
String MINI_DING = "mini_ding";
/**
* 客户来源App
* */

1
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java

@ -85,6 +85,7 @@ public interface NumConstant {
String POSITIVE_EIGHT_STR = "+8";
String EMPTY_STR = "";
String ONE_NEG_STR = "-1";
String ONE_HUNDRED_STR = "100";
String FIFTY_STR="50";
}

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

@ -148,4 +148,9 @@ public interface ServiceConstant {
* 插件pli-power服务
*/
String PLI_POWER_SERVER = "pli-power-base-server";
/**
*
*/
String EPMET_JM_REPORT = "epmet-jmreport-server";
}

4
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/DictListFormDTO.java

@ -1,6 +1,8 @@
package com.epmet.commons.tools.dto.form;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@ -9,6 +11,8 @@ import javax.validation.constraints.NotBlank;
* @Author sun
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DictListFormDTO {
/**

26
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/DingMiniInfoFormDTO.java

@ -0,0 +1,26 @@
package com.epmet.commons.tools.dto.form;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2022/9/15 10:25
* @DESC
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DingMiniInfoFormDTO implements Serializable {
private static final long serialVersionUID = 2661531490851265637L;
public interface DingMiniInfoForm{}
@NotBlank(message = "miniAppId不能为空",groups = DingMiniInfoForm.class)
private String miniAppId;
}

24
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/form/HasOperPermissionFormDTO.java

@ -0,0 +1,24 @@
package com.epmet.commons.tools.dto.form;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class HasOperPermissionFormDTO {
/**
* uri
*/
@NotBlank(message = "uri不能为空")
private String uri;
/**
* http方法
*/
@NotBlank(message = "请求http方法不能为空")
private String method;
@NotBlank(message = "操作者ID不能为空")
private String operId;
}

13
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/OperResouce.java

@ -0,0 +1,13 @@
package com.epmet.commons.tools.dto.result;
import lombok.Data;
@Data
public class OperResouce {
private String userId;
private String resourceUrl;
private String ResourceMethod;
}

22
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/YtHsjcResDTO.java

@ -0,0 +1,22 @@
package com.epmet.commons.tools.dto.result;
import lombok.Data;
import java.util.List;
/**
* @Description
* @Author yzm
* @Date 2022/9/26 17:04
*/
@Data
public class YtHsjcResDTO {
private int code = 200;
private String msg = "请求成功";
/**
* 响应数据
*/
private List<YtHsjcResDetailDTO> data;
private int total;
}

48
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/dto/result/YtHsjcResDetailDTO.java

@ -0,0 +1,48 @@
package com.epmet.commons.tools.dto.result;
import lombok.Data;
/**
* @Description
* @Author yzm
* @Date 2022/9/26 17:10
*/
@Data
public class YtHsjcResDetailDTO {
private String id;
private String name;
private String card_no;
private String telephone;
private String address;
private String test_time;
private String depart_name;
private String county;
private String upload_time;
private String sample_result_pcr;
private String sample_time;
private String sampling_org_pcr;
/* {
"code":"200",
"msg":"请求成功",
"data":[
{
"id":"6a31eb2d38c011eda054fa163ebc7ff4",
"name":"杨冠中",// 姓名
"card_no":"372527198404130813",// 证件号码
"telephone":"13697890860",// 电话
"address":"保利香榭里公馆18-1-302",// 联系地址
"test_time":"2022-09-20 12:52:28",// 检测时间
"depart_name":"天仁医学检验实验室有限公司",// varchar
"county":"莱山区",// 所属区县
"upload_time":"2022-09-20 21:23:10",// 时间戳
"sample_result_pcr":"2",// 核酸检测结果 1:阳性,2:阴性
"sample_time":"2022-09-20 06:48:28",// 采样时间
"sampling_org_pcr":"采样点327"// 核酸采样机构
},
]
"total":1
}
*/
}

4
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/CoveragePlaceTypeEnum.java

@ -18,7 +18,9 @@ public enum CoveragePlaceTypeEnum {
VOLUNTEER("volunteer", "志愿者"),
GROUP_RENT("group_rent", "群租房"),
EVENT("event", "城市管理事件"),
ZHZL_RQ("zhzl_rq", "综合治理人群");
ZHZL_RQ("zhzl_rq", "综合治理人群"),
NUCLEIC_POINT("nucleic_point", "核酸检测点"),
VACCINE_POINT("vaccine_point", "疫苗接种点");
private final String code;
private final String name;

79
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/DingMiniAppEnum.java

@ -0,0 +1,79 @@
package com.epmet.commons.tools.enums;
/**
* @Description
* @Author yzm
* @Date 2022/9/14 19:11
*/
public enum DingMiniAppEnum {
// 亿联云盘CorpId:dingd1e19e397c754c7735c2f4657eb6378f
//
// //各应用秘钥
// 随手拍
// SuiteId:27501006
// AppId:119450
// MiniAppId:5000000002934668
// SuiteKey:suitew6ccvkquinmrghqy
// SuiteSecret:TooAxiegdsE5BPP6xo1AxK1LdmaUoMpPMyomOcGcBSXtnsxRc8dEfyOlG56oSmEB
//
// 随时讲
// SuiteId:27564007
// AppId:119451
// MiniAppId:5000000002934374
// SuiteKey:suitezhyj12glsrp8em0f
// SuiteSecret:-z5Q_lvMP6l7fTzlArEzUT8D_-5pvqBQaJMuTGHoXnz0nuiqGQMZ8aeya_cxTsN-
//
// 我的报事
// SuiteId:27569006
// AppId:119452
// MiniAppId:5000000002934456
// SuiteKey:suite5yxliro6wawv514w
// SuiteSecret:aQxiPi7DwJSUa9HlbUU_L7Q4wGCLEDmgf__Ffx75cTn3jZwuHy9vdl-9Iv5FeyJU
//
// 实时动态
// SuiteId:27458011
// AppId:119453
// MiniAppId:5000000002934488
// SuiteKey:suitemcestnonr6y0xigc
// SuiteSecret:kKCNCkfDhmLoVnl_wuAiScyDG4776mkTevuSBuiYhHg-Bvz1-vhb_4IA-Km7nK2I
SSP("suitew6ccvkquinmrghqy", "随手拍", "TooAxiegdsE5BPP6xo1AxK1LdmaUoMpPMyomOcGcBSXtnsxRc8dEfyOlG56oSmEB"),
SSJ("suitezhyj12glsrp8em0f", "随时讲", "-z5Q_lvMP6l7fTzlArEzUT8D_-5pvqBQaJMuTGHoXnz0nuiqGQMZ8aeya_cxTsN-"),
MY_REPORT_EVENT("suite5yxliro6wawv514w", "我的报事", "aQxiPi7DwJSUa9HlbUU_L7Q4wGCLEDmgf__Ffx75cTn3jZwuHy9vdl-9Iv5FeyJU"),
SSDT("suitemcestnonr6y0xigc", "实时动态", "kKCNCkfDhmLoVnl_wuAiScyDG4776mkTevuSBuiYhHg-Bvz1-vhb_4IA-Km7nK2I");
private String suiteKey;
private String name;
private String suiteSecret;
DingMiniAppEnum(String suiteKey, String name, String suiteSecret) {
this.suiteKey = suiteKey;
this.name = name;
this.suiteSecret = suiteSecret;
}
public static DingMiniAppEnum getEnum(String suiteKey) {
DingMiniAppEnum[] values = DingMiniAppEnum.values();
for (DingMiniAppEnum value : values) {
if (value.getSuiteKey().equals(suiteKey)) {
return value;
}
}
return null;
}
public String getSuiteKey() {
return suiteKey;
}
public String getName() {
return name;
}
public String getSuiteSecret() {
return suiteSecret;
}
}

6
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/EventEnum.java

@ -19,6 +19,12 @@ public enum EventEnum {
TOPIC_SHIFTED_TO_PROJECT("topic_to_project","resi_group","话题被转为项目"),
LEADER_RESOLVE_TOPIC("leader_resolve_topic","resi_group","组长解决组内话题"),
FINISH_USER_DEMAND("finish_user_demand","community_service","服务完成"),
ZBWYH("参加支部委员会","part_member", "支部委员会活动签到"),
ZBDYDH("参加支部党员大会","part_member", "支部党员大会活动签到"),
DXZH("参加党小组会","part_member", "党小组会活动签到"),
DANGKE ("参加党课","part_member", "党课活动签到"),
ZTDR("参加主题党日","part_member", "主题党日活动签到"),
WMFWHD("参加为民服务活动","part_member", "为民服务活动活动签到"),
;
private String eventClass;

27
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/IdCardTypeEnum.java

@ -0,0 +1,27 @@
package com.epmet.commons.tools.enums;
/**
* 唯一整件类型
*/
public enum IdCardTypeEnum {
OTHERS("0", "其他"),
SFZH("1", "身份证号"),
PASSPORT("2", "护照");
private String type;
private String name;
IdCardTypeEnum(String type, String name) {
this.type = type;
this.name = name;
}
public String getType() {
return type;
}
public String getName() {
return name;
}
}

1
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java

@ -86,6 +86,7 @@ public enum EpmetErrorCode {
BUILDING_NAME_EXITED(8215,"楼栋名称已存在"),
DOOR_NAME_EXITED(8216,"门牌号已存在"),
NEIGHBOOR_NAME_EXITED(8217,"小区名称已存在"),
BUILDING_NAME_EXITED_IN_GRID(8218,"小区下该楼栋已存在于其他网格"),
REQUIRE_PERMISSION(8301, "您没有足够的操作权限"),
THIRD_PLAT_REQUEST_ERROR(8302, "请求第三方平台错误"),

46
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/CommonOperAccessOpenFeignClient.java

@ -0,0 +1,46 @@
package com.epmet.commons.tools.feign;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.dto.form.HasOperPermissionFormDTO;
import com.epmet.commons.tools.dto.result.OperResouce;
import com.epmet.commons.tools.feign.fallback.CommonOperAccessOpenFeignClientFallbackFactory;
import com.epmet.commons.tools.utils.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* @Description 运营端权限模块
* @Author yinzuomei
* @Date 2020/5/21 15:17 本服务对外开放的API,其他服务通过引用此client调用该服务
*/
@FeignClient(name = ServiceConstant.OPER_ACCESS_SERVER, fallbackFactory = CommonOperAccessOpenFeignClientFallbackFactory.class)
//@FeignClient(name = ServiceConstant.OPER_ACCESS_SERVER, fallbackFactory = CommonOperAccessOpenFeignClientFallbackFactory.class, url = "http://localhost:8093")
public interface CommonOperAccessOpenFeignClient {
/**
* @param
* @return com.epmet.commons.tools.utils.Result
* @Author yinzuomei
* @Description 清空运营人员权限信息菜单信息
* @Date 2020/5/21 17:08
**/
@GetMapping("/oper/access/menu/clearoperuseraccess")
Result clearOperUserAccess();
/**
* 是否有该接口的权限
* @return
*/
@PostMapping("/oper/access/menu/hasPermission")
Result hasOperPermission(@RequestBody HasOperPermissionFormDTO form);
/**
* 需要验证的菜单资源
* @return
*/
@PostMapping("/oper/access/menu/getExamineResourceUrls")
Result<List<OperResouce>> getExamineResourceUrls();
}

24
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/CommonThirdFeignClient.java

@ -0,0 +1,24 @@
package com.epmet.commons.tools.feign;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.dto.form.DingMiniInfoFormDTO;
import com.epmet.commons.tools.feign.fallback.CommonThirdFeignClientFallBackFactory;
import com.epmet.commons.tools.redis.common.bean.DingMiniInfoCache;
import com.epmet.commons.tools.utils.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* @Description
* @Author zxc
*/
@FeignClient(name = ServiceConstant.EPMET_THIRD_SERVER, fallbackFactory = CommonThirdFeignClientFallBackFactory.class)
// @FeignClient(name = ServiceConstant.EPMET_THIRD_SERVER, fallbackFactory = CommonAggFeignClientFallBackFactory.class,url = "localhost:8110")
public interface CommonThirdFeignClient {
@PostMapping("/third/dingTalk/getDingMiniInfo")
Result<DingMiniInfoCache> getDingMiniInfo(@RequestBody DingMiniInfoFormDTO formDTO);
}

2
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java

@ -25,8 +25,6 @@ public class EpmetBaseRequestInterceptor implements RequestInterceptor {
// Map<String, String> requestHeaders = getHeadersFromRequest();
log.debug("EpmetBaseRequestInterceptor#apply#inheritableAdditionalHeaders:" + requestHeaders);
if (requestHeaders != null && requestHeaders.size() > 0) {
for (Map.Entry<String, String> kv : requestHeaders.entrySet()) {
template.header(kv.getKey(), kv.getValue());

35
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/fallback/CommonOperAccessOpenFeignClientFallback.java

@ -0,0 +1,35 @@
package com.epmet.commons.tools.feign.fallback;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.dto.form.HasOperPermissionFormDTO;
import com.epmet.commons.tools.dto.result.OperResouce;
import com.epmet.commons.tools.feign.CommonOperAccessOpenFeignClient;
import com.epmet.commons.tools.utils.ModuleUtils;
import com.epmet.commons.tools.utils.Result;
import java.util.List;
/**
* @Description 运营端权限模块
* @Author yinzuomei
* @Date 2020/5/21 15:47
*/
//@Component
public class CommonOperAccessOpenFeignClientFallback implements CommonOperAccessOpenFeignClient {
@Override
public Result clearOperUserAccess() {
return ModuleUtils.feignConError(ServiceConstant.OPER_ACCESS_SERVER, "clearOperUserAccess");
}
@Override
public Result hasOperPermission(HasOperPermissionFormDTO form) {
return ModuleUtils.feignConError(ServiceConstant.OPER_ACCESS_SERVER, "hasOperPermission");
}
@Override
public Result<List<OperResouce>> getExamineResourceUrls() {
return ModuleUtils.feignConError(ServiceConstant.OPER_ACCESS_SERVER, "getExamineResourceUrls");
}
}

19
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/fallback/CommonOperAccessOpenFeignClientFallbackFactory.java

@ -0,0 +1,19 @@
package com.epmet.commons.tools.feign.fallback;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.feign.CommonOperAccessOpenFeignClient;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class CommonOperAccessOpenFeignClientFallbackFactory implements FallbackFactory<CommonOperAccessOpenFeignClient> {
private CommonOperAccessOpenFeignClientFallback fallback = new CommonOperAccessOpenFeignClientFallback();
@Override
public CommonOperAccessOpenFeignClient create(Throwable cause) {
log.error(String.format("FeignClient调用发生异常,异常信息:%s", ExceptionUtils.getThrowableErrorStackTrace(cause)));
return fallback;
}
}

20
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/fallback/CommonThirdFeignClientFallBackFactory.java

@ -0,0 +1,20 @@
package com.epmet.commons.tools.feign.fallback;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.feign.CommonThirdFeignClient;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class CommonThirdFeignClientFallBackFactory implements FallbackFactory<CommonThirdFeignClient> {
private CommonThirdFeignClientFallback fallback = new CommonThirdFeignClientFallback();
@Override
public CommonThirdFeignClient create(Throwable cause) {
log.error(String.format("FeignClient调用发生异常,异常信息:%s", ExceptionUtils.getThrowableErrorStackTrace(cause)));
return fallback;
}
}

24
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/fallback/CommonThirdFeignClientFallback.java

@ -0,0 +1,24 @@
package com.epmet.commons.tools.feign.fallback;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.dto.form.DingMiniInfoFormDTO;
import com.epmet.commons.tools.feign.CommonThirdFeignClient;
import com.epmet.commons.tools.redis.common.bean.DingMiniInfoCache;
import com.epmet.commons.tools.utils.ModuleUtils;
import com.epmet.commons.tools.utils.Result;
import org.springframework.stereotype.Component;
/**
*
* @Author zxc
* @Description
* @Date
**/
@Component
public class CommonThirdFeignClientFallback implements CommonThirdFeignClient {
@Override
public Result<DingMiniInfoCache> getDingMiniInfo(DingMiniInfoFormDTO formDTO) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_THIRD_SERVER, "getDingMiniInfo", formDTO);
}
}

7
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/page/PageData.java

@ -29,6 +29,7 @@ public class PageData<T> implements Serializable {
private List<T> list;
private int pages;
/**
* 分页
* @param list 列表数据
@ -38,4 +39,10 @@ public class PageData<T> implements Serializable {
this.list = list;
this.total = (int)total;
}
public PageData(List<T> list, long total,int pageSize) {
this.list = list;
this.total = (int)total;
this.pages = (int) Math.ceil((double)total / pageSize);
}
}

55
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/processor/MaskProcessor.java

@ -2,8 +2,10 @@ package com.epmet.commons.tools.processor;
import cn.hutool.core.util.StrUtil;
import com.epmet.commons.tools.annotation.MaskResponse;
import com.epmet.commons.tools.enums.IdCardTypeEnum;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.utils.IdCardRegexUtils;
import com.epmet.commons.tools.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -13,6 +15,7 @@ import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* desc:脱敏处理器
@ -130,27 +133,67 @@ public class MaskProcessor {
return maskIdCard(originString);
} else if (MaskResponse.MASK_TYPE_MOBILE.equals(maskType)) {
return maskMobile(originString);
} else if (MaskResponse.MASK_TYPE_CHINESE_NAME.equals(maskType)) {
return maskChineseName(originString);
} else {
return originString;
}
}
/**
* 对中文人名进行打码
* @param originString
* @return
*/
private String maskChineseName(String originString) {
if (StringUtils.isBlank(originString)) {
// 空串,或者只有一个字的,不打码,直接返回
return originString;
}
int length = originString.length();
// 2个字以上的,首位字母明文,中间*
// 中文不能用\\w,要用[\u4e00-\u9fa5]
if (length == 2) {
return originString.replaceAll("^([\\u4e00-\\u9fa5]).*$", "$1*");
} else {
String maskStr = StrUtil.repeat("*", length - 2);
return originString.replaceAll("^([\\u4e00-\\u9fa5]).*([\\u4e00-\\u9fa5])$", "$1" + maskStr + "$2");
}
}
/**
* 唯一整件号打码可能是身份证号或者是护照号
* 将明文字符串打码变为掩码保留前6后面打码
* @param originString
* @return
*/
private String maskIdCard(String originString) {
int clearTextLength = 12;
// 仅将6位之后的全都打码
int length = originString.length();
if (length <= clearTextLength) {
IdCardRegexUtils regexUtil = IdCardRegexUtils.parse(originString);
if (regexUtil == null) {
// 不匹配任何类型,不码
return originString;
}
String maskStr = StrUtil.repeatByLength("*", length - clearTextLength);
if (regexUtil.getTypeEnum() == IdCardTypeEnum.SFZH) {
// 身份证号
// 仅将6位之后的全都打码
int maskedTextLength = 12;
int length = originString.length();
String maskStr = StrUtil.repeatByLength("*", length - maskedTextLength);
return originString.replaceAll("^(\\d{10})\\d+([a-zA-Z0-9]{2})$", new StringBuilder("$1").append(maskStr).append("$2").toString());
} else if (regexUtil.getTypeEnum() == IdCardTypeEnum.PASSPORT) {
// 护照,前两位,后两位为明文,其他*
int clearLength = 4;
int maskedLength = 0;
if ((maskedLength = originString.length() - clearLength) > 0) {
String maskStr = StrUtil.repeatByLength("*", maskedLength);
return originString.replaceAll("^([a-zA-Z0-9]{2})[a-zA-Z0-9]+([a-zA-Z0-9]{2})$", new StringBuilder("$1").append(maskStr).append("$2").toString());
}
}
return originString.replaceAll("^(\\d{10})\\d+([a-zA-Z0-9]{2})$", new StringBuilder("$1").append(maskStr).append("$2").toString());
return originString;
}
/**

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

@ -104,6 +104,10 @@ public class RedisKeys {
return rootPrefix.concat("sys:security:user:").concat(app).concat(StrConstant.COLON).concat(client).concat(StrConstant.COLON).concat(userId);
}
public static String getCpUserKeyForDingApp(String suiteKey,String app, String client, String userId) {
return rootPrefix.concat("sys:security:user:").concat(app).concat(StrConstant.COLON).concat(client).concat(StrConstant.COLON).concat(suiteKey).concat(StrConstant.COLON).concat(userId);
}
/**
* 拼接手机验证码key---后面需要改
*
@ -856,4 +860,73 @@ public class RedisKeys {
}
return rootPrefix.concat("staffbaseinfo:")+userId;
}
/**
* 大华publicKey
*/
public static String getDhPublicKey() {
return rootPrefix.concat("dh:public");
}
/**
* 大华token
*/
public static String getDhToken() {
return rootPrefix.concat("dh:token");
}
/**
* desc:根据appId 获取 客户信息key
* @param appId
* @return
*/
public static String getThirdCustomerInfoByAppId(String appId) {
if (StringUtils.isBlank(appId)){
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"参数错误");
}
return rootPrefix.concat("third:customerInfo:appId:")+appId;
}
public static String getCustomerStaffTempKey(String staffId) {
if (StringUtils.isBlank(staffId)){
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"参数错误");
}
return rootPrefix.concat("gov:staff:temp:staffId:")+staffId;
}
/**
* Desc: 票据
* @param suiteKey
* @author zxc
* @date 2022/9/14 10:46
*/
public static String getSuiteTicketKey(String suiteKey) {
return rootPrefix.concat("ding:suiteTicket:" + suiteKey);
}
public static String getDingMiniInfoKey(String suiteKey) {
return rootPrefix.concat("ding:miniInfo:" + suiteKey);
}
/**
* 运营人员-资源权限
* @param operId
* @return
*/
public static String operResourcesBaseDir() {
return rootPrefix.concat("oper:access:resources:");
}
public static String operResourcesByUserId(String operId) {
return operResourcesBaseDir().concat(operId);
}
/**
* 获取需要检查的资源url
* @return
*/
public static String getOperExamineResourceUrls() {
return rootPrefix.concat("oper:access:examineresources");
}
}

58
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/common/CustomerDingDingRedis.java

@ -0,0 +1,58 @@
package com.epmet.commons.tools.redis.common;
import com.epmet.commons.tools.dto.form.DingMiniInfoFormDTO;
import com.epmet.commons.tools.exception.EpmetException;
import com.epmet.commons.tools.feign.CommonThirdFeignClient;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.redis.common.bean.DingMiniInfoCache;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import java.util.Map;
/**
* @Author zxc
* @DateTime 2022/9/15 10:01
* @DESC
*/
@Slf4j
@Component
public class CustomerDingDingRedis {
@Autowired
private CommonThirdFeignClient thirdFeignClient;
@Autowired
private RedisUtils redisUtils;
private static CustomerDingDingRedis customerDingDingRedis;
@PostConstruct
public void init() {
customerDingDingRedis = this;
customerDingDingRedis.thirdFeignClient = this.thirdFeignClient;
customerDingDingRedis.redisUtils = this.redisUtils;
}
public static DingMiniInfoCache getDingMiniInfo(String miniAppId){
String key = RedisKeys.getDingMiniInfoKey(miniAppId);
Map<String, Object> miniInfoMap = customerDingDingRedis.redisUtils.hGetAll(key);
if (!CollectionUtils.isEmpty(miniInfoMap)){
return ConvertUtils.mapToEntity(miniInfoMap,DingMiniInfoCache.class);
}
Result<DingMiniInfoCache> dingMiniInfoResult = customerDingDingRedis.thirdFeignClient.getDingMiniInfo(new DingMiniInfoFormDTO(miniAppId));
if (!dingMiniInfoResult.success()){
throw new EpmetException("查询dingMiniInfo失败...");
}
if (null == dingMiniInfoResult.getData()){
return null;
}
return dingMiniInfoResult.getData();
}
}

52
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/common/bean/DingMiniInfoCache.java

@ -0,0 +1,52 @@
package com.epmet.commons.tools.redis.common.bean;
import lombok.Data;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2022/9/15 10:11
* @DESC
*/
@Data
public class DingMiniInfoCache implements Serializable {
private static final long serialVersionUID = -6956910978074595334L;
private String id;
/**
*
*/
private String suiteId;
/**
*
*/
private String appId;
/**
*
*/
private String miniAppId;
/**
*
*/
private String suiteName;
/**
*
*/
private String suiteKey;
/**
*
*/
private String suiteSecret;
private String token;
private String aesKey;
}

6
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/password/BCryptPasswordEncoder.java

@ -16,7 +16,7 @@ import java.util.regex.Pattern;
*
*/
public class BCryptPasswordEncoder implements PasswordEncoder {
private Pattern BCRYPT_PATTERN = Pattern
private static final Pattern BCRYPT_PATTERN = Pattern
.compile("\\A\\$2a?\\$\\d\\d\\$[./0-9A-Za-z]{53}");
private final Log logger = LogFactory.getLog(getClass());
@ -72,10 +72,10 @@ public class BCryptPasswordEncoder implements PasswordEncoder {
return false;
}
if (!BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
/*if (!BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
logger.warn("Encoded password does not look like BCrypt");
return false;
}
}*/
return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
}

37
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/password/PasswordUtils.java

@ -37,6 +37,43 @@ public class PasswordUtils {
return passwordEncoder.matches(str, password);
}
/**
* desc:校验密码规则是否
* 校验密码规则密码必须8-20个字符而且同时包含大小写字母和数字
* @param password
* @return
*/
public static boolean checkPassWordRule(String password) {
boolean flag=false;
if(password.length()<8||password.length()>20){
return flag;
}
boolean numFlag=false;
boolean bigLetter=false;
boolean smallLetter=false;
char[] passwordArray = password.toCharArray();
for(int i=0;i < passwordArray.length;i++) {
char currentStr=passwordArray[i];
// 判断ch是否是数字字符,如'1','2‘,是返回true。否则返回false
if(Character.isDigit(currentStr)){
numFlag=true;
continue;
}
// 判断ch是否是字母字符,如'a','b‘,是返回true。否则返回false
if(Character.isUpperCase(currentStr)){
bigLetter=true;
continue;
}
if(Character.isLowerCase(currentStr)){
smallLetter=true;
}
}
if(numFlag&&bigLetter&&smallLetter){
flag=true;
}
return flag;
}
public static void main(String[] args) {
String str = "wangqing";

1
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/security/user/LoginUserUtil.java

@ -2,6 +2,7 @@ package com.epmet.commons.tools.security.user;
import com.epmet.commons.tools.constant.AppClientConstant;
import com.epmet.commons.tools.utils.EpmetRequestHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;

9
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/CpUserDetailRedis.java

@ -41,6 +41,15 @@ public class CpUserDetailRedis {
redisUtils.hMSet(key, map, expire);
}
public void setForDingApp(String suiteKey,TokenDto user, long expire) {
if (user == null) {
return;
}
String key = RedisKeys.getCpUserKeyForDingApp(suiteKey,user.getApp(), user.getClient(), user.getUserId());
//bean to map
Map<String, Object> map = BeanUtil.beanToMap(user, false, true);
redisUtils.hMSet(key, map, expire);
}
/**
* 获取token信息
*

7
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/DateUtils.java

@ -55,6 +55,7 @@ public class DateUtils {
public final static String DATE_TIME_PATTERN_END_WITH_MINUTE = "yyyy-MM-dd HH:mm";
public static final String DATE_PATTERN_YYYYMMDD = "yyyyMMdd";
public static final String DATE_PATTERN_YYYYMMDDHHMM = "yyyyMMddHHmm";
public static final String DATE_NAME_PATTERN = "yyyy年MM月dd日";
public static final String MONTH_NAME_PATTERN = "yyyy年MM月";
public static final String DATE_PATTERN_YYYY = "yyyy";
@ -1070,4 +1071,10 @@ public class DateUtils {
return cal.getTime();
}
public static Date calDateBaseDay(Date date, int day) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, day);
return calendar.getTime();
}
}

9
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/EpmetRequestHolder.java

@ -2,6 +2,7 @@ package com.epmet.commons.tools.utils;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.epmet.commons.tools.constant.AppClientConstant;
import com.epmet.commons.tools.constant.Constant;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
@ -86,6 +87,14 @@ public class EpmetRequestHolder {
return getHeader(AppClientConstant.CLIENT);
}
/**
* 获取登陆用户的token
* @return
*/
public static String getLoginUserAuthorizationToken() {
return getHeader(Constant.AUTHORIZATION_HEADER);
}
/**
* 获取所有
* @return

28
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/HttpClientManager.java

@ -443,6 +443,34 @@ public class HttpClientManager {
}
}
public Result<String> sendGet(String url, Map<String, Object> params, Map<String, Object> headerMap) {
try {
URIBuilder builder = new URIBuilder(url);
if (!CollectionUtils.isEmpty(params)) {
Set<String> set = params.keySet();
for (String key : set) {
builder.setParameter(key, params.get(key) == null ? "" : String.valueOf(params.get(key)));
}
}
System.out.println(builder.getPath());
HttpGet httpGet = new HttpGet(builder.build());
httpGet.setConfig(requestConfig);
if (null != headerMap){
headerMap.forEach((k,v) -> {
if (StringUtils.isNotBlank(k)) {
httpGet.addHeader(k, v == null ? null : v.toString());
}
});
}
return execute(httpGet,false);
} catch (Exception e) {
log.error("sendGet exception", e);
return new Result<String>().error(EpmetErrorCode.SERVER_ERROR.getCode(), EpmetErrorCode.SERVER_ERROR.getMsg());
}
}
private Result<String> execute(HttpRequestBase httpMethod, boolean isHttps) {
CloseableHttpResponse response = null;
try {

155
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/IdCardRegexUtils.java

@ -0,0 +1,155 @@
package com.epmet.commons.tools.utils;
import com.epmet.commons.tools.enums.IdCardTypeEnum;
import com.epmet.commons.tools.exception.EpmetException;
import com.epmet.commons.tools.exception.ExceptionUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.DateTimeException;
import java.time.LocalDate;
import java.time.Period;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 唯一整件正则工具
*/
public class IdCardRegexUtils {
/**
* 15位身份证号的正则表达式
*/
private static final Pattern PATTERN_15_ID = Pattern.compile("^\\d{6}(?<year>\\d{2})(?<month>0[1-9]|1[0-2])(?<day>[0-2][0-9]|3[0-1])\\d{2}(?<sex>\\d)$");
/**
* 18位身份证号的正则表达式
*/
private static final Pattern PATTERN_18_ID = Pattern.compile("^\\d{6}(?<year>\\d{4})(?<month>0[1-9]|1[0-2])(?<day>[0-2][0-9]|3[0-1])\\d{2}(?<sex>\\d)[0-9a-xA-X]$");
/**
* 9位护照
*/
private static final Pattern PATTERN_9_PASSPORT = Pattern.compile("^[a-zA-Z0-9]{8,9}$");
private String inputText;
private Matcher matcher;
private IdCardTypeEnum idCardType;
private IdCardRegexUtils(IdCardTypeEnum idCardType, Matcher matcher, String inputText) {
this.idCardType = idCardType;
this.matcher = matcher;
this.inputText = inputText;
}
/**
* 正则解析结果
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class ParsedContent {
private String birthdayYear;
private String birthdayMonth;
private String birthdayDay;
private String sex;
private Integer age;
}
/**
* desc:校验输入的证件号是否合法
* @param input
* @return
*/
public static boolean validateIdCard(String input){
IdCardRegexUtils parse = IdCardRegexUtils.parse(input);
return parse != null;
}
/**
* 解析正则
* @param input
* @return
*/
public static IdCardRegexUtils parse(String input) {
if (input == null || input.trim().length() == 0) {
return null;
}
if (input.length() == 15) {
Matcher matcher = PATTERN_15_ID.matcher(input);
if (matcher.matches()) {
return new IdCardRegexUtils(IdCardTypeEnum.SFZH, matcher, input);
}
}
if (input.length() == 18) {
Matcher matcher = PATTERN_18_ID.matcher(input);
if (matcher.matches()) {
return new IdCardRegexUtils(IdCardTypeEnum.SFZH, matcher, input);
}
}
if (input.length() == 9 || input.length() == 8) {
Matcher matcher = PATTERN_9_PASSPORT.matcher(input);
if (matcher.matches()) {
return new IdCardRegexUtils(IdCardTypeEnum.PASSPORT, matcher, input);
}
}
return null;
}
/**
* 获取解析结果
* @return
*/
public ParsedContent getParsedResult() {
if (matcher == null || idCardType == null) {
return null;
}
if (IdCardTypeEnum.SFZH == idCardType) {
//是身份证号,可以解析
String year;
if (inputText.length() == 15) {
// 15位身份证号,years前需要拼上19
year = "19".concat(matcher.group("year"));
} else {
year = matcher.group("year");
}
String month = matcher.group("month");
String day = matcher.group("day");
String sex = matcher.group("sex");
// ------- 年龄Start----------
Integer age;
try {
LocalDate birthday = LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
age = Period.between(birthday, LocalDate.now()).getYears();
} catch (DateTimeException e) {
throw new EpmetException("身份证号解析年龄失败:" + ExceptionUtils.getErrorStackTrace(e));
}
// ------- 年龄End----------
return new ParsedContent(year, month, day, sex, age);
}
// 其他类型暂时不可解析
return null;
}
/**
* 获取类型枚举
* @return
*/
public IdCardTypeEnum getTypeEnum() {
return idCardType;
}
public static void main(String[] args) {
IdCardRegexUtils parse = IdCardRegexUtils.parse("370282198801303017");
ParsedContent parsedResult = parse.getParsedResult();
System.out.println(parsedResult);
}
}

89
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/NameUtils.java

@ -0,0 +1,89 @@
package com.epmet.commons.tools.utils;
import com.epmet.commons.tools.constant.NumConstant;
import java.util.HashMap;
import java.util.Map;
/**
* @Description
* @Author zhaoqifeng
* @Date 2022/9/14 14:40
*/
public class NameUtils {
/**
* 复姓两字,国内现存81个末尾添加三字以上的部分满姓
*/
private static final String[] SURNAME_NOW = {"百里", "北堂", "北野", "北宫", "辟闾", "孛尔", "淳于", "成公", "陈生", "褚师",
"端木", "东方", "东郭", "东野", "东门", "第五", "大狐", "段干", "段阳", "带曰", "第二", "东宫", "公孙", "公冶", "公羊",
"公良", "公西", "公孟", "高堂", "高阳", "公析", "公肩", "公坚", "郭公", "谷梁", "毌将", "公乘", "毌丘", "公户", "公广",
"公仪", "公祖", "皇甫", "黄龙", "胡母", "何阳", "夹谷", "九方", "即墨", "梁丘", "闾丘", "洛阳", "陵尹", "冷富", "龙丘",
"令狐", "林彭", "南宫", "南郭", "女娲", "南伯", "南容", "南门", "南野", "欧阳", "欧侯", "濮阳", "青阳", "漆雕", "亓官",
"渠丘", "壤驷", "上官", "少室", "少叔", "司徒", "司马", "司空", "司寇", "士孙", "申屠", "申徒", "申鲜", "申叔", "夙沙",
"叔先", "叔仲", "侍其", "叔孙", "澹台", "太史", "太叔", "太公", "屠岸", "唐古", "闻人", "巫马", "微生", "王孙", "无庸",
"夏侯", "西门", "信平", "鲜于", "轩辕", "相里", "新垣", "徐离", "羊舌", "羊角", "延陵", "於陵", "伊祁", "吾丘", "乐正",
"只斤", "诸葛", "颛孙", "仲孙", "仲长", "钟离", "宗政", "主父", "中叔", "左人", "左丘", "宰父", "长儿", "仉督", "单于",
"叱干", "叱利", "车非", "车公", "车侯", "车长", "车绵", "独孤", "大野", "独吉", "达奚", "达官", "达仲", "达品", "哥舒",
"哥夜", "哥翰", "哥汗", "赫连", "呼延", "贺兰", "黑齿", "斛律", "斛粟", "贺若", "贺奴", "贺远", "贺元", "夹谷", "吉胡",
"吉利", "吉家", "可频", "慕容", "万俟", "万红", "万中", "抹捻", "纳兰", "纳西", "纳吉", "纳罕", "纳塞", "纳博", "纳称",
"纳勉", "普周", "仆固", "仆散", "蒲察", "屈突", "屈卢", "钳耳", "是云", "索卢", "厍狄", "拓跋", "同蹄", "秃发", "完颜",
"完明", "完忠", "宇文", "尉迟", "耶律", "耶红", "也先", "耶鲜", "耶闻", "长孙", "长南", "长北", "长西", "长红", "长元",
"长秋", "长寸", "长李", "长云", "萨嘛喇","赫舍里","萨克达","钮祜禄","他塔喇","喜塔腊","库雅喇","瓜尔佳","舒穆禄","索绰络",
"叶赫那拉","依尔觉罗","额尔德特","讷殷富察","叶赫那兰","爱新觉罗","依尔根觉罗"};
/**
* 获取复姓非单字姓氏未匹配上则依旧返回单字姓氏
* @param name
* @return
*/
public static String getSurNameComplex(String name){
for (String s : SURNAME_NOW) {
if (name.startsWith(s)) {
return name.substring(0, s.length());
}
}
return name.substring(0,1);
}
/**
* 获取复姓名去除姓氏后名
* @param name
* @return
*/
public static String getNameComplex(String name){
for (String s : SURNAME_NOW) {
if (name.startsWith(s)) {
return name.substring(s.length());
}
}
return name.substring(1);
}
/**
* 获取姓氏与姓名<br>
* 姓名在两字时首字为姓<br>
* 姓名大于两字时优先匹配复姓<br>
* 姓氏未匹配且姓名多于5字时姓与名均在姓氏中,名为空少于5字时则采用第一个字为姓<br>
* @param name 姓名
* @return map类型数据姓氏为key值X名字为value值M
*/
public static Map<String, String> getSurName(String name) {
Map<String,String> mapData = new HashMap<>(NumConstant.TWO);
if (name.length() > NumConstant.ZERO && name.length() <= NumConstant.TWO){
mapData.put("X", name.substring(NumConstant.ZERO, NumConstant.ONE));
mapData.put("M", name.substring(NumConstant.ONE));
} else if (name.length() > NumConstant.TWO) {
for (String s : SURNAME_NOW) {//遍历复姓数组
if (name.startsWith(s)) {
mapData.put("X", s);
mapData.put("M", name.substring(s.length()));
return mapData;
}
}
//姓氏没有匹配时采用第一个字为姓
mapData.put("X", name.substring(NumConstant.ZERO, NumConstant.ONE));
mapData.put("M", name.substring(NumConstant.ONE));
}
return mapData;
}
}

42
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/YtHsResUtils.java

@ -0,0 +1,42 @@
package com.epmet.commons.tools.utils;
import com.alibaba.fastjson.JSON;
import com.epmet.commons.tools.dto.result.YtHsjcResDTO;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.EpmetException;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
/**
* @Description
* @Author yzm
* @Date 2022/9/26 16:56
*/
@Slf4j
public class YtHsResUtils {
static String url = "https://10.2.2.60:8191/sjzt/server/hsjcxx?appkey=DR4jF5Be7sCsqDmCamq2tmYCl";
/**
* desc:图片同步扫描
*
* @return
*/
public static YtHsjcResDTO hsjc(String cardNo, Integer rowNum, Integer pageSize) {
try {
String param = String.format("&card_no=%s&ROWNUM=%s&PAGESIZE=%s", cardNo, rowNum, pageSize);
String apiUrl = url.concat(param);
Result<String> result = HttpClientManager.getInstance().sendPostByJSON(apiUrl, null);
if (result.success()) {
return JSON.parseObject(result.getData(), YtHsjcResDTO.class);
}
YtHsjcResDTO resultResult = new YtHsjcResDTO();
resultResult.setData(new ArrayList<>());
return resultResult;
} catch (Exception e) {
log.error(String.format("烟台核算检测结果查询异常cardNo:%s,异常信息:%s", cardNo, e.getMessage()));
throw new EpmetException(EpmetErrorCode.SERVER_ERROR.getCode(), "获取核算检测结果api异常"+e.getMessage());
}
}
}

51
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/poi/excel/converter/EasyExcelDateConverter.java

@ -0,0 +1,51 @@
package com.epmet.commons.tools.utils.poi.excel.converter;
/**
* desc:
*
* @author: LiuJanJun
* @date: 2022/8/26 4:59 下午
* @version: 1.0
*/
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Author: liujianjun
* @Date: 2022/7/19
* @Description: yyyy-MM-dd easyExcel 日期转换
*/
public class EasyExcelDateConverter implements Converter<Date> {
private static final String PATTERN_YYYY_MM_DD = "yyyy-MM-dd";
@Override
public Class<?> supportJavaTypeKey() {
return Converter.super.supportJavaTypeKey();
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return Converter.super.supportExcelTypeKey();
}
@Override
public WriteCellData<?> convertToExcelData(Date value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat(PATTERN_YYYY_MM_DD);
String dateValue = sdf.format(value);
return new WriteCellData<>(dateValue);
}
//@Override
//public Date convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
// SimpleDateFormat sdf = new SimpleDateFormat(PATTERN_YYYY_MM_DD);
// return sdf.parse(cellData.getStringValue());
//}
}

26
epmet-gateway/src/main/java/com/epmet/GatewayApplication.java

@ -8,9 +8,15 @@
package com.epmet;
import com.alibaba.fastjson.JSON;
import com.epmet.commons.tools.aspect.ServletExceptionHandler;
import com.epmet.commons.tools.config.RedissonConfig;
import com.epmet.commons.tools.config.ThreadDispatcherConfig;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.filter.CpProperty;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@ -18,6 +24,9 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import javax.annotation.PostConstruct;
import java.util.List;
/**
* 网关服务
*
@ -31,7 +40,24 @@ import org.springframework.context.annotation.FilterType;
@ComponentScan(basePackages = {"com.epmet.*"}, excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {RedissonConfig.class, ThreadDispatcherConfig.class, ServletExceptionHandler.class}))
public class GatewayApplication {
@Autowired
private CpProperty cpProperty;
@Autowired
private RedisUtils redisUtils;
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
/**
* 初始化运营端校验资源列表
*/
// @PostConstruct
// public void initOperExamineResources() {
// if (!redisUtils.hasKey(RedisKeys.getOperExamineResourceUrls())) {
// List<CpProperty.OperExamineResource> operExamineResourceUrls = cpProperty.getOperExamineResourceUrls();
// redisUtils.setString(RedisKeys.getOperExamineResourceUrls(), JSON.toJSONString(operExamineResourceUrls));
// }
// }
}

70
epmet-gateway/src/main/java/com/epmet/auth/InternalAuthProcessor.java

@ -1,11 +1,22 @@
package com.epmet.auth;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.epmet.commons.tools.constant.AppClientConstant;
import com.epmet.commons.tools.constant.Constant;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.dto.form.HasOperPermissionFormDTO;
import com.epmet.commons.tools.dto.result.OperResouce;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.EpmetException;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.feign.CommonOperAccessOpenFeignClient;
import com.epmet.commons.tools.feign.ResultDataResolver;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.security.dto.BaseTokenDto;
import com.epmet.commons.tools.utils.CpUserDetailRedis;
import com.epmet.commons.tools.utils.Result;
import com.epmet.filter.CpProperty;
import com.epmet.jwt.JwtTokenUtils;
import io.jsonwebtoken.Claims;
@ -15,18 +26,20 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import java.util.Date;
import java.util.List;
/**
* 内部认证处理器
*/
@Component
public class InternalAuthProcessor extends AuthProcessor {
public class InternalAuthProcessor extends AuthProcessor implements ResultDataResolver {
private Logger logger = LoggerFactory.getLogger(getClass());
@ -41,6 +54,12 @@ public class InternalAuthProcessor extends AuthProcessor {
@Autowired
private CpProperty cpProperty;
@Autowired
private CommonOperAccessOpenFeignClient operAccessOpenFeignClient;
@Autowired
private RedisUtils redisUtils;
@Override
public ServerWebExchange auth(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
@ -104,10 +123,59 @@ public class InternalAuthProcessor extends AuthProcessor {
builder.header(AppClientConstant.CUSTOMER_ID, customerId);
}
// 针对运营端的url拦截和校验
if (AppClientConstant.APP_OPER.equals(app)) {
HttpMethod method = request.getMethod();
Boolean hasAccess = checkRequestOperResource(userId, requestUri, method.toString());
if (!hasAccess) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "资源未授权", "资源未授权");
}
}
ServerHttpRequest shr = builder.build();
return exchange.mutate().request(shr).build();
}
/**
* 校验运营端用户是否有权访问该资源
* @param uri
* @param method
* @return
*/
private Boolean checkRequestOperResource(String userId, String uri, String method) {
String resourceJsonString = redisUtils.getString(RedisKeys.getOperExamineResourceUrls());
List<OperResouce> resources = JSON.parseObject(resourceJsonString, new TypeReference<List<OperResouce>>() {});
if (resources == null) {
// redis中没有缓存,需要api获取
resources = getResultDataOrThrowsException(operAccessOpenFeignClient.getExamineResourceUrls(), ServiceConstant.OPER_ACCESS_SERVER,
EpmetErrorCode.SERVER_ERROR.getCode(), "调用operaccess获取要校验的资源失败", "调用operaccess获取要校验的资源失败");
// 缓存
redisUtils.setString(RedisKeys.getOperExamineResourceUrls(), JSON.toJSONString(resources));
}
for (OperResouce resource : resources) {
if (antPathMatcher.match(resource.getResourceUrl(), uri)
&& resource.getResourceMethod().equals(method)) {
//需要校验权限的url
HasOperPermissionFormDTO form = new HasOperPermissionFormDTO();
form.setUri(uri);
form.setMethod(method);
form.setOperId(userId);
Result result = operAccessOpenFeignClient.hasOperPermission(form);
if (result == null || !result.success()) {
return false;
}
return true;
}
}
// 如果当前请求url不需要校验权限,那么返回true
return true;
}
/**
* 是否需要认证
* @param requestUri

11
epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java

@ -42,4 +42,15 @@ public class CpProperty {
*/
private List<String> swaggerUrls;
/**
* 运营端需要校验的url资源列表
*/
private List<OperExamineResource> operExamineResourceUrls;
@Data
public static class OperExamineResource {
private String resourceUrl;
private String resourceMethod;
}
}

5
epmet-gateway/src/main/java/com/epmet/filter/EpmetGatewayFilter.java

@ -5,6 +5,7 @@ import com.epmet.auth.ExternalAuthProcessor;
import com.epmet.auth.InternalAuthProcessor;
import com.epmet.commons.tools.constant.AppClientConstant;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.EpmetException;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.utils.IpUtils;
@ -64,6 +65,10 @@ public class EpmetGatewayFilter implements GatewayFilter {
}
return doFilter(exchange, chain);
} catch (EpmetException re) {
// 人为抛出,则携带错误码和错误信息响应给前端
log.error("EpmetGatewayFilter认证出错RenException,错误信息:{}", ExceptionUtils.getErrorStackTrace(re));
return response(exchange, new Result<>().error(re.getCode(), re.getMessage()));
} catch (RenException re) {
// 人为抛出,则携带错误码和错误信息响应给前端
log.error("EpmetGatewayFilter认证出错RenException,错误信息:{}", ExceptionUtils.getErrorStackTrace(re));

5
epmet-gateway/src/main/resources/bootstrap-urls.yml

@ -0,0 +1,5 @@
epmet:
oper-examine-resource-urls:
# 角色编辑
- resourceUrl: /oper/access/operrole
resourceMethod: PUT

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

@ -12,6 +12,7 @@ spring:
name: epmet-gateway-server
#环境 dev|test|prod
profiles:
include: urls
active: @spring.profiles.active@
messages:
encoding: UTF-8
@ -471,6 +472,12 @@ hystrix:
isolation:
thread:
timeoutInMilliseconds: 60000 #缺省为1000
threadpool:
default:
coreSize: 20
maximumSize: 50
maxQueueSize: 500
queueSizeRejectionThreshold: 200
ribbon:
ReadTimeout: 300000
@ -506,6 +513,7 @@ epmet:
- /resi/voice/**
- /point/**
- /heart/**
- /oss/**
# 内部认证url白名单(在白名单中的,就不会再校验登录了)
internalAuthUrlsWhiteList:

7
epmet-module/data-aggregator/data-aggregator-server/pom.xml

@ -32,6 +32,13 @@
<groupId>com.epmet</groupId>
<artifactId>epmet-commons-mybatis</artifactId>
<version>2.0.0</version>
<!--排除主从-->
<exclusions>
<exclusion>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.epmet</groupId>

17
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcPointNucleicMonitoringDao.java

@ -0,0 +1,17 @@
package com.epmet.dataaggre.dao.epmetuser;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dataaggre.entity.epmetuser.IcPointNucleicMonitoringEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 核酸监测点
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-06-20
*/
@Mapper
public interface IcPointNucleicMonitoringDao extends BaseDao<IcPointNucleicMonitoringEntity> {
}

17
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/IcPointVaccinesInoculationDao.java

@ -0,0 +1,17 @@
package com.epmet.dataaggre.dao.epmetuser;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dataaggre.entity.epmetuser.IcPointVaccinesInoculationEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 疫苗接种点
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-06-20
*/
@Mapper
public interface IcPointVaccinesInoculationDao extends BaseDao<IcPointVaccinesInoculationEntity> {
}

1
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/govorg/CustomerGridDao.java

@ -86,4 +86,5 @@ public interface CustomerGridDao extends BaseDao<CustomerGridEntity> {
CustomerGridDTO getGridInfo(@Param("gridId") String gridId);
List<ScreenCustomerGridDTO> getSubGridList(@Param("customerId") String customerId, @Param("agencyId") String agencyId);
List<ScreenCustomerGridDTO> getAllSubGridList(@Param("customerId") String customerId, @Param("agencyId") String agencyId);
}

77
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/entity/epmetuser/IcPointNucleicMonitoringEntity.java

@ -0,0 +1,77 @@
package com.epmet.dataaggre.entity.epmetuser;
import com.baomidou.mybatisplus.annotation.TableName;
import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 核酸监测点
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-06-20
*/
@Data
@EqualsAndHashCode(callSuper=false)
@TableName("ic_point_nucleic_monitoring")
public class IcPointNucleicMonitoringEntity extends BaseEpmetEntity {
private static final long serialVersionUID = 1L;
/**
* 客户ID
*/
private String customerId;
/**
* 所属组织ID
*/
private String orgId;
/**
* 所属组织名称
*/
private String orgName;
/**
* 组织ID上级
*/
private String pid;
/**
* 组织ID所有上级
*/
private String pids;
/**
* 核酸监测点名称
*/
private String name;
/**
* 服务时间
*/
private String serveTime;
/**
* 咨询电话
*/
private String mobile;
/**
* 监测点地址
*/
private String address;
/**
* 经度
*/
private String longitude;
/**
* 纬度
*/
private String latitude;
}

102
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/entity/epmetuser/IcPointVaccinesInoculationEntity.java

@ -0,0 +1,102 @@
package com.epmet.dataaggre.entity.epmetuser;
import com.baomidou.mybatisplus.annotation.TableName;
import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 疫苗接种点
*
* @author generator generator@elink-cn.com
* @since v1.0.0 2022-06-20
*/
@Data
@EqualsAndHashCode(callSuper=false)
@TableName("ic_point_vaccines_inoculation")
public class IcPointVaccinesInoculationEntity extends BaseEpmetEntity {
private static final long serialVersionUID = 1L;
/**
* 客户ID
*/
private String customerId;
/**
* 所属组织ID
*/
private String orgId;
/**
* 所属组织名称
*/
private String orgName;
/**
* 组织ID上级
*/
private String pid;
/**
* 组织ID所有上级
*/
private String pids;
/**
* 疫苗接种点名称
*/
private String name;
/**
* 接种日期
*/
private String inoculationDate;
/**
* 接种上午开始时间
*/
private String moStartTime;
/**
* 接种上午结束时间
*/
private String moEndTime;
/**
* 接种下午开始时间
*/
private String afStartTime;
/**
* 接种下午结束时间
*/
private String afEndTime;
/**
* 暂无疫苗12
*/
private String noAvailableVaccines;
/**
* 咨询电话
*/
private String mobile;
/**
* 接种点地址
*/
private String address;
/**
* 经度
*/
private String longitude;
/**
* 纬度
*/
private String latitude;
}

10
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/EpmetUserService.java

@ -15,6 +15,8 @@ import com.epmet.dataaggre.dto.govorg.result.GridStaffResultDTO;
import com.epmet.dataaggre.dto.govorg.result.MemberProjectInfoResultDTO;
import com.epmet.dataaggre.dto.govproject.result.ProjectAnalysisResultDTO;
import com.epmet.dataaggre.entity.epmetuser.CustomerStaffEntity;
import com.epmet.dataaggre.entity.epmetuser.IcPointNucleicMonitoringEntity;
import com.epmet.dataaggre.entity.epmetuser.IcPointVaccinesInoculationEntity;
import com.epmet.dataaggre.entity.epmetuser.IcResiUserEntity;
import com.epmet.dto.IcResiUserDTO;
import com.epmet.dto.UserBaseInfoDTO;
@ -240,4 +242,12 @@ public interface EpmetUserService {
List<IcResiUserEntity> listVolunteers(String customerId, String agencyId, String staffOrgIds, String search, String resiCategory);
List<NowStatsDataResultDTO> getNowResiUser(NowStatsDataFormDTO formDTO);
Integer countVaccinePoint(String customerId, String agencyId, String staffOrgIds, String search);
Integer countNucleicPoint(String customerId, String agencyId, String staffOrgIds, String search);
List<IcPointVaccinesInoculationEntity> listVaccinePoints(String customerId, String agencyId, String staffOrgIds, String search);
List<IcPointNucleicMonitoringEntity> listNucleicPoints(String customerId, String agencyId,String staffOrgIds, String search);
}

48
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java

@ -94,6 +94,10 @@ public class EpmetUserServiceImpl implements EpmetUserService {
private CustomerFootBarService customerFootBarService;
@Resource
private RegisterRelationDao registerRelationDao;
@Resource
private IcPointVaccinesInoculationDao pointVaccinesInoculationDao;
@Resource
private IcPointNucleicMonitoringDao pointNucleicMonitoringDao;
/**
* @Description 根据UserIds查询
@ -923,4 +927,48 @@ public class EpmetUserServiceImpl implements EpmetUserService {
List<NowStatsDataResultDTO> list = registerRelationDao.selectNowResiUser(formDTO);
return list;
}
@Override
public Integer countVaccinePoint(String customerId, String agencyId, String staffOrgIds, String search) {
LambdaQueryWrapper<IcPointVaccinesInoculationEntity> query = new LambdaQueryWrapper<>();
query.eq(IcPointVaccinesInoculationEntity::getCustomerId, customerId);
//query.and(w -> w.likeRight(IcPointVaccinesInoculationEntity::getPids, staffOrgIds)
// .or()
// .eq(IcPointVaccinesInoculationEntity::getOrgId, agencyId));
query.like(StringUtils.isNotBlank(search), IcPointVaccinesInoculationEntity::getName, search);
return pointVaccinesInoculationDao.selectCount(query);
}
@Override
public Integer countNucleicPoint(String customerId, String agencyId, String staffOrgIds, String search) {
LambdaQueryWrapper<IcPointNucleicMonitoringEntity> query = new LambdaQueryWrapper<>();
query.eq(IcPointNucleicMonitoringEntity::getCustomerId, customerId);
query.and(w -> w.likeRight(IcPointNucleicMonitoringEntity::getPids, staffOrgIds)
.or()
.eq(IcPointNucleicMonitoringEntity::getOrgId, agencyId));
query.like(StringUtils.isNotBlank(search), IcPointNucleicMonitoringEntity::getName, search);
return pointNucleicMonitoringDao.selectCount(query);
}
@Override
public List<IcPointVaccinesInoculationEntity> listVaccinePoints(String customerId, String agencyId, String staffOrgIds, String search) {
LambdaQueryWrapper<IcPointVaccinesInoculationEntity> query = new LambdaQueryWrapper<>();
query.eq(IcPointVaccinesInoculationEntity::getCustomerId, customerId);
//query.and(w -> w.likeRight(IcPointVaccinesInoculationEntity::getPids, staffOrgIds)
// .or()
// .eq(IcPointVaccinesInoculationEntity::getOrgId, agencyId));
query.like(StringUtils.isNotBlank(search), IcPointVaccinesInoculationEntity::getName, search);
return pointVaccinesInoculationDao.selectList(query);
}
@Override
public List<IcPointNucleicMonitoringEntity> listNucleicPoints(String customerId, String agencyId, String staffOrgIds, String search) {
LambdaQueryWrapper<IcPointNucleicMonitoringEntity> query = new LambdaQueryWrapper<>();
query.eq(IcPointNucleicMonitoringEntity::getCustomerId, customerId);
query.and(w -> w.likeRight(IcPointNucleicMonitoringEntity::getPids, staffOrgIds)
.or()
.eq(IcPointNucleicMonitoringEntity::getOrgId, agencyId));
query.like(StringUtils.isNotBlank(search), IcPointNucleicMonitoringEntity::getName, search);
return pointNucleicMonitoringDao.selectList(query);
}
}

2
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/govorg/impl/GovOrgServiceImpl.java

@ -1487,7 +1487,7 @@ public class GovOrgServiceImpl implements GovOrgService {
List<ScreenCustomerGridDTO> gridList = new ArrayList<>();
//组织级别为街道的查询下级所有网格
if (isGetSubAllGrid && (OrgLevelEnum.STREET.getCode().equals(dto.getLevel()))) {
gridList = customerGridDao.getSubGridList(customerId, agencyId);
gridList = customerGridDao.getAllSubGridList(customerId, agencyId);
List<ScreenAgencyOrGridListDTO.AgencyGrid> allGridList = new ArrayList<>();
gridList.forEach(gr -> {
ScreenAgencyOrGridListDTO.AgencyGrid org = new ScreenAgencyOrGridListDTO.AgencyGrid();

22
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/impl/CoverageServiceImpl.java

@ -30,6 +30,8 @@ import com.epmet.dataaggre.dto.govorg.form.DataListLeftSubTotalFormDTO;
import com.epmet.dataaggre.dto.govorg.form.SearchDetailFormDTO;
import com.epmet.dataaggre.dto.govorg.result.*;
import com.epmet.dataaggre.dto.resigroup.result.OrgInfoCommonDTO;
import com.epmet.dataaggre.entity.epmetuser.IcPointNucleicMonitoringEntity;
import com.epmet.dataaggre.entity.epmetuser.IcPointVaccinesInoculationEntity;
import com.epmet.dataaggre.entity.epmetuser.IcResiUserEntity;
import com.epmet.dataaggre.entity.govorg.*;
import com.epmet.dataaggre.entity.govproject.IcEventEntity;
@ -628,6 +630,12 @@ public class CoverageServiceImpl implements CoverageService {
// 志愿者
String[] parts = categoryKey.split("_");
return epmetUserService.countVolunteers(customerId, agencyId, staffOrgIds, search, parts[1]);
} else if (CoveragePlaceTypeEnum.VACCINE_POINT.getCode().equals(placeType)) {
// 疫苗接种点
return epmetUserService.countVaccinePoint(customerId, agencyId, staffOrgIds, search);
} else if (CoveragePlaceTypeEnum.NUCLEIC_POINT.getCode().equals(placeType)) {
// 核酸检测点
return epmetUserService.countNucleicPoint(customerId, agencyId, staffOrgIds, search);
}
return 0;
@ -805,6 +813,20 @@ public class CoverageServiceImpl implements CoverageService {
coordinates[1], coordinates[0]);
}).collect(Collectors.toList());
} else if (CoveragePlaceTypeEnum.VACCINE_POINT.getCode().equals(placeType)) {
// 疫苗接种点
List<IcPointVaccinesInoculationEntity> vps = epmetUserService.listVaccinePoints(customerId, agencyId, staffOrgIds, search);
return vps.stream()
.map(vp -> new CoverageAnalisisDataListResultDTO(vp.getId(), categoryKey, isPage ? categoryDict.getCategoryName() : null,
placeType, vp.getName(), vp.getLatitude(), vp.getLongitude()))
.collect(Collectors.toList());
} else if (CoveragePlaceTypeEnum.NUCLEIC_POINT.getCode().equals(placeType)) {
// 核酸检测点
List<IcPointNucleicMonitoringEntity> nps = epmetUserService.listNucleicPoints(customerId, agencyId, staffOrgIds, search);
return nps.stream()
.map(np -> new CoverageAnalisisDataListResultDTO(np.getId(), categoryKey, isPage ? categoryDict.getCategoryName() : null,
placeType, np.getName(), np.getLatitude(), np.getLongitude()))
.collect(Collectors.toList());
}
return new ArrayList<>();
}

7
epmet-module/data-aggregator/data-aggregator-server/src/main/resources/bootstrap.yml

@ -191,6 +191,13 @@ hystrix:
isolation:
thread:
timeoutInMilliseconds: 60000 #缺省为1000
threadpool:
default:
coreSize: 20
maximumSize: 50
maxQueueSize: 500
queueSizeRejectionThreshold: 200
ribbon:
ReadTimeout: 300000

4
epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/UserBaseInfoDao.xml

@ -7,13 +7,13 @@
<select id="selectUserInfosByUserIds" resultType="com.epmet.dataaggre.dto.epmetuser.result.UserInfosResultDTO">
SELECT
user_id,
CONCAT(STREET,'-',SURNAME,
CONCAT(SURNAME,
CASE WHEN GENDER = '1' THEN '先生'
WHEN GENDER = '2' THEN '女士'
ELSE '先生/女士' END
) AS userShowName,
HEAD_IMG_URL AS headPhoto,
CONCAT(STREET,'-',REAL_NAME) AS realName
CONCAT(REAL_NAME) AS realName
FROM user_base_info
WHERE DEL_FLAG = 0
AND

16
epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govorg/CustomerGridDao.xml

@ -197,4 +197,20 @@
ORDER BY pid, grid_name
</select>
<select id="getAllSubGridList" resultType="com.epmet.dataaggre.dto.evaluationindex.ScreenCustomerGridDTO">
SELECT
customer_id AS customerId,
id AS gridId,
grid_name AS gridName,
pid AS parentAgencyId,
pids AS allParentIds
FROM
customer_grid
WHERE
del_flag = '0'
AND customer_id = #{customerId}
AND pids LIKE concat('%',#{agencyId},'%')
ORDER BY pid, grid_name
</select>
</mapper>

6
epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/govproject/ProjectDao.xml

@ -470,6 +470,9 @@
<if test="'grid' == orgType">
AND GRID_ID = #{orgId}
</if>
<if test="'agency' == orgType">
AND ORG_ID_PATH LIKE concat('%', #{orgId}, '%')
</if>
<if test="null != startDate and '' != startDate">
AND DATE_FORMAT(CREATED_TIME,"%Y%m%d%H%i%s") <![CDATA[ >= ]]> #{startDate}
</if>
@ -492,6 +495,9 @@
<if test="'grid' == orgType">
AND GRID_ID = #{orgId}
</if>
<if test="'agency' == orgType">
AND ORG_ID_PATH LIKE concat('%', #{orgId}, '%')
</if>
<if test="null != startDate and '' != startDate">
AND DATE_FORMAT(CREATED_TIME,"%Y%m%d%H%i%s") <![CDATA[ >= ]]> #{startDate}
</if>

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

Loading…
Cancel
Save