diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/AccessTokenDTO.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/AccessTokenDTO.java new file mode 100644 index 0000000000..dac9be670e --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/AccessTokenDTO.java @@ -0,0 +1,19 @@ +package com.epmet.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @description: + * @author: liushaowen + * @date: 2020/11/17 10:07 + */ +@Data +public class AccessTokenDTO implements Serializable { + private String resiToken; + + private String workToken; + + private String errMsg; +} diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/utils/ThirdUtils.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/utils/ThirdUtils.java new file mode 100644 index 0000000000..426bab2b82 --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/utils/ThirdUtils.java @@ -0,0 +1,53 @@ +package com.epmet.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.epmet.commons.tools.enums.EnvEnum; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.HttpClientManager; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.AccessTokenDTO; +import com.epmet.dto.result.CustomerTokensResultDTO; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @description: + * @author: liushaowen + * @date: 2020/11/17 10:04 + */ + +public class ThirdUtils { + /** + * @Description 获取AccessToken公共方法 + * @param customerId + * @return com.epmet.dto.AccessTokenDTO + * @Author liushaowen + * @Date 2020/11/17 10:09 + */ + public static AccessTokenDTO getAccessToken(String customerId) { + EnvEnum envEnum = EnvEnum.getCurrentEnv(); + AccessTokenDTO accessToken = new AccessTokenDTO(); + + String url = "https://epmet-cloud.elinkservice.cn/api/third/pacustomer/tokenlist"; + JSONObject postData = new JSONObject(); + postData.put("customerId", customerId); + String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(postData)).getData(); + JSONObject toResult = JSON.parseObject(data); + Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class); + if (null != toResult.get("code")) { + mapToResult.setCode(((Integer) toResult.get("code")).intValue()); + } + if (!mapToResult.success()) { + accessToken.setErrMsg( StringUtils.isBlank(mapToResult.getMsg()) ? mapToResult.getInternalMsg() : mapToResult.getMsg()); + } + Object CustomerTokensResultDTO = mapToResult.getData(); + JSONObject json = JSON.parseObject(CustomerTokensResultDTO.toString()); + CustomerTokensResultDTO customerTokensResultDTO = ConvertUtils.mapToEntity(json, com.epmet.dto.result.CustomerTokensResultDTO.class); + accessToken.setResiToken(customerTokensResultDTO.getResiAuthorizerToken()); + accessToken.setWorkToken(customerTokensResultDTO.getWorkAuthorizerToken()); + return accessToken; + } +} diff --git a/epmet-module/resi-group/resi-group-server/pom.xml b/epmet-module/resi-group/resi-group-server/pom.xml index 8d7f6c1173..1489a642ca 100644 --- a/epmet-module/resi-group/resi-group-server/pom.xml +++ b/epmet-module/resi-group/resi-group-server/pom.xml @@ -160,6 +160,11 @@ false https://epmet-dev.elinkservice.cn/api/epmetscan/api + + 5 + 8 + 10 + 30 @@ -193,6 +198,11 @@ false https://epmet-dev.elinkservice.cn/api/epmetscan/api + + 5 + 8 + 10 + 30 @@ -225,6 +235,11 @@ true https://epmet-dev.elinkservice.cn/api/epmetscan/api + + 5 + 8 + 10 + 30 @@ -254,6 +269,11 @@ true https://epmet-open.elinkservice.cn/api/epmetscan/api + + 5 + 8 + 10 + 30 diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/AsyncConfig.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/AsyncConfig.java new file mode 100644 index 0000000000..8a1a958939 --- /dev/null +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/AsyncConfig.java @@ -0,0 +1,49 @@ +package com.epmet.config; + +import com.epmet.properties.ThreadProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池配置类 + */ +@Configuration +@EnableConfigurationProperties(ThreadProperties.class) +@EnableAsync +public class AsyncConfig { + + @Autowired + private ThreadProperties threadProperties; + + @Bean + public Executor executor() { + ThreadProperties.ThreadPoolProperties threadPoolProps = threadProperties.getThreadPool(); + + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(threadPoolProps.getCorePoolSize()); + executor.setMaxPoolSize(threadPoolProps.getMaxPoolSize()); + executor.setQueueCapacity(threadPoolProps.getQueueCapacity()); + executor.setThreadNamePrefix("epmet-resi-group-"); + // rejection-policy:当pool已经达到max size的时候,如何处理新任务 + // CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略 + executor.setKeepAliveSeconds(threadPoolProps.getKeepAlive()); + executor.initialize(); + return executor; + } + + @Bean + public ExecutorService executorService() { + ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) executor(); + return executor.getThreadPoolExecutor(); + } + +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/controller/ResiGroupCodeController.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/controller/ResiGroupCodeController.java index 6f6430f358..34b4458ea8 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/controller/ResiGroupCodeController.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/controller/ResiGroupCodeController.java @@ -89,7 +89,7 @@ public class ResiGroupCodeController { @RequestMapping("creategroupcode") public Result createGroupCode(@RequestBody CreateGroupCodeFormDTO dto){ ValidatorUtils.validateEntity(dto); - return new Result().ok(resiGroupCodeService.createGroupCode(dto)); + return new Result().ok(resiGroupCodeService.createGroupCode(dto, true)); } @RequestMapping("getgroupcode") diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupCodeService.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupCodeService.java index de9a3a1505..e0b5e7ec4d 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupCodeService.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupCodeService.java @@ -101,12 +101,12 @@ public interface ResiGroupCodeService extends BaseService { /** * @Description 创建群组二维码 - * @param dto + * @param dto,syncFlag(是否同步执行,true同步,false异步) * @return String * @Author liushaowen * @Date 2020/11/13 16:32 */ - String createGroupCode(CreateGroupCodeFormDTO dto); + String createGroupCode(CreateGroupCodeFormDTO dto, boolean syncFlag); /** * @Description 获取群组二维码 diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupCodeServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupCodeServiceImpl.java index a09b756ca6..d989b3a379 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupCodeServiceImpl.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupCodeServiceImpl.java @@ -25,6 +25,7 @@ import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.enums.EnvEnum; +import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; @@ -48,6 +49,7 @@ import com.epmet.resi.group.dto.group.form.CreateGroupCodeFormDTO; import com.epmet.resi.group.dto.group.form.GetGroupCodeFormDTO; import com.epmet.resi.group.dto.group.form.GroupCodeBasicInfoFormDTO; import com.epmet.resi.group.dto.group.result.GroupCodeBasicInfoResultDTO; +import com.epmet.utils.ThirdUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,6 +60,7 @@ import org.springframework.transaction.annotation.Transactional; import java.io.UnsupportedEncodingException; import java.util.*; +import java.util.concurrent.ExecutorService; /** * 小组二维码 小组唯一二维码,海报码和小组码是同一个二维码,长期有效的 @@ -76,6 +79,9 @@ public class ResiGroupCodeServiceImpl extends BaseServiceImpl page(Map params) { IPage page = baseDao.selectPage( @@ -129,14 +135,68 @@ public class ResiGroupCodeServiceImpl extends BaseServiceImpl{ + try { + long startTs = System.currentTimeMillis(); + createCodeFunction(dto); + long endTs = System.currentTimeMillis(); + logger.info("异步创建群二维码成功,执行时长:{}", endTs - startTs); + } catch (Exception e) { + logger.error("异步创建群二维码失败,错误信息:{}", ExceptionUtils.getErrorStackTrace(e)); + } + }); + return ""; + } + } + + /** + * @param dto + * @return com.epmet.commons.tools.utils.Result + * @Description 获取群组二维码 + * @Author liushaowen + * @Date 2020/11/16 9:37 + */ + @Override + public Result getGroupCode(GetGroupCodeFormDTO dto) { + ResiGroupCodeEntity codeByGroupId = getCode(dto.getGroupId(), dto.getType()); + if (codeByGroupId != null) { + //数据库有数据 + return new Result().ok(codeByGroupId.getUrl()); + } else { + //从微信获取二维码并存储 + CreateGroupCodeFormDTO createDto = new CreateGroupCodeFormDTO(); + BeanUtils.copyProperties(dto, createDto); + String url = createGroupCode(createDto, false); + if (StringUtils.isBlank(url)){ + throw new RenException("获取二维码失败"); + } + return new Result().ok(url); + } + } + + private ResiGroupCodeEntity getCode(String groupId, String type) { + if (StringUtils.isBlank(groupId) || StringUtils.isBlank(type)) { + throw new RenException("获取二维码失败,groupId或type为空"); + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("DEL_FLAG", "0"); + queryWrapper.eq("GROUP_ID", groupId); + queryWrapper.eq("TYPE", type); + return baseDao.selectOne(queryWrapper); + } + + private String createCodeFunction(CreateGroupCodeFormDTO dto){ String result = ""; ResiGroupCodeEntity codeByGroupId = getCode(dto.getGroupId(), dto.getType()); if (codeByGroupId != null) { @@ -146,7 +206,7 @@ public class ResiGroupCodeServiceImpl extends BaseServiceImpl - * @Description 获取群组二维码 - * @Author liushaowen - * @Date 2020/11/16 9:37 - */ - @Override - public Result getGroupCode(GetGroupCodeFormDTO dto) { - ResiGroupCodeEntity codeByGroupId = getCode(dto.getGroupId(), dto.getType()); - if (codeByGroupId != null) { - //数据库有数据 - return new Result().ok(codeByGroupId.getUrl()); - } else { - //从微信获取二维码并存储 - CreateGroupCodeFormDTO createDto = new CreateGroupCodeFormDTO(); - BeanUtils.copyProperties(dto, createDto); - String url = createGroupCode(createDto); - if (StringUtils.isBlank(url)){ - throw new RenException("获取二维码失败"); - } - return new Result().ok(url); - } - } - - private ResiGroupCodeEntity getCode(String groupId, String type) { - if (StringUtils.isBlank(groupId) || StringUtils.isBlank(type)) { - throw new RenException("获取二维码失败,groupId或type为空"); - } - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("DEL_FLAG", "0"); - queryWrapper.eq("GROUP_ID", groupId); - queryWrapper.eq("TYPE", type); - return baseDao.selectOne(queryWrapper); - } - - //获取AccessToken - private String getAccessToken(String customerId) { - EnvEnum envEnum = EnvEnum.getCurrentEnv(); - String resiAccessToken = null; - if (EnvEnum.PROD.getCode().equals(envEnum.getCode())) { - //居民端 - StringBuilder resiKey = new StringBuilder(customerId).append(":resi"); - Map authorizerRefreshToken = new HashMap<>(); - authorizerRefreshToken = resiGroupCodeRedis.getAuthorizerRefreshToken(resiKey.toString()); - resiAccessToken = (String) authorizerRefreshToken.get("authorizerAccessToken"); - } else { - String url = "https://epmet-cloud.elinkservice.cn/api/third/pacustomer/tokenlist"; - JSONObject postData = new JSONObject(); - postData.put("customerId", customerId); - String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(postData)).getData(); - JSONObject toResult = JSON.parseObject(data); - Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class); - if (null != toResult.get("code")) { - mapToResult.setCode(((Integer) toResult.get("code")).intValue()); - } - Object CustomerTokensResultDTO = mapToResult.getData(); - JSONObject json = JSON.parseObject(CustomerTokensResultDTO.toString()); - CustomerTokensResultDTO customerTokensResultDTO = ConvertUtils.mapToEntity(json, com.epmet.dto.result.CustomerTokensResultDTO.class); - resiAccessToken = customerTokensResultDTO.getResiAuthorizerToken(); - } - return resiAccessToken; - } - /** * @param formDTO * @Description 获取生成海报(小组码)信息 @@ -272,7 +268,7 @@ public class ResiGroupCodeServiceImpl extends BaseServiceImpl