From 80ef4abd8e44a8429495814b968b1efe2b9482bd Mon Sep 17 00:00:00 2001 From: jianjun Date: Mon, 16 Aug 2021 16:03:42 +0800 Subject: [PATCH 01/23] =?UTF-8?q?=E5=88=A9=E7=94=A8aop=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E5=B8=83=E5=BC=8F=E9=94=81=E6=96=B9=E5=BC=8F=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=20=E9=87=8D=E5=A4=8D=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/aop/NoRepeatSubmit.java | 6 +- .../commons/tools/aop/NoRepeatSubmitAop.java | 88 +++++++++---------- .../distributedlock/DistributedLock.java | 37 +++++--- .../tools/exception/EpmetErrorCode.java | 1 + .../epmet/commons/tools/redis/RedisKeys.java | 9 ++ .../controller/AccessConfigController.java | 10 ++- .../com/epmet/controller/TestController.java | 51 +++++++++-- .../com/epmet/controller/UserController.java | 6 ++ .../epmet/service/impl/UserServiceImpl.java | 2 +- 9 files changed, 145 insertions(+), 65 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aop/NoRepeatSubmit.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aop/NoRepeatSubmit.java index aad5ee733a..d4f32340ab 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aop/NoRepeatSubmit.java +++ b/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; -} \ No newline at end of file +} diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aop/NoRepeatSubmitAop.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aop/NoRepeatSubmitAop.java index 7dfbd88a75..6b21bbaaae 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/aop/NoRepeatSubmitAop.java +++ b/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 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; - } - - } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/distributedlock/DistributedLock.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/distributedlock/DistributedLock.java index 85a2e61c84..60e17175f1 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/distributedlock/DistributedLock.java +++ b/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; } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java index 96558433fc..8ba25b63e6 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java +++ b/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, "该机关存在下级机关,不允许删除"), diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 6d5a5f0cfb..046802e321 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -481,4 +481,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); + } } diff --git a/epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/AccessConfigController.java b/epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/AccessConfigController.java index 71ce7c3ec5..2b9d99f615 100644 --- a/epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/AccessConfigController.java +++ b/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); diff --git a/epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/TestController.java b/epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/TestController.java index b18beb3aab..6ad185da6b 100644 --- a/epmet-module/gov-access/gov-access-server/src/main/java/com/epmet/controller/TestController.java +++ b/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 test(@RequestBody(required = false) Input input) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + String s = "这里是测试结果!"; + return new Result().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 headersMap = new HashMap<>(); + headersMap.put("Authorization","token"); + Result 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 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/UserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/UserController.java index a88a812828..d4a4148450 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/UserController.java +++ b/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 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 saveWxUser(@RequestBody WxUserFormDTO formDTO){ return new Result().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 saveUserInfo(@RequestBody UserInfoFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO, UserInfoFormDTO.UserInfoForm.class); diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/UserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/UserServiceImpl.java index b8ee97c440..515f2ccba9 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/UserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/UserServiceImpl.java @@ -182,7 +182,7 @@ public class UserServiceImpl extends BaseServiceImpl 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 当前在哪个网格,显示哪个网格的名称 From 54acd649311ea0f50d16220afa58707b8bc997ec Mon Sep 17 00:00:00 2001 From: wxz Date: Wed, 18 Aug 2021 17:04:50 +0800 Subject: [PATCH 02/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9:CPAuthxxx=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=93=E5=8D=B0header=E5=88=97=E8=A1=A8?= =?UTF-8?q?=EF=BC=8C=E7=BB=99gateway=E6=97=A5=E5=BF=97=E7=BB=91=E5=AE=9Atr?= =?UTF-8?q?anSerail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filter/CpAuthGatewayFilterFactory.java | 60 +++++++++++++------ 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java b/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java index 6513d27f04..538467d2e1 100644 --- a/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java +++ b/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java @@ -68,18 +68,25 @@ public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory 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 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> entry : headers.entrySet()) { + String headerKey = entry.getKey(); + List 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 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 Date: Thu, 19 Aug 2021 13:58:30 +0800 Subject: [PATCH 03/23] =?UTF-8?q?fix:=E6=9F=A5=E8=AF=A2=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E4=BA=BA=E5=A4=A7=E4=BB=A3=E8=A1=A8=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E5=AE=A2=E6=88=B7=E4=B8=8B=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E4=BA=BA=E5=A4=A7=E4=BB=A3=E8=A1=A8=EF=BC=8C=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=A9=BA=E5=88=97=E8=A1=A8=EF=BC=8C=E8=80=8C=E4=B8=8D=E5=9C=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2org=E6=9C=8D=E5=8A=A1,=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/service/impl/ResiEventServiceImpl.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java b/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java index bd6a1c4376..295c8bb6a1 100644 --- a/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java +++ b/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,6 +45,8 @@ public class ResiEventServiceImpl implements ResiEventService, ResultDataResolve //String parentAgencyId = gridInfoData.getParentAgencyId(); //String pids = gridInfoData.getPids(); + List npcResultList = new ArrayList<>(); + //查询人大代表列表 ListUserByBadgeFormDTO npcForm = new ListUserByBadgeFormDTO(customerId, BadgeConstant.BADGE_KEY_NPC); Result> npcResult = epmetUserOpenFeignClient.listUsersByBadge(npcForm); @@ -55,9 +58,13 @@ public class ResiEventServiceImpl implements ResiEventService, ResultDataResolve Result> npcGridInfoResult = govOrgOpenFeignClient.selectOrgInfo(form); List npcGridInfos = getResultDataOrThrowsException(npcGridInfoResult, ServiceConstant.GOV_ORG_SERVER, null, null); + if(CollectionUtils.isEmpty(npcGridInfos)) { + // 没有人大代表,直接返回空列表即可 + return npcResultList; + } + Map npcGridInfoMap = convertNpcGridInfos2Map(npcGridInfos); - List npcResultList = new ArrayList<>(); npcData.stream().forEach(npc -> { if (StringUtils.isBlank(excludeUserId) || !npc.getUserId().equals(excludeUserId)) { OrgInfoResultDTO gridInfo = npcGridInfoMap.get(npc.getGridId()); From 6d7444012f24b64a90fc27fe1b45d0d5086e08d7 Mon Sep 17 00:00:00 2001 From: wxz Date: Thu, 19 Aug 2021 14:15:38 +0800 Subject: [PATCH 04/23] =?UTF-8?q?fix:=E5=88=9A=E6=89=8D=E6=94=B9=E9=94=99?= =?UTF-8?q?=E4=BA=86=E3=80=82=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/service/impl/ResiEventServiceImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java b/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java index 295c8bb6a1..36a2a43684 100644 --- a/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java +++ b/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/service/impl/ResiEventServiceImpl.java @@ -52,17 +52,17 @@ public class ResiEventServiceImpl implements ResiEventService, ResultDataResolve Result> npcResult = epmetUserOpenFeignClient.listUsersByBadge(npcForm); List npcData = getResultDataOrThrowsException(npcResult, ServiceConstant.EPMET_USER_SERVER, null, null); + if(CollectionUtils.isEmpty(npcData)) { + // 没有人大代表,直接返回空列表即可 + return npcResultList; + } + //批量查询人大代表所在的网格信息 List npcGridIds = npcData.stream().map(d -> d.getGridId()).collect(Collectors.toList()); OrgInfoFormDTO form = new OrgInfoFormDTO(OrgInfoConstant.GRID, npcGridIds); Result> npcGridInfoResult = govOrgOpenFeignClient.selectOrgInfo(form); List npcGridInfos = getResultDataOrThrowsException(npcGridInfoResult, ServiceConstant.GOV_ORG_SERVER, null, null); - if(CollectionUtils.isEmpty(npcGridInfos)) { - // 没有人大代表,直接返回空列表即可 - return npcResultList; - } - Map npcGridInfoMap = convertNpcGridInfos2Map(npcGridInfos); npcData.stream().forEach(npc -> { From d33487737bc289160dcee60f83cf130dfc60069a Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Fri, 20 Aug 2021 11:02:35 +0800 Subject: [PATCH 05/23] =?UTF-8?q?=E5=88=86=E7=B1=BB=E5=90=8D=E5=AD=97?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/CategoryAnalysisResultDTO.java | 7 +++ .../result/CategoryTopAppealResultDTO.java | 7 +++ .../ScreenProjectCategoryOrgDailyDao.java | 2 +- .../screen/impl/ScreenProjectServiceImpl.java | 16 ++----- .../ScreenProjectCategoryOrgDailyDao.xml | 46 ++++++------------- 5 files changed, 31 insertions(+), 47 deletions(-) diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/dto/result/screen/CategoryAnalysisResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/dto/result/screen/CategoryAnalysisResultDTO.java index f91ef35e09..ebbd47cdaa 100644 --- a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/dto/result/screen/CategoryAnalysisResultDTO.java +++ b/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; } diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/CategoryTopAppealResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/CategoryTopAppealResultDTO.java index 6b5a1000ec..1fab9522b4 100644 --- a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/project/dto/result/CategoryTopAppealResultDTO.java +++ b/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 = ""; diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.java index 98de75653b..e3cf3d074d 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.java +++ b/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 selectCategoryAnalysis(@Param("agencyId") String agencyId,@Param("customerId")String customerId); - CustomerProjectCategoryDTO selectProjectCategory(@Param("categoryCode")String categoryCode, @Param("customerId")String customerId, @Param("subCustomerIds")List subCustomerIds); + CustomerProjectCategoryDTO selectProjectCategory(@Param("categoryCode")String categoryCode, @Param("customerId")String customerId); /** * @Description 查询事件分类 diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/ScreenProjectServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/ScreenProjectServiceImpl.java index afd527d643..cbfb044895 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/ScreenProjectServiceImpl.java +++ b/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 resultDTOList = screenProjectCategoryOrgDailyDao.selectCategoryAnalysis(formDTO.getAgencyId(), customerId); List resultList = new ArrayList<>(); if (!CollectionUtils.isEmpty(resultDTOList)) { - Result> crmRes = operCrmOpenFeignClient.getAllSubCustomerIds(customerId); - List 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> sonCustomer = operCrmOpenFeignClient.getAllSubCustomerIds(customerId); - List 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()); diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenProjectCategoryOrgDailyDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenProjectCategoryOrgDailyDao.xml index 4bd5e6a20d..5731b27e2b 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenProjectCategoryOrgDailyDao.xml +++ b/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 @@ + + + \ No newline at end of file From b88945f19bde79a5d47241f4d572a26d83ce0ff2 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Wed, 25 Aug 2021 16:39:23 +0800 Subject: [PATCH 08/23] =?UTF-8?q?=E7=BD=91=E6=A0=BC=E5=91=98=E5=B7=A1?= =?UTF-8?q?=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GridManagerListYuShanResultDTO.java | 94 +++++++++++++++++++ .../user/StaffPatrolDetailController.java | 13 +++ .../user/StaffPatrolDetailService.java | 9 ++ .../impl/StaffPatrolDetailServiceImpl.java | 29 ++++++ .../mapper/screen/ScreenCustomerAgencyDao.xml | 2 +- 5 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListYuShanResultDTO.java diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListYuShanResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListYuShanResultDTO.java new file mode 100644 index 0000000000..51ab6b798a --- /dev/null +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListYuShanResultDTO.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 GridManagerListYuShanResultDTO 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 GridManagerListYuShanResultDTO() { + 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; + } +} diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/user/StaffPatrolDetailController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/user/StaffPatrolDetailController.java index e20e1e7d5c..5901ada344 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/user/StaffPatrolDetailController.java +++ b/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.GridManagerListYuShanResultDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -77,4 +78,16 @@ public class StaffPatrolDetailController { return new Result().ok(staffPatrolService.patrolCount(formDTO)); } + /** + * @Description 网格员分布-榆山 + * @Param formDTO + * @author zxc + * @date 2021/8/25 3:00 下午 + */ + @PostMapping("gridmanagerlist-yushan") + public Result> gridManagerListYuShan(@RequestBody GridManagerListFormDTO formDTO){ + ValidatorUtils.validateEntity(formDTO, GridManagerListFormDTO.GridManagerListForm.class); + return new Result>().ok(staffPatrolService.gridManagerListYuShan(formDTO)); + } + } diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/StaffPatrolDetailService.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/StaffPatrolDetailService.java index 95fc1eb064..41c1e3278c 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/StaffPatrolDetailService.java +++ b/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.GridManagerListYuShanResultDTO; import java.util.List; @@ -27,6 +28,14 @@ public interface StaffPatrolDetailService{ */ List gridManagerList(GridManagerListFormDTO formDTO); + /** + * @Description 网格员分布-榆山 + * @Param formDTO + * @author zxc + * @date 2021/8/25 3:00 下午 + */ + List gridManagerListYuShan(GridManagerListFormDTO formDTO); + /** * @Description 002、查看巡查记录 * @Param formDTO diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/impl/StaffPatrolDetailServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/impl/StaffPatrolDetailServiceImpl.java index 6f01a162ac..48a11334e2 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/impl/StaffPatrolDetailServiceImpl.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/impl/StaffPatrolDetailServiceImpl.java @@ -19,6 +19,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.GridManagerListYuShanResultDTO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -136,6 +137,34 @@ public class StaffPatrolDetailServiceImpl implements StaffPatrolDetailService { return result; } + /** + * @Description 网格员分布-榆山 + * @Param formDTO + * @author zxc + * @date 2021/8/25 3:00 下午 + */ + @Override + public List gridManagerListYuShan(GridManagerListFormDTO formDTO) { + List resultTwo = this.gridManagerList(formDTO); + List result = ConvertUtils.sourceToTarget(resultTwo, GridManagerListYuShanResultDTO.class); + Result> listResult = epmetUserOpenFeignClient.patrolInfo(formDTO.getAgencyId()); + if (!listResult.success()){ + throw new RenException("查询巡查次数和时长失败"); + } + List 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 diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenCustomerAgencyDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenCustomerAgencyDao.xml index f0e65a8bd1..3e058e209a 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenCustomerAgencyDao.xml +++ b/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},'%') - AND cg.ALL_PARENT_IDS LIKE CONCAT(#{agencyId}, '%') + AND cg.ALL_PARENT_IDS LIKE CONCAT('%',#{agencyId}, '%') From cd2e538b81fc7b41f6070bc0779dff5c474a14f1 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Thu, 26 Aug 2021 10:49:40 +0800 Subject: [PATCH 09/23] =?UTF-8?q?=E5=AF=B9=E5=A4=96=E6=8E=A5=E5=8F=A3-?= =?UTF-8?q?=E7=BD=91=E6=A0=BC=E5=91=98=E5=B7=A1=E6=9F=A5=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/GridMemberPatrolListFormDTO.java | 43 ++++++++++++++++ .../result/GridMemberPatrolListResultDTO.java | 31 ++++++++++++ .../controller/EpmetUserController.java | 19 +++++-- .../dataaggre/dao/datastats/DataStatsDao.java | 8 +++ .../dao/epmetuser/StaffPatrolRecordDao.java | 7 +++ .../service/datastats/DataStatsService.java | 8 +++ .../datastats/impl/DataStatsServiceImpl.java | 13 ++++- .../service/epmetuser/EpmetUserService.java | 12 +++-- .../epmetuser/impl/EpmetUserServiceImpl.java | 49 +++++++++++++++++-- .../mapper/datastats/DatsStatsDao.xml | 30 ++++++++++++ .../mapper/epmetuser/StaffPatrolRecordDao.xml | 20 ++++++++ 11 files changed, 227 insertions(+), 13 deletions(-) create mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/GridMemberPatrolListFormDTO.java create mode 100644 epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/GridMemberPatrolListResultDTO.java diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/GridMemberPatrolListFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/form/GridMemberPatrolListFormDTO.java new file mode 100644 index 0000000000..a7ffd9dc56 --- /dev/null +++ b/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 {} +} diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/GridMemberPatrolListResultDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/epmetuser/result/GridMemberPatrolListResultDTO.java new file mode 100644 index 0000000000..9a2035680d --- /dev/null +++ b/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; + +} diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/EpmetUserController.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/EpmetUserController.java index 506048dbd4..300f242c41 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/EpmetUserController.java +++ b/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> 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>().ok(epmetUserService.gridMemberPatrolList(formDTO)); + } + } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/datastats/DataStatsDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/datastats/DataStatsDao.java index e9772bf321..9cf5a3a6e1 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/datastats/DataStatsDao.java +++ b/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 agencyList, @Param("dateId") String dateId); + + /** + * @Description 查询当前组织及下级所有网格员维度对应最大dated数据 + * @author sun + */ + List selectGirdMemberPatrol(GridMemberPatrolListFormDTO formDTO); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/StaffPatrolRecordDao.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/StaffPatrolRecordDao.java index 36385a7cbd..a18928719c 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/dao/epmetuser/StaffPatrolRecordDao.java +++ b/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 { * @author sun */ StaffListResultDTO selectPersonalPatrolList(@Param("staffId") String staffId); + + /** + * @Description 按维度汇总当前组织及下级网格员巡查数据 + * @author sun + */ + List gridMemberPatrol(GridMemberPatrolListFormDTO formDTO); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/DataStatsService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/DataStatsService.java index 8d0cb5fa76..d4756648a0 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/DataStatsService.java +++ b/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 getGirdMemberPatrol(GridMemberPatrolListFormDTO formDTO); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java index 6a8896618d..cfe7943085 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java @@ -12,7 +12,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; @@ -1830,4 +1832,13 @@ public class DataStatsServiceImpl implements DataStatsService { return result; } + /** + * @Description 查询当前组织及下级所有网格员维度对应最大dated数据 + * @author sun + */ + @Override + public List getGirdMemberPatrol(GridMemberPatrolListFormDTO formDTO) { + return dataStatsDao.selectGirdMemberPatrol(formDTO); + } + } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/EpmetUserService.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/EpmetUserService.java index e1941c1c08..6d25c65b48 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/EpmetUserService.java +++ b/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 gridMemberPatrolList(GridMemberPatrolListFormDTO formDTO); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java index 32bce002dc..cabda43539 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java +++ b/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 gridMemberPatrolList(GridMemberPatrolListFormDTO formDTO) { + //1.查询当前组织及下级所有网格员维度对应最大dated数据【例查询2021年8月数据,则是查询8月对应的最大daeId那天的网格员数据】 + List resultList = dataStatsService.getGirdMemberPatrol(formDTO); + if (CollectionUtils.isEmpty(resultList)) { + return new ArrayList<>(); + } + + //2.按维度汇总当前组织及下级网格员巡查数据 + //【如果查询当前月或本年度数据,则需要排除最大dateId的数据,因为上边查的统计数据只有t-1的,巡查数据是t的,避免多计算了当天的巡查项目数和时长数】 + formDTO.setDateId(resultList.get(0).getDateId()); + List 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() { + @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; + } + } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/datastats/DatsStatsDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/datastats/DatsStatsDao.xml index 5a563a5e4b..9f99415f2b 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/datastats/DatsStatsDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/datastats/DatsStatsDao.xml @@ -767,4 +767,34 @@ + + diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/StaffPatrolRecordDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/StaffPatrolRecordDao.xml index 9f0fd1fe74..fb4ad95459 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/StaffPatrolRecordDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/epmetuser/StaffPatrolRecordDao.xml @@ -120,4 +120,24 @@ AND ssp.staff_id = #{staffId} + + From 3931bf81508da2485ffb78ba366bd2058477a291 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Thu, 26 Aug 2021 13:54:34 +0800 Subject: [PATCH 10/23] =?UTF-8?q?=E5=90=8D=E5=AD=97=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ltDTO.java => GridManagerListGeneralResultDTO.java} | 4 ++-- .../controller/user/StaffPatrolDetailController.java | 10 +++++----- .../service/user/StaffPatrolDetailService.java | 6 +++--- .../user/impl/StaffPatrolDetailServiceImpl.java | 9 ++++----- 4 files changed, 14 insertions(+), 15 deletions(-) rename epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/{GridManagerListYuShanResultDTO.java => GridManagerListGeneralResultDTO.java} (93%) diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListYuShanResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListGeneralResultDTO.java similarity index 93% rename from epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListYuShanResultDTO.java rename to epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListGeneralResultDTO.java index 51ab6b798a..bb7e6c781a 100644 --- a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListYuShanResultDTO.java +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/user/result/GridManagerListGeneralResultDTO.java @@ -12,7 +12,7 @@ import java.io.Serializable; * @DESC */ @Data -public class GridManagerListYuShanResultDTO implements Serializable { +public class GridManagerListGeneralResultDTO implements Serializable { private static final long serialVersionUID = -2770911125810373090L; @@ -78,7 +78,7 @@ public class GridManagerListYuShanResultDTO implements Serializable { @JsonIgnore private Boolean llStatus; - public GridManagerListYuShanResultDTO() { + public GridManagerListGeneralResultDTO() { this.staffId = ""; this.longitude = ""; this.latitude = ""; diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/user/StaffPatrolDetailController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/user/StaffPatrolDetailController.java index 5901ada344..f01e9dbe77 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/user/StaffPatrolDetailController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/user/StaffPatrolDetailController.java @@ -11,7 +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.GridManagerListYuShanResultDTO; +import com.epmet.user.result.GridManagerListGeneralResultDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -79,15 +79,15 @@ public class StaffPatrolDetailController { } /** - * @Description 网格员分布-榆山 + * @Description 网格员分布 * @Param formDTO * @author zxc * @date 2021/8/25 3:00 下午 */ - @PostMapping("gridmanagerlist-yushan") - public Result> gridManagerListYuShan(@RequestBody GridManagerListFormDTO formDTO){ + @PostMapping("gridmanagerlistgeneral") + public Result> gridManagerListGeneral(@RequestBody GridManagerListFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO, GridManagerListFormDTO.GridManagerListForm.class); - return new Result>().ok(staffPatrolService.gridManagerListYuShan(formDTO)); + return new Result>().ok(staffPatrolService.gridManagerListGeneral(formDTO)); } } diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/StaffPatrolDetailService.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/StaffPatrolDetailService.java index 41c1e3278c..8bc7a6c4b6 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/StaffPatrolDetailService.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/StaffPatrolDetailService.java @@ -8,7 +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.GridManagerListYuShanResultDTO; +import com.epmet.user.result.GridManagerListGeneralResultDTO; import java.util.List; @@ -29,12 +29,12 @@ public interface StaffPatrolDetailService{ List gridManagerList(GridManagerListFormDTO formDTO); /** - * @Description 网格员分布-榆山 + * @Description 网格员分布 * @Param formDTO * @author zxc * @date 2021/8/25 3:00 下午 */ - List gridManagerListYuShan(GridManagerListFormDTO formDTO); + List gridManagerListGeneral(GridManagerListFormDTO formDTO); /** * @Description 002、查看巡查记录 diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/impl/StaffPatrolDetailServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/impl/StaffPatrolDetailServiceImpl.java index 48a11334e2..adec1862e9 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/user/impl/StaffPatrolDetailServiceImpl.java +++ b/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,7 +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.GridManagerListYuShanResultDTO; +import com.epmet.user.result.GridManagerListGeneralResultDTO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -138,15 +137,15 @@ public class StaffPatrolDetailServiceImpl implements StaffPatrolDetailService { } /** - * @Description 网格员分布-榆山 + * @Description 网格员分布 * @Param formDTO * @author zxc * @date 2021/8/25 3:00 下午 */ @Override - public List gridManagerListYuShan(GridManagerListFormDTO formDTO) { + public List gridManagerListGeneral(GridManagerListFormDTO formDTO) { List resultTwo = this.gridManagerList(formDTO); - List result = ConvertUtils.sourceToTarget(resultTwo, GridManagerListYuShanResultDTO.class); + List result = ConvertUtils.sourceToTarget(resultTwo, GridManagerListGeneralResultDTO.class); Result> listResult = epmetUserOpenFeignClient.patrolInfo(formDTO.getAgencyId()); if (!listResult.success()){ throw new RenException("查询巡查次数和时长失败"); From faead61a446546782a4b1915c4ce0e44474f35c7 Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Fri, 27 Aug 2021 17:49:04 +0800 Subject: [PATCH 11/23] =?UTF-8?q?=E5=AF=B9=E5=A4=96=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-gateway/src/main/resources/bootstrap.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml index 23c16efb82..91552a59b1 100644 --- a/epmet-gateway/src/main/resources/bootstrap.yml +++ b/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 From fa70a90619ecb10bfe34845cd2d0ae139758c65b Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Tue, 31 Aug 2021 14:29:55 +0800 Subject: [PATCH 12/23] =?UTF-8?q?=E5=9C=A8=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...eenProjectCategoryOrgDailyServiceImpl.java | 33 ++++++++++++++----- .../ScreenProjectCategoryOrgDailyDao.xml | 2 +- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java index cd771a5a9f..23f44b8184 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java @@ -462,19 +462,34 @@ public class ScreenProjectCategoryOrgDailyServiceImpl extends BaseServiceImpl> groupByStatus = categoryProjectExists.stream().collect(Collectors.groupingBy(CategoryProjectResultDTO::getStatus)); + List twoResult = new ArrayList<>(); if (!CollectionUtils.isEmpty(groupByStatus.get(false))){ - List 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 entities = ConvertUtils.sourceToTarget(categoryProjectNotExists, ScreenProjectCategoryOrgDailyEntity.class); - entities.forEach(e -> { - e.setOrgId(entity.getAgencyId()); + twoResult.addAll(categoryProjectNotExists); + } + if (!CollectionUtils.isEmpty(twoResult)){ + Map> groupOrigin = twoResult.stream().collect(Collectors.groupingBy(CategoryProjectResultDTO::getCategoryOriginCustomerId)); + List finalResult1 = result; + groupOrigin.forEach((originCustomerId, list) -> { + // 父客户存在但是未使用的分类 + 父客户不存在的分类,根据categoryCode分组 + Map> 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); + } } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml index e6293d01f2..cdce01974a 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectCategoryOrgDailyDao.xml @@ -81,7 +81,7 @@ AND od.pid = '0' AND od.date_id = #{dateId} - GROUP BY categoryCode,od.pid + GROUP BY categoryCode,od.ORG_ID From 70a8406ac3ef305ad6d50f20866a1b104533d084 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Tue, 31 Aug 2021 15:03:27 +0800 Subject: [PATCH 13/23] =?UTF-8?q?=E5=86=8D=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java index 23f44b8184..902981793a 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectCategoryOrgDailyServiceImpl.java +++ b/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 Date: Tue, 31 Aug 2021 21:34:53 +0800 Subject: [PATCH 14/23] =?UTF-8?q?1.=E6=8F=90=E5=8F=96openapi-sdk=202.?= =?UTF-8?q?=E8=B0=83=E6=95=B4third=20apiService=E7=9B=B8=E5=85=B3=E9=80=BB?= =?UTF-8?q?=E8=BE=91=203.=E5=AE=8C=E6=88=90=E6=8E=A8=E9=80=81component=20a?= =?UTF-8?q?ccess=20token=E5=88=B0=E7=A7=81=E6=9C=89=E5=8C=96=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/redis/RedisKeys.java | 22 ++ .../src/main/resources/bootstrap.yml | 1 + .../epmet/constant/ThirdPlatformActions.java | 6 + .../result/ThirdPlatformActionsResultDTO.java | 19 ++ .../privateepmet/GetAccessTokenResultDTO.java | 18 ++ .../com/epmet/feign/ThirdOpenFeignClient.java | 22 ++ .../ThirdOpenFeignClientFallback.java | 12 + .../java/com/epmet/apiservice/ApiService.java | 246 +++++++++++++++--- .../epmet/apiservice/impl/DemoApiService.java | 18 +- .../impl/LuzhouGridPlatformApiService.java | 49 ++-- .../impl/PingyinPrivateEpmetApiService.java | 169 ++++++++++++ .../controller/PrivateEpmetController.java | 50 ++++ .../com/epmet/controller/TestConttroller.java | 30 +++ .../com/epmet/dao/ThirdplatformActionDao.java | 10 + .../dao/ThirdplatformCustomerRegisterDao.java | 10 + .../com/epmet/redis/ThirdPlatformCache.java | 19 ++ .../service/ComponentVerifyTicketService.java | 3 + .../epmet/service/PrivateEpmetService.java | 19 ++ .../epmet/service/ThirdPlatformService.java | 10 + .../ComponentVerifyTicketServiceImpl.java | 203 +++++++++------ .../service/impl/PrivateEpmetServiceImpl.java | 71 +++++ .../impl/ThirdPlatformServiceImpl.java | 6 + .../mapper/ThirdplatformActionDao.xml | 17 ++ .../ThirdplatformCustomerRegisterDao.xml | 14 + epmet-openapi/epmet-openapi-sdk/pom.xml | 15 ++ .../epmet/openapi/sdk/encrypt/Md5Util.java | 133 ++++++++++ .../openapi/sdk/sign/OpenApiSignUtils.java | 109 ++++++++ epmet-openapi/pom.xml | 1 + 28 files changed, 1160 insertions(+), 142 deletions(-) create mode 100644 epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/ThirdPlatformActionsResultDTO.java create mode 100644 epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/privateepmet/GetAccessTokenResultDTO.java create mode 100644 epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/PingyinPrivateEpmetApiService.java create mode 100644 epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/PrivateEpmetController.java create mode 100644 epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/TestConttroller.java create mode 100644 epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/redis/ThirdPlatformCache.java create mode 100644 epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/PrivateEpmetService.java create mode 100644 epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/PrivateEpmetServiceImpl.java create mode 100644 epmet-openapi/epmet-openapi-sdk/pom.xml create mode 100644 epmet-openapi/epmet-openapi-sdk/src/main/java/com/epmet/openapi/sdk/encrypt/Md5Util.java create mode 100644 epmet-openapi/epmet-openapi-sdk/src/main/java/com/epmet/openapi/sdk/sign/OpenApiSignUtils.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 046802e321..0b965cf2da 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -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 diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml index 91552a59b1..4f65034c7d 100644 --- a/epmet-gateway/src/main/resources/bootstrap.yml +++ b/epmet-gateway/src/main/resources/bootstrap.yml @@ -495,6 +495,7 @@ epmet: - /data/stats/project/** - /data/stats/basereport/** - /data/stats/governance/** + - /third/private-epmet/push-component-access-token # 对外开放接口认证白名单 diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/constant/ThirdPlatformActions.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/constant/ThirdPlatformActions.java index dc17deca39..bd0875b2e2 100644 --- a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/constant/ThirdPlatformActions.java +++ b/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"; + } diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/ThirdPlatformActionsResultDTO.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/ThirdPlatformActionsResultDTO.java new file mode 100644 index 0000000000..a1a81ee406 --- /dev/null +++ b/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; + +} diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/privateepmet/GetAccessTokenResultDTO.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/privateepmet/GetAccessTokenResultDTO.java new file mode 100644 index 0000000000..e2cc8ab4c3 --- /dev/null +++ b/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; + +} diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/ThirdOpenFeignClient.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/ThirdOpenFeignClient.java index 9cfd126d4c..d4efa88cc9 100644 --- a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/ThirdOpenFeignClient.java +++ b/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> 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); } diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/fallback/ThirdOpenFeignClientFallback.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/fallback/ThirdOpenFeignClientFallback.java index 76098de169..b6929b9883 100644 --- a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/feign/fallback/ThirdOpenFeignClientFallback.java +++ b/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> 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); + } } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/ApiService.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/ApiService.java index 36117287e1..a43689e321 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/ApiService.java +++ b/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 { /** * 重试次数 */ @@ -61,13 +64,13 @@ public abstract class ApiService { * @param headers * @return */ - public String sendGetRequest(String platformId, String action, Map params, Map headers) { + public R sendGetRequest(String platformId, String action, Map params, Map 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 result = HttpClientManager.getInstance().sendGet(thirdplatform.getBaseUrl().concat(actionEntity.getApiUrl()), - thirdplatform.getBaseUrl().startsWith("https://"), + Result 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 headers) { + public R sendPostRequest(String platformId, String action, String jsonString, Map headers, Map 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 result = HttpClientManager.getInstance().sendPost(thirdplatform.getBaseUrl().concat(actionEntity.getApiUrl()), - thirdplatform.getBaseUrl().startsWith("https://"), + String urlParmsStr = this.convertQueryParams2String(urlParams); + Result 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 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 stringRedisTemplate = SpringContextUtils.getBean("redisTemplate", RedisTemplate.class); + Map 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 hashOperations = SpringContextUtils.getBean("redisTemplate", RedisTemplate.class).opsForHash(); + Map 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 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 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 map) { + String redisKey = RedisKeys.getThirdPlatformActionUrlKey(platformId); + + RedisTemplate redisTemplate = SpringContextUtils.getBean("redisTemplate", RedisTemplate.class); + HashOperations 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 + * @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 actions = SpringContextUtils.getBean(ThirdplatformActionDao.class) + .listPlatformActions(platformId); + + Map 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 R parsePlatformResponseResult(String resultString, Class 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) {}; } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/DemoApiService.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/DemoApiService.java index 63f718a0d5..ed06d5059a 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/DemoApiService.java +++ b/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 { 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 String parsePlatformResponseResult(String resultString, Class clazz) { + return null; } } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/LuzhouGridPlatformApiService.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/LuzhouGridPlatformApiService.java index abbaad2255..dee2cd8137 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/LuzhouGridPlatformApiService.java +++ b/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 { + + @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 platformResult = JSON.parseObject(result.getData(), LZGridPlatformBaseResult.class); - judgeResultSuccess(platformResult); - - token = platformResult.getResult(); - addAccessTokenToCache(platformId, token, (long)(3600*1.8*1000), TimeUnit.MILLISECONDS); + LZGridPlatformBaseResult 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 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 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 LZGridPlatformBaseResult parsePlatformResponseResult(String resultString, Class clazz) { + LZGridPlatformBaseResult 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 baseResult = sendPostRequestToUploadFile(platformId, ThirdPlatformActions.UPLOAD_FILE, file, fileName); + // 此处设置为第三方系统返回的唯一id + resultDTO.setUrl(baseResult.getResult()); System.out.println("泸州网格化平台项目文件上传成功"); } catch (Exception e) { throw new RenException("上传失败"); diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/PingyinPrivateEpmetApiService.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/apiservice/impl/PingyinPrivateEpmetApiService.java new file mode 100644 index 0000000000..da62386442 --- /dev/null +++ b/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 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 stringResult = HttpClientManager.getInstance().sendPostByHttps(requestUrl, "{}"); + String remoteResultString = getResultDataOrThrowsException(stringResult, "【调用平阴私有化平台获取AccessToken】", EpmetErrorCode.SERVER_ERROR.getCode(), null); + Result 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 requestBodyMap) { + HashMap 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 + * @author wxz + * @date 2021.08.31 14:19:41 + */ + private Map constructCommonUrlParamsMap(String platformKey, String authType, String nonce, Long timeMillis, String sign) { + HashMap 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 Result parsePlatformResponseResult(String resultString, Class clazz) { + Result result; + try { + result = JSON.parseObject(resultString, new TypeReference>(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 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 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) { + + } +} diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/PrivateEpmetController.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/PrivateEpmetController.java new file mode 100644 index 0000000000..1135562069 --- /dev/null +++ b/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(); + } +} diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/TestConttroller.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/TestConttroller.java new file mode 100644 index 0000000000..f5d81f987d --- /dev/null +++ b/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(); + } + +} diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ThirdplatformActionDao.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ThirdplatformActionDao.java index 50de9d3629..405ae52529 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ThirdplatformActionDao.java +++ b/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 listPlatformActions(@Param("platformId") String platformId); } \ No newline at end of file diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ThirdplatformCustomerRegisterDao.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ThirdplatformCustomerRegisterDao.java index 3dc3001baf..5f1fe6f038 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ThirdplatformCustomerRegisterDao.java +++ b/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 + * @author wxz + * @date 2021.08.30 17:07:32 + */ + List listPlatformsByActionKey(@Param("actionKey") String actionKey); } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/redis/ThirdPlatformCache.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/redis/ThirdPlatformCache.java new file mode 100644 index 0000000000..c8c3409bc2 --- /dev/null +++ b/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; +} diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ComponentVerifyTicketService.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ComponentVerifyTicketService.java index 28cfae2fde..8d3ce45cbf 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ComponentVerifyTicketService.java +++ b/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); + } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/PrivateEpmetService.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/PrivateEpmetService.java new file mode 100644 index 0000000000..3ab6a0b870 --- /dev/null +++ b/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); +} diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ThirdPlatformService.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ThirdPlatformService.java index 570ce04d49..33224b3497 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ThirdPlatformService.java +++ b/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 + * @author wxz + * @date 2021.08.30 16:59:13 + */ + List listPlatformsByActionKey(String actionKey); } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ComponentVerifyTicketServiceImpl.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ComponentVerifyTicketServiceImpl.java index a23d9ac77f..2ac3e225b2 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ComponentVerifyTicketServiceImpl.java +++ b/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 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 result){ + public void disposeAuthResult(Map result) { Map tempMap = result; - Map data = tempMap; + Map 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 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_token、component_appid、authorization_code】 + * @Description 使用授权码获取授权信息 请求参数:【component_access_token、component_appid、authorization_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 hashMap = JSON.parseObject(authInfo, HashMap.class); + HashMap 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 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 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 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 map = JSON.parseObject(data, Map.class); + String data = HttpClientManager.getInstance().sendPostByJSON(WxMaCodeConstant.API_GET_AUTHORIZER_INFO + componentAccessToken, JSON.toJSONString(jsonObject)).getData(); + 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 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 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 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 bindInfo = JSON.parseObject(bindResult, Map.class); + Map 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 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 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); + } + }); + } + } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/PrivateEpmetServiceImpl.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/PrivateEpmetServiceImpl.java new file mode 100644 index 0000000000..35cb59cad1 --- /dev/null +++ b/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) { + + } +} diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ThirdPlatformServiceImpl.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ThirdPlatformServiceImpl.java index 3d6393e17e..a3e0930e7a 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ThirdPlatformServiceImpl.java +++ b/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 listPlatformsByActionKey(String actionKey) { + return thirdplatformCustomerRegisterDao.listPlatformsByActionKey(actionKey); + } } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformActionDao.xml b/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformActionDao.xml index 39de22dca5..954b8a96e6 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformActionDao.xml +++ b/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 + + + diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformCustomerRegisterDao.xml b/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformCustomerRegisterDao.xml index 9ab368a8bc..66d039fc3c 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformCustomerRegisterDao.xml +++ b/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ThirdplatformCustomerRegisterDao.xml @@ -36,6 +36,20 @@ and DEL_FLAG = 0 + + + insert into thirdplatform_customer_register ( diff --git a/epmet-openapi/epmet-openapi-sdk/pom.xml b/epmet-openapi/epmet-openapi-sdk/pom.xml new file mode 100644 index 0000000000..c006c05b10 --- /dev/null +++ b/epmet-openapi/epmet-openapi-sdk/pom.xml @@ -0,0 +1,15 @@ + + + + epmet-openapi + com.epmet + 2.0.0 + + 4.0.0 + + epmet-openapi-sdk + + + \ No newline at end of file diff --git a/epmet-openapi/epmet-openapi-sdk/src/main/java/com/epmet/openapi/sdk/encrypt/Md5Util.java b/epmet-openapi/epmet-openapi-sdk/src/main/java/com/epmet/openapi/sdk/encrypt/Md5Util.java new file mode 100644 index 0000000000..0838048629 --- /dev/null +++ b/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; + } + +} diff --git a/epmet-openapi/epmet-openapi-sdk/src/main/java/com/epmet/openapi/sdk/sign/OpenApiSignUtils.java b/epmet-openapi/epmet-openapi-sdk/src/main/java/com/epmet/openapi/sdk/sign/OpenApiSignUtils.java new file mode 100644 index 0000000000..e44b17aa30 --- /dev/null +++ b/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 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 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 map) { + Set 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 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 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); + } +} diff --git a/epmet-openapi/pom.xml b/epmet-openapi/pom.xml index 9db62073f3..a3be582a53 100644 --- a/epmet-openapi/pom.xml +++ b/epmet-openapi/pom.xml @@ -13,6 +13,7 @@ epmet-openapi epmet-openapi-scan + epmet-openapi-sdk \ No newline at end of file From 2557b58325b51fbdbcc61a4c8e6bcfe53451d044 Mon Sep 17 00:00:00 2001 From: wxz Date: Tue, 31 Aug 2021 22:21:44 +0800 Subject: [PATCH 15/23] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=EF=BC=9A=E6=BC=8F=E4=BA=86openapi-sdk=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-module/epmet-third/epmet-third-server/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/epmet-module/epmet-third/epmet-third-server/pom.xml b/epmet-module/epmet-third/epmet-third-server/pom.xml index bd811cf03e..a945beb046 100644 --- a/epmet-module/epmet-third/epmet-third-server/pom.xml +++ b/epmet-module/epmet-third/epmet-third-server/pom.xml @@ -21,6 +21,11 @@ + + com.epmet + epmet-openapi-sdk + 2.0.0 + com.epmet epmet-third-client From 8df605b3cdf2cfb0e11233506db7d1d8b6f2e529 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Wed, 1 Sep 2021 09:56:55 +0800 Subject: [PATCH 16/23] =?UTF-8?q?=E5=85=9A=E5=91=98=E8=AE=A4=E8=AF=81bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../partymember/service/impl/PartyMemberConfirmServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/PartyMemberConfirmServiceImpl.java b/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/PartyMemberConfirmServiceImpl.java index 80cc4cc91e..1610de67c6 100644 --- a/epmet-module/resi-partymember/resi-partymember-server/src/main/java/com/epmet/modules/partymember/service/impl/PartyMemberConfirmServiceImpl.java +++ b/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)); From bdc0ab6e20a0e7915cdfade6d75dd716a3e6eeeb Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 3 Sep 2021 10:32:01 +0800 Subject: [PATCH 17/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E5=AE=9E=E5=86=B5=E6=97=A5=E6=9C=9Fbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datastats/impl/DataStatsServiceImpl.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java index 6a8896618d..868a97eda4 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java +++ b/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; @@ -1487,26 +1488,25 @@ public class DataStatsServiceImpl implements DataStatsService { } 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); - 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()); + //startDate = DateUtils.getBeforeNDay(actulStartDate,1); + //DateUtils.format(DateUtils.addDateDays(yesterday, -1),DateUtils.DATE_PATTERN_YYYYMMDD); 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); + //startDate = DateUtils.getBeforeNDay(actulStartDate,1); if (!isYesterday) { endDate = DateUtils.format(DateUtils.getMonthEnd(dateIdDate), DateUtils.DATE_PATTERN_YYYYMMDD); } @@ -1516,6 +1516,7 @@ public class DataStatsServiceImpl implements DataStatsService { } formDTO.setStartDateId(startDate); formDTO.setEndDateId(endDate); + log.info("getSubWorkFact do select param:{}", JSON.toJSONString(formDTO)); List result = new ArrayList<>(); //如果是社区 则下级是网格 查询网格的数据 if (OrgLevelEnum.COMMUNITY.getCode().equals(formDTO.getAgencyLevel())){ From d657ee22cc0d894b02b78309e9ed799fa11127b3 Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 1 Sep 2021 12:33:23 +0800 Subject: [PATCH 18/23] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/datastats/impl/DataStatsServiceImpl.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java index 4667a7b99c..411be35b77 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java @@ -1489,26 +1489,22 @@ public class DataStatsServiceImpl implements DataStatsService { formDTO.setDateId(format.format(yesterday)); } String startDate = null; - String actulStartDate = 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); - actulStartDate = formDTO.getDateId(); + endDate = formDTO.getDateId(); break; case "thisWeek": startDate = DateUtils.getWeekStart(formDTO.getDateId()); - //startDate = DateUtils.getBeforeNDay(actulStartDate,1); - //DateUtils.format(DateUtils.addDateDays(yesterday, -1),DateUtils.DATE_PATTERN_YYYYMMDD); if (!isYesterday){ endDate = DateUtils.getWeekEnd(formDTO.getDateId()); } break; case "thisMonth": startDate = DateUtils.format(DateUtils.getMonthStart(dateIdDate),DateUtils.DATE_PATTERN_YYYYMMDD); - //startDate = DateUtils.getBeforeNDay(actulStartDate,1); if (!isYesterday) { endDate = DateUtils.format(DateUtils.getMonthEnd(dateIdDate), DateUtils.DATE_PATTERN_YYYYMMDD); } @@ -1544,7 +1540,7 @@ public class DataStatsServiceImpl implements DataStatsService { Map closeProjectStartMap = closeProjectStart.stream().collect(Collectors.toMap(SubGridProjectResultDTO::getGridId, SubGridProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1)); Map closeProjectEndMap = closeProjectEnd.stream().collect(Collectors.toMap(SubGridProjectResultDTO::getGridId, SubGridProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1)); //巡查次数和时间 - List patrolList = statsStaffPatrolRecordDailyService.getPatrolSumList(gridIdList,actulStartDate,formDTO.getEndDateId()); + List patrolList = statsStaffPatrolRecordDailyService.getPatrolSumList(gridIdList,formDTO.getStartDateId(),formDTO.getEndDateId()); Map patrolListMap = patrolList.stream().collect(Collectors.toMap(PatrolDailySumResult::getFullAgencyId, o -> o, (o1, o2) -> o1)); subAgencyList.forEach(agency->{ @@ -1585,7 +1581,7 @@ public class DataStatsServiceImpl implements DataStatsService { Map closeProjectEndMap = closeProjectEnd.stream().collect(Collectors.toMap(SubAgencyProjectResultDTO::getAgencyId, SubAgencyProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1)); //巡查次数和时间 List agencyFullIds = subAgencyList.stream().map(o -> o.getPids().concat(StrConstant.COLON).concat(o.getAgencyId())).collect(Collectors.toList()); - List patrolList = statsStaffPatrolRecordDailyService.getPatrolSumList(agencyFullIds,actulStartDate,formDTO.getEndDateId()); + List patrolList = statsStaffPatrolRecordDailyService.getPatrolSumList(agencyFullIds,formDTO.getStartDateId(),formDTO.getEndDateId()); Map patrolListMap = patrolList.stream().collect(Collectors.toMap(PatrolDailySumResult::getFullAgencyId, o -> o, (o1, o2) -> o1)); subAgencyList.forEach(agency->{ From 65d8cbcd1911a5294c3185047baa5f75f401242f Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 1 Sep 2021 12:57:43 +0800 Subject: [PATCH 19/23] =?UTF-8?q?=E5=80=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/datastats/impl/DataStatsServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java index 411be35b77..443b33c2fa 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java @@ -1599,7 +1599,9 @@ public class DataStatsServiceImpl implements DataStatsService { }); } - List newResult = result.stream().sorted(Comparator.comparing(o -> o.getTopicToIssueTotal() + o.getIssueToProjectTotal() + o.getClosedProjectTotal() + o.getPatrolTotal())).collect(Collectors.toList()); + List newResult = result.stream().sorted(Comparator.comparing(o -> o.getTopicToIssueTotal() + o.getIssueToProjectTotal() + o.getClosedProjectTotal() + o.getPatrolTotal())) + .collect(Collectors.toList()); + Collections.reverse(newResult); return newResult; } From 59f134ef5455499dabe283e71fd438f0bb62255c Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 1 Sep 2021 13:22:04 +0800 Subject: [PATCH 20/23] =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataaggre/service/datastats/impl/DataStatsServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java index 443b33c2fa..748ba3cf82 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java @@ -1494,7 +1494,7 @@ public class DataStatsServiceImpl implements DataStatsService { 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(); break; case "thisWeek": From 7e1a228191be6d82720882bd5d035ff09e5f7dcc Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 1 Sep 2021 13:38:39 +0800 Subject: [PATCH 21/23] =?UTF-8?q?=E5=B7=AE=E5=80=BC=20=E5=B7=AE=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datastats/impl/DataStatsServiceImpl.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java index 748ba3cf82..eef006470e 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java @@ -1490,21 +1490,25 @@ public class DataStatsServiceImpl implements DataStatsService { } String startDate = null; String endDate = formDTO.getDateId(); + String breforeStartDate = null; 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 = formDTO.getDateId(); + breforeStartDate = startDate = DateUtils.getBeforeNDay(startDate,1); endDate = formDTO.getDateId(); break; case "thisWeek": startDate = DateUtils.getWeekStart(formDTO.getDateId()); + breforeStartDate = startDate = DateUtils.getBeforeNDay(startDate,1); if (!isYesterday){ endDate = DateUtils.getWeekEnd(formDTO.getDateId()); } break; case "thisMonth": startDate = DateUtils.format(DateUtils.getMonthStart(dateIdDate),DateUtils.DATE_PATTERN_YYYYMMDD); + breforeStartDate = startDate = DateUtils.getBeforeNDay(startDate,1); if (!isYesterday) { endDate = DateUtils.format(DateUtils.getMonthEnd(dateIdDate), DateUtils.DATE_PATTERN_YYYYMMDD); } @@ -1525,17 +1529,17 @@ public class DataStatsServiceImpl implements DataStatsService { } List gridIdList = subAgencyList.stream().map(ScreenCustomerGridDTO::getGridId).collect(Collectors.toList()); //查询组织的话题转议题数据 - List toIssueStart = dataStatsDao.getSubGridTopicShiftIssue(gridIdList, formDTO.getStartDateId()); + List toIssueStart = dataStatsDao.getSubGridTopicShiftIssue(gridIdList, breforeStartDate); List toIssueEnd = dataStatsDao.getSubGridTopicShiftIssue(gridIdList, formDTO.getEndDateId()); Map toIssueStartMap = toIssueStart.stream().collect(Collectors.toMap(SubGridFormDTO.Topic::getGridId, SubGridFormDTO.Topic::getShiftedIssueTotal, (o1, o2) -> o1)); Map toIssueEndMap = toIssueEnd.stream().collect(Collectors.toMap(SubGridFormDTO.Topic::getGridId, SubGridFormDTO.Topic::getShiftedIssueTotal, (o1, o2) -> o1)); //查询组织的议题转项目数据 - List toProjectStart = dataStatsDao.getSubGridIssue(gridIdList, formDTO.getStartDateId()); + List toProjectStart = dataStatsDao.getSubGridIssue(gridIdList, breforeStartDate); List toProjectEnd = dataStatsDao.getSubGridIssue(gridIdList, formDTO.getEndDateId()); Map toProjectStartMap = toProjectStart.stream().collect(Collectors.toMap(SubGridIssueResultDTO::getGridId, SubGridIssueResultDTO::getShiftProjectTotal, (o1, o2) -> o1)); Map toProjectEndMap = toProjectEnd.stream().collect(Collectors.toMap(SubGridIssueResultDTO::getGridId, SubGridIssueResultDTO::getShiftProjectTotal, (o1, o2) -> o1)); //查询组织已关闭的项目数据 - List closeProjectStart = dataStatsDao.getSubGridProject(gridIdList, formDTO.getStartDateId()); + List closeProjectStart = dataStatsDao.getSubGridProject(gridIdList, breforeStartDate); List closeProjectEnd = dataStatsDao.getSubGridProject(gridIdList, formDTO.getEndDateId()); Map closeProjectStartMap = closeProjectStart.stream().collect(Collectors.toMap(SubGridProjectResultDTO::getGridId, SubGridProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1)); Map closeProjectEndMap = closeProjectEnd.stream().collect(Collectors.toMap(SubGridProjectResultDTO::getGridId, SubGridProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1)); @@ -1565,23 +1569,23 @@ public class DataStatsServiceImpl implements DataStatsService { List agencyList = subAgencyList.stream().map(ScreenCustomerAgencyDTO::getAgencyId).collect(Collectors.toList()); //查询组织的话题转议题数据 - List toIssueStart = dataStatsDao.getSubAgencyTopicShiftIssue(agencyList, formDTO.getStartDateId()); + List toIssueStart = dataStatsDao.getSubAgencyTopicShiftIssue(agencyList, breforeStartDate); List toIssueEnd = dataStatsDao.getSubAgencyTopicShiftIssue(agencyList, formDTO.getEndDateId()); Map toIssueStartMap = toIssueStart.stream().collect(Collectors.toMap(SubAgencyFormDTO.Topic::getAgencyId, SubAgencyFormDTO.Topic::getShiftedIssueTotal, (o1, o2) -> o1)); Map toIssueEndMap = toIssueEnd.stream().collect(Collectors.toMap(SubAgencyFormDTO.Topic::getAgencyId, SubAgencyFormDTO.Topic::getShiftedIssueTotal, (o1, o2) -> o1)); //查询组织的议题转项目数据 - List toProjectStart = dataStatsDao.getSubAgencyIssue(agencyList, formDTO.getStartDateId()); + List toProjectStart = dataStatsDao.getSubAgencyIssue(agencyList, breforeStartDate); List toProjectEnd = dataStatsDao.getSubAgencyIssue(agencyList, formDTO.getEndDateId()); Map toProjectStartMap = toProjectStart.stream().collect(Collectors.toMap(SubAgencyIssueResultDTO::getAgencyId, SubAgencyIssueResultDTO::getShiftProjectTotal, (o1, o2) -> o1)); Map toProjectEndMap = toProjectEnd.stream().collect(Collectors.toMap(SubAgencyIssueResultDTO::getAgencyId, SubAgencyIssueResultDTO::getShiftProjectTotal, (o1, o2) -> o1)); //查询组织已关闭的项目数据 - List closeProjectStart = dataStatsDao.getSubAgencyProject(agencyList, formDTO.getStartDateId()); + List closeProjectStart = dataStatsDao.getSubAgencyProject(agencyList, breforeStartDate); List closeProjectEnd = dataStatsDao.getSubAgencyProject(agencyList, formDTO.getEndDateId()); Map closeProjectStartMap = closeProjectStart.stream().collect(Collectors.toMap(SubAgencyProjectResultDTO::getAgencyId, SubAgencyProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1)); Map closeProjectEndMap = closeProjectEnd.stream().collect(Collectors.toMap(SubAgencyProjectResultDTO::getAgencyId, SubAgencyProjectResultDTO::getClosedProjectTotal, (o1, o2) -> o1)); //巡查次数和时间 List agencyFullIds = subAgencyList.stream().map(o -> o.getPids().concat(StrConstant.COLON).concat(o.getAgencyId())).collect(Collectors.toList()); - List patrolList = statsStaffPatrolRecordDailyService.getPatrolSumList(agencyFullIds,formDTO.getStartDateId(),formDTO.getEndDateId()); + List patrolList = statsStaffPatrolRecordDailyService.getPatrolSumList(agencyFullIds,breforeStartDate,formDTO.getEndDateId()); Map patrolListMap = patrolList.stream().collect(Collectors.toMap(PatrolDailySumResult::getFullAgencyId, o -> o, (o1, o2) -> o1)); subAgencyList.forEach(agency->{ From a574ef5683d1cf0c1cd1746ae7b94a71365d1f0c Mon Sep 17 00:00:00 2001 From: jianjun Date: Wed, 1 Sep 2021 13:40:25 +0800 Subject: [PATCH 22/23] =?UTF-8?q?=E5=B7=AE=E5=80=BC=20=E5=B7=AE=E5=80=BC?= =?UTF-8?q?=20=E4=BB=A3=E7=A0=81=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/datastats/impl/DataStatsServiceImpl.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java index eef006470e..1002b8c34a 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java @@ -1490,25 +1490,21 @@ public class DataStatsServiceImpl implements DataStatsService { } String startDate = null; String endDate = formDTO.getDateId(); - String breforeStartDate = null; 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 = formDTO.getDateId(); - breforeStartDate = startDate = DateUtils.getBeforeNDay(startDate,1); endDate = formDTO.getDateId(); break; case "thisWeek": startDate = DateUtils.getWeekStart(formDTO.getDateId()); - breforeStartDate = startDate = DateUtils.getBeforeNDay(startDate,1); if (!isYesterday){ endDate = DateUtils.getWeekEnd(formDTO.getDateId()); } break; case "thisMonth": startDate = DateUtils.format(DateUtils.getMonthStart(dateIdDate),DateUtils.DATE_PATTERN_YYYYMMDD); - breforeStartDate = startDate = DateUtils.getBeforeNDay(startDate,1); if (!isYesterday) { endDate = DateUtils.format(DateUtils.getMonthEnd(dateIdDate), DateUtils.DATE_PATTERN_YYYYMMDD); } @@ -1517,6 +1513,7 @@ 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 result = new ArrayList<>(); From 8d08abc80c2e6d5ff3f123ac4493a806e9d7ca64 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Wed, 1 Sep 2021 15:12:11 +0800 Subject: [PATCH 23/23] =?UTF-8?q?screenProjectOrgDaily=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ScreenProjectOrgDailyServiceImpl.java | 26 ++---- .../extract/FactOriginProjectMainDailyDao.xml | 91 +++++++++---------- .../screen/ScreenProjectOrgDailyDao.xml | 2 +- 3 files changed, 48 insertions(+), 71 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectOrgDailyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectOrgDailyServiceImpl.java index 3a37d17a40..9fbca67078 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenProjectOrgDailyServiceImpl.java +++ b/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 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 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 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 diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectOrgDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectOrgDailyDao.xml index 0700977462..841526476b 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenProjectOrgDailyDao.xml +++ b/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 #{dateId}