Browse Source

Merge remote-tracking branch 'origin/dev_bugfix_ljj' into dev_bugfix_ljj

dev_shibei_match
yinzuomei 4 years ago
parent
commit
24c02ab557
  1. 6
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aop/NoRepeatSubmit.java
  2. 88
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aop/NoRepeatSubmitAop.java
  3. 37
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/distributedlock/DistributedLock.java
  4. 1
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java
  5. 31
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
  6. 60
      epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java
  7. 2
      epmet-gateway/src/main/resources/bootstrap.yml
  8. 43
      epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/GridMemberPatrolListFormDTO.java
  9. 31
      epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/GridMemberPatrolListResultDTO.java
  10. 19
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/EpmetUserController.java
  11. 8
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/datastats/DataStatsDao.java
  12. 7
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/StaffPatrolRecordDao.java
  13. 8
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/DataStatsService.java
  14. 49
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java
  15. 12
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/EpmetUserService.java
  16. 49
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java
  17. 30
      epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/datastats/DatsStatsDao.xml
  18. 20
      epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/StaffPatrolRecordDao.xml
  19. 7
      epmet-module/data-report/data-report-client/src/main/java/com/epmet/dto/result/screen/CategoryAnalysisResultDTO.java
  20. 7
      epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/CategoryTopAppealResultDTO.java
  21. 94
      epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListGeneralResultDTO.java
  22. 13
      epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/user/StaffPatrolDetailController.java
  23. 2
      epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.java
  24. 16
      epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/ScreenProjectServiceImpl.java
  25. 9
      epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/StaffPatrolDetailService.java
  26. 30
      epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/impl/StaffPatrolDetailServiceImpl.java
  27. 2
      epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenCustomerAgencyDao.xml
  28. 46
      epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenProjectCategoryOrgDailyDao.xml
  29. 2
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/aspect/RequestLogAspect.java
  30. 34
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java
  31. 26
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectOrgDailyServiceImpl.java
  32. 91
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml
  33. 2
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml
  34. 2
      epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectOrgDailyDao.xml
  35. 6
      epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/constant/ThirdPlatformActions.java
  36. 19
      epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/ThirdPlatformActionsResultDTO.java
  37. 18
      epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/privateepmet/GetAccessTokenResultDTO.java
  38. 22
      epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/ThirdOpenFeignClient.java
  39. 12
      epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/fallback/ThirdOpenFeignClientFallback.java
  40. 5
      epmet-module/epmet-third/epmet-third-server/pom.xml
  41. 246
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/ApiService.java
  42. 18
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/DemoApiService.java
  43. 49
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/LuzhouGridPlatformApiService.java
  44. 169
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/PingyinPrivateEpmetApiService.java
  45. 50
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/PrivateEpmetController.java
  46. 30
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/TestConttroller.java
  47. 10
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ThirdplatformActionDao.java
  48. 10
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ThirdplatformCustomerRegisterDao.java
  49. 19
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/redis/ThirdPlatformCache.java
  50. 3
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ComponentVerifyTicketService.java
  51. 19
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/PrivateEpmetService.java
  52. 10
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ThirdPlatformService.java
  53. 203
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ComponentVerifyTicketServiceImpl.java
  54. 71
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/PrivateEpmetServiceImpl.java
  55. 6
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ThirdPlatformServiceImpl.java
  56. 17
      epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformActionDao.xml
  57. 14
      epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformCustomerRegisterDao.xml
  58. 10
      epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/AccessConfigController.java
  59. 51
      epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/TestController.java
  60. 9
      epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java
  61. 2
      epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/PartyMemberConfirmServiceImpl.java
  62. 15
      epmet-openapi/epmet-openapi-sdk/pom.xml
  63. 133
      epmet-openapi/epmet-openapi-sdk/src/main/java/com/epmet/openapi/sdk/encrypt/Md5Util.java
  64. 109
      epmet-openapi/epmet-openapi-sdk/src/main/java/com/epmet/openapi/sdk/sign/OpenApiSignUtils.java
  65. 1
      epmet-openapi/pom.xml
  66. 30
      epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PatrolYuShanResultDTO.java
  67. 9
      epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java
  68. 5
      epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java
  69. 14
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsStaffPatrolRecordDailyController.java
  70. 6
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/UserController.java
  71. 9
      epmet-user/epmet-user-server/src/main/java/com/epmet/dao/StatsStaffPatrolRecordDailyDao.java
  72. 11
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsStaffPatrolRecordDailyService.java
  73. 12
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsStaffPatrolRecordDailyServiceImpl.java
  74. 2
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/UserServiceImpl.java
  75. 13
      epmet-user/epmet-user-server/src/main/resources/mapper/StatsStaffPatrolRecordDailyDao.xml

6
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aop/NoRepeatSubmit.java

@ -13,5 +13,9 @@ import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {
/**
* 持锁时长 单位毫秒 默认10秒
*/
long leaseTime() default 10*1000;
}
}

88
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aop/NoRepeatSubmitAop.java

@ -1,15 +1,16 @@
package com.epmet.commons.tools.aop;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.RenException;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.epmet.commons.tools.redis.RedisKeys;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@ -18,6 +19,7 @@ import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;
/**
* desc:利用用户token及请求url 防止用户重复提交需要在没有唯一索引的保存或修改操作 方法入口上加上@NoRepeatSubMit注解
* @author zhaoqifeng
* @dscription
* @date 2020/11/24 9:59
@ -26,51 +28,49 @@ import java.util.concurrent.TimeUnit;
@Configuration
@Slf4j
public class NoRepeatSubmitAop {
private static final String AUTHORIZATION_TOKEN_HEADER_KEY = "Authorization";
@Autowired
private DistributedLock distributedLock;
/**
* 重复提交判断时间为2s
*/
private static final Cache<String, Integer> CACHES = CacheBuilder.newBuilder()
// 最大缓存 100 个
.maximumSize(100)
// 设置写缓存后 5 秒钟过期
.expireAfterWrite(5, TimeUnit.SECONDS)
.build();
@Around("@annotation(noRepeatSubmit)")
public Object around(ProceedingJoinPoint pjp,NoRepeatSubmit noRepeatSubmit) {
@Pointcut("@annotation(com.epmet.commons.tools.aop.NoRepeatSubmit)")
public void doAspect() {
try {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
assert attributes != null;
HttpServletRequest request = attributes.getRequest();
String internalToken = request.getHeader(AUTHORIZATION_TOKEN_HEADER_KEY);
String key = getKey(request.getRequestURI(), internalToken);
// 如果缓存中有这个url视为重复提交
Object result = null;
try {
long leaseTime = noRepeatSubmit.leaseTime();
//如果获取不到锁等待0秒直接返回 持锁时间为leaseTime
RLock lock = distributedLock.getLock(RedisKeys.getNoRepeatSubmitKey(key), leaseTime, NumConstant.ZERO_L, TimeUnit.MILLISECONDS);
try {
//因为getLock如果获取失败抛异常 所以不做锁状态的判断
result = pjp.proceed();
} finally {
distributedLock.unLock(lock);
}
} catch (Exception e) {
log.warn("noRepeatSubmit exception",e);
//"未获取到锁,重复提交了
throw new RenException(EpmetErrorCode.REPEAT_SUBMIT.getCode());
}
return result;
} catch (RenException e) {
throw e;
} catch (Throwable e) {
log.error("验证重复提交时出现未知异常!");
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode());
}
}
@Before("doAspect()")
public void around(JoinPoint pjp) {
try {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
assert attributes != null;
HttpServletRequest request = attributes.getRequest();
String key = getKey(request.getRequestURI(), pjp.getArgs());
// 如果缓存中有这个url视为重复提交
if (CACHES.getIfPresent(key) == null) {
CACHES.put(key, NumConstant.ZERO);
} else {
log.error("重复提交");
throw new RenException(EpmetErrorCode.REPEATED_SUBMIT_ERROR.getCode());
}
} catch (RenException e) {
throw e;
} catch (Throwable e) {
log.error("验证重复提交时出现未知异常!");
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode());
}
private String getKey(String keyExpress,String token) {
return keyExpress+token;
}
private String getKey(String keyExpress, Object[] args) {
for (int i = 0; i < args.length; i++) {
keyExpress = keyExpress.replace("arg[" + i + "]", args[i].toString());
}
return keyExpress;
}
}

37
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/distributedlock/DistributedLock.java

@ -1,6 +1,7 @@
package com.epmet.commons.tools.distributedlock;
import com.epmet.commons.tools.exception.RenException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
@ -13,6 +14,7 @@ import java.util.concurrent.TimeUnit;
* @Author zxc
* @DateTime 2020/10/28 9:05 上午
*/
@Slf4j
@Component
public class DistributedLock {
@ -45,18 +47,31 @@ public class DistributedLock {
* @return
*/
public RLock getLock(String name, Long leaseTime, Long waitTime, TimeUnit timeUnit) {
RLock lock = null;
if (StringUtils.isNotBlank(name) && leaseTime > 0 && waitTime > 0) {
lock = redissonClient.getLock(name);
Boolean lockStatus;
try {
lockStatus = lock.tryLock(waitTime, leaseTime, timeUnit);
if (!lockStatus) {
throw new RenException("获取锁🔒失败了......");
}
} catch (InterruptedException e) {
e.printStackTrace();
RLock lock = redissonClient.getLock(name);
Boolean lockStatus;
try {
lockStatus = lock.tryLock(waitTime, leaseTime, timeUnit);
if (!lockStatus) {
throw new RenException("获取锁🔒失败了......");
}
} catch (InterruptedException e) {
log.error("getLock interruptedException"+name,e);
}
return lock;
}
/**
* 取锁
*
* @param name 锁key
* @return
*/
public RLock tryLock(String name) {
RLock lock = redissonClient.getLock(name);
Boolean lockStatus = lock.tryLock();
if (!lockStatus) {
throw new RenException("获取锁🔒失败了......");
}
return lock;
}

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

@ -64,6 +64,7 @@ public enum EpmetErrorCode {
ACTUAL_TIME(8124,"请录入实际开始时间,实际结束时间"),
ACTUAL_NOT_FINISHED(8125,"请先结束活动"),
ACT_SIGN_UP_END_TIME_EARLIER_NOW_EERROR(8121,"活动报名截止时间应晚于当前时间"),
REPEAT_SUBMIT(8126,"重复请求,请稍后重试"),
CANNOT_AUDIT_WARM(8201, "请完善居民信息"),
NOT_DEL_AGENCY(8202, "该机关存在下级机关,不允许删除"),

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

@ -440,6 +440,28 @@ public class RedisKeys {
return rootPrefix.concat("thirdplatform:accesstoken:").concat(platformId);
}
/**
* @Description 第三方平台信息key
* @param platformId
* @return java.lang.String
* @author wxz
* @date 2021.08.31 14:44:35
*/
public static String getThirdPlatformInfoKey(String platformId) {
return rootPrefix.concat("thirdplatform:info:").concat(platformId);
}
/**
* @Description 第三方平台操作urlkey
* @param platformId
* @return java.lang.String
* @author wxz
* @date 2021.08.31 15:15:15
*/
public static String getThirdPlatformActionUrlKey(String platformId) {
return rootPrefix.concat("thirdplatform:actions:").concat(platformId);
}
/**
* @return 设置组员已读未读标识
* @param source :act notice
@ -481,4 +503,13 @@ public class RedisKeys {
public static String getProjectChangedMsgDistinceKey(String customerId) {
return rootPrefix.concat("project_changed:consume:").concat(customerId);
}
/**
* desc:获取防重复提交redis key
* @param key
* @return
*/
public static String getNoRepeatSubmitKey(String key) {
return rootPrefix.concat("no_repeat_submit:").concat(key);
}
}

60
epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java

@ -68,18 +68,25 @@ public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CpA
return chain.filter(exchange);
}
//1.添加流水号
ServerHttpRequest request = exchange.getRequest();
List<String> tranSerials = request.getHeaders().get(AppClientConstant.TRANSACTION_SERIAL_KEY);
if (CollectionUtils.isEmpty(tranSerials) || StringUtils.isBlank(tranSerials.get(0))) {
request.mutate().header(AppClientConstant.TRANSACTION_SERIAL_KEY, new String[]{getTransactionSerial()});
//0.添加流水号
String tranSerial = getTranserialFromRequestHeader(request);
if (StringUtils.isBlank(tranSerial)) {
tranSerial = generateTransactionSerial();
// 设置当前线程名
request.mutate().header(AppClientConstant.TRANSACTION_SERIAL_KEY, new String[]{tranSerial});
}
Thread.currentThread().setName(tranSerial);
//1.打印请求信息
logRequest(request);
//2.获取请求路径,参数
String requestUri = request.getPath().pathWithinApplication().value();
MultiValueMap<String, String> queryParams = request.getQueryParams();
String queryParamsStr = convertQueryParams2String(queryParams);
logger.info("CpAuthGatewayFilterFactory当前requestUri=[" + requestUri.concat(queryParamsStr) + "],CpAuthGatewayFilterFactory拦截成功,客户端Id:{}", IpUtils.getClientIp(request));
logger.info("当前requestUri=[" + requestUri.concat(queryParamsStr) + "],客户端Id:{}", IpUtils.getClientIp(request));
//3.认证
String authType = getAuthType(request);
@ -109,6 +116,36 @@ public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CpA
};
}
/**
* @Description 打印请求头
* @param request 请求
* @return void
* @author wxz
* @date 2021.08.18 11:18:00
*/
private void logRequest(ServerHttpRequest request) {
HttpHeaders headers = request.getHeaders();
StringBuilder sb = new StringBuilder("请求头:");
for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
String headerKey = entry.getKey();
List<String> headerValue = entry.getValue();
sb.append(headerKey).append(":").append(headerValue).append(",");
}
logger.info(sb.toString());
}
/**
* @Description 从request请求头中获取传递过来的流水号
* @param request
* @return java.lang.String
* @author wxz
* @date 2021.08.18 15:55:30
*/
private String getTranserialFromRequestHeader(ServerHttpRequest request) {
List<String> tranSerials = request.getHeaders().get(AppClientConstant.TRANSACTION_SERIAL_KEY);
return CollectionUtils.isEmpty(tranSerials) ? null : tranSerials.get(0);
}
/**
* @return
* @Description 将url参数转化为String
@ -181,23 +218,12 @@ public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CpA
return AuthTypeConstant.AUTH_TYPE_INTERNAL;
}
/**
* 获取请求头
*
* @param request
* @return
*/
private String getHeader(ServerHttpRequest request, String headerName) {
HttpHeaders headers = request.getHeaders();
return headers.getFirst(headerName);
}
/**
* 获取事务流水号
*
* @return
*/
public static String getTransactionSerial() {
public static String generateTransactionSerial() {
String[] letterPool = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"
, "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};

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

@ -481,6 +481,7 @@ epmet:
- /message/template/**
- /data/aggregator/project/projectdistribution
- /data/aggregator/epmetuser/open-staffdetail
- /data/aggregator/epmetuser/gridmemberpatrollist
- /data/aggregator/pub/**
#stats external包下 公共的类只外部暴露方法 纯外部使用的 暴漏整个
- /data/stats/statsuser/gm-uploadevent
@ -494,6 +495,7 @@ epmet:
- /data/stats/project/**
- /data/stats/basereport/**
- /data/stats/governance/**
- /third/private-epmet/push-component-access-token
# 对外开放接口认证白名单

43
epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/GridMemberPatrolListFormDTO.java

@ -0,0 +1,43 @@
package com.epmet.dataaggre.dto.epmetuser.form;
import com.epmet.commons.tools.validator.group.CustomerClientShowGroup;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* @Description 对外接口--网格员排名-巡查记录-接口入参
* @Auth sun
*/
@Data
public class GridMemberPatrolListFormDTO implements Serializable {
private static final long serialVersionUID = -3381286960911634231L;
/**
* 组织id
*/
@NotBlank(message = "组织Id不能为空", groups = GridMemberPatrolListFormDTO.Member.class)
private String agencyId;
/**
* 维度Id(:202108;:2021)
*/
@NotBlank(message = "维度Id不能为空", groups = GridMemberPatrolListFormDTO.Member.class)
private String dimId;
/**
* 维度类型(:month:year)
*/
@NotBlank(message = "维度类型不能为空", groups = GridMemberPatrolListFormDTO.Member.class)
private String dimType;
/**
* 排序字段(上报事件:project巡查时长:patrolTime处理件数:dealEvent)
*/
private String sort = "project";
//按条件查询数据的最大日维度Id
private String dateId;
public interface Member extends CustomerClientShowGroup {}
}

31
epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/GridMemberPatrolListResultDTO.java

@ -0,0 +1,31 @@
package com.epmet.dataaggre.dto.epmetuser.result;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.io.Serializable;
/**
* @Description 对外接口--网格员排名-巡查记录-接口返参
* @Auth sun
*/
@Data
public class GridMemberPatrolListResultDTO implements Serializable {
private static final long serialVersionUID = 7129564173128153335L;
//工作人员用户id
private String staffId = "";
//真名
private String staffName = "";
//上报事件(项目)数
private Integer reportProjectCount = 0;
//巡查总时长【单位:分钟】
private Integer patrolTotalTime = 0;
//处理件数(议题转项目数+议题关闭数+项目响应数+项目吹哨数+项目结案数)
private Integer eventCount = 0;
@JsonIgnore
private String dateId;
@JsonIgnore
private Integer timeNum;
}

19
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/EpmetUserController.java

@ -8,10 +8,7 @@ import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.ExcelUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.dataaggre.dto.epmetuser.form.OpenStaffDetailFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.PatrolDateListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.PatrolRecordListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.StaffListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.*;
import com.epmet.dataaggre.dto.epmetuser.result.*;
import com.epmet.dataaggre.dto.govorg.result.GridMemberDataAnalysisResultDTO;
import com.epmet.dataaggre.excel.StaffPatrollExcel;
@ -218,4 +215,18 @@ public class EpmetUserController {
ExcelUtils.exportExcelToTarget(response, null, resultDTOS, StaffPatrollExcel.class);
}
/**
* @Param formDTO
* @Description 对外接口--网格员排名-巡查记录
* @author sun
*/
@PostMapping("gridmemberpatrollist")
public Result<List<GridMemberPatrolListResultDTO>> gridMemberPatrolList(@RequestBody GridMemberPatrolListFormDTO formDTO) {
ValidatorUtils.validateEntity(formDTO, GridMemberPatrolListFormDTO.Member.class);
if(!"month".equals(formDTO.getDimType())&&!"year".equals(formDTO.getDimType())){
throw new RenException("参数错误,维度类型参数值错误");
}
return new Result<List<GridMemberPatrolListResultDTO>>().ok(epmetUserService.gridMemberPatrolList(formDTO));
}
}

8
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/datastats/DataStatsDao.java

@ -21,6 +21,8 @@ import com.epmet.dataaggre.dto.datastats.FactGroupActDailyDTO;
import com.epmet.dataaggre.dto.datastats.form.SubAgencyFormDTO;
import com.epmet.dataaggre.dto.datastats.form.SubGridFormDTO;
import com.epmet.dataaggre.dto.datastats.result.*;
import com.epmet.dataaggre.dto.epmetuser.form.GridMemberPatrolListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.result.GridMemberPatrolListResultDTO;
import com.epmet.dataaggre.dto.resigroup.ActCategoryDictDTO;
import com.epmet.dataaggre.dto.resigroup.result.GroupActRankDetailDTO;
import com.epmet.dataaggre.entity.datastats.DimAgencyEntity;
@ -300,4 +302,10 @@ public interface DataStatsDao {
* @return
*/
TotalAndIncrResultDTO getAgencySumGroup(@Param("agencyList") List<String> agencyList, @Param("dateId") String dateId);
/**
* @Description 查询当前组织及下级所有网格员维度对应最大dated数据
* @author sun
*/
List<GridMemberPatrolListResultDTO> selectGirdMemberPatrol(GridMemberPatrolListFormDTO formDTO);
}

7
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/StaffPatrolRecordDao.java

@ -19,6 +19,7 @@ package com.epmet.dataaggre.dao.epmetuser;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dataaggre.dto.epmetuser.form.GridMemberPatrolListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.StaffListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.result.StaffListResultDTO;
import com.epmet.dataaggre.entity.epmetuser.StaffPatrolRecordEntity;
@ -53,4 +54,10 @@ public interface StaffPatrolRecordDao extends BaseDao<StaffPatrolRecordEntity> {
* @author sun
*/
StaffListResultDTO selectPersonalPatrolList(@Param("staffId") String staffId);
/**
* @Description 按维度汇总当前组织及下级网格员巡查数据
* @author sun
*/
List<StaffListResultDTO> gridMemberPatrol(GridMemberPatrolListFormDTO formDTO);
}

8
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/DataStatsService.java

@ -3,6 +3,8 @@ package com.epmet.dataaggre.service.datastats;
import com.epmet.dataaggre.dto.datastats.FactGroupActDailyDTO;
import com.epmet.dataaggre.dto.datastats.form.*;
import com.epmet.dataaggre.dto.datastats.result.*;
import com.epmet.dataaggre.dto.epmetuser.form.GridMemberPatrolListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.result.GridMemberPatrolListResultDTO;
import com.epmet.dataaggre.dto.govorg.result.GridMemberDataAnalysisResultDTO;
import com.epmet.dataaggre.dto.resigroup.ActCategoryDictDTO;
import com.epmet.dataaggre.dto.resigroup.result.GroupActRankDetailDTO;
@ -221,4 +223,10 @@ public interface DataStatsService {
* @date 2021/8/12 2:23 下午
*/
UserAndGroupTotalResultDTO getUserAndGroupTotal(BaseDataFormDTO formDTO);
/**
* @Description 查询当前组织及下级所有网格员维度对应最大dated数据
* @author sun
*/
List<GridMemberPatrolListResultDTO> getGirdMemberPatrol(GridMemberPatrolListFormDTO formDTO);
}

49
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java

@ -1,5 +1,6 @@
package com.epmet.dataaggre.service.datastats.impl;
import com.alibaba.fastjson.JSON;
import com.epmet.commons.dynamic.datasource.annotation.DataSource;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.constant.StrConstant;
@ -12,7 +13,9 @@ import com.epmet.dataaggre.dao.datastats.FactGridMemberStatisticsDailyDao;
import com.epmet.dataaggre.dto.datastats.FactGroupActDailyDTO;
import com.epmet.dataaggre.dto.datastats.form.*;
import com.epmet.dataaggre.dto.datastats.result.*;
import com.epmet.dataaggre.dto.epmetuser.result.PatrolDailySumResult;
import com.epmet.dataaggre.dto.epmetuser.form.GridMemberPatrolListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.result.GridMemberPatrolListResultDTO;
import com.epmet.dataaggre.dto.epmetuser.result.PatrolDailySumResult;
import com.epmet.dataaggre.dto.evaluationindex.ScreenCustomerAgencyDTO;
import com.epmet.dataaggre.dto.evaluationindex.ScreenCustomerGridDTO;
import com.epmet.dataaggre.dto.evaluationindex.ScreenGovernRankDataDailyDTO;
@ -1486,27 +1489,22 @@ public class DataStatsServiceImpl implements DataStatsService {
formDTO.setDateId(format.format(yesterday));
}
String startDate = null;
String actulStartDate = null;
String endDate = null;
String endDate = formDTO.getDateId();
Date dateIdDate = DateUtils.parse(formDTO.getDateId(), DateUtils.DATE_PATTERN_YYYYMMDD);
boolean isYesterday = DateUtils.getBeforeNDay(1,DateUtils.DATE_PATTERN_YYYYMMDD).equals(formDTO.getDateId());
switch (formDTO.getType()){
case "yesterday":
startDate = DateUtils.getBeforeNDay(formDTO.getDateId(),1);
startDate = formDTO.getDateId();
endDate = formDTO.getDateId();
actulStartDate = formDTO.getDateId();
break;
case "thisWeek":
actulStartDate = DateUtils.getWeekStart(formDTO.getDateId());
startDate = DateUtils.getBeforeNDay(actulStartDate,1);
DateUtils.format(DateUtils.addDateDays(yesterday, -1),DateUtils.DATE_PATTERN_YYYYMMDD);
startDate = DateUtils.getWeekStart(formDTO.getDateId());
if (!isYesterday){
endDate = DateUtils.getWeekEnd(formDTO.getDateId());
}
break;
case "thisMonth":
actulStartDate = DateUtils.format(DateUtils.getMonthStart(dateIdDate),DateUtils.DATE_PATTERN_YYYYMMDD);
startDate = DateUtils.getBeforeNDay(actulStartDate,1);
startDate = DateUtils.format(DateUtils.getMonthStart(dateIdDate),DateUtils.DATE_PATTERN_YYYYMMDD);
if (!isYesterday) {
endDate = DateUtils.format(DateUtils.getMonthEnd(dateIdDate), DateUtils.DATE_PATTERN_YYYYMMDD);
}
@ -1515,7 +1513,9 @@ public class DataStatsServiceImpl implements DataStatsService {
log.warn("===========");
}
formDTO.setStartDateId(startDate);
String breforeStartDate = DateUtils.getBeforeNDay(formDTO.getStartDateId(),1);
formDTO.setEndDateId(endDate);
log.info("getSubWorkFact do select param:{}", JSON.toJSONString(formDTO));
List<WorkFactResultDTO> result = new ArrayList<>();
//如果是社区 则下级是网格 查询网格的数据
if (OrgLevelEnum.COMMUNITY.getCode().equals(formDTO.getAgencyLevel())){
@ -1526,22 +1526,22 @@ public class DataStatsServiceImpl implements DataStatsService {
}
List<String> gridIdList = subAgencyList.stream().map(ScreenCustomerGridDTO::getGridId).collect(Collectors.toList());
//查询组织的话题转议题数据
List<SubGridFormDTO.Topic> toIssueStart = dataStatsDao.getSubGridTopicShiftIssue(gridIdList, formDTO.getStartDateId());
List<SubGridFormDTO.Topic> toIssueStart = dataStatsDao.getSubGridTopicShiftIssue(gridIdList, breforeStartDate);
List<SubGridFormDTO.Topic> toIssueEnd = dataStatsDao.getSubGridTopicShiftIssue(gridIdList, formDTO.getEndDateId());
Map<String, Integer> toIssueStartMap = toIssueStart.stream().collect(Collectors.toMap(SubGridFormDTO.Topic::getGridId, SubGridFormDTO.Topic::getShiftedIssueTotal, (o1, o2) -> o1));
Map<String, Integer> toIssueEndMap = toIssueEnd.stream().collect(Collectors.toMap(SubGridFormDTO.Topic::getGridId, SubGridFormDTO.Topic::getShiftedIssueTotal, (o1, o2) -> o1));
//查询组织的议题转项目数据
List<SubGridIssueResultDTO> toProjectStart = dataStatsDao.getSubGridIssue(gridIdList, formDTO.getStartDateId());
List<SubGridIssueResultDTO> toProjectStart = dataStatsDao.getSubGridIssue(gridIdList, breforeStartDate);
List<SubGridIssueResultDTO> toProjectEnd = dataStatsDao.getSubGridIssue(gridIdList, formDTO.getEndDateId());
Map<String, Integer> toProjectStartMap = toProjectStart.stream().collect(Collectors.toMap(SubGridIssueResultDTO::getGridId, SubGridIssueResultDTO::getShiftProjectTotal, (o1, o2) -> o1));
Map<String, Integer> toProjectEndMap = toProjectEnd.stream().collect(Collectors.toMap(SubGridIssueResultDTO::getGridId, SubGridIssueResultDTO::getShiftProjectTotal, (o1, o2) -> o1));
//查询组织已关闭的项目数据
List<SubGridProjectResultDTO> closeProjectStart = dataStatsDao.getSubGridProject(gridIdList, formDTO.getStartDateId());
List<SubGridProjectResultDTO> closeProjectStart = dataStatsDao.getSubGridProject(gridIdList, breforeStartDate);
List<SubGridProjectResultDTO> closeProjectEnd = dataStatsDao.getSubGridProject(gridIdList, formDTO.getEndDateId());
Map<String, Integer> closeProjectStartMap = closeProjectStart.stream().collect(Collectors.toMap(SubGridProjectResultDTO::getGridId, SubGridProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1));
Map<String, Integer> closeProjectEndMap = closeProjectEnd.stream().collect(Collectors.toMap(SubGridProjectResultDTO::getGridId, SubGridProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1));
//巡查次数和时间
List<PatrolDailySumResult> patrolList = statsStaffPatrolRecordDailyService.getPatrolSumList(gridIdList,actulStartDate,formDTO.getEndDateId());
List<PatrolDailySumResult> patrolList = statsStaffPatrolRecordDailyService.getPatrolSumList(gridIdList,formDTO.getStartDateId(),formDTO.getEndDateId());
Map<String, PatrolDailySumResult> patrolListMap = patrolList.stream().collect(Collectors.toMap(PatrolDailySumResult::getFullAgencyId, o -> o, (o1, o2) -> o1));
subAgencyList.forEach(agency->{
@ -1566,23 +1566,23 @@ public class DataStatsServiceImpl implements DataStatsService {
List<String> agencyList = subAgencyList.stream().map(ScreenCustomerAgencyDTO::getAgencyId).collect(Collectors.toList());
//查询组织的话题转议题数据
List<SubAgencyFormDTO.Topic> toIssueStart = dataStatsDao.getSubAgencyTopicShiftIssue(agencyList, formDTO.getStartDateId());
List<SubAgencyFormDTO.Topic> toIssueStart = dataStatsDao.getSubAgencyTopicShiftIssue(agencyList, breforeStartDate);
List<SubAgencyFormDTO.Topic> toIssueEnd = dataStatsDao.getSubAgencyTopicShiftIssue(agencyList, formDTO.getEndDateId());
Map<String, Integer> toIssueStartMap = toIssueStart.stream().collect(Collectors.toMap(SubAgencyFormDTO.Topic::getAgencyId, SubAgencyFormDTO.Topic::getShiftedIssueTotal, (o1, o2) -> o1));
Map<String, Integer> toIssueEndMap = toIssueEnd.stream().collect(Collectors.toMap(SubAgencyFormDTO.Topic::getAgencyId, SubAgencyFormDTO.Topic::getShiftedIssueTotal, (o1, o2) -> o1));
//查询组织的议题转项目数据
List<SubAgencyIssueResultDTO> toProjectStart = dataStatsDao.getSubAgencyIssue(agencyList, formDTO.getStartDateId());
List<SubAgencyIssueResultDTO> toProjectStart = dataStatsDao.getSubAgencyIssue(agencyList, breforeStartDate);
List<SubAgencyIssueResultDTO> toProjectEnd = dataStatsDao.getSubAgencyIssue(agencyList, formDTO.getEndDateId());
Map<String, Integer> toProjectStartMap = toProjectStart.stream().collect(Collectors.toMap(SubAgencyIssueResultDTO::getAgencyId, SubAgencyIssueResultDTO::getShiftProjectTotal, (o1, o2) -> o1));
Map<String, Integer> toProjectEndMap = toProjectEnd.stream().collect(Collectors.toMap(SubAgencyIssueResultDTO::getAgencyId, SubAgencyIssueResultDTO::getShiftProjectTotal, (o1, o2) -> o1));
//查询组织已关闭的项目数据
List<SubAgencyProjectResultDTO> closeProjectStart = dataStatsDao.getSubAgencyProject(agencyList, formDTO.getStartDateId());
List<SubAgencyProjectResultDTO> closeProjectStart = dataStatsDao.getSubAgencyProject(agencyList, breforeStartDate);
List<SubAgencyProjectResultDTO> closeProjectEnd = dataStatsDao.getSubAgencyProject(agencyList, formDTO.getEndDateId());
Map<String, Integer> closeProjectStartMap = closeProjectStart.stream().collect(Collectors.toMap(SubAgencyProjectResultDTO::getAgencyId, SubAgencyProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1));
Map<String, Integer> closeProjectEndMap = closeProjectEnd.stream().collect(Collectors.toMap(SubAgencyProjectResultDTO::getAgencyId, SubAgencyProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1));
//巡查次数和时间
List<String> agencyFullIds = subAgencyList.stream().map(o -> o.getPids().concat(StrConstant.COLON).concat(o.getAgencyId())).collect(Collectors.toList());
List<PatrolDailySumResult> patrolList = statsStaffPatrolRecordDailyService.getPatrolSumList(agencyFullIds,actulStartDate,formDTO.getEndDateId());
List<PatrolDailySumResult> patrolList = statsStaffPatrolRecordDailyService.getPatrolSumList(agencyFullIds,breforeStartDate,formDTO.getEndDateId());
Map<String, PatrolDailySumResult> patrolListMap = patrolList.stream().collect(Collectors.toMap(PatrolDailySumResult::getFullAgencyId, o -> o, (o1, o2) -> o1));
subAgencyList.forEach(agency->{
@ -1600,7 +1600,9 @@ public class DataStatsServiceImpl implements DataStatsService {
});
}
List<WorkFactResultDTO> newResult = result.stream().sorted(Comparator.comparing(o -> o.getTopicToIssueTotal() + o.getIssueToProjectTotal() + o.getClosedProjectTotal() + o.getPatrolTotal())).collect(Collectors.toList());
List<WorkFactResultDTO> newResult = result.stream().sorted(Comparator.comparing(o -> o.getTopicToIssueTotal() + o.getIssueToProjectTotal() + o.getClosedProjectTotal() + o.getPatrolTotal()))
.collect(Collectors.toList());
Collections.reverse(newResult);
return newResult;
}
@ -1830,4 +1832,13 @@ public class DataStatsServiceImpl implements DataStatsService {
return result;
}
/**
* @Description 查询当前组织及下级所有网格员维度对应最大dated数据
* @author sun
*/
@Override
public List<GridMemberPatrolListResultDTO> getGirdMemberPatrol(GridMemberPatrolListFormDTO formDTO) {
return dataStatsDao.selectGirdMemberPatrol(formDTO);
}
}

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

@ -1,9 +1,6 @@
package com.epmet.dataaggre.service.epmetuser;
import com.epmet.dataaggre.dto.epmetuser.form.OpenStaffDetailFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.PatrolDateListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.PatrolRecordListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.StaffListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.*;
import com.epmet.dataaggre.dto.epmetuser.result.*;
import com.epmet.dataaggre.dto.govorg.result.GridStaffResultDTO;
@ -96,4 +93,11 @@ public interface EpmetUserService {
* @date 2021/8/3 15:09
*/
UserEventLogoResultDTO mentionMeEvent(String userId);
/**
* @Param formDTO
* @Description 对外接口--网格员排名-巡查记录
* @author sun
*/
List<GridMemberPatrolListResultDTO> gridMemberPatrolList(GridMemberPatrolListFormDTO formDTO);
}

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

@ -9,15 +9,13 @@ import com.epmet.dataaggre.dao.epmetuser.*;
import com.epmet.dataaggre.dto.epmetuser.CustomerStaffDTO;
import com.epmet.dataaggre.dto.epmetuser.StaffPatrolDetailDTO;
import com.epmet.dataaggre.dto.epmetuser.StaffPatrolRecordDTO;
import com.epmet.dataaggre.dto.epmetuser.form.OpenStaffDetailFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.PatrolDateListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.PatrolRecordListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.StaffListFormDTO;
import com.epmet.dataaggre.dto.epmetuser.form.*;
import com.epmet.dataaggre.dto.epmetuser.result.*;
import com.epmet.dataaggre.dto.govorg.CustomerAgencyDTO;
import com.epmet.dataaggre.dto.govorg.CustomerGridDTO;
import com.epmet.dataaggre.dto.govorg.result.GridStaffResultDTO;
import com.epmet.dataaggre.entity.epmetuser.ResiUserBadgeEntity;
import com.epmet.dataaggre.service.datastats.DataStatsService;
import com.epmet.dataaggre.service.epmetuser.EpmetUserService;
import com.epmet.dataaggre.service.epmetuser.StaffPatrolDetailService;
import com.epmet.dataaggre.service.epmetuser.StaffPatrolRecordService;
@ -61,6 +59,8 @@ public class EpmetUserServiceImpl implements EpmetUserService {
private ResiUserBadgeDao resiUserBadgeDao;
@Autowired
private GovProjectService govProjectService;
@Autowired
private DataStatsService dataStatsService;
/**
* @Description 根据UserIds查询
@ -424,5 +424,46 @@ public class EpmetUserServiceImpl implements EpmetUserService {
return resultDTO;
}
/**
* @Param formDTO
* @Description 对外接口--网格员排名-巡查记录
* @author sun
*/
@Override
public List<GridMemberPatrolListResultDTO> gridMemberPatrolList(GridMemberPatrolListFormDTO formDTO) {
//1.查询当前组织及下级所有网格员维度对应最大dated数据【例查询2021年8月数据,则是查询8月对应的最大daeId那天的网格员数据】
List<GridMemberPatrolListResultDTO> resultList = dataStatsService.getGirdMemberPatrol(formDTO);
if (CollectionUtils.isEmpty(resultList)) {
return new ArrayList<>();
}
//2.按维度汇总当前组织及下级网格员巡查数据
//【如果查询当前月或本年度数据,则需要排除最大dateId的数据,因为上边查的统计数据只有t-1的,巡查数据是t的,避免多计算了当天的巡查项目数和时长数】
formDTO.setDateId(resultList.get(0).getDateId());
List<StaffListResultDTO> patrolList = staffPatrolRecordDao.gridMemberPatrol(formDTO);
//3.以统计数据为准封装结果数据
resultList.forEach(re -> patrolList.stream().filter(l -> re.getStaffId().equals(l.getStaffId())).forEach(s -> {
re.setReportProjectCount(s.getReportProjectCount());
re.setPatrolTotalTime((s.getTimeNum() > NumConstant.ZERO ? s.getTimeNum() / 60 : 0));
}));
//4.按排序字段排序并返回
Collections.sort(resultList, new Comparator<GridMemberPatrolListResultDTO>() {
@Override
public int compare(GridMemberPatrolListResultDTO o1, GridMemberPatrolListResultDTO o2) {
if ("patrolTime".equals(formDTO.getSort())) {
return o2.getPatrolTotalTime().compareTo(o1.getPatrolTotalTime());
} else if ("dealEvent".equals(formDTO.getSort())) {
return o2.getEventCount().compareTo(o1.getEventCount());
} else {
return o2.getReportProjectCount().compareTo(o1.getReportProjectCount());
}
}
});
return resultList;
}
}

30
epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/datastats/DatsStatsDao.xml

@ -767,4 +767,34 @@
</foreach>
</select>
<select id="selectGirdMemberPatrol" resultType="com.epmet.dataaggre.dto.epmetuser.result.GridMemberPatrolListResultDTO">
SELECT
staff_id staffId,
staff_name staffName,
date_id dateId,
IFNULL(
SUM(
issue_to_project_count + closed_issue_count + project_response_count + project_transfer_count + project_closed_count
)
, 0)eventCount
FROM
fact_grid_member_statistics_daily
WHERE
del_flag = '0'
AND pids LIKE concat('%', #{agencyId}, '%')
AND date_id = (
SELECT MAX(date_id)
FROM fact_grid_member_statistics_daily
WHERE
del_flag = '0'
<if test="dimType!= null and dimType == 'month' ">
AND month_id = #{dimId}
</if>
<if test="dimType!= null and dimType == 'year' ">
AND year_id = #{dimId}
</if>
)
GROUP BY staff_id
</select>
</mapper>

20
epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/StaffPatrolRecordDao.xml

@ -120,4 +120,24 @@
AND ssp.staff_id = #{staffId}
</select>
<select id="gridMemberPatrol" resultType="com.epmet.dataaggre.dto.epmetuser.result.StaffListResultDTO">
SELECT
staff_id staffId,
IFNULL(SUM(patrol_total), 0) reportProjectCount,
IFNULL(SUM(total_time), 0) timeNum
FROM
stats_staff_patrol_record_daily
WHERE
del_flag = '0'
AND grid_pids LIKE concat('%', #{agencyId}, '%')
<if test="dimType!= null and dimType == 'month' ">
AND month_id = #{dimId}
</if>
<if test="dimType!= null and dimType == 'year' ">
AND year_id = #{dimId}
</if>
AND date_id <![CDATA[<=]]> #{dateId}
GROUP BY staff_id
</select>
</mapper>

7
epmet-module/data-report/data-report-client/src/main/java/com/epmet/dto/result/screen/CategoryAnalysisResultDTO.java

@ -1,5 +1,6 @@
package com.epmet.dto.result.screen;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -33,4 +34,10 @@ public class CategoryAnalysisResultDTO implements Serializable {
* 分类编码
*/
private String categoryCode;
/**
* 分类来源客户ID
*/
@JsonIgnore
private String categoryOriginCustomerId;
}

7
epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/CategoryTopAppealResultDTO.java

@ -1,6 +1,7 @@
package com.epmet.project.dto.result;
import com.epmet.commons.tools.constant.NumConstant;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.io.Serializable;
@ -30,6 +31,12 @@ public class CategoryTopAppealResultDTO implements Serializable {
*/
private Integer categoryCount;
/**
* 分类来源客户ID
*/
@JsonIgnore
private String categoryOriginCustomerId;
public CategoryTopAppealResultDTO() {
this.categoryId = "";
this.categoryName = "";

94
epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListGeneralResultDTO.java

@ -0,0 +1,94 @@
package com.epmet.user.result;
import com.epmet.commons.tools.constant.NumConstant;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2021/6/7 2:57 下午
* @DESC
*/
@Data
public class GridManagerListGeneralResultDTO implements Serializable {
private static final long serialVersionUID = -2770911125810373090L;
/**
* 工作人员id
*/
private String staffId;
/**
* 工作人员手机号
*/
private String mobile;
/**
* 经度
*/
private String longitude;
/**
* 纬度
*/
private String latitude;
/**
* 网格ID
*/
private String gridId;
/**
* 正在巡查patrolling否则返回空字符串
*/
private String status;
/**
* 网格名称最多显示上两级
*/
private String gridName;
/**
* 姓名
*/
private String staffName;
/**
* 巡查时长
*/
private Integer patrolDuration;
/**
* 巡查次数
*/
private Integer patrolCount;
/**
* 中心点位
*/
@JsonIgnore
private String centerMark;
/**
* 经纬度赋值状态
*/
@JsonIgnore
private Boolean llStatus;
public GridManagerListGeneralResultDTO() {
this.staffId = "";
this.longitude = "";
this.latitude = "";
this.gridId = "";
this.status = "";
this.gridName = "";
this.staffName = "";
this.centerMark = "";
this.llStatus = false;
this.patrolDuration = NumConstant.ZERO;
this.patrolCount = NumConstant.ZERO;
}
}

13
epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/user/StaffPatrolDetailController.java

@ -11,6 +11,7 @@ import com.epmet.user.result.GridManagerListResultDTO;
import com.epmet.dto.result.PatrolTrackResultDTO;
import com.epmet.dto.result.RecordListResultDTO;
import com.epmet.dto.result.PatrolCountResultDTO;
import com.epmet.user.result.GridManagerListGeneralResultDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -77,4 +78,16 @@ public class StaffPatrolDetailController {
return new Result<PatrolCountResultDTO>().ok(staffPatrolService.patrolCount(formDTO));
}
/**
* @Description 网格员分布
* @Param formDTO
* @author zxc
* @date 2021/8/25 3:00 下午
*/
@PostMapping("gridmanagerlistgeneral")
public Result<List<GridManagerListGeneralResultDTO>> gridManagerListGeneral(@RequestBody GridManagerListFormDTO formDTO){
ValidatorUtils.validateEntity(formDTO, GridManagerListFormDTO.GridManagerListForm.class);
return new Result<List<GridManagerListGeneralResultDTO>>().ok(staffPatrolService.gridManagerListGeneral(formDTO));
}
}

2
epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.java

@ -42,7 +42,7 @@ public interface ScreenProjectCategoryOrgDailyDao {
*/
List<CategoryAnalysisResultDTO> selectCategoryAnalysis(@Param("agencyId") String agencyId,@Param("customerId")String customerId);
CustomerProjectCategoryDTO selectProjectCategory(@Param("categoryCode")String categoryCode, @Param("customerId")String customerId, @Param("subCustomerIds")List<String> subCustomerIds);
CustomerProjectCategoryDTO selectProjectCategory(@Param("categoryCode")String categoryCode, @Param("customerId")String customerId);
/**
* @Description 查询事件分类

16
epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/ScreenProjectServiceImpl.java

@ -159,13 +159,8 @@ public class ScreenProjectServiceImpl implements ScreenProjectService {
List<CategoryAnalysisResultDTO> resultDTOList = screenProjectCategoryOrgDailyDao.selectCategoryAnalysis(formDTO.getAgencyId(), customerId);
List<CategoryAnalysisResultDTO> resultList = new ArrayList<>();
if (!CollectionUtils.isEmpty(resultDTOList)) {
Result<List<String>> crmRes = operCrmOpenFeignClient.getAllSubCustomerIds(customerId);
List<String> subCustomerIds = new ArrayList<>();
if (crmRes.success() && !CollectionUtils.isEmpty(crmRes.getData())) {
subCustomerIds = crmRes.getData();
}
for (CategoryAnalysisResultDTO dto : resultDTOList) {
CustomerProjectCategoryDTO projectCategoryDTO = screenProjectCategoryOrgDailyDao.selectProjectCategory(dto.getCategoryCode(), customerId, subCustomerIds);
CustomerProjectCategoryDTO projectCategoryDTO = screenProjectCategoryOrgDailyDao.selectProjectCategory(dto.getCategoryCode(), dto.getCategoryOriginCustomerId());
if (null == projectCategoryDTO || StringUtils.isBlank(projectCategoryDTO.getCategoryName())) {
log.warn(String.format("查询分类名称失败,当前客户:%s, categoryCode:%s", dto.getCategoryCode(), customerId));
continue;
@ -224,15 +219,10 @@ public class ScreenProjectServiceImpl implements ScreenProjectService {
if (CollectionUtils.isEmpty(result)){
return new ArrayList<>();
}
Result<List<String>> sonCustomer = operCrmOpenFeignClient.getAllSubCustomerIds(customerId);
List<String> subCustomerIds = new ArrayList<>();
if (sonCustomer.success() && !CollectionUtils.isEmpty(sonCustomer.getData())) {
subCustomerIds = sonCustomer.getData();
}
for (CategoryTopAppealResultDTO r : result) {
CustomerProjectCategoryDTO projectCategoryDTO = screenProjectCategoryOrgDailyDao.selectProjectCategory(r.getCategoryId(), customerId, subCustomerIds);
CustomerProjectCategoryDTO projectCategoryDTO = screenProjectCategoryOrgDailyDao.selectProjectCategory(r.getCategoryId(), r.getCategoryOriginCustomerId());
if (null == projectCategoryDTO || StringUtils.isBlank(projectCategoryDTO.getCategoryName())) {
log.warn(String.format("查询分类名称失败,当前客户:%s, categoryCode:%s", r.getCategoryId(), customerId));
log.warn(String.format("查询分类名称失败,当前客户:%s, categoryCode:%s", r.getCategoryId(), r.getCategoryOriginCustomerId()));
continue;
}
r.setCategoryName(projectCategoryDTO.getCategoryName());

9
epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/StaffPatrolDetailService.java

@ -8,6 +8,7 @@ import com.epmet.user.result.GridManagerListResultDTO;
import com.epmet.dto.result.PatrolTrackResultDTO;
import com.epmet.dto.result.RecordListResultDTO;
import com.epmet.dto.result.PatrolCountResultDTO;
import com.epmet.user.result.GridManagerListGeneralResultDTO;
import java.util.List;
@ -27,6 +28,14 @@ public interface StaffPatrolDetailService{
*/
List<GridManagerListResultDTO> gridManagerList(GridManagerListFormDTO formDTO);
/**
* @Description 网格员分布
* @Param formDTO
* @author zxc
* @date 2021/8/25 3:00 下午
*/
List<GridManagerListGeneralResultDTO> gridManagerListGeneral(GridManagerListFormDTO formDTO);
/**
* @Description 002查看巡查记录
* @Param formDTO

30
epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/impl/StaffPatrolDetailServiceImpl.java

@ -3,7 +3,6 @@ package com.epmet.datareport.service.user.impl;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.datareport.constant.PatrolConstant;
import com.epmet.datareport.dao.user.StaffPatrolDetailDao;
@ -19,6 +18,7 @@ import com.epmet.dto.form.RecordListFormDTO;
import com.epmet.dto.form.PatrolCountFormDTO;
import com.epmet.user.result.GridManagerListResultDTO;
import com.epmet.dto.result.PatrolCountResultDTO;
import com.epmet.user.result.GridManagerListGeneralResultDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -136,6 +136,34 @@ public class StaffPatrolDetailServiceImpl implements StaffPatrolDetailService {
return result;
}
/**
* @Description 网格员分布
* @Param formDTO
* @author zxc
* @date 2021/8/25 3:00 下午
*/
@Override
public List<GridManagerListGeneralResultDTO> gridManagerListGeneral(GridManagerListFormDTO formDTO) {
List<GridManagerListResultDTO> resultTwo = this.gridManagerList(formDTO);
List<GridManagerListGeneralResultDTO> result = ConvertUtils.sourceToTarget(resultTwo, GridManagerListGeneralResultDTO.class);
Result<List<PatrolYuShanResultDTO>> listResult = epmetUserOpenFeignClient.patrolInfo(formDTO.getAgencyId());
if (!listResult.success()){
throw new RenException("查询巡查次数和时长失败");
}
List<PatrolYuShanResultDTO> data = listResult.getData();
if (!CollectionUtils.isEmpty(data)){
result.forEach(r -> {
data.forEach(d -> {
if (r.getGridId().equals(d.getGridId()) && r.getStaffId().equals(d.getStaffId())){
r.setPatrolCount(d.getPatrolCount());
r.setPatrolDuration(d.getPatrolDuration());
}
});
});
}
return result;
}
/**
* @Description 根据中心点位截取经纬度
* @Param centMark

2
epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenCustomerAgencyDao.xml

@ -341,7 +341,7 @@
AND cg.AREA_CODE LIKE CONCAT(#{areaCode},'%')
</if>
<if test="agencyId != null and agencyId != ''">
AND cg.ALL_PARENT_IDS LIKE CONCAT(#{agencyId}, '%')
AND cg.ALL_PARENT_IDS LIKE CONCAT('%',#{agencyId}, '%')
</if>
</select>

46
epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenProjectCategoryOrgDailyDao.xml

@ -8,7 +8,8 @@
SELECT '' AS categoryName,
M.PROJECT_TOTAL AS projectTotal,
m.DATE_ID as dateId,
m.CATEGORY_CODE as categoryCode
m.CATEGORY_CODE as categoryCode,
m.CATEGORY_ORIGIN_CUSTOMER_ID
FROM screen_project_category_org_daily m
WHERE M.DEL_FLAG = '0'
and m.level='1'
@ -33,46 +34,25 @@
<!-- 平阴的分类编码: 平阴自己的+ 子客户未对照的 -->
<select id="selectProjectCategory" parameterType="map" resultType="com.epmet.project.CustomerProjectCategoryDTO">
SELECT
*
SELECT DISTINCT
m.CATEGORY_CODE,
m.CATEGORY_NAME,
m.`LEVEL`
FROM
(
SELECT DISTINCT
m.CATEGORY_CODE,
m.CATEGORY_NAME,
m.`LEVEL`
FROM
customer_project_category_dict m
WHERE
m.DEL_FLAG = '0'
AND m.customer_id = #{customerId}
<if test="subCustomerIds != null and subCustomerIds.size() > 0">
UNION ALL
SELECT DISTINCT
m.CATEGORY_CODE,
m.CATEGORY_NAME,
m.`LEVEL`
FROM
customer_project_category_dict m
WHERE
m.DEL_FLAG = '0'
AND m.customer_id IN
<foreach item="subCustomerId" collection="subCustomerIds" open="(" separator="," close=")">
#{subCustomerId}
</foreach>
</if>
) temp
customer_project_category_dict m
WHERE
temp.CATEGORY_CODE = #{categoryCode}
ORDER BY temp.`LEVEL` DESC
LIMIT 1
m.DEL_FLAG = '0'
AND m.customer_id = #{customerId}
AND CATEGORY_CODE = #{categoryCode}
LIMIT 1
</select>
<!-- 查询事件分类 -->
<select id="categoryTopAppeal" resultType="com.epmet.project.dto.result.CategoryTopAppealResultDTO">
SELECT
CATEGORY_CODE AS categoryId,
PROJECT_TOTAL AS categoryCount
PROJECT_TOTAL AS categoryCount,
CATEGORY_ORIGIN_CUSTOMER_ID
FROM
screen_project_category_org_daily
WHERE

2
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/aspect/RequestLogAspect.java

@ -21,7 +21,7 @@ import javax.servlet.http.HttpServletRequest;
public class RequestLogAspect extends BaseRequestLogAspect {
@Override
@Around(value = "execution(* com.epmet.controller.*Controller*.*(..)) ")
@Around(value = "execution(* com.epmet.controller..*Controller*.*(..)) ")
public Object proceed(ProceedingJoinPoint point) throws Throwable {
return super.proceed(point, getRequest());
}

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

@ -436,7 +436,6 @@ public class ScreenProjectCategoryOrgDailyServiceImpl extends BaseServiceImpl<Sc
e.setCustomerId(customerId);
finalSonResult.add(e);
});
result.addAll(finalSonResult);
}
// 内部客户与外部客户 相同的分类累加
if (!CollectionUtils.isEmpty(categoryProjectExists)){
@ -462,19 +461,34 @@ public class ScreenProjectCategoryOrgDailyServiceImpl extends BaseServiceImpl<Sc
log.info("组合后的数据{}:"+JSON.toJSONString(finalResult));
// 父客户存在分类,但是父客户没有使用过此分类
Map<Boolean, List<CategoryProjectResultDTO>> groupByStatus = categoryProjectExists.stream().collect(Collectors.groupingBy(CategoryProjectResultDTO::getStatus));
List<CategoryProjectResultDTO> twoResult = new ArrayList<>();
if (!CollectionUtils.isEmpty(groupByStatus.get(false))){
List<ScreenProjectCategoryOrgDailyEntity> entities = ConvertUtils.sourceToTarget(groupByStatus.get(false), ScreenProjectCategoryOrgDailyEntity.class);
entities.forEach(e -> {
e.setOrgId(entity.getAgencyId());
});
result.addAll(entities);
twoResult.addAll(groupByStatus.get(false));
}
if (!CollectionUtils.isEmpty(categoryProjectNotExists)){
List<ScreenProjectCategoryOrgDailyEntity> entities = ConvertUtils.sourceToTarget(categoryProjectNotExists, ScreenProjectCategoryOrgDailyEntity.class);
entities.forEach(e -> {
e.setOrgId(entity.getAgencyId());
twoResult.addAll(categoryProjectNotExists);
}
if (!CollectionUtils.isEmpty(twoResult)){
Map<String, List<CategoryProjectResultDTO>> groupOrigin = twoResult.stream().collect(Collectors.groupingBy(CategoryProjectResultDTO::getCategoryOriginCustomerId));
List<ScreenProjectCategoryOrgDailyEntity> finalResult1 = result;
groupOrigin.forEach((originCustomerId, list) -> {
// 父客户存在但是未使用的分类 + 父客户不存在的分类,根据categoryCode分组
Map<String, List<CategoryProjectResultDTO>> sonGroupByCode = list.stream().collect(Collectors.groupingBy(CategoryProjectResultDTO::getCategoryCode));
sonGroupByCode.forEach((code,list2) -> {
ScreenProjectCategoryOrgDailyEntity e = new ScreenProjectCategoryOrgDailyEntity();
e.setCustomerId(customerId);
e.setCategoryOriginCustomerId(originCustomerId);
e.setCategoryCode(code);
e.setOrgId(entity.getAgencyId());
e.setProjectTotal(CollectionUtils.isEmpty(list2) ? NumConstant.ZERO : list2.stream().collect(Collectors.summingInt(CategoryProjectResultDTO::getProjectTotal)));
e.setPid(entity.getPid());
e.setPids(StringUtils.isEmpty(entity.getPids()) ? NumConstant.ZERO_STR : entity.getPids());
// 因为根据categoryCode分组,所以level都一样,取第一条的
e.setLevel(list2.get(NumConstant.ZERO).getLevel());
finalResult1.add(e);
});
});
result.addAll(entities);
}
}
}

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

@ -184,44 +184,30 @@ public class ScreenProjectOrgDailyServiceImpl extends BaseServiceImpl<ScreenProj
log.warn(String.format(PingYinConstants.AGENCY_INFO_IS_ZERO,customerId));
return;
}
del(customerId, dateId);
List<ProjectOrgDailyResultDTO> projectOrgDaily = baseDao.selectOrgProjectByAgency(agencyInfos, dateId);
if (CollectionUtils.isEmpty(projectOrgDaily)){
log.info(String.format(PingYinConstants.SELECT_GRID_INFO_BY_ORG_IS_NULL,customerId));
return;
}
log.info(projectOrgDaily.toString());
List<ScreenProjectOrgDailyDTO> createProjects = disposeCreateProject(agencyInfos, dateId);
agencyInfos = disposeCreateProject(agencyInfos, dateId);
agencyInfos.forEach(a -> {
a.setDateId(dateId);
projectOrgDaily.forEach(p -> {
if (a.getAreaCode().equals(p.getAreaCode())){
a.setResolvedRatio(getRatio(p.getResolvedNum(),p.getProjectTotal()));
a.setBadRatio(getRatio(p.getBadTotal(),p.getEvaluateTotal()));
a.setGoodRatio(getRatio(p.getGoodTotal(),p.getEvaluateTotal()));
a.setBadTotal(p.getBadTotal());
a.setEvaluateTotal(p.getEvaluateTotal());
a.setGoodTotal(p.getGoodTotal());
a.setProjectTotal(p.getProjectTotal());
a.setResolvedNum(p.getResolvedNum());
}
});
});
agencyInfos.forEach(a -> {
createProjects.forEach(p -> {
if (a.getOrgId().equals(p.getOrgId())){
a.setBadTotal(p.getBadTotal() + a.getBadTotal());
a.setEvaluateTotal(p.getEvaluateTotal() + a.getEvaluateTotal());
a.setGoodTotal(p.getGoodTotal() + a.getGoodTotal());
a.setProjectTotal(p.getProjectTotal() + a.getProjectTotal());
a.setResolvedNum(p.getResolvedNum() + a.getResolvedNum());
a.setResolvedRatio(getRatio(a.getResolvedNum(),a.getProjectTotal()));
a.setBadRatio(getRatio(a.getBadTotal(),a.getEvaluateTotal()));
a.setGoodRatio(getRatio(a.getGoodTotal(),a.getEvaluateTotal()));
a.setResolvedRatio(getRatio(p.getResolvedNum(),p.getProjectTotal()));
a.setBadRatio(getRatio(p.getBadTotal(),p.getEvaluateTotal()));
a.setGoodRatio(getRatio(p.getGoodTotal(),p.getEvaluateTotal()));
}
});
});
log.info(agencyInfos.toString());
del(customerId, dateId);
insert(agencyInfos,customerId,dateId);
}
@ -239,6 +225,7 @@ public class ScreenProjectOrgDailyServiceImpl extends BaseServiceImpl<ScreenProj
log.warn(String.format(PingYinConstants.AGENCY_INFO_IS_ZERO,customerId));
return;
}
del(customerId, dateId);
List<ProjectOrgDailyResultDTO> projectOrgDaily = baseDao.selectOrgProject(agencyInfos, dateId);
if (CollectionUtils.isEmpty(projectOrgDaily)){
log.info(String.format(PingYinConstants.SELECT_GRID_INFO_BY_ORG_IS_NULL,customerId));
@ -278,7 +265,6 @@ public class ScreenProjectOrgDailyServiceImpl extends BaseServiceImpl<ScreenProj
});
});
log.info(agencyInfos.toString());
del(customerId, dateId);
insert(agencyInfos,customerId,dateId);
}

91
epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml

@ -623,66 +623,57 @@
<!-- 组织查询项目总数 -->
<select id="selectProjectTotalByOrg" resultType="com.epmet.dto.pingyin.result.ProjectTotalResultDTO">
SELECT
m.AGENCY_ID AS orgId,
IFNULL(COUNT(m.ID),0) AS projectTotal
FROM fact_origin_project_main_daily m
WHERE m.DEL_FLAG = 0
AND m.GRID_ID = ''
AND (
<foreach collection="orgIds" item="orgId" separator=" OR ">
m.AGENCY_ID = #{orgId}
</foreach>
)
<if test="dateId != null and dateId != '' ">
AND m.DATE_ID <![CDATA[ <= ]]> #{dateId}
</if>
<if test="monthId != null and monthId != '' ">
AND m.MONTH_ID <![CDATA[ <= ]]> #{monthId}
</if>
GROUP BY m.AGENCY_ID
<foreach collection="orgIds" item="orgId" separator=" UNION ALL ">
SELECT
#{orgId} AS orgId,
IFNULL(COUNT(m.ID),0) AS projectTotal
FROM fact_origin_project_main_daily m
WHERE m.DEL_FLAG = 0
AND m.GRID_ID = ''
AND m.PIDS LIKE CONCAT('%',#{orgId},'%')
<if test="dateId != null and dateId != '' ">
AND m.DATE_ID <![CDATA[ <= ]]> #{dateId}
</if>
<if test="monthId != null and monthId != '' ">
AND m.MONTH_ID <![CDATA[ <= ]]> #{monthId}
</if>
</foreach>
</select>
<!-- 组织查询已解决项目数 -->
<select id="selectResolvedNumByOrg" resultType="com.epmet.dto.pingyin.result.ResolvedNumResultDTO">
SELECT
AGENCY_ID AS orgId,
IFNULL(COUNT(ID),0) AS resolvedNum
FROM fact_origin_project_main_daily
WHERE DEL_FLAG = 0
AND DATE_ID <![CDATA[ <= ]]> #{dateId}
AND PROJECT_STATUS = 'closed'
AND IS_RESOLVED = 'resolved'
AND (
<foreach collection="orgIds" item="orgId" separator=" OR ">
AGENCY_ID = #{orgId}
</foreach>
)
AND GRID_ID = ''
GROUP BY AGENCY_ID
<foreach collection="orgIds" item="orgId" separator=" UNION ALL ">
SELECT
#{orgId} AS orgId,
IFNULL(COUNT(ID),0) AS resolvedNum
FROM fact_origin_project_main_daily
WHERE DEL_FLAG = 0
AND DATE_ID <![CDATA[ <= ]]> #{dateId}
AND PIDS LIKE CONCAT('%',#{orgId},'%')
AND PROJECT_STATUS = 'closed'
AND IS_RESOLVED = 'resolved'
AND GRID_ID = ''
</foreach>
</select>
<!-- 组织 查询 满意度评价次数 -->
<select id="selectEvaluateCountByOrg" resultType="com.epmet.dto.pingyin.result.EvaluateTotalResultDTO">
SELECT
ORG_ID,
IFNULL(COUNT(PROJECT_ID),0) AS evaluateCount
FROM fact_origin_project_log_daily
WHERE DEL_FLAG = 0
AND ORG_TYPE = 'agency'
AND DATE_ID <![CDATA[ <= ]]> #{dateId}
AND (
<foreach collection="orgIds" item="orgId" separator=" OR ">
org_id = #{orgId}
<foreach collection="orgIds" item="orgId" separator=" UNION ALL ">
SELECT
#{orgId} as orgId,
IFNULL(COUNT(PROJECT_ID),0) AS evaluateCount
FROM fact_origin_project_log_daily
WHERE DEL_FLAG = 0
AND ORG_TYPE = 'agency'
AND DATE_ID <![CDATA[ <= ]]> #{dateId}
AND PIDS LIKE CONCAT('%',#{orgId},'%')
AND IS_ACTIVE = 1
AND (
<foreach collection="activeCodes" item="code" separator=" OR ">
ACTION_CODE = #{code}
</foreach>
)
AND IS_ACTIVE = 1
AND (
<foreach collection="activeCodes" item="code" separator=" OR ">
ACTION_CODE = #{code}
)
</foreach>
)
GROUP BY ORG_ID
</select>
<!-- 组织查询本月新增项目数 -->

2
epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml

@ -81,7 +81,7 @@
</if>
AND od.pid = '0'
AND od.date_id = #{dateId}
GROUP BY categoryCode,od.pid
GROUP BY categoryCode,od.ORG_ID
</select>
<!-- 查询内部客户组织的项目分类 -->

2
epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectOrgDailyDao.xml

@ -138,7 +138,7 @@
FROM screen_project_grid_daily g
LEFT JOIN screen_customer_grid cg ON cg.GRID_ID = g.GRID_ID
WHERE g.DEL_FLAG = 0
AND cg.PARENT_AGENCY_ID = #{a.orgId}
AND cg.ALL_PARENT_IDS LIKE CONCAT('%',#{a.orgId},'%')
AND g.DATE_ID <![CDATA[ = ]]> #{dateId}
</foreach>
</select>

6
epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/constant/ThirdPlatformActions.java

@ -19,4 +19,10 @@ public interface ThirdPlatformActions {
*/
String UPLOAD_FILE = "UPLOAD_FILE";
/** 推送 微信component access token */
String PUSH_COMPONENT_ACCESS_TOKEN = "PUSH_COMPONENT_ACCESS_TOKEN";
/** 推送 微信 authorizer access token */
String PUSH_AUTHORIZER_ACCESS_TOKEN = "PUSH_AUTHORIZER_ACCESS_TOKEN";
}

19
epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/ThirdPlatformActionsResultDTO.java

@ -0,0 +1,19 @@
package com.epmet.dto.result;
import lombok.Data;
/**
* @Description 第三方平台及其支持的action result
* @author wxz
* @date 2021.08.30 17:06:42
*/
@Data
public class ThirdPlatformActionsResultDTO {
private String platformId;
private String platformKey;
private String platformName;
private String actionKey;
private String apiUrl;
}

18
epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/privateepmet/GetAccessTokenResultDTO.java

@ -0,0 +1,18 @@
package com.epmet.dto.result.privateepmet;
import lombok.Data;
/**
* @Description 获取accesstoken结果
* @author wxz
* @date 2021.08.30 17:40:25
*/
@Data
public class GetAccessTokenResultDTO {
// token
private String accessToken;
// 有效时长
private Long expireTime;
}

22
epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/ThirdOpenFeignClient.java

@ -2,6 +2,8 @@ package com.epmet.feign;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.form.AuthorizerAccessTokenFormDTO;
import com.epmet.dto.form.ComponentAccessTokenFormDTO;
import com.epmet.dto.form.SaveOrUpdateCustSelPlatformFormDTO;
import com.epmet.dto.form.ThirdPlatformFormDTO;
import com.epmet.dto.result.ThirdplatformResultDTO;
@ -35,4 +37,24 @@ public interface ThirdOpenFeignClient {
*/
@PostMapping("/third/thirdplatform/customer/list-available-platforms-by-action")
Result<List<ThirdplatformResultDTO>> listAvailablePlatformsByCustomerAndAction(@RequestBody ThirdPlatformFormDTO input);
/**
* @Description 私有化平台接收component-access推送
* @param input
* @return com.epmet.commons.tools.utils.Result
* @author wxz
* @date 2021.08.30 16:40:17
*/
@PostMapping("/third/private-epmet/push-component-access-token")
Result pushComponentAccessToken(@RequestBody ComponentAccessTokenFormDTO input);
/**
* @Description 接收推送AuthorizerTokens
* @param input
* @return com.epmet.commons.tools.utils.Result
* @author wxz
* @date 2021.08.30 16:36:02
*/
@PostMapping("/third/private-epmet/push-authorizer-tokens")
Result pushAuthorizerTokens(@RequestBody AuthorizerAccessTokenFormDTO input);
}

12
epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/fallback/ThirdOpenFeignClientFallback.java

@ -3,6 +3,8 @@ package com.epmet.feign.fallback;
import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.utils.ModuleUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.form.AuthorizerAccessTokenFormDTO;
import com.epmet.dto.form.ComponentAccessTokenFormDTO;
import com.epmet.dto.form.SaveOrUpdateCustSelPlatformFormDTO;
import com.epmet.dto.form.ThirdPlatformFormDTO;
import com.epmet.dto.result.ThirdplatformResultDTO;
@ -22,4 +24,14 @@ public class ThirdOpenFeignClientFallback implements ThirdOpenFeignClient {
public Result<List<ThirdplatformResultDTO>> listAvailablePlatformsByCustomerAndAction(ThirdPlatformFormDTO input) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_THIRD_SERVER, "listAvailablePlatformsByCustomerAndAction", input);
}
@Override
public Result pushComponentAccessToken(ComponentAccessTokenFormDTO input) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_THIRD_SERVER, "pushComponentAccessToken", input);
}
@Override
public Result pushAuthorizerTokens(AuthorizerAccessTokenFormDTO input) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_THIRD_SERVER, "pushAuthorizerTokens", input);
}
}

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

@ -21,6 +21,11 @@
</properties>
<dependencies>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-openapi-sdk</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-third-client</artifactId>

246
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/ApiService.java

@ -1,7 +1,8 @@
package com.epmet.apiservice;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.epmet.apiservice.result.LZGridPlatformBaseResult;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.redis.RedisKeys;
import com.epmet.commons.tools.utils.HttpClientManager;
@ -10,19 +11,21 @@ import com.epmet.commons.tools.utils.SpringContextUtils;
import com.epmet.dao.ThirdplatformActionDao;
import com.epmet.dao.ThirdplatformCustomerRegisterDao;
import com.epmet.dao.ThirdplatformDao;
import com.epmet.dto.form.ProjectApplyAssistFormDTO;
import com.epmet.dto.form.TPFDemoFormDTO;
import com.epmet.dto.form.UploadFileFormDTO;
import com.epmet.dto.form.*;
import com.epmet.dto.result.ProjectAssistResult;
import com.epmet.dto.result.UploadFileResultDTO;
import com.epmet.entity.ThirdplatformActionEntity;
import com.epmet.entity.ThirdplatformCustomerRegisterEntity;
import com.epmet.entity.ThirdplatformEntity;
import com.epmet.redis.ThirdPlatformCache;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@ -32,7 +35,7 @@ import java.util.concurrent.TimeUnit;
* 此抽象类中定义方法的具体返回类型所有子类都要统一使用在具体实现中做转换若是不需要返回返回null即可
*/
@Slf4j
public abstract class ApiService {
public abstract class ApiService<R> {
/**
* 重试次数
*/
@ -61,13 +64,13 @@ public abstract class ApiService {
* @param headers
* @return
*/
public String sendGetRequest(String platformId, String action, Map<String, Object> params, Map<String, Object> headers) {
public R sendGetRequest(String platformId, String action, Map<String, Object> params, Map<String, Object> headers) {
// 1.获取token
String accessToken = getAccessToken(platformId);
//2.获取url
ThirdplatformEntity thirdplatform = SpringContextUtils.getBean(ThirdplatformDao.class).selectById(platformId);
ThirdplatformActionEntity actionEntity = SpringContextUtils.getBean(ThirdplatformActionDao.class)
.getByPlatformIdAndActionKey(platformId, action);
ThirdPlatformCache thirdPlatformInfo = getThirdPlatformInfo(platformId);
String actionUrl = getThirdPlatformActionUrl(platformId, action);
if (headers == null) {
headers = new HashMap<>();
@ -76,8 +79,8 @@ public abstract class ApiService {
// 填充access token到头当中
headers.put("X-Access-Token", accessToken);
log.info("apiService sendGetRequest param:{},headers:{}",params,headers);
Result<String> result = HttpClientManager.getInstance().sendGet(thirdplatform.getBaseUrl().concat(actionEntity.getApiUrl()),
thirdplatform.getBaseUrl().startsWith("https://"),
Result<String> result = HttpClientManager.getInstance().sendGet(thirdPlatformInfo.getBaseUrl().concat(actionUrl),
thirdPlatformInfo.getBaseUrl().startsWith("https://"),
params,
headers);
log.info("apiService sendGetRequest result:{}",JSON.toJSONString(result));
@ -87,37 +90,51 @@ public abstract class ApiService {
if (result.success()) {
throw new RenException("请求第三方平台,获取AccessToken失败。");
}
LZGridPlatformBaseResult platformResult = JSON.parseObject(result.getData(), LZGridPlatformBaseResult.class);
judgeResultSuccess(platformResult);
return result.getData();
return parsePlatformResponseResult(result.getData(), String.class);
}
/**
* @Description
accesstoken header名称如果不需要AccessToken与getAccessToken()方法共同返回null即可
* @return java.lang.String
* @author wxz
* @date 2021.08.30 14:06:26
*/
public abstract String getAccessTokenHeaderName();
/**
* 发送post请求
* @param platformId
* @param action
* @param jsonString
* @param headers
* @return
* @return 平台对应返回值的Result类
*/
public String sendPostRequest(String platformId, String action, String jsonString, Map<String, Object> headers) {
public R sendPostRequest(String platformId, String action, String jsonString, Map<String, Object> headers, Map<String, String> urlParams) {
// 1.获取token
String accessToken = getAccessToken(platformId);
//2.获取url
ThirdplatformEntity thirdplatform = SpringContextUtils.getBean(ThirdplatformDao.class).selectById(platformId);
ThirdplatformActionEntity actionEntity = SpringContextUtils.getBean(ThirdplatformActionDao.class)
.getByPlatformIdAndActionKey(platformId, action);
ThirdPlatformCache platformFromCache = getThirdPlatformInfo(platformId);
String actionUrl = getThirdPlatformActionUrl(platformId, action);
if (headers == null) {
headers = new HashMap<>();
}
// 填充access token到头当中
headers.put("X-Access-Token", accessToken);
if (StringUtils.isNotBlank(accessToken)) {
//headers.put("X-Access-Token", accessToken);
String accessTokenHeaderName = getAccessTokenHeaderName();
if (StringUtils.isBlank(accessTokenHeaderName)) {
throw new RenException("没有指定AccessToken的Header名字");
}
headers.put(accessTokenHeaderName, accessToken);
}
log.info("apiService sendPostRequest param:{},headers:{}",jsonString,headers);
Result<String> result = HttpClientManager.getInstance().sendPost(thirdplatform.getBaseUrl().concat(actionEntity.getApiUrl()),
thirdplatform.getBaseUrl().startsWith("https://"),
String urlParmsStr = this.convertQueryParams2String(urlParams);
Result<String> result = HttpClientManager.getInstance().sendPost(platformFromCache.getBaseUrl().concat(actionUrl).concat(urlParmsStr),
platformFromCache.getBaseUrl().startsWith("https://"),
jsonString,
headers);
log.info("apiService sendPostRequest result:{}",JSON.toJSONString(result));
@ -128,12 +145,10 @@ public abstract class ApiService {
throw new RenException("请求第三方平台,发送Post请求失败。错误信息:" + result.getMsg());
}
LZGridPlatformBaseResult platformResult = JSON.parseObject(result.getData(), LZGridPlatformBaseResult.class);
judgeResultSuccess(platformResult);
return result.getData();
return parsePlatformResponseResult(result.getData(), String.class);
}
public String sendPostRequestToUploadFile(String platformId, String action, File file, String fileName) {
public R sendPostRequestToUploadFile(String platformId, String action, File file, String fileName) {
// 1.获取token
String accessToken = getAccessToken(platformId);
//2.获取url
@ -159,8 +174,6 @@ public abstract class ApiService {
throw new RenException("请求第三方平台,发送Post请求失败。错误信息:" + result.getMsg());
}
LZGridPlatformBaseResult platformResult = JSON.parseObject(result.getData(), LZGridPlatformBaseResult.class);
// token过期重试逻辑,先不加
//if ("402".equals(platformResult.getCode())) {
// // 如果token过期
@ -168,8 +181,37 @@ public abstract class ApiService {
// getAccessToken(platformId);
// return sendPostRequest(platformId, action, jsonString, headers);
//}
judgeResultSuccess(platformResult);
return result.getData();
return parsePlatformResponseResult(result.getData(), String.class);
}
/**
* @Description 将url参数拼接为字符串
* @param queryParams
* @return java.lang.String
* @author wxz
* @date 2021.08.31 14:08:17
*/
protected String convertQueryParams2String(Map<String, String> queryParams) {
try {
if (queryParams == null || queryParams.size() == 0) {
return "";
}
StringBuilder sb = new StringBuilder("");
queryParams.entrySet().forEach(entry -> {
String key = entry.getKey();
String value = entry.getValue();
sb.append("&").append(key).append("=").append(value);
});
String result = sb.toString();
if (result.startsWith("&")) {
result = result.substring(1);
return "?".concat(result);
}
return "";
} catch (Exception e) {
log.warn("gateway中将url参数转化为String失败,程序继续执行,错误信息:".concat(ExceptionUtils.getErrorStackTrace(e)));
return "";
}
}
/**
@ -202,6 +244,36 @@ public abstract class ApiService {
stringRedisTemplate.opsForValue().set(RedisKeys.getThirdPlatformAccessTokenKey(platformId), accessToken, expire, timeUnit);
}
/**
* @Description 将第三方平台信息存入缓存
* @param cache
* @return void
* @author wxz
* @date 2021.08.31 14:55:48
*/
protected void addPlatformToCache(ThirdPlatformCache cache) {
RedisTemplate<String, String> stringRedisTemplate = SpringContextUtils.getBean("redisTemplate", RedisTemplate.class);
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(cache);
stringRedisTemplate.opsForHash().putAll(RedisKeys.getThirdPlatformInfoKey(cache.getPlatformId()), stringObjectMap);
}
/**
* @Description 从缓存中取第三方平台信息
* @param thirdPlatformKey
* @return com.epmet.redis.ThirdPlatformCache
* @author wxz
* @date 2021.08.31 14:55:28
*/
protected ThirdPlatformCache getPlatformFromCache(String thirdPlatformKey) {
HashOperations<String, String, Object> hashOperations = SpringContextUtils.getBean("redisTemplate", RedisTemplate.class).opsForHash();
Map<String, Object> entries = hashOperations.entries(RedisKeys.getThirdPlatformInfoKey(thirdPlatformKey));
if (entries.size() == 0) {
return null;
}
ThirdPlatformCache thirdPlatformCache = BeanUtil.mapToBean(entries, ThirdPlatformCache.class, true);
return thirdPlatformCache;
}
/**
* @Description 从缓存中取token
* @return
@ -210,7 +282,87 @@ public abstract class ApiService {
*/
protected String getAccessTokenFromCache(String platformId) {
RedisTemplate<String, String> stringRedisTemplate = SpringContextUtils.getBean("redisTemplate", RedisTemplate.class);
return stringRedisTemplate.opsForValue().get(platformId);
return stringRedisTemplate.opsForValue().get(RedisKeys.getThirdPlatformAccessTokenKey(platformId));
}
/**
* @Description 从缓存查询第三方平台操作url
* @param platformId
* @param action
* @return java.lang.String
* @author wxz
* @date 2021.08.31 15:18:06
*/
protected String getThirdPlatformActionUrlFromCache(String platformId, String action) {
HashOperations<String, String, String> ops = SpringContextUtils.getBean("redisTemplate", RedisTemplate.class).opsForHash();
String url = ops.get(RedisKeys.getThirdPlatformActionUrlKey(platformId), action);
return url;
}
/**
* @Description 将第三方平台操作url添加至缓存
* @param platformId
* @param map
* @return java.lang.String
* @author wxz
* @date 2021.08.31 15:20:45
*/
protected void addThirdPlatformActionUrlsToCache(String platformId, Map<String, Object> map) {
String redisKey = RedisKeys.getThirdPlatformActionUrlKey(platformId);
RedisTemplate redisTemplate = SpringContextUtils.getBean("redisTemplate", RedisTemplate.class);
HashOperations<String, String, Object> ops = redisTemplate.opsForHash();
ops.putAll(redisKey, map);
}
/**
* @Description 从缓存里面读取平台信息如果缓存中没有从db读取放入缓存
* @param platformId 平台id
* @return com.epmet.redis.ThirdPlatformCache
* @author wxz
* @date 2021.08.31 15:02:19
*/
protected ThirdPlatformCache getThirdPlatformInfo(String platformId) {
ThirdPlatformCache platform = getPlatformFromCache(platformId);
if (platform == null) {
platform = new ThirdPlatformCache();
ThirdplatformEntity platformEntity = SpringContextUtils.getBean(ThirdplatformDao.class).selectById(platformId);
platform.setPlatformId(platformEntity.getId());
platform.setApiService(platformEntity.getApiService());
platform.setBaseUrl(platformEntity.getBaseUrl());
platform.setPlatformKey(platformEntity.getPlatformKey());
platform.setPlatformName(platformEntity.getPlatformName());
platform.setPlatformSecret(platformEntity.getPlatformSecret());
addPlatformToCache(platform);
}
return platform;
}
/**
* @Description 获取第三放平台操作url优先读取缓存没有则读取db
* @param platformId
* @param actionKey
* @return java.util.Map<java.lang.String,java.lang.String>
* @author wxz
* @date 2021.08.31 15:21:39
*/
protected String getThirdPlatformActionUrl(String platformId, String actionKey) {
String url = getThirdPlatformActionUrlFromCache(platformId, actionKey);
if (StringUtils.isBlank(url)) {
List<ThirdplatformActionEntity> actions = SpringContextUtils.getBean(ThirdplatformActionDao.class)
.listPlatformActions(platformId);
Map<String, Object> map = new HashMap<>(actions.size());
// 将action:url映射至map
for (ThirdplatformActionEntity a : actions) {
map.put(a.getActionKey(), a.getApiUrl());
if (actionKey.equals(a.getActionKey())) {
url = a.getApiUrl();
}
}
addThirdPlatformActionUrlsToCache(platformId, map);
}
return url;
}
/**
@ -246,16 +398,38 @@ public abstract class ApiService {
}
/**
* @Description 判断第三方平台返回结果成功失败如果失败则抛出异常
* @return
* @Description 解析第三方平台返回结果
* @param resultString
* @param clazz R的泛型对象T的clazz
* @return R 泛型不同平台的Result DTO类型
* @author wxz
* @date 2021.03.22 10:32
*/
public abstract void judgeResultSuccess(LZGridPlatformBaseResult result);
* @date 2021.08.31 13:36:11
*/
public abstract <T> R parsePlatformResponseResult(String resultString, Class<T> clazz);
public UploadFileResultDTO uploadFile(UploadFileFormDTO formDTO) {
return null;
}
/**
* @Description 推送ComponentAccessToken
* @param form
* @return void 保持空实现让子类去实现
* @author wxz
* @date 2021.08.30 17:15:01
*/
public void pushComponentAccessToken(ComponentAccessTokenFormDTO form, String platformId, String platformKey) {}
/**
* @description 推送小程序token
*
* @param form
* @param platformId
* @param platformKey
* @return
* @author wxz
* @date 2021.08.31 20:26:51
*/
public void pushAuthorizerAccessToken(AuthorizerAccessTokenFormDTO form, String platformId, String platformKey) {};
}

18
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/DemoApiService.java

@ -14,10 +14,15 @@ import org.springframework.stereotype.Component;
* demo api service
*/
@Component(value = "demoApiService")
public class DemoApiService extends ApiService {
public class DemoApiService extends ApiService<String> {
Logger logger = LoggerFactory.getLogger(DemoApiService.class);
@Override
public String getAccessTokenHeaderName() {
return null;
}
@Override
public String getAccessToken(String platformId) {
return null;
@ -29,8 +34,15 @@ public class DemoApiService extends ApiService {
return null;
}
/**
* @Description 解析平台返回结果
* @param resultString 平台返回结果string
* @return java.lang.String
* @author wxz
* @date 2021.08.30 22:43:24
*/
@Override
public void judgeResultSuccess(LZGridPlatformBaseResult result) {
public <T> String parsePlatformResponseResult(String resultString, Class<T> clazz) {
return null;
}
}

49
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/LuzhouGridPlatformApiService.java

@ -31,7 +31,12 @@ import java.util.concurrent.TimeUnit;
*/
@Slf4j
@Component("luzhouGridPlatformApiService")
public class LuzhouGridPlatformApiService extends ApiService {
public class LuzhouGridPlatformApiService extends ApiService<LZGridPlatformBaseResult> {
@Override
public String getAccessTokenHeaderName() {
return "X-Access-Token";
}
@Override
public String getAccessToken(String platformId) {
@ -58,11 +63,8 @@ public class LuzhouGridPlatformApiService extends ApiService {
throw new RenException("请求第三方平台,获取AccessToken失败。");
}
LZGridPlatformBaseResult<String> platformResult = JSON.parseObject(result.getData(), LZGridPlatformBaseResult.class);
judgeResultSuccess(platformResult);
token = platformResult.getResult();
addAccessTokenToCache(platformId, token, (long)(3600*1.8*1000), TimeUnit.MILLISECONDS);
LZGridPlatformBaseResult<String> lzGridPlatformBaseResult = parsePlatformResponseResult(result.getData(), String.class);
addAccessTokenToCache(platformId, lzGridPlatformBaseResult.getResult(), (long)(3600*1.8*1000), TimeUnit.MILLISECONDS);
}
return token;
}
@ -83,30 +85,24 @@ public class LuzhouGridPlatformApiService extends ApiService {
// 正式调用第三方平台
String argsStr = JSON.toJSONString(formDTO);
String result = sendPostRequest(platformId, ThirdPlatformActions.PROJECT_ASSIST, argsStr, null);
LZGridPlatformBaseResult<String> result = sendPostRequest(platformId, ThirdPlatformActions.PROJECT_ASSIST, argsStr, null, null);
// 开发阶段临时写死
//String result = "{\"eventId\":\"test-task-id\"}";
ProjectAssistResult projectAssistResult = new ProjectAssistResult();
if (!StringUtils.isBlank(result)) {
// 此处要经过一系列业务处理,将第三方平台返回的数据进行解析,等处理最后转换成ProjectAssistResult类型,返回。ProjectAssistResult这个类型是
// 所有apiService的projectAssist方法返回值的统一类型,是我们的epmet-cloud所需要的数据的实体,
// 所有apiService都要想办法转化成这个类型。
LZGridPlatformBaseResult<String> lzResult = JSON.parseObject(result, LZGridPlatformBaseResult.class);
// 此处设置为第三方系统返回的唯一id
projectAssistResult.setTaskId(lzResult.getResult());
}
// 此处设置为第三方系统返回的唯一id
projectAssistResult.setTaskId(result.getResult());
log.info("projectAssist 泸州网格化平台项目协助发送成功");
return projectAssistResult;
}
@Override
public void judgeResultSuccess(LZGridPlatformBaseResult result) {
//LZGridPlatformBaseResult;
if (!"200".equalsIgnoreCase(result.getCode())) {
throw new RenException("泸州网格化平台:返回失败结果,错误码:" + result.getCode());
public <T> LZGridPlatformBaseResult<T> parsePlatformResponseResult(String resultString, Class<T> clazz) {
LZGridPlatformBaseResult<T> baseResult = JSON.parseObject(resultString, LZGridPlatformBaseResult.class);
if (!"200".equalsIgnoreCase(baseResult.getCode())) {
throw new RenException("泸州网格化平台:返回失败结果,错误码:" + baseResult.getCode());
}
return baseResult;
}
@Override
@ -118,16 +114,9 @@ public class LuzhouGridPlatformApiService extends ApiService {
// 正式调用第三方平台
File file = new File(formDTO.getFile().getOriginalFilename());
FileUtils.copyInputStreamToFile(formDTO.getFile().getInputStream(), file);
String result = sendPostRequestToUploadFile(platformId, ThirdPlatformActions.UPLOAD_FILE, file, fileName);
if (!StringUtils.isBlank(result)) {
// 此处要经过一系列业务处理,将第三方平台返回的数据进行解析,等处理最后转换成ProjectAssistResult类型,返回。ProjectAssistResult这个类型是
// 所有apiService的projectAssist方法返回值的统一类型,是我们的epmet-cloud所需要的数据的实体,
// 所有apiService都要想办法转化成这个类型。
LZGridPlatformBaseResult lzResult = JSON.parseObject(result, LZGridPlatformBaseResult.class);
// 此处设置为第三方系统返回的唯一id
resultDTO.setUrl((String) lzResult.getResult());
}
LZGridPlatformBaseResult<String> baseResult = sendPostRequestToUploadFile(platformId, ThirdPlatformActions.UPLOAD_FILE, file, fileName);
// 此处设置为第三方系统返回的唯一id
resultDTO.setUrl(baseResult.getResult());
System.out.println("泸州网格化平台项目文件上传成功");
} catch (Exception e) {
throw new RenException("上传失败");

169
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/PingyinPrivateEpmetApiService.java

@ -0,0 +1,169 @@
package com.epmet.apiservice.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.epmet.apiservice.ApiService;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.feign.ResultDataResolver;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.HttpClientManager;
import com.epmet.commons.tools.utils.Result;
import com.epmet.constant.ThirdPlatformActions;
import com.epmet.dto.form.AuthorizerAccessTokenFormDTO;
import com.epmet.dto.form.ComponentAccessTokenFormDTO;
import com.epmet.dto.result.privateepmet.GetAccessTokenResultDTO;
import com.epmet.openapi.sdk.sign.OpenApiSignUtils;
import com.epmet.redis.ThirdPlatformCache;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@Component("pingyinPrivateEpmetApiService")
@Slf4j
public class PingyinPrivateEpmetApiService extends ApiService<Result> implements ResultDataResolver {
// 认证方式
private String authType = "take_token";
@Override
public String getAccessTokenHeaderName() {
return "AccessToken";
}
@Override
public String getAccessToken(String platformId) {
String accessTokenFromCache = super.getAccessTokenFromCache(platformId);
if (StringUtils.isBlank(accessTokenFromCache)) {
ThirdPlatformCache thirdPlatformInfo = super.getThirdPlatformInfo(platformId);
String apiUrl = getThirdPlatformActionUrl(platformId, ThirdPlatformActions.GET_ACCESS_TOKEN);
String baseUrl = thirdPlatformInfo.getBaseUrl();
String platformKey = thirdPlatformInfo.getPlatformKey();
String platformSecret = thirdPlatformInfo.getPlatformSecret();
String uuid = UUID.randomUUID().toString();
long currentTimeMillis = System.currentTimeMillis();
try {
String sign = createSign(platformKey, platformSecret, uuid, currentTimeMillis, authType, null);
log.info("【调用平阴私有化平台获取AccessToken】参数列表:sign:{}, app_id:{}, auth_type:{}, nonce:{}, timestamp:{}", sign, platformKey, platformSecret, uuid, currentTimeMillis);
String urlParams = super.convertQueryParams2String(constructCommonUrlParamsMap(platformKey, authType, uuid, currentTimeMillis, sign));
String requestUrl = baseUrl.concat(apiUrl).concat(urlParams);
Result<String> stringResult = HttpClientManager.getInstance().sendPostByHttps(requestUrl, "{}");
String remoteResultString = getResultDataOrThrowsException(stringResult, "【调用平阴私有化平台获取AccessToken】", EpmetErrorCode.SERVER_ERROR.getCode(), null);
Result<GetAccessTokenResultDTO> remoteResult = parsePlatformResponseResult(remoteResultString, GetAccessTokenResultDTO.class);
log.info("【调用平阴私有化平台获取AccessToken】结果:{}", remoteResultString);
accessTokenFromCache = remoteResult.getData().getAccessToken();
//(15 * 60 * 1000)为提前获取token。对方token有效期2小时,我们设置有效期为1小时45分钟,留15分钟容错时间,防止时间差
long expire = remoteResult.getData().getExpireTime() - System.currentTimeMillis() - (15 * 60 * 1000);
super.addAccessTokenToCache(platformId, accessTokenFromCache, expire, TimeUnit.MILLISECONDS);
} catch (Exception e) {
throw new RenException(ExceptionUtils.getErrorStackTrace(e));
}
}
return accessTokenFromCache;
}
/**
* @Description 创建签名
* @param platformKey
* @param platformSecret
* @param nonce
* @param timeMillis
* @param authType
* @return java.lang.String
* @author wxz
* @date 2021.08.31 15:37:58
*/
private String createSign(String platformKey, String platformSecret, String nonce, Long timeMillis, String authType, Map<String, String> requestBodyMap) {
HashMap<String, String> contentMap = new HashMap<>();
contentMap.put("app_id", platformKey);
contentMap.put("auth_type", authType);
contentMap.put("nonce", nonce);
contentMap.put("timestamp", String.valueOf(timeMillis));
if (requestBodyMap != null && requestBodyMap.size() > 0) {
contentMap.putAll(requestBodyMap);
}
String sign;
try {
sign = OpenApiSignUtils.createSign(contentMap, platformSecret);
} catch (Exception e) {
String detail = ExceptionUtils.getErrorStackTrace(e);
log.error(detail);
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode(), "【平阴私有化平台apService】创建签名失败");
}
return sign;
}
/**
* @Description 构造url参数map
* @param platformKey
* @param authType
* @param nonce
* @param timeMillis
* @param sign
* @return java.util.Map<java.lang.String,java.lang.String>
* @author wxz
* @date 2021.08.31 14:19:41
*/
private Map<String, String> constructCommonUrlParamsMap(String platformKey, String authType, String nonce, Long timeMillis, String sign) {
HashMap<String, String> map = new HashMap<>();
map.put("app_id", platformKey);
map.put("auth_type", authType);
map.put("nonce", nonce);
map.put("timestamp", String.valueOf(timeMillis));
map.put("sign", sign);
return map;
}
@Override
public <T> Result<T> parsePlatformResponseResult(String resultString, Class<T> clazz) {
Result<T> result;
try {
result = JSON.parseObject(resultString, new TypeReference<Result<T>>(clazz){});
} catch (Exception e) {
String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
log.error(errorStackTrace);
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode(), "【调用平阴私有化服务器,解析返回结果失败】");
}
if (!result.success()) {
throw new RenException(String.format("【请求平阴私有化平台】失败,返回结果string:%s", resultString));
}
return result;
}
@Override
public void pushComponentAccessToken(ComponentAccessTokenFormDTO form, String platformId, String platformKey) {
ThirdPlatformCache thirdPlatformInfo = getThirdPlatformInfo(platformId);
String nonce = UUID.randomUUID().toString();
long timeMillis = System.currentTimeMillis();
Map<String, String> bodyMap = null;
try {
bodyMap = ConvertUtils.entityToMap(form);
} catch (Exception e) {
String detail = ExceptionUtils.getErrorStackTrace(e);
log.error(detail);
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode(), "【推送ComponentAccessToken】requestBody转化为map失败");
}
String sign = createSign(platformKey, thirdPlatformInfo.getPlatformSecret(), nonce, timeMillis, authType, bodyMap);
Map<String, String> urlParams = constructCommonUrlParamsMap(platformKey, authType, nonce, timeMillis, sign);
String jsonString = JSON.toJSONString(form);
Result result = super.sendPostRequest(platformId, ThirdPlatformActions.PUSH_COMPONENT_ACCESS_TOKEN, jsonString, null, urlParams);
getResultDataOrThrowsException(result, "【平阴私有化平台】推送ComponentAccessToken", EpmetErrorCode.SERVER_ERROR.getCode(), null);
}
@Override
public void pushAuthorizerAccessToken(AuthorizerAccessTokenFormDTO form, String platformId, String platformKey) {
}
}

50
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/PrivateEpmetController.java

@ -0,0 +1,50 @@
package com.epmet.controller;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.form.AuthorizerAccessTokenFormDTO;
import com.epmet.dto.form.ComponentAccessTokenFormDTO;
import com.epmet.service.PrivateEpmetService;
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;
/**
* @Description 私有化平台相关controller
* @author wxz
* @date 2021.08.30 15:18:51
*/
@RestController
@RequestMapping("/private-epmet")
public class PrivateEpmetController {
@Autowired
private PrivateEpmetService privateEpmetService;
/**
* @Description 接收推送component access
* @param input
* @return com.epmet.commons.tools.utils.Result
* @author wxz
* @date 2021.08.30 15:18:57
*/
@PostMapping("push-component-access-token")
public Result pushComponentAccessToken(@RequestBody ComponentAccessTokenFormDTO input) {
privateEpmetService.pushComponentAccessToken(input);
return new Result();
}
/**
* @Description 接收推送AuthorizerTokens
* @param input
* @return com.epmet.commons.tools.utils.Result
* @author wxz
* @date 2021.08.30 16:36:02
*/
@PostMapping("push-authorizer-tokens")
public Result pushAuthorizerTokens(@RequestBody AuthorizerAccessTokenFormDTO input) {
privateEpmetService.pushAuthorizerTokens(input);
return new Result();
}
}

30
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/TestConttroller.java

@ -0,0 +1,30 @@
package com.epmet.controller;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.form.ComponentAccessTokenFormDTO;
import com.epmet.service.ComponentVerifyTicketService;
import com.epmet.service.PrivateEpmetService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
@RequestMapping("test")
public class TestConttroller {
@Autowired
private ComponentVerifyTicketService componentVerifyTicketService;
@PostMapping("push-component-access-token")
public Result testPushComponentAccessToken() {
ComponentAccessTokenFormDTO form = new ComponentAccessTokenFormDTO();
form.setComponentAccessToken("token...");
form.setExpiresInTime(new Date());
componentVerifyTicketService.pushComponentAccessToken2PrivateEpmetPlatforms(form);
return new Result();
}
}

10
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ThirdplatformActionDao.java

@ -22,6 +22,8 @@ import com.epmet.entity.ThirdplatformActionEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
*
*
@ -38,4 +40,12 @@ public interface ThirdplatformActionDao extends BaseDao<ThirdplatformActionEntit
* @date 2021.03.16 13:35
*/
ThirdplatformActionEntity getByPlatformIdAndActionKey(@Param("platformId") String platformId, @Param("action") String action);
/**
* @Description 列出平台的操作列表
* @param platformId
* @return com.epmet.entity.ThirdplatformActionEntity
* @author wxz
* @date 2021.08.31 15:23:14
*/
List<ThirdplatformActionEntity> listPlatformActions(@Param("platformId") String platformId);
}

10
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ThirdplatformCustomerRegisterDao.java

@ -19,6 +19,7 @@ package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.form.PlatformUnregisterFormDTO;
import com.epmet.dto.result.ThirdPlatformActionsResultDTO;
import com.epmet.entity.ThirdplatformCustomerRegisterEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -55,4 +56,13 @@ public interface ThirdplatformCustomerRegisterDao extends BaseDao<ThirdplatformC
* @Date 10:15 2021-04-09
**/
void unregisterPlatformCustomer(PlatformUnregisterFormDTO formDTO);
/**
* @Description 已知操作的key查询哪些app可以做此操作
* @param actionKey 操作key
* @return java.util.List<com.epmet.dto.result.ThirdPlatformActionsResultDTO>
* @author wxz
* @date 2021.08.30 17:07:32
*/
List<ThirdPlatformActionsResultDTO> listPlatformsByActionKey(@Param("actionKey") String actionKey);
}

19
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/redis/ThirdPlatformCache.java

@ -0,0 +1,19 @@
package com.epmet.redis;
import lombok.Data;
/**
* @Description 第三方平台缓存对象
* @author wxz
* @date 2021.08.31 14:41:49
*/
@Data
public class ThirdPlatformCache {
//String platformKey, String platformSecret, String platformName, String apiService, String baseUrl
private String platformId;
private String platformKey;
private String platformSecret;
private String platformName;
private String apiService;
private String baseUrl;
}

3
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ComponentVerifyTicketService.java

@ -2,6 +2,7 @@ package com.epmet.service;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.dto.form.AuthCodeAndTimeFromDTO;
import com.epmet.dto.form.ComponentAccessTokenFormDTO;
import org.springframework.web.bind.annotation.RequestBody;
import javax.servlet.http.HttpServletRequest;
@ -48,4 +49,6 @@ public interface ComponentVerifyTicketService {
*/
void redirectUri(TokenDto tokenDto, @RequestBody AuthCodeAndTimeFromDTO fromDTO);
public void pushComponentAccessToken2PrivateEpmetPlatforms(ComponentAccessTokenFormDTO input);
}

19
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/PrivateEpmetService.java

@ -0,0 +1,19 @@
package com.epmet.service;
import com.epmet.dto.form.AuthorizerAccessTokenFormDTO;
import com.epmet.dto.form.ComponentAccessTokenFormDTO;
public interface PrivateEpmetService {
void pushAuthorizerTokens(AuthorizerAccessTokenFormDTO input);
/**
* @Description 推送component access token
* @param input
* @return void
* @author wxz
* @date 2021.08.30 16:17:48
*/
void pushComponentAccessToken(ComponentAccessTokenFormDTO input);
void pushVerifyTicket(String ticket);
}

10
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ThirdPlatformService.java

@ -5,6 +5,7 @@ import com.epmet.dto.form.CustomerFormDTO;
import com.epmet.dto.form.ThirdPlatformFormDTO;
import com.epmet.dto.form.PlatformRegisterFormDTO;
import com.epmet.dto.form.PlatformUnregisterFormDTO;
import com.epmet.dto.result.ThirdPlatformActionsResultDTO;
import com.epmet.dto.result.ThirdplatformResultDTO;
import java.util.List;
@ -100,4 +101,13 @@ public interface ThirdPlatformService {
* @Date 10:15 2021-04-09
**/
void registerThirdPlatformCustomer(PlatformRegisterFormDTO formDTO);
/**
* @Description 已知操作的key查询哪些app可以做此操作
* @param actionKey
* @return java.util.List<com.epmet.dto.result.ThirdplatformResultDTO>
* @author wxz
* @date 2021.08.30 16:59:13
*/
List<ThirdPlatformActionsResultDTO> listPlatformsByActionKey(String actionKey);
}

203
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ComponentVerifyTicketServiceImpl.java

@ -4,12 +4,15 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.client.config.utils.IOUtils;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.epmet.apiservice.ApiService;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.HttpClientManager;
import com.epmet.constant.ModuleConstant;
import com.epmet.constant.ThirdPlatformActions;
import com.epmet.constant.ThirdRedisKeyConstant;
import com.epmet.constant.ThirdRunTimeInfoConstant;
import com.epmet.dao.*;
@ -21,7 +24,9 @@ import com.epmet.feign.OperCrmOpenFeignClient;
import com.epmet.mpaes.WXBizMsgCrypt;
import com.epmet.mpaes.WXXmlToMapUtil;
import com.epmet.redis.RedisThird;
import com.epmet.service.ApiServiceSelector;
import com.epmet.service.ComponentVerifyTicketService;
import com.epmet.service.ThirdPlatformService;
import com.epmet.wxapi.constant.WxMaCodeConstant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -47,7 +52,7 @@ import static com.epmet.constant.ThirdRunTimeInfoConstant.*;
*/
@Slf4j
@Service
public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketService {
public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketService, ApiServiceSelector {
@Autowired
private RedisThird redisThird;
@ -94,6 +99,9 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
@Autowired
private PaCustomerDao paCustomerDao;
@Autowired
private ThirdPlatformService thirdPlatformService;
@Value("${third.platform.appId}")
private String componentAppId;
@Value("${third.platform.appSecret}")
@ -104,8 +112,8 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
private String token;
/**
* @Description 获得授权事件的票据
* @param
* @Description 获得授权事件的票据
* @author zxc
*/
@Transactional(rollbackFor = Exception.class)
@ -123,23 +131,23 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
String nonce = request.getParameter(ModuleConstant.NONCE);
String encryptType = request.getParameter(ModuleConstant.ENCRYPT_TYPE);
String signature = request.getParameter(ModuleConstant.SIGNATURE);
log.info(String.format(ThirdRunTimeInfoConstant.VERIFY_TICKET,msgSignature,timeStamp,nonce,encryptType,signature));
log.info(String.format(ThirdRunTimeInfoConstant.VERIFY_TICKET, msgSignature, timeStamp, nonce, encryptType, signature));
// 从请求中读取整个post数据
InputStream inputStream;
String postData = null;
inputStream = request.getInputStream();
postData= IOUtils.toString(inputStream,ModuleConstant.UTF8);
WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(token,aesKey,componentAppId);
postData = IOUtils.toString(inputStream, ModuleConstant.UTF8);
WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(token, aesKey, componentAppId);
String msg = wxBizMsgCrypt.decryptMsg(msgSignature, timeStamp, nonce, postData);
log.info(String.format(ThirdRunTimeInfoConstant.MSG,msg));
log.info(String.format(ThirdRunTimeInfoConstant.MSG, msg));
// 将xml转为map
Map<String, String> result = WXXmlToMapUtil.xmlToMap(msg);
String infotype = result.get(ModuleConstant.INFO_TYPE);
log.info(String.format(ThirdRunTimeInfoConstant.INFO_TYPE,infotype));
switch (infotype){
log.info(String.format(ThirdRunTimeInfoConstant.INFO_TYPE, infotype));
switch (infotype) {
case ModuleConstant.TICKET_UNDERLINE_KEY: //接收票据 【component_verify_ticket】
String ComponentVerifyTicket = result.get(ModuleConstant.TICKET_KEY);
log.info(String.format(COMPONENT_VERIFY_TICKET,ComponentVerifyTicket));
log.info(String.format(COMPONENT_VERIFY_TICKET, ComponentVerifyTicket));
// 缓存 ticket
redisThird.setComponentVerifyTicket(ComponentVerifyTicket);
// 存数据库
@ -149,7 +157,7 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
//先逻辑删
ticketDao.deleteOldComponentVerifyTicket();
ticketDao.insertComponentVerifyTicket(ticketFormDTO);
log.info(ModuleConstant.TICKET_UNDERLINE_KEY+":"+ComponentVerifyTicket);
log.info(ModuleConstant.TICKET_UNDERLINE_KEY + ":" + ComponentVerifyTicket);
break;
case ModuleConstant.AUTHORIZED: //授权成功
this.disposeAuthResult(result);
@ -173,7 +181,7 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
}
log.info(ThirdRunTimeInfoConstant.END_TICKET);
Integer tokenCount = componentAccessTokenDao.selectAccessTokenCount();
if (tokenCount == NumConstant.ZERO){
if (tokenCount == NumConstant.ZERO) {
String accessTokenCountFlag = ModuleConstant.ACCOUNT_TOKEN_FLAG_ONE;
this.getComponentAccessToken(accessTokenCountFlag);
}
@ -181,14 +189,14 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
}
/**
* @Description 授权结果插入
* @param result
* @Description 授权结果插入
* @author zxc
*/
@Transactional(rollbackFor = Exception.class)
public void disposeAuthResult(Map<String,String> result){
public void disposeAuthResult(Map<String, String> result) {
Map tempMap = result;
Map<String,Object> data = tempMap;
Map<String, Object> data = tempMap;
AuthResultRecordFormDTO authResultRecord = ConvertUtils.mapToEntity(data, AuthResultRecordFormDTO.class);
authResultRecord.setWechatCreateTime(this.sToDate(result.get(ModuleConstant.CREATE_TIME)));
if (result.containsKey(ModuleConstant.AUTHORIZATION_CODE_EXPIRED_TIME)) {
@ -199,9 +207,9 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
}
/**
* @Description 定时获取 (令牌component_access_token) 第三方与微信交互使用的component_access_token
* 每十分钟执行一次,判断是否有马上超时的15分钟以内算马上超时
* @param accessTokenCountFlag 表里的 component_access_token的数量
* @Description 定时获取 (令牌component_access_token) 第三方与微信交互使用的component_access_token
* 每十分钟执行一次,判断是否有马上超时的15分钟以内算马上超时
* @author zxc
*/
@Transactional(rollbackFor = Exception.class)
@ -218,7 +226,7 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
jsonObject.put(ModuleConstant.COMPONENT_APPID, componentAppId);
jsonObject.put(ModuleConstant.COMPONENT_APPSECRET, appSecret);
jsonObject.put(ModuleConstant.TICKET_UNDERLINE_KEY, componentVerifyTicket);
log.info(String.format(ThirdRunTimeInfoConstant.COMPONENT_ACCESS_TOKEN,componentVerifyTicket));
log.info(String.format(ThirdRunTimeInfoConstant.COMPONENT_ACCESS_TOKEN, componentVerifyTicket));
String post = HttpClientManager.getInstance().sendPostByJSON(WxMaCodeConstant.API_COMPONENT_TOKEN_URL, JSON.toJSONString(jsonObject)).getData();
Map hashMap = JSON.parseObject(post, Map.class);
if (!hashMap.containsKey(ModuleConstant.ERR_MSG)) {
@ -236,6 +244,13 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
componentAccessTokenDao.insertComponentAccessToken(formDTO);
//存缓存
redisThird.setComponentAccessToken(componentAccessToken);
//推送到私有化平台们
try {
pushComponentAccessToken2PrivateEpmetPlatforms(formDTO);
} catch (Exception e) {
String detail = ExceptionUtils.getErrorStackTrace(e);
log.error(detail);
}
} else {
throw new RenException(ThirdRunTimeInfoConstant.FAILURE_ACCESS_TOKEN);
}
@ -245,8 +260,29 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
}
/**
* @Description 获取预授权码
* @param input
* @return void
* @Description 推送component access token到私有化平台
* @author wxz
* @date 2021.08.30 17:12:15
*/
public void pushComponentAccessToken2PrivateEpmetPlatforms(ComponentAccessTokenFormDTO input) {
List<ThirdPlatformActionsResultDTO> platforms = thirdPlatformService.listPlatformsByActionKey(ThirdPlatformActions.PUSH_COMPONENT_ACCESS_TOKEN);
platforms.stream().forEach(p -> {
log.info("推送component-access-token到私有化平台:platformId:{}, platformKey:{}, platformName:{}, apiUrl:{}", p.getPlatformId(), p.getPlatformKey(), p.getPlatformName(), p.getApiUrl());
ApiService apiService = selectApiService(p.getPlatformId());
try {
apiService.pushComponentAccessToken(input, p.getPlatformId(), p.getPlatformKey());
} catch (Exception e) {
String detail = ExceptionUtils.getErrorStackTrace(e);
log.error(detail);
}
});
}
/**
* @param
* @Description 获取预授权码
* @author zxc
*/
@Transactional(rollbackFor = Exception.class)
@ -258,7 +294,7 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
JSONObject jsonObject = new JSONObject();
jsonObject.put(ModuleConstant.COMPONENT_APPID, componentAppId);
String post = HttpClientManager.getInstance().sendPostByJSON(WxMaCodeConstant.API_CREATE_PREAUTHCODE_URL + accessToken, JSON.toJSONString(jsonObject)).getData();
log.info(String.format(POST_RESULT,post));
log.info(String.format(POST_RESULT, post));
Map hashMap = JSON.parseObject(post, Map.class);
if (!hashMap.containsKey(ModuleConstant.ERR_MSG)) {
preAuthCode = hashMap.get(ModuleConstant.PRE_AUTH_CODE).toString();
@ -283,11 +319,11 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
}
/**
* @Description 使用授权码获取授权信息 请求参数component_access_tokencomponent_appidauthorization_code
* @Description 使用授权码获取授权信息 请求参数component_access_tokencomponent_appidauthorization_code
* @author zxc
*/
@Transactional(rollbackFor = Exception.class)
public AuthorizationInfoResultDTO authInfoByAuthCode(String authCode,String customerId,String clientType) {
public AuthorizationInfoResultDTO authInfoByAuthCode(String authCode, String customerId, String clientType) {
log.info(START_GET_AUTH_INFO);
AuthorizationInfoResultDTO authorizationInfoResultDTO = new AuthorizationInfoResultDTO();
// 获取令牌【component_access_token】
@ -297,11 +333,11 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
jsonObject.put(ModuleConstant.COMPONENT_APPID, componentAppId);
jsonObject.put(ModuleConstant.AUTHORIZATION_CODE, authCode);
String authInfo = HttpClientManager.getInstance().sendPostByJSON(WxMaCodeConstant.API_QUERY_AUTH_URL + accessToken, JSON.toJSONString(jsonObject)).getData();
HashMap<String,Map> hashMap = JSON.parseObject(authInfo, HashMap.class);
HashMap<String, Map> hashMap = JSON.parseObject(authInfo, HashMap.class);
Map map = hashMap.get(ModuleConstant.AUTHORIZATION_INFO);
authorizationInfoResultDTO = ConvertUtils.mapToEntity(map, AuthorizationInfoResultDTO.class);
String authAppId = authorizationInfoResultDTO.getAuthorizer_appid();
log.info("授权信息:"+map);
log.info("授权信息:" + map);
String expiresIn = authorizationInfoResultDTO.getExpires_in().toString();
Date expiresInTime = this.countExpirationTime(expiresIn);
//授权信息分为两张表,基础信息authorization_info,授权列表func_info
@ -314,14 +350,14 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
authInfoDTO.setCustomerId(customerId);
authInfoDTO.setClientType(clientType);
List<Map> func_info = authorizationInfoResultDTO.getFunc_info();
log.info("权限列表信息:"+func_info);
log.info("权限列表信息:" + func_info);
String funcInfo = JSON.toJSONString(func_info);
authInfoDTO.setFuncInfo(funcInfo);
//先逻辑删除,在插入
authorizationInfoDao.updateOldAuthorizationInfo(authAppId);
authorizationInfoDao.insertAuthorizationInfo(authInfoDTO);
// 授权信息放入缓存
redisThird.setAuthInfo(authorizationInfoResultDTO,customerId,clientType);
redisThird.setAuthInfo(authorizationInfoResultDTO, customerId, clientType);
//authorizer_refresh_token 放入缓存
redisThird.setAuthorizerRefreshToken(authInfoDTO);
log.info(END_GET_AUTH_INFO);
@ -329,8 +365,8 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
}
/**
* @Description 获取/刷新接口调用令牌
* @param
* @Description 获取/刷新接口调用令牌
* @author zxc
*/
@Transactional(rollbackFor = Exception.class)
@ -338,7 +374,7 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
public void refreshToken() {
//查询 即将过期的 authorizer_access_token
List<WillOverDueResultDTO> willOverDueResultDTOS = authorizationInfoDao.checkWillOverDue();
if (willOverDueResultDTOS.size() != NumConstant.ZERO && null != willOverDueResultDTOS){
if (willOverDueResultDTOS.size() != NumConstant.ZERO && null != willOverDueResultDTOS) {
log.info("查询到即将过期的authorizer_access_token");
willOverDueResultDTOS.forEach(willOverDueDTO -> {
String authAppId = willOverDueDTO.getAuthAppId();
@ -346,10 +382,10 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
String clientType = willOverDueDTO.getClientType();
JSONObject jsonObject = new JSONObject();
//授权方AppId
jsonObject.put(ModuleConstant.AUTHORIZER_APPID,authAppId);
jsonObject.put(ModuleConstant.AUTHORIZER_APPID, authAppId);
//第三方平台AppId
jsonObject.put(ModuleConstant.COMPONENT_APPID,componentAppId);
jsonObject.put(ModuleConstant.AUTHORIZER_REFRESH_TOKEN,willOverDueDTO.getAuthorizerRefreshToken());
jsonObject.put(ModuleConstant.COMPONENT_APPID, componentAppId);
jsonObject.put(ModuleConstant.AUTHORIZER_REFRESH_TOKEN, willOverDueDTO.getAuthorizerRefreshToken());
String componentAccessToken = redisThird.getComponentAccessToken();
String data = HttpClientManager.getInstance().sendPostByJSON(WxMaCodeConstant.API_AUTHORIZER_TOKEN_URL + componentAccessToken, JSON.toJSONString(jsonObject)).getData();
Map map = JSON.parseObject(data, HashMap.class);
@ -368,7 +404,7 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
formDTO.setAuthAppid(authAppId);
formDTO.setClientType(clientType);
AuthorizationInfoFormDTO authorizationInfo = new AuthorizationInfoFormDTO();
BeanUtils.copyProperties(formDTO,authorizationInfo);
BeanUtils.copyProperties(formDTO, authorizationInfo);
authorizationInfo.setAuthorizerAppid(authAppId);
//先逻辑删除,在插入
authorizationInfoDao.deleteOldAuthorizerAccessToken(customerId, clientType);
@ -380,7 +416,7 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
resultDTO.setAuthorizer_refresh_token(authorizerRefreshToken);
resultDTO.setAuthorizer_appid(authAppId);
resultDTO.setExpires_in(7200);
redisThird.setAuthInfo(resultDTO,customerId,clientType);
redisThird.setAuthInfo(resultDTO, customerId, clientType);
}
});
log.info("更新authorizer_access_token成功");
@ -389,13 +425,13 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
}
/**
* @Description 授权回调URL,回调时并获取授权信息
* @param
* @Description 授权回调URL, 回调时并获取授权信息
* @author zxc
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void redirectUri(TokenDto tokenDto, @RequestBody AuthCodeAndTimeFromDTO authCodeAndTime){
public void redirectUri(TokenDto tokenDto, @RequestBody AuthCodeAndTimeFromDTO authCodeAndTime) {
log.info("开始执行回调URL");
String authCode = authCodeAndTime.getAuthCode();
String clientType = authCodeAndTime.getClientType();
@ -413,7 +449,7 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
formDTO.setClientType(clientType);
formDTO.setCustomerId(customerId);
log.info(ThirdRunTimeInfoConstant.BEGIN_DELETE_INSERT_AUTH_CODE);
authCodeDao.deleteCustomerAuthCode(customerId,clientType);
authCodeDao.deleteCustomerAuthCode(customerId, clientType);
authCodeDao.insertRedirectAuthCode(formDTO);
//authCode存缓存
redisThird.setAuthCode(formDTO);
@ -423,12 +459,12 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
List<FixationAppIdResultDTO> fixationAppIdResultDTOS = fixationAppIdDao.selectFixationInfos();
String finalCustomerId = customerId;//
fixationAppIdResultDTOS.forEach(fixationAppId -> {
if (fixationAppId.getAppId().equals(authAppId)){
if (fixationAppId.getAppId().equals(authAppId)) {
// TODO 是城阳项目或者党群e事通
// crm表中的customerId【原customerId】
String masterCustomerId = fixationAppId.getMasterCustomerId();
formDTO.setCustomerId(masterCustomerId);
authCodeDao.deleteCustomerAuthCode(finalCustomerId,clientType);
authCodeDao.deleteCustomerAuthCode(finalCustomerId, clientType);
authCodeDao.insertRedirectAuthCode(formDTO);
//authCode存缓存
redisThird.setAuthCode(formDTO);
@ -447,37 +483,37 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
//替换 新customerId为旧customerId
customerId = formDTO.getCustomerId();
// 2. 创建开放平台账号并绑定 或者 直接绑定开放平台
this.createAndBindOpenAccount(customerId,authAppId,clientType);
this.createAndBindOpenAccount(customerId, authAppId, clientType);
// 3. 更新 customer_mp 表授权状态和AuthAppId
this.updateCustomerMpAppId(customerId,authAppId,clientType);
authCodeDao.updateAppId(customerId,clientType,authAppId);
this.updateCustomerMpAppId(customerId, authAppId, clientType);
authCodeDao.updateAppId(customerId, clientType, authAppId);
// 4. 保存授权方账户信息
this.saveAuthAccountInfo(customerId,authAppId,clientType);
this.saveAuthAccountInfo(customerId, authAppId, clientType);
// 5. 校验客户居民端、工作端小程序是否全部授权,全部授权完成的推送钉钉消息 sun
this.checkAuthorization(customerId);
log.info("回调结束");
}
/**
* @Description 获取授权方的帐号基本信息并保存
* @param customerId
* @param authAppId
* @Description 获取授权方的帐号基本信息并保存
* @author zxc
*/
@Transactional(rollbackFor = Exception.class)
public void saveAuthAccountInfo(String customerId, String authAppId,String clientType) {
public void saveAuthAccountInfo(String customerId, String authAppId, String clientType) {
log.info("开始执行保存授权账户基本信息");
JSONObject jsonObject = new JSONObject();
jsonObject.put(ModuleConstant.COMPONENT_APP_ID,componentAppId);
jsonObject.put(ModuleConstant.AUTHORIZER_APP_ID,authAppId);
jsonObject.put(ModuleConstant.COMPONENT_APP_ID, componentAppId);
jsonObject.put(ModuleConstant.AUTHORIZER_APP_ID, authAppId);
String componentAccessToken = redisThird.getComponentAccessToken();
String data = HttpClientManager.getInstance().sendPostByJSON(WxMaCodeConstant.API_GET_AUTHORIZER_INFO + componentAccessToken , JSON.toJSONString(jsonObject)).getData();
Map<String,Map> map = JSON.parseObject(data, Map.class);
String data = HttpClientManager.getInstance().sendPostByJSON(WxMaCodeConstant.API_GET_AUTHORIZER_INFO + componentAccessToken, JSON.toJSONString(jsonObject)).getData();
Map<String, Map> map = JSON.parseObject(data, Map.class);
Map authorizerInfo = map.get(ModuleConstant.AUTHORIZER_INFO);
log.info("授权信息:"+authorizerInfo);
log.info("授权信息:" + authorizerInfo);
// 存在 “miniprograminfo” 字段为小程序,不存在为公众号
boolean keyExist = authorizerInfo.containsKey(ModuleConstant.MINI_PROGRAM_INFO);
if (keyExist == true){
if (keyExist == true) {
log.info("授权方为小程序 并 开始插入信息");
MiniInfoFormDTO miniInfoFormDTO = ConvertUtils.mapToEntity(authorizerInfo, MiniInfoFormDTO.class);
miniInfoFormDTO.setCustomerId(customerId);
@ -498,22 +534,22 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
businessInfoForm.setPrimaryId(primaryId);
businessInfoList.add(businessInfoForm);
});
businessInfoDao.deleteBusinessInfo(customerId,clientType);
businessInfoDao.deleteBusinessInfo(customerId, clientType);
businessInfoDao.insertBusinessInfo(businessInfoList);
//todo 小程序配置的合法域名信息插入
Map miniProgramInfo = (Map) authorizerInfo.get(ModuleConstant.MINI_PROGRAM_INFO);
List<MiniNetworkInfoFormDTO> networkInfoList = new ArrayList<>();
Map networkInfo = (Map) miniProgramInfo.get(ModuleConstant.NETWORK);
networkInfo.forEach((key,value) -> {
networkInfo.forEach((key, value) -> {
MiniNetworkInfoFormDTO miniNetworkInfoForm = new MiniNetworkInfoFormDTO();
miniNetworkInfoForm .setCustomerId(customerId);
miniNetworkInfoForm.setCustomerId(customerId);
miniNetworkInfoForm.setClientType(clientType);
miniNetworkInfoForm.setNetworkType(key.toString());
miniNetworkInfoForm.setUrl(value.toString());
miniNetworkInfoForm.setPrimaryId(primaryId);
networkInfoList.add(miniNetworkInfoForm);
});
miniNetworkInfoDao.deleteNetworkInfo(customerId,clientType);
miniNetworkInfoDao.deleteNetworkInfo(customerId, clientType);
miniNetworkInfoDao.insertNetworkInfo(networkInfoList);
//todo 小程序配置的类目信息插入
List<MiniCategoryInfoFormDTO> categoryInfoList = new ArrayList<>();
@ -533,7 +569,7 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
miniCategoryInfoDao.deleteCategoryInfo(customerId, clientType);
miniCategoryInfoDao.insertCategoryInfo(categoryInfoList);
}
}else {
} else {
log.info("授权方为公众号 并 开始插入信息");
PaInfoFormDTO paInfoFormDTO = ConvertUtils.mapToEntity(authorizerInfo, PaInfoFormDTO.class);
//公众号基本信息插入
@ -551,7 +587,7 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
businessInfoForm.setPrimaryId(primaryId);
businessInfoList.add(businessInfoForm);
});
businessInfoDao.deleteBusinessInfo(customerId,clientType);
businessInfoDao.deleteBusinessInfo(customerId, clientType);
businessInfoDao.insertBusinessInfo(businessInfoList);
}
log.info("保存授权方基本信息结束");
@ -559,12 +595,12 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
}
/**
* @Description 回填 customer_mp appId , 更改授权状态
* @param
* @Description 回填 customer_mp appId , 更改授权状态
* @author zxc
*/
@Transactional(rollbackFor = Exception.class)
public void updateCustomerMpAppId(String customerId,String authAppId,String clientType){
public void updateCustomerMpAppId(String customerId, String authAppId, String clientType) {
log.info("==========回填customer_mp开始==========");
Integer checkBindCount = customerMpDao.checkBind(authAppId, clientType);
if (checkBindCount == NumConstant.ZERO) {
@ -578,14 +614,14 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
log.info("==========回填customer_mp结束==========");
}
public void createAndBindOpenAccount(String customerId,String authAppId,String clientType){
public void createAndBindOpenAccount(String customerId, String authAppId, String clientType) {
log.info(ThirdRunTimeInfoConstant.BEGIN_CREATE_OPEN);
Map<String, Object> authorizerRefreshToken = redisThird.getAuthorizerRefreshToken(customerId + ThirdRedisKeyConstant.COLON + clientType);
String authorizerAccessToken = authorizerRefreshToken.get("authorizerAccessToken").toString();
JSONObject bindInfoForm = new JSONObject();
bindInfoForm.put(ModuleConstant.LOW_APP_ID,authAppId);
bindInfoForm.put(ModuleConstant.LOW_APP_ID, authAppId);
String bindResult = HttpClientManager.getInstance().sendPostByJSON(WxMaCodeConstant.API_OPEN_GET + authorizerAccessToken, JSON.toJSONString(bindInfoForm)).getData();
Map<String,Object> bindInfo = JSON.parseObject(bindResult, Map.class);
Map<String, Object> bindInfo = JSON.parseObject(bindResult, Map.class);
boolean bindStatus = bindInfo.containsKey(ModuleConstant.OPEN_APP_ID);
if (bindStatus != true) {
Integer authCount = customerMpDao.selectAuthCount(customerId);
@ -663,11 +699,11 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
}
/**
* @Description 转换过期时间
* @param expiresIn
* @Description 转换过期时间
* @author zxc
*/
public Date countExpirationTime(String expiresIn){
public Date countExpirationTime(String expiresIn) {
expiresIn = expiresIn + "000";
Date date = new Date();
long l = date.getTime() + Long.valueOf(expiresIn);
@ -676,21 +712,21 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
}
/**
* @Description 查询客户Id
* @param tokenDto
* @Description 查询客户Id
* @author zxc
*/
public String getLoginUserCustomerId(TokenDto tokenDto){
public String getLoginUserCustomerId(TokenDto tokenDto) {
PaCustomerUserAgencyDTO result = paCustomerUserAgencyDao.selectCustomerIdByUserId(tokenDto.getUserId());
return result.getCustomerId();
}
/**
* @Description 时间戳秒级转换 Date
* @param t
* @Description 时间戳秒级转换 Date
* @author zxc
*/
public Date sToDate(String t){
public Date sToDate(String t) {
Long aLong = Long.valueOf(t + "000");
Date date = new Date();
date.setTime(aLong);
@ -699,24 +735,24 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
/**
* @author sun
* @Description 校验客户两哥小程序是否完成授权
* @Description 校验客户两哥小程序是否完成授权
*/
private void checkAuthorization(String customerId){
private void checkAuthorization(String customerId) {
List<CustomerMpDTO> list = customerMpDao.selectByCustomerId(customerId);
AtomicBoolean bl = new AtomicBoolean(false);
list.forEach(mp->{
if(mp.getAuthorizationFlag()!=NumConstant.ONE){
list.forEach(mp -> {
if (mp.getAuthorizationFlag() != NumConstant.ONE) {
bl.set(true);
}
});
if(!bl.get()){
if (!bl.get()) {
dDingNews(customerId);
}
}
/**
* @author sun
* @Description 发送钉钉消息通知运营人员有新客户完成授权
* @Description 发送钉钉消息通知运营人员有新客户完成授权
*/
private String dDingNews(String customerId) {
//1.查询客户及管理员信息,用于发送消息使用
@ -739,8 +775,29 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe
"> 管理员称谓: " + result.getAppellation() + "\n\n" +
"> 联系方式: " + result.getPhone() + "\n");
request.setMarkdown(markdown);
HttpClientManager.getInstance().sendDingMsg(JSON.toJSONString(request),url,secret);
HttpClientManager.getInstance().sendDingMsg(JSON.toJSONString(request), url, secret);
return null;
}
/**
* @Description 推送AuthorizerAccessToken到私有化平台们
* @param form
* @return void
* @author wxz
* @date 2021.08.31 17:22:04
*/
public void pushAuthorizerAccessToken2PrivateEpmets(AuthorizerAccessTokenFormDTO form) {
List<ThirdPlatformActionsResultDTO> platforms = thirdPlatformService.listPlatformsByActionKey(ThirdPlatformActions.PUSH_AUTHORIZER_ACCESS_TOKEN);
platforms.stream().forEach(p -> {
log.info("推送authorizer-access-token到私有化平台:platformId:{}, platformKey:{}, platformName:{}, apiUrl:{}", p.getPlatformId(), p.getPlatformKey(), p.getPlatformName(), p.getApiUrl());
ApiService apiService = selectApiService(p.getPlatformId());
try {
apiService.pushAuthorizerAccessToken(form, p.getPlatformId(), p.getPlatformKey());
} catch (Exception e) {
String detail = ExceptionUtils.getErrorStackTrace(e);
log.error(detail);
}
});
}
}

71
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/PrivateEpmetServiceImpl.java

@ -0,0 +1,71 @@
package com.epmet.service.impl;
import com.epmet.constant.ThirdRunTimeInfoConstant;
import com.epmet.dao.AuthorizationInfoDao;
import com.epmet.dao.ComponentAccessTokenDao;
import com.epmet.dao.ComponentVerifyTicketDao;
import com.epmet.dto.form.AuthorizationInfoFormDTO;
import com.epmet.dto.form.AuthorizerAccessTokenFormDTO;
import com.epmet.dto.form.ComponentAccessTokenFormDTO;
import com.epmet.dto.result.AuthorizationInfoResultDTO;
import com.epmet.redis.RedisThird;
import com.epmet.service.PrivateEpmetService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Slf4j
public class PrivateEpmetServiceImpl implements PrivateEpmetService {
@Autowired
private ComponentVerifyTicketDao componentVerifyTicketDao;
@Autowired
private AuthorizationInfoDao authorizationInfoDao;
@Autowired
private ComponentAccessTokenDao componentAccessTokenDao;
@Autowired
private RedisThird redisThird;
@Transactional(rollbackFor = RuntimeException.class)
@Override
public void pushAuthorizerTokens(AuthorizerAccessTokenFormDTO input) {
System.out.println("收到AuthorizerAccessTokenFormDTO:" + input);
//AuthorizationInfoFormDTO authorizationInfo = new AuthorizationInfoFormDTO();
//BeanUtils.copyProperties(input,authorizationInfo);
//authorizationInfo.setAuthorizerAppid(input.getAuthAppid());
////先逻辑删除,在插入
//authorizationInfoDao.deleteOldAuthorizerAccessToken(input.getCustomerId(), input.getClientType());
//authorizationInfoDao.insertAuthorizerAccessToken(input);
////缓存 refreshAuthorizerAccessToken
//redisThird.setAuthorizerRefreshToken(authorizationInfo);
//AuthorizationInfoResultDTO resultDTO = new AuthorizationInfoResultDTO();
//resultDTO.setAuthorizer_access_token(input.getAuthorizerAccessToken());
//resultDTO.setAuthorizer_refresh_token(input.getAuthorizerRefreshToken());
//resultDTO.setAuthorizer_appid(input.getAuthAppid());
//resultDTO.setExpires_in(7200);
//redisThird.setAuthInfo(resultDTO,input.getCustomerId(),input.getClientType());
}
@Override
@Transactional(rollbackFor = RuntimeException.class)
public void pushComponentAccessToken(ComponentAccessTokenFormDTO componentAccessToken) {
System.out.println("收到componentAccessToken:" + componentAccessToken);
//先逻辑删,在插入
//componentAccessTokenDao.deleteOldComponentAccessToken();
//componentAccessTokenDao.insertComponentAccessToken(componentAccessToken);
////存缓存
//redisThird.setComponentAccessToken(componentAccessToken.getComponentAccessToken());
}
@Override
public void pushVerifyTicket(String ticket) {
}
}

6
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ThirdPlatformServiceImpl.java

@ -12,6 +12,7 @@ import com.epmet.dto.form.CustomerFormDTO;
import com.epmet.dto.form.ThirdPlatformFormDTO;
import com.epmet.dto.form.PlatformRegisterFormDTO;
import com.epmet.dto.form.PlatformUnregisterFormDTO;
import com.epmet.dto.result.ThirdPlatformActionsResultDTO;
import com.epmet.dto.result.ThirdplatformResultDTO;
import com.epmet.entity.ThirdplatformCustomerActionEntity;
import com.epmet.entity.ThirdplatformCustomerRegisterEntity;
@ -160,4 +161,9 @@ public class ThirdPlatformServiceImpl implements ThirdPlatformService {
thirdplatformCustomerRegisterDao.batchInsertThirdplatformCustomerRegister(entityList);
}
}
@Override
public List<ThirdPlatformActionsResultDTO> listPlatformsByActionKey(String actionKey) {
return thirdplatformCustomerRegisterDao.listPlatformsByActionKey(actionKey);
}
}

17
epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformActionDao.xml

@ -30,6 +30,23 @@
from thirdplatform_action ta
where ta.PLATFORM_ID = #{platformId}
and ACTION_KEY = #{action}
and ta.DEL_FLAG=0
</select>
<select id="listPlatformActions" resultType="com.epmet.entity.ThirdplatformActionEntity">
select id,
platform_id,
action_key,
api_url,
del_flag,
revision,
created_by,
created_time,
updated_by,
updated_time
from thirdplatform_action ta
where ta.PLATFORM_ID = #{platformId}
and ta.DEL_FLAG=0
</select>

14
epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformCustomerRegisterDao.xml

@ -36,6 +36,20 @@
and DEL_FLAG = 0
</select>
<!--已知操作的key,查询哪些app可以做此操作-->
<select id="listPlatformsByActionKey" resultType="com.epmet.dto.result.ThirdPlatformActionsResultDTO">
select thirdplatform_action.PLATFORM_ID,
thirdplatform.PLATFORM_KEY,
thirdplatform.PLATFORM_NAME,
thirdplatform_action.ACTION_KEY,
thirdplatform_action.API_URL
from thirdplatform
inner join thirdplatform_action
on (thirdplatform.ID = thirdplatform_action.PLATFORM_ID and thirdplatform_action.DEL_FLAG = 0)
and thirdplatform_action.ACTION_KEY = #{actionKey}
and thirdplatform.DEL_FLAG = 0
</select>
<insert id="batchInsertThirdplatformCustomerRegister" parameterType="map">
insert into thirdplatform_customer_register
(

10
epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/AccessConfigController.java

@ -1,5 +1,6 @@
package com.epmet.controller;
import com.epmet.commons.tools.aop.NoRepeatSubmit;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.dto.form.*;
@ -8,11 +9,9 @@ import com.epmet.dto.result.AccessConfigOpesResultDTO;
import com.epmet.dto.result.AccessConfigOptionsResultDTO;
import com.epmet.dto.result.RoleOperationDefaultResultDTO;
import com.epmet.service.AccessConfigService;
import oracle.jdbc.proxy.annotation.Post;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Set;
@ -49,6 +48,7 @@ public class AccessConfigController {
* 保存角色的操作权限列表
* @return
*/
@NoRepeatSubmit
@PostMapping("saveroleopes")
public Result saveRoleOpes(@RequestBody AccessConfigOpesFormDTO formDTO) {
accessConfigService.saveRoleOpes(formDTO.getRoleId(), formDTO.getOpes(), formDTO.getCustomerId());
@ -71,6 +71,7 @@ public class AccessConfigController {
* @param config
* @return
*/
@NoRepeatSubmit
@PostMapping("saveconfig")
public Result saveSettings(@RequestBody AccessConfigSaveConfigDTO config) {
ValidatorUtils.validateEntity(config);
@ -87,6 +88,7 @@ public class AccessConfigController {
* @param form
* @return
*/
@NoRepeatSubmit
@PostMapping("roledefaultopes/save")
public Result saveRoleDefaultOperations(@RequestBody AccessConfigRoleDefaultOpesFormDTO form) {
ValidatorUtils.validateEntity(form);
@ -111,6 +113,7 @@ public class AccessConfigController {
* @param form
* @return
*/
@NoRepeatSubmit
@PostMapping("opedefaultscopes/save")
public Result saveOpeDefaultScopes(@RequestBody AccessConfigOpeDefaultScopesFormDTO form) {
ValidatorUtils.validateEntity(form, AccessConfigOpeDefaultScopesFormDTO.SaveOpeDefaultScopesGroup.class);
@ -124,6 +127,7 @@ public class AccessConfigController {
* @author wxz
* @date 2020.11.17 17:41
*/
@NoRepeatSubmit
@PostMapping("add-ope-and-scopes-4role")
public Result addOpeAndScopes4Role(@RequestBody AccessConfigAdd4RoletFormDTO form) {
ValidatorUtils.validateEntity(form, AccessConfigAdd4RoletFormDTO.AddSingleOperation4RoleGroup.class);
@ -141,6 +145,7 @@ public class AccessConfigController {
* @author wxz
* @date 2021.07.01 16:07
*/
@NoRepeatSubmit
@PostMapping("add-ope-and-scopes-4role/by-default-conf")
public Result addOpeAndScopes4RoleByDefaultConf(@RequestBody AccessConfigAdd4RoletFormDTO form) {
ValidatorUtils.validateEntity(form, AccessConfigAdd4RoletFormDTO.AddSingleOperations4RoleByDefault.class);
@ -157,6 +162,7 @@ public class AccessConfigController {
* @author wxz
* @date 2020.12.02 16:20
*/
@NoRepeatSubmit
@PostMapping("add-opes-and-scopes-4role")
public Result addOpesAndScopes4Role(@RequestBody AccessConfigAdd4RoletFormDTO form) {
ValidatorUtils.validateEntity(form, AccessConfigAdd4RoletFormDTO.AddMultiOperations4RoleGroup.class);

51
epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/TestController.java

@ -1,11 +1,22 @@
package com.epmet.controller;
import com.epmet.commons.tools.annotation.ExternalRequestAuth;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.aop.NoRepeatSubmit;
import com.epmet.commons.tools.utils.HttpClientManager;
import com.epmet.commons.tools.utils.Result;
import com.epmet.service.TestService;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@RestController
@RequestMapping("test")
@ -14,13 +25,41 @@ public class TestController {
@Autowired
private TestService testService;
@NoRepeatSubmit
@ExternalRequestAuth
@PostMapping("test")
public void test(@RequestBody Input input) {
if (true) {
throw new RenException("测试报错");
public Result<String> test(@RequestBody(required = false) Input input) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String s = "这里是测试结果!";
return new Result<String>().ok(s);
}
@PostMapping("repeat")
public Result testRepeatSubmit(){
System.out.println("开始执行多线程==========");
CountDownLatch countDownLatch = new CountDownLatch(1);
ExecutorService executorService = Executors.newFixedThreadPool(10);
String url = "http://localhost:8099/gov/access/test/test";
for (int i = 0; i < 10 ; i++) {
executorService.submit(()->{
try {
countDownLatch.await();
Map<String,String> headersMap = new HashMap<>();
headersMap.put("Authorization","token");
Result<String> stringResult = HttpClientManager.getInstance().sendPostByJSONAndHeader(url, "", headersMap);
System.out.println(stringResult.getData());
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
testService.test();
countDownLatch.countDown();
return new Result().ok(true);
}
@Data

9
epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java

@ -13,6 +13,7 @@ import com.epmet.enums.OrgLevelEnums;
import com.epmet.feign.EpmetUserOpenFeignClient;
import com.epmet.feign.GovOrgOpenFeignClient;
import com.epmet.service.ResiEventService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -44,11 +45,18 @@ public class ResiEventServiceImpl implements ResiEventService, ResultDataResolve
//String parentAgencyId = gridInfoData.getParentAgencyId();
//String pids = gridInfoData.getPids();
List<ResiEventNpcResultDTO> npcResultList = new ArrayList<>();
//查询人大代表列表
ListUserByBadgeFormDTO npcForm = new ListUserByBadgeFormDTO(customerId, BadgeConstant.BADGE_KEY_NPC);
Result<List<ListUserByBadgeResultDTO>> npcResult = epmetUserOpenFeignClient.listUsersByBadge(npcForm);
List<ListUserByBadgeResultDTO> npcData = getResultDataOrThrowsException(npcResult, ServiceConstant.EPMET_USER_SERVER, null, null);
if(CollectionUtils.isEmpty(npcData)) {
// 没有人大代表,直接返回空列表即可
return npcResultList;
}
//批量查询人大代表所在的网格信息
List<String> npcGridIds = npcData.stream().map(d -> d.getGridId()).collect(Collectors.toList());
OrgInfoFormDTO form = new OrgInfoFormDTO(OrgInfoConstant.GRID, npcGridIds);
@ -57,7 +65,6 @@ public class ResiEventServiceImpl implements ResiEventService, ResultDataResolve
Map<String, OrgInfoResultDTO> npcGridInfoMap = convertNpcGridInfos2Map(npcGridInfos);
List<ResiEventNpcResultDTO> npcResultList = new ArrayList<>();
npcData.stream().forEach(npc -> {
if (StringUtils.isBlank(excludeUserId) || !npc.getUserId().equals(excludeUserId)) {
OrgInfoResultDTO gridInfo = npcGridInfoMap.get(npc.getGridId());

2
epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/PartyMemberConfirmServiceImpl.java

@ -193,7 +193,7 @@ public class PartyMemberConfirmServiceImpl implements PartyMemberConfirmService
PartymemberInfoEntity.class);
PartymemberInfoDTO info = partymemberInfoService.getPartyMemberInfoByUser(partyMemberInfoDTO.getCustomerId(), partyMemberInfoDTO.getUserId());
if (null != info) {
partyMemberInfoDTO.setId(info.getId());
partyMemberInfoEntity.setId(info.getId());
}
if (confirmAutoDTO == null || !confirmAutoDTO.getComparisonResults()) {
log.info("submit confirmAutoDTO return null or false:{}",JSON.toJSONString(confirmAutoDTO));

15
epmet-openapi/epmet-openapi-sdk/pom.xml

@ -0,0 +1,15 @@
<?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-openapi</artifactId>
<groupId>com.epmet</groupId>
<version>2.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>epmet-openapi-sdk</artifactId>
</project>

133
epmet-openapi/epmet-openapi-sdk/src/main/java/com/epmet/openapi/sdk/encrypt/Md5Util.java

@ -0,0 +1,133 @@
package com.epmet.openapi.sdk.encrypt;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Md5Util {
/**
* 加密盐
*/
public static final String SALT = "EPMET_UMD_SALT";
public static String md5(String string) throws Exception {
if (string == null || string.trim().length() == 0) {
return null;
}
return getMD5(string.getBytes("GBK"));
}
private static final char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
private static String getMD5(byte[] source) throws Exception {
String s = null;
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(source);
byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数,
// 用字节表示就是 16 个字节
char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
// 所以表示成 16 进制需要 32 个字符
int k = 0; // 表示转换结果中对应的字符位置
for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
// 转换成 16 进制字符的转换
byte byte0 = tmp[i]; // 取第 i 个字节
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
// >>> 为逻辑右移,将符号位一起右移
str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
}
s = new String(str); // 换后的结果转换为字符串
return s;
}
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++)
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n += 256;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + "" + hexDigits[d2];
}
public static String MD5Encode(String origin, String charsetname) throws Exception {
String resultString = null;
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(charsetname)));
return resultString;
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
String uuid = "03a1dcd8cb1811eabac1c03fd56f7847";
System.out.println(get12Char(uuid));
}
}
/**
* 获取短字符
*
* @param str
* @return 大写
*/
public static String get12Char(String str) {
String arr[] = ShortText(str);
String rst = (arr[0] + arr[1]).toUpperCase();
return rst.substring(0, 4) + rst.substring(4, 8) + rst.substring(8, 12);
}
private static String[] ShortText(String string) {
String[] chars = new String[]{ // 要使用生成URL的字符
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
"o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B",
"C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
String hex = "";
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
hex = byteArrayToHexString(md.digest(SALT.concat(string)
.getBytes("utf-8")));
} catch (Exception e) {
e.printStackTrace();
}
int hexLen = hex.length();
int subHexLen = hexLen / 8;
String[] ShortStr = new String[4];
for (int i = 0; i < subHexLen; i++) {
String outChars = "";
int j = i + 1;
String subHex = hex.substring(i * 8, j * 8);
long idx = Long.valueOf("3FFFFFFF", 16) & Long.valueOf(subHex, 16);
for (int k = 0; k < 6; k++) {
int index = (int) (Long.valueOf("0000003D", 16) & idx);
outChars += chars[index];
idx = idx >> 5;
}
ShortStr[i] = outChars;
}
return ShortStr;
}
}

109
epmet-openapi/epmet-openapi-sdk/src/main/java/com/epmet/openapi/sdk/sign/OpenApiSignUtils.java

@ -0,0 +1,109 @@
package com.epmet.openapi.sdk.sign;
import com.epmet.openapi.sdk.encrypt.Md5Util;
import java.util.*;
/**
* OpenApi签名工具
*/
public class OpenApiSignUtils {
/**
* @Description 创建签名
* @return
* @author wxz
* @date 2021.03.22 16:47
*/
public static String createSign(Map<String, String> contentMap, String signKey) throws Exception {
String str2beSigned = mapToSignStr(contentMap);
str2beSigned = str2beSigned.concat("&sign_key=").concat(signKey);
return Md5Util.md5(str2beSigned);
}
/**
* @Description 验签
* @return
* @author wxz
* @date 2021.03.22 16:51
*/
public static boolean checkSign(Map<String, String> contentMap, String signKey) throws Exception {
String newSign = createSign(contentMap, signKey);
return newSign.equals(contentMap.get("sign"));
}
/**
* @Description map转化为签名明文
* @return
* @author wxz
* @date 2021.03.22 16:47
*/
public static String mapToSignStr(Map<String, String> map) {
Set<String> keySet = map.keySet();
String[] keyArray = (String[])keySet.toArray(new String[keySet.size()]);
Arrays.sort(keyArray);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < keyArray.length; ++i) {
String key = keyArray[i];
String val = (String)map.get(key);
if (val != null && val.trim().length() > 0 && !"sign".equals(key)) {
if (!sb.toString().isEmpty()) {
sb.append("&");
}
sb.append(key).append("=").append((String)map.get(key));
}
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
generateGetAccessTokenSign();
System.out.println("==============");
generateGetOrgDetailSign();
}
private static void generateGetAccessTokenSign() throws Exception {
long now = System.currentTimeMillis();
System.out.println(now);
String uuid = UUID.randomUUID().toString().replace("-", "");
HashMap<String, String> content = new HashMap<>();
content.put("app_id", "7d98b8af2d05752b4225709c4cfd4bd0");
content.put("timestamp", String.valueOf(now));
content.put("nonce", uuid);
content.put("auth_type", "take_token");
String secret = "3209ee9f41704482be1a1fb5873a25376f2899191ca846119d44168316bc3e44";
String sign = createSign(content, secret);
System.out.println("时间戳:" + now);
System.out.println("随机数:" + uuid);
System.out.println("签名:" + sign);
}
private static void generateGetOrgDetailSign() throws Exception {
long now = System.currentTimeMillis();
String uuid = UUID.randomUUID().toString().replace("-", "");;
System.out.println("时间戳:" + now);
System.out.println("随机数:" + uuid);
HashMap<String, String> content = new HashMap<>();
//content.put("orgId", "aaa");
//content.put("test", null);
content.put("gridId", "12128e0f614f1c00a058ea9a107033b2");
content.put("app_id", "7d98b8af2d05752b4225709c4cfd4bd0");
content.put("timestamp", String.valueOf(now));
content.put("nonce", uuid);
content.put("auth_type", "take_token");
String secret = "3209ee9f41704482be1a1fb5873a25376f2899191ca846119d44168316bc3e44";
String sign = createSign(content, secret);
System.out.println("签名:" + sign);
}
}

1
epmet-openapi/pom.xml

@ -13,6 +13,7 @@
<artifactId>epmet-openapi</artifactId>
<modules>
<module>epmet-openapi-scan</module>
<module>epmet-openapi-sdk</module>
</modules>
</project>

30
epmet-user/epmet-user-client/src/main/java/com/epmet/dto/result/PatrolYuShanResultDTO.java

@ -0,0 +1,30 @@
package com.epmet.dto.result;
import lombok.Data;
import java.io.Serializable;
/**
* @Author zxc
* @DateTime 2021/8/25 3:50 下午
* @DESC
*/
@Data
public class PatrolYuShanResultDTO implements Serializable {
private static final long serialVersionUID = -54918706294182026L;
private String staffId;
private String gridId;
/**
* 巡查时长
*/
private Integer patrolDuration;
/**
* 巡查次数
*/
private Integer patrolCount;
}

9
epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java

@ -623,4 +623,13 @@ public interface EpmetUserOpenFeignClient {
*/
@PostMapping("/epmetuser/statsstaffpatrolrecorddaily/patrolcount")
Result<PatrolCountResultDTO> patrolCount(@RequestBody PatrolCountFormDTO formDTO);
/**
* @Description 查询巡查次数和时长
* @Param agencyId
* @author zxc
* @date 2021/8/25 3:59 下午
*/
@PostMapping("/epmetuser/statsstaffpatrolrecorddaily/patrolinfo")
Result<List<PatrolYuShanResultDTO>> patrolInfo(@RequestParam("agencyId")String agencyId);
}

5
epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java

@ -437,4 +437,9 @@ public class EpmetUserOpenFeignClientFallback implements EpmetUserOpenFeignClien
public Result<PatrolCountResultDTO> patrolCount(PatrolCountFormDTO formDTO) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "patrolCount", formDTO);
}
@Override
public Result<List<PatrolYuShanResultDTO>> patrolInfo(String agencyId) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "patrolInfo", agencyId);
}
}

14
epmet-user/epmet-user-server/src/main/java/com/epmet/controller/StatsStaffPatrolRecordDailyController.java

@ -2,12 +2,15 @@ package com.epmet.controller;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
import com.epmet.dto.result.PatrolYuShanResultDTO;
import com.epmet.service.StatsStaffPatrolRecordDailyService;
import com.epmet.dto.form.PatrolCountFormDTO;
import com.epmet.dto.result.PatrolCountResultDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* []工作人员巡查记录统计
@ -33,4 +36,15 @@ public class StatsStaffPatrolRecordDailyController {
ValidatorUtils.validateEntity(formDTO, PatrolCountFormDTO.PatrolCountForm.class);
return new Result<PatrolCountResultDTO>().ok(statsStaffPatrolRecordDailyService.patrolCount(formDTO));
}
/**
* @Description 查询巡查次数和时长
* @Param agencyId
* @author zxc
* @date 2021/8/25 4:02 下午
*/
@PostMapping("patrolinfo")
public Result<List<PatrolYuShanResultDTO>> patrolInfo(@RequestParam("agencyId")String agencyId){
return new Result<List<PatrolYuShanResultDTO>>().ok(statsStaffPatrolRecordDailyService.patrolInfo(agencyId));
}
}

6
epmet-user/epmet-user-server/src/main/java/com/epmet/controller/UserController.java

@ -1,6 +1,7 @@
package com.epmet.controller;
import com.epmet.commons.tools.annotation.LoginUser;
import com.epmet.commons.tools.aop.NoRepeatSubmit;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.utils.Result;
import com.epmet.commons.tools.validator.ValidatorUtils;
@ -50,6 +51,7 @@ public class UserController {
* @Description
* @Date 2020/3/16 15:49
**/
@NoRepeatSubmit
@PostMapping("saveOrUpdateUserWechatDTO")
public Result<UserDTO> saveOrUpdateUserWechatDTO(@RequestBody UserWechatDTO userWechatDTO) {
//效验数据
@ -77,6 +79,7 @@ public class UserController {
* @Author sun
* @Description 居民端个人信息-同步用户微信信息
**/
@NoRepeatSubmit
@PostMapping("updatewxuserinfo")
public Result updateWxUserInfo(@LoginUser TokenDto tokenDTO, @RequestBody WxUserInfoFormDTO wxUserInfoFormDTO) {
wxUserInfoFormDTO.setUserId(tokenDTO.getUserId());
@ -124,6 +127,7 @@ public class UserController {
* @Author sun
* @Description 小程序微信用户登陆新增或更新用户信息
**/
@NoRepeatSubmit
@PostMapping("savewxuser")
public Result<UserDTO> saveWxUser(@RequestBody WxUserFormDTO formDTO){
return new Result<UserDTO>().ok(userService.saveWxUser(formDTO));
@ -138,6 +142,7 @@ public class UserController {
* @Author zhangyong
* @Date 14:51 2020-07-23
**/
@NoRepeatSubmit
@PostMapping("updateUserBaseAndWxUserInfo")
public Result updateUserBaseAndWxUserInfo(@RequestBody WxUserInfoFormDTO wxUserInfoFormDTO) {
ValidatorUtils.validateEntity(wxUserInfoFormDTO);
@ -160,6 +165,7 @@ public class UserController {
* @author zxc
* @date 2021/1/19 上午10:35
*/
@NoRepeatSubmit
@PostMapping("saveuserinfo")
public Result<UserDTO> saveUserInfo(@RequestBody UserInfoFormDTO formDTO){
ValidatorUtils.validateEntity(formDTO, UserInfoFormDTO.UserInfoForm.class);

9
epmet-user/epmet-user-server/src/main/java/com/epmet/dao/StatsStaffPatrolRecordDailyDao.java

@ -18,6 +18,7 @@
package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.result.PatrolYuShanResultDTO;
import com.epmet.dto.result.SelectPatrolCountResultDTO;
import com.epmet.entity.StatsStaffPatrolRecordDailyEntity;
import org.apache.ibatis.annotations.Mapper;
@ -71,5 +72,13 @@ public interface StatsStaffPatrolRecordDailyDao extends BaseDao<StatsStaffPatrol
* @date 2021/8/20 9:10 上午
*/
List<SelectPatrolCountResultDTO> selectPatrolCount(@Param("agencyId")String agencyId, @Param("dateId")String dateId);
/**
* @Description 查询巡查次数和时长
* @Param agencyId
* @author zxc
* @date 2021/8/25 4:02 下午
*/
List<PatrolYuShanResultDTO> patrolInfo(@Param("agencyId")String agencyId);
}

11
epmet-user/epmet-user-server/src/main/java/com/epmet/service/StatsStaffPatrolRecordDailyService.java

@ -1,10 +1,13 @@
package com.epmet.service;
import com.epmet.commons.mybatis.service.BaseService;
import com.epmet.dto.result.PatrolYuShanResultDTO;
import com.epmet.entity.StatsStaffPatrolRecordDailyEntity;
import com.epmet.dto.form.PatrolCountFormDTO;
import com.epmet.dto.result.PatrolCountResultDTO;
import java.util.List;
/**
* []工作人员巡查记录统计
*
@ -21,4 +24,12 @@ public interface StatsStaffPatrolRecordDailyService extends BaseService<StatsSta
*/
PatrolCountResultDTO patrolCount(PatrolCountFormDTO formDTO);
/**
* @Description 查询巡查次数和时长
* @Param agencyId
* @author zxc
* @date 2021/8/25 4:02 下午
*/
List<PatrolYuShanResultDTO> patrolInfo(String agencyId);
}

12
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/StatsStaffPatrolRecordDailyServiceImpl.java

@ -5,6 +5,7 @@ import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.constant.PatrolConstant;
import com.epmet.dao.StatsStaffPatrolRecordDailyDao;
import com.epmet.dto.result.PatrolYuShanResultDTO;
import com.epmet.dto.result.SelectPatrolCountResultDTO;
import com.epmet.entity.StatsStaffPatrolRecordDailyEntity;
import com.epmet.service.StatsStaffPatrolRecordDailyService;
@ -45,4 +46,15 @@ public class StatsStaffPatrolRecordDailyServiceImpl extends BaseServiceImpl<Stat
});
return result;
}
/**
* @Description 查询巡查次数和时长
* @Param agencyId
* @author zxc
* @date 2021/8/25 4:02 下午
*/
@Override
public List<PatrolYuShanResultDTO> patrolInfo(String agencyId) {
return baseDao.patrolInfo(agencyId);
}
}

2
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/UserServiceImpl.java

@ -182,7 +182,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserDao, UserEntity> implem
if(null != myselfMsg){
MyResiUserInfoResultDTO result = ConvertUtils.sourceToTarget(myselfMsg,MyResiUserInfoResultDTO.class);
//registerFlag 是否已注册居民,true ,false
result.setRegisterFlag(StringUtils.isNotBlank(myselfMsg.getResiId()) ? true : false);
result.setRegisterFlag(StringUtils.isNotBlank(myselfMsg.getResiId()));
result.setRegisterGridName(ModuleConstant.EMPTY_STR);
if(StringUtils.isNotBlank(myselfMsg.getGridId())){
//registerGridName 当前在哪个网格,显示哪个网格的名称

13
epmet-user/epmet-user-server/src/main/resources/mapper/StatsStaffPatrolRecordDailyDao.xml

@ -52,4 +52,17 @@
ORDER BY STAFF_ID DESC) t GROUP BY t.STATUS
</select>
<!-- 查询巡查次数和时长 -->
<select id="patrolInfo" resultType="com.epmet.dto.result.PatrolYuShanResultDTO">
SELECT
GRID_ID,
STAFF_ID,
IFNULL(SUM(PATROL_TOTAL),0) AS patrolCount,
IFNULL(ROUND((SUM(TOTAL_TIME)/60),0),0) AS patrolDuration
FROM stats_staff_patrol_record_daily
WHERE DEL_FLAG = 0
AND GRID_PIDS LIKE CONCAT('%',#{agencyId},'%')
GROUP BY GRID_ID,STAFF_ID
</select>
</mapper>
Loading…
Cancel
Save