From c8fffee6c39e50209afade1e26facc93b7b4c037 Mon Sep 17 00:00:00 2001 From: wxz Date: Wed, 23 Sep 2020 18:10:16 +0800 Subject: [PATCH 01/20] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=AE=A4=E8=AF=81-?= =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90=E9=87=8D=E6=9E=84=E5=86=85?= =?UTF-8?q?=E9=83=A8=E5=BA=94=E7=94=A8=E8=AE=A4=E8=AF=81=EF=BC=8C=E5=BE=85?= =?UTF-8?q?=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/constant/Constant.java | 2 + .../java/com/epmet/auth/AuthProcessor.java | 26 ++ .../com/epmet/auth/ExternalAuthProcessor.java | 21 ++ .../com/epmet/auth/InternalAuthProcessor.java | 175 +++++++++++ .../filter/CpAuthGatewayFilterFactory.java | 277 +++++------------- .../java/com/epmet/filter/CpProperty.java | 10 +- .../com/epmet/filter/UserTokenFilter.java | 35 --- .../src/main/resources/bootstrap.yml | 11 +- 8 files changed, 320 insertions(+), 237 deletions(-) create mode 100644 epmet-gateway/src/main/java/com/epmet/auth/AuthProcessor.java create mode 100644 epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java create mode 100644 epmet-gateway/src/main/java/com/epmet/auth/InternalAuthProcessor.java delete mode 100644 epmet-gateway/src/main/java/com/epmet/filter/UserTokenFilter.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/Constant.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/Constant.java index 67aced6dbe..3636e2942d 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/Constant.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/Constant.java @@ -96,6 +96,8 @@ public interface Constant { * authorization header */ String AUTHORIZATION_HEADER = "authorization"; + + String ACCESS_TOKEN_HEADER = "AccessToken"; /** * APP用户标识 */ diff --git a/epmet-gateway/src/main/java/com/epmet/auth/AuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/AuthProcessor.java new file mode 100644 index 0000000000..4ef47a2eae --- /dev/null +++ b/epmet-gateway/src/main/java/com/epmet/auth/AuthProcessor.java @@ -0,0 +1,26 @@ +package com.epmet.auth; + +import com.alibaba.fastjson.JSON; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; + +public abstract class AuthProcessor { + + abstract Mono auth(ServerWebExchange exchange, GatewayFilterChain chain); + + protected Mono response(ServerWebExchange exchange, Object object) { + String json = JSON.toJSONString(object); + DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(json.getBytes(StandardCharsets.UTF_8)); + exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8); + exchange.getResponse().setStatusCode(HttpStatus.OK); + return exchange.getResponse().writeWith(Flux.just(buffer)); + } + +} diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java new file mode 100644 index 0000000000..f008fa8eda --- /dev/null +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java @@ -0,0 +1,21 @@ +package com.epmet.auth; + +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 外部应用认证 + */ +@Component +public class ExternalAuthProcessor extends AuthProcessor { + + @Override + public Mono auth(ServerWebExchange exchange, GatewayFilterChain chain) { + + + + return null; + } +} diff --git a/epmet-gateway/src/main/java/com/epmet/auth/InternalAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/InternalAuthProcessor.java new file mode 100644 index 0000000000..ee247c843b --- /dev/null +++ b/epmet-gateway/src/main/java/com/epmet/auth/InternalAuthProcessor.java @@ -0,0 +1,175 @@ +package com.epmet.auth; + +import com.epmet.commons.tools.constant.AppClientConstant; +import com.epmet.commons.tools.constant.Constant; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.security.dto.BaseTokenDto; +import com.epmet.commons.tools.security.dto.GovTokenDto; +import com.epmet.commons.tools.security.dto.TokenDto; +import com.epmet.commons.tools.utils.CpUserDetailRedis; +import com.epmet.commons.tools.utils.Result; +import com.epmet.jwt.JwtTokenUtils; +import io.jsonwebtoken.Claims; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.http.HttpHeaders; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 内部认证处理器 + */ +@Component +public class InternalAuthProcessor extends AuthProcessor { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private JwtTokenUtils jwtTokenUtils; + + @Autowired + private CpUserDetailRedis cpUserDetailRedis; + + @Override + public Mono auth(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + String requestUri = request.getPath().pathWithinApplication().value(); + + logger.info("CpAuthGatewayFilterFactory当前requestUri=[" + requestUri + "]CpAuthGatewayFilterFactory拦截成功"); + String token = getTokenFromRequest(request); + //BaseTokenDto baseTokenDto = StringUtils.isNotBlank(token) ? getBaseTokenDto(token, jwtTokenUtils) : null; + BaseTokenDto baseTokenDto; + if(StringUtils.isNotBlank(token)){ + try{ + baseTokenDto = getBaseTokenDto(token, jwtTokenUtils); + }catch(RenException e){ + return response(exchange,new Result<>().error(e.getCode(),e.getMsg())); + } + }else{ + baseTokenDto = null; + } + + String customerId = ""; + + if (baseTokenDto != null) { + if (AppClientConstant.APP_RESI.equals(baseTokenDto.getApp())) { + // 居民端 + TokenDto resiTokenDto = getLoginUserInfoByToken(token, jwtTokenUtils, TokenDto.class); + if (resiTokenDto != null) { + customerId = resiTokenDto.getCustomerId(); + baseTokenDto = resiTokenDto; + } + } else if (AppClientConstant.APP_GOV.equals(baseTokenDto.getApp())) { + // 政府端 + GovTokenDto govTokenDto = getLoginUserInfoByToken(token, jwtTokenUtils, GovTokenDto.class); + if (govTokenDto != null) { + customerId = govTokenDto.getCustomerId(); + baseTokenDto = govTokenDto; + } + } else if(AppClientConstant.APP_OPER.equals(baseTokenDto.getApp())){ + //运营端 + TokenDto resiTokenDto = getLoginUserInfoByToken(token, jwtTokenUtils, TokenDto.class); + if (resiTokenDto != null) { + customerId = resiTokenDto.getCustomerId(); + baseTokenDto = resiTokenDto; + } + } + } + + // 校验token + if (StringUtils.isBlank(token)) { + return response(exchange,new Result<>().error(EpmetErrorCode.ERR10005.getCode(),EpmetErrorCode.ERR10005.getMsg())); + } + try { + validateTokenDto(baseTokenDto, token); + } catch (RenException e) { + return response(exchange,new Result<>().error(e.getCode(),e.getMsg())); + } + + // 添加header + if (baseTokenDto != null) { + String redisKey = baseTokenDto.getApp() + "-" + baseTokenDto.getClient() + "-" + baseTokenDto.getUserId(); + logger.info("redisKey=" + redisKey); + exchange.getRequest().mutate() + .header(Constant.APP_USER_KEY, redisKey) + .header(AppClientConstant.APP,baseTokenDto.getApp()) + .header(AppClientConstant.CLIENT,baseTokenDto.getClient()) + .header(AppClientConstant.USER_ID,baseTokenDto.getUserId()); + + if (StringUtils.equals(baseTokenDto.getApp(), "gov")) {//工作端 + if(StringUtils.isNotBlank(customerId)){ + exchange.getRequest().mutate().header(AppClientConstant.CUSTOMER_ID, customerId); + } + } else if (StringUtils.equals(baseTokenDto.getApp(), "public")) {//公众号端 + exchange.getRequest().mutate().header(AppClientConstant.CUSTOMER_ID, customerId); + } + ServerHttpRequest build = exchange.getRequest().mutate().build(); + return chain.filter(exchange.mutate().request(build).build()); + } + + return chain.filter(exchange); + } + + /** + * 从请求中获取token + * @param request + * @return + */ + private String getTokenFromRequest(ServerHttpRequest request) { + HttpHeaders headers = request.getHeaders(); + String token = headers.getFirst(Constant.AUTHORIZATION_HEADER); + if (StringUtils.isBlank(token)) { + token = headers.getFirst(Constant.TOKEN_HEADER); + } + if (StringUtils.isBlank(token)) { + token = request.getQueryParams().getFirst(Constant.AUTHORIZATION_HEADER); + } + return token; + } + + private BaseTokenDto getBaseTokenDto(String token, JwtTokenUtils jwtTokenUtils) { + //是否过期 + Claims claims = jwtTokenUtils.getClaimByToken(token); + if (claims == null || jwtTokenUtils.isTokenExpired(claims.getExpiration())) { + return null; + } + //获取用户ID + String app = (String) claims.get("app"); + String client = (String) claims.get("client"); + String userId = (String) claims.get("userId"); + return new BaseTokenDto(app, client, userId, token); + } + + private T getLoginUserInfoByToken(String token, JwtTokenUtils jwtTokenUtils, Class clz) { + BaseTokenDto baseTokenDto = getBaseTokenDto(token, jwtTokenUtils); + //查询Redis + return cpUserDetailRedis.get(baseTokenDto.getApp(), baseTokenDto.getClient(), baseTokenDto.getUserId(), clz); + } + + /** + * 校验Token是否异常 + * @param tokenDto + * @param tokenStr + */ + private void validateTokenDto(BaseTokenDto tokenDto, String tokenStr) { + if (null == tokenDto) { + //说明登录状态时效(超时) + throw new RenException(EpmetErrorCode.ERR10006.getCode()); + }else{ + //Redis中存在数据,取出token,进行比对 + if(StringUtils.equals(tokenDto.getToken(),tokenStr)){ + //用户携带token与Redis中一致 + + }else{ + //用户携带token与Redis中不一致,说明当前用户此次会话失效,提示重新登陆 + throw new RenException(EpmetErrorCode.ERR10007.getCode()); + } + } + } +} 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 7c74fa6763..9d530b6c55 100644 --- a/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java +++ b/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java @@ -1,35 +1,24 @@ package com.epmet.filter; -import com.alibaba.fastjson.JSON; +import com.epmet.auth.ExternalAuthProcessor; +import com.epmet.auth.InternalAuthProcessor; import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.Constant; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; -import com.epmet.commons.tools.security.dto.BaseTokenDto; -import com.epmet.commons.tools.security.dto.GovTokenDto; -import com.epmet.commons.tools.security.dto.TokenDto; -import com.epmet.commons.tools.utils.CpUserDetailRedis; -import com.epmet.commons.tools.utils.Result; -import com.epmet.jwt.JwtTokenUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; -import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; @@ -40,16 +29,25 @@ import java.util.List; * @since 1.0.0 */ @Component("CpAuth") -public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory implements UserTokenFilter { +public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory { + private Logger logger = LoggerFactory.getLogger(getClass()); - @Autowired - private CpProperty cpProperty; + private final AntPathMatcher antPathMatcher = new AntPathMatcher(); + + public static final String AUTH_TYPE_INTERNAL = "internal"; + public static final String AUTH_TYPE_EXTERNAL = "external"; + public static final String AUTH_TYPE_NO_NEED = "no_need"; + public static final String AUTH_TYPE_UNKNOW = "unknow"; + @Autowired - private JwtTokenUtils jwtTokenUtils; + private CpProperty cpProperty; + @Autowired - private CpUserDetailRedis cpUserDetailRedis; + private InternalAuthProcessor internalAuthProcessor; + @Autowired + private ExternalAuthProcessor externalAuthProcessor; @Override public List shortcutFieldOrder() { @@ -67,82 +65,22 @@ public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory().error(e.getCode(),e.getMsg())); - } - }else{ - baseTokenDto = null; - } - - String customerId = ""; - - if (baseTokenDto != null) { - if (AppClientConstant.APP_RESI.equals(baseTokenDto.getApp())) { - // 居民端 - TokenDto resiTokenDto = getLoginUserInfoByToken(token, jwtTokenUtils, cpUserDetailRedis, TokenDto.class); - if (resiTokenDto != null) { - customerId = resiTokenDto.getCustomerId(); - baseTokenDto = resiTokenDto; - } - } else if (AppClientConstant.APP_GOV.equals(baseTokenDto.getApp())) { - // 政府端 - GovTokenDto govTokenDto = getLoginUserInfoByToken(token, jwtTokenUtils, cpUserDetailRedis, GovTokenDto.class); - if (govTokenDto != null) { - customerId = govTokenDto.getCustomerId(); - baseTokenDto = govTokenDto; - } - } else if(AppClientConstant.APP_OPER.equals(baseTokenDto.getApp())){ - //运营端 - TokenDto resiTokenDto = getLoginUserInfoByToken(token, jwtTokenUtils, cpUserDetailRedis, TokenDto.class); - if (resiTokenDto != null) { - customerId = resiTokenDto.getCustomerId(); - baseTokenDto = resiTokenDto; - } - } - } - - //需要认证 - if (needAuth(requestUri)) { - if (StringUtils.isBlank(token)) { - return response(exchange,new Result<>().error(EpmetErrorCode.ERR10005.getCode(),EpmetErrorCode.ERR10005.getMsg())); - } - // 校验token - try { - validateTokenDto(baseTokenDto, token); - } catch (RenException e) { - return response(exchange,new Result<>().error(e.getCode(),e.getMsg())); - } - } //添加流水号 exchange.getRequest().mutate().header(AppClientConstant.TRANSACTION_SERIAL_KEY, new String[]{getTransactionSerial()}); - if (baseTokenDto != null) { - String redisKey = baseTokenDto.getApp() + "-" + baseTokenDto.getClient() + "-" + baseTokenDto.getUserId(); - logger.info("redisKey=" + redisKey); - exchange.getRequest().mutate() - .header(Constant.APP_USER_KEY, redisKey) - .header(AppClientConstant.APP,baseTokenDto.getApp()) - .header(AppClientConstant.CLIENT,baseTokenDto.getClient()) - .header(AppClientConstant.USER_ID,baseTokenDto.getUserId()) - ; - if (StringUtils.equals(baseTokenDto.getApp(), "gov")) {//工作端 - if(StringUtils.isNotBlank(customerId)){ - exchange.getRequest().mutate().header(AppClientConstant.CUSTOMER_ID, customerId); - } - } else if (StringUtils.equals(baseTokenDto.getApp(), "public")) {//公众号端 - exchange.getRequest().mutate().header(AppClientConstant.CUSTOMER_ID, customerId); - } - ServerHttpRequest build = exchange.getRequest().mutate().build(); - return chain.filter(exchange.mutate().request(build).build()); + + ServerHttpRequest request = exchange.getRequest(); + + String authType = getAuthType(request); + + switch (authType) { + case AUTH_TYPE_EXTERNAL: + return externalAuthProcessor.auth(exchange, chain); + case AUTH_TYPE_INTERNAL: + return internalAuthProcessor.auth(exchange, chain); + case AUTH_TYPE_UNKNOW: + throw new RenException(EpmetErrorCode.ERR401.getCode(), "无法确定认证方式"); + case AUTH_TYPE_NO_NEED: + break; } return chain.filter(exchange); @@ -150,85 +88,71 @@ public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory response(ServerWebExchange exchange, Object object) { - String json = JSON.toJSONString(object); - DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(json.getBytes(StandardCharsets.UTF_8)); - exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8); - exchange.getResponse().setStatusCode(HttpStatus.OK); - return exchange.getResponse().writeWith(Flux.just(buffer)); + /** + * 获取请求头 + * @param request + * @return + */ + private String getHeader(ServerHttpRequest request, String headerName) { + HttpHeaders headers = request.getHeaders(); + return headers.getFirst(headerName); } /** - * 是否需要认证 - * @param requestUri + * 获取事务流水号 * @return */ - private boolean needAuth(String requestUri) { - // 优先判断白名单,在白名单中的就直接放行 - for (String url : cpProperty.getUrlWhiteList()) { - if (antPathMatcher.match(url, requestUri)) { - return false; - } - } + public static String getTransactionSerial() { + String[] letterPool = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n" + , "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}; - for (String url : cpProperty.getSwaggerUrls()) { - if (antPathMatcher.match(url, requestUri)) { - return false; - } + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 2; i++) { + sb.append(letterPool[(int) (Math.random() * 25)]); } - for (String url : cpProperty.getUrls()) { - if (antPathMatcher.match(url, requestUri)) { - return true; - } - } - return false; + sb.append(System.currentTimeMillis()); + return sb.toString(); } public static class CpAuthConfig { @@ -250,45 +174,4 @@ public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory urls; + /** + * 需要内部认证的url + */ + private List internalAuthUrls; + + /** + * 需要外部认证的url + */ + private List externalAuthUrls; /** * 白名单 diff --git a/epmet-gateway/src/main/java/com/epmet/filter/UserTokenFilter.java b/epmet-gateway/src/main/java/com/epmet/filter/UserTokenFilter.java deleted file mode 100644 index f66b0e6707..0000000000 --- a/epmet-gateway/src/main/java/com/epmet/filter/UserTokenFilter.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.epmet.filter; - -import com.epmet.commons.tools.exception.EpmetErrorCode; -import com.epmet.commons.tools.exception.RenException; -import com.epmet.commons.tools.security.dto.BaseTokenDto; -import com.epmet.commons.tools.utils.CpUserDetailRedis; -import com.epmet.jwt.JwtTokenUtils; -import io.jsonwebtoken.Claims; - -/** - * 用户token的过滤器接口,提供通用的默认方法 - */ -public interface UserTokenFilter { - - default BaseTokenDto getBaseTokenDto(String token, JwtTokenUtils jwtTokenUtils) { - //是否过期 - Claims claims = jwtTokenUtils.getClaimByToken(token); - if (claims == null || jwtTokenUtils.isTokenExpired(claims.getExpiration())) { -// throw new RenException(EpmetErrorCode.ERR401.getCode()); - return null; - } - //获取用户ID - String app = (String) claims.get("app"); - String client = (String) claims.get("client"); - String userId = (String) claims.get("userId"); - return new BaseTokenDto(app, client, userId, token); - } - - default T getLoginUserInfoByToken(String token, JwtTokenUtils jwtTokenUtils, CpUserDetailRedis cpUserDetailRedis, Class clz) { - BaseTokenDto baseTokenDto = getBaseTokenDto(token, jwtTokenUtils); - //查询Redis - return cpUserDetailRedis.get(baseTokenDto.getApp(), baseTokenDto.getClient(), baseTokenDto.getUserId(), clz); - } - -} diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml index 9748b1ca26..32724f1913 100644 --- a/epmet-gateway/src/main/resources/bootstrap.yml +++ b/epmet-gateway/src/main/resources/bootstrap.yml @@ -415,8 +415,8 @@ ribbon: ConnectTimeout: 300000 epmet: - # 党群e事通(校验是否登录) - urls: + # 内部认证,需要Authorization请求头 + internalAuthUrls: - /oper/customize/** - /oper/crm/** - /epmetuser/** @@ -438,13 +438,16 @@ epmet: - /resi/home/** - /data/report/** - # url认证白名单,先判断白名单,在白名单中的url直接放行,不再判断上述需要认证的名单 - urlWhiteList: + # 外部应用认证,使用AccessToken等头进行认证 + externalAuthUrls: - /data/report/test/test - /data/report/screen/** - /data/report/kcscreen/** - /epmetuser/customerstaff/customerlist + # url认证白名单,先判断白名单,在白名单中的url直接放行,不再判断上述需要认证的名单 + urlWhiteList: + swaggerUrls: jwt: From c37a6e44d7b0af2965200671691268a5bf8952e6 Mon Sep 17 00:00:00 2001 From: wxz Date: Thu, 24 Sep 2020 18:02:05 +0800 Subject: [PATCH 02/20] =?UTF-8?q?=E5=AE=8C=E6=88=90"=E5=86=85=E9=83=A8?= =?UTF-8?q?=E9=89=B4=E6=9D=83+=E5=A4=96=E9=83=A8=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E9=89=B4=E6=9D=83"=E7=9A=84=E6=95=B4=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-gateway/pom.xml | 7 ++ .../com/epmet/auth/ExtAppAuthProcessor.java | 30 +++++++ .../epmet/auth/ExtAppJwtAuthProcessor.java | 88 +++++++++++++++++++ .../epmet/auth/ExtAppMD5AuthProcessor.java | 74 ++++++++++++++++ .../com/epmet/auth/ExternalAuthProcessor.java | 60 ++++++++++++- .../filter/CpAuthGatewayFilterFactory.java | 22 ++++- .../java/com/epmet/jwt/JwtTokenUtils.java | 12 +++ .../EpmetCommonServiceOpenFeignClient.java | 7 ++ ...tCommonServiceOpenFeignClientFallback.java | 5 ++ .../controller/ExternalAppController.java | 18 ++++ .../com/epmet/dao/ExternalAppSecretDao.java | 2 + .../service/ExternalAppSecretService.java | 1 + .../impl/ExternalAppSecretServiceImpl.java | 9 ++ .../externalapp/ExtAppJwtTokenUtils.java | 7 +- .../resources/mapper/ExternalAppSecretDao.xml | 8 ++ 15 files changed, 342 insertions(+), 8 deletions(-) create mode 100644 epmet-gateway/src/main/java/com/epmet/auth/ExtAppAuthProcessor.java create mode 100644 epmet-gateway/src/main/java/com/epmet/auth/ExtAppJwtAuthProcessor.java create mode 100644 epmet-gateway/src/main/java/com/epmet/auth/ExtAppMD5AuthProcessor.java diff --git a/epmet-gateway/pom.xml b/epmet-gateway/pom.xml index cef4109081..a69f43837e 100644 --- a/epmet-gateway/pom.xml +++ b/epmet-gateway/pom.xml @@ -58,6 +58,13 @@ 2.0.0 compile + + + + com.epmet + common-service-client + 2.0.0 + diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppAuthProcessor.java new file mode 100644 index 0000000000..4dc7a22c71 --- /dev/null +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppAuthProcessor.java @@ -0,0 +1,30 @@ +package com.epmet.auth; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * 外部应用认证处理器父类 + */ +public abstract class ExtAppAuthProcessor { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + private int diffMillins = 1000 * 60 * 5; + + public abstract void auth(String appId, String token, Long ts); + + /** + * 时间戳校验 + * @param timestamp + * @return + */ + protected boolean validTimeStamp(Long timestamp) { + long now = System.currentTimeMillis(); + if (Math.abs(now - timestamp) > diffMillins) { + return false; + } + return true; + } +} diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppJwtAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppJwtAuthProcessor.java new file mode 100644 index 0000000000..431907cde5 --- /dev/null +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppJwtAuthProcessor.java @@ -0,0 +1,88 @@ +package com.epmet.auth; + +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.utils.SpringContextUtils; +import com.epmet.feign.EpmetCommonServiceOpenFeignClient; +import com.epmet.jwt.JwtTokenUtils; +import io.jsonwebtoken.Claims; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * jwt 认证处理器 + */ +@Component +public class ExtAppJwtAuthProcessor extends ExtAppAuthProcessor { + + private static Logger logger = LoggerFactory.getLogger(ExtAppJwtAuthProcessor.class); + + @Autowired + private JwtTokenUtils jwtTokenUtils; + + @Autowired + private RedisUtils redisUtils; + + @Override + public void auth(String appId, String token, Long ts) { + String secret; + if (StringUtils.isBlank(secret = getTokenFromCache(appId))) { + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), String.format("根据AppId:【%s】没有找到对应的秘钥", appId)); + } + + Claims claim; + try { + claim = jwtTokenUtils.getClaimByToken(token, secret); + } catch (Exception e) { + String errorStackTrace = ExceptionUtils.getErrorStackTrace(e); + logger.error("解析token失败:{}", errorStackTrace); + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "解析token失败"); + } + + String appIdIn = (String)claim.get("appId"); + String customerId = (String)claim.get("customerId"); + Long timestamp = (Long)claim.get("ts"); + + //校验时间戳,允许5分钟误差 + if (StringUtils.isAnyBlank(appIdIn, customerId) || timestamp == null) { + logger.error("access token不完整。{},{},{}", appIdIn, customerId, timestamp); + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "AccessToken不完整"); + } + + if (!validTimeStamp(timestamp)) { + logger.error("extapp token已经超时,请求被拒绝"); + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "AccessToken已经超时"); + } + + if (!appId.equals(appIdIn)) { + logger.error("AppId不对应,token外部的:{}, token内部解析出来的:{}", appId, appIdIn); + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "AppId不匹配"); + } + } + + /** + * 通过APP ID查询对应的秘钥 + * @param appId + * @return + */ + public String getTokenFromCache(String appId) { + String secret = (String)redisUtils.get(RedisKeys.getExternalAppSecretKey(appId)); + if (StringUtils.isBlank(secret)) { + EpmetCommonServiceOpenFeignClient commonService = SpringContextUtils.getBean(EpmetCommonServiceOpenFeignClient.class); + Result result = commonService.getSecret(appId); + if (!result.success()) { + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), result.getInternalMsg()); + } + secret = result.getData(); + redisUtils.set(RedisKeys.getExternalAppSecretKey(appId), secret); + } + return secret; + } +} diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppMD5AuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppMD5AuthProcessor.java new file mode 100644 index 0000000000..c1869cb1ab --- /dev/null +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppMD5AuthProcessor.java @@ -0,0 +1,74 @@ +package com.epmet.auth; + +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; +import com.epmet.commons.tools.utils.Md5Util; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.utils.SpringContextUtils; +import com.epmet.feign.EpmetCommonServiceOpenFeignClient; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * md5 认证处理器 + */ +@Component +public class ExtAppMD5AuthProcessor extends ExtAppAuthProcessor { + + private static Logger logger = LoggerFactory.getLogger(ExtAppMD5AuthProcessor.class); + + //@Autowired + //private EpmetCommonServiceOpenFeignClient commonServiceOpenFeignClient; + + @Autowired + private RedisUtils redisUtils; + + @Override + public void auth(String appId, String token, Long ts) { + if (ts == null) { + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "需要传入时间戳参数"); + } + String secret; + if (StringUtils.isBlank(secret = getTokenFromCache(appId))) { + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), String.format("根据AppId:%s没有找到对应的秘钥", appId)); + } + + String localDigest = Md5Util.md5(secret.concat(":") + ts); + if (!localDigest.equals(token)) { + // 调用方生成的摘要跟本地生成的摘要不匹配 + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "签名不匹配,认证失败"); + } + + if (!validTimeStamp(ts)) { + logger.error("AccessToken已经超时,请求被拒绝"); + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "AccessToken已经超时,请求被拒绝"); + } + } + + /** + * 通过APP ID查询对应的秘钥 + * + * @param appId + * @return + */ + public String getTokenFromCache(String appId) { + String secret = (String) redisUtils.get(RedisKeys.getExternalAppSecretKey(appId)); + if (StringUtils.isBlank(secret)) { + EpmetCommonServiceOpenFeignClient commonService = SpringContextUtils.getBean(EpmetCommonServiceOpenFeignClient.class); + Result result = commonService.getSecret(appId); + if (!result.success()) { + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), result.getInternalMsg()); + } + + secret = result.getData(); + redisUtils.set(RedisKeys.getExternalAppSecretKey(appId), secret); + } + return secret; + } + +} diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java index f008fa8eda..7b46e870ce 100644 --- a/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java @@ -1,6 +1,15 @@ package com.epmet.auth; +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.utils.Result; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @@ -11,11 +20,60 @@ import reactor.core.publisher.Mono; @Component public class ExternalAuthProcessor extends AuthProcessor { + private Logger logger = LoggerFactory.getLogger(getClass()); + + // 头s + public static final String AUTHORIZATION_TOKEN_HEADER_KEY = "Authorization"; + public static final String ACCESS_TOKEN_HEADER_KEY = "AccessToken"; + public static final String APP_ID_HEADER_KEY = "appId"; + public static final String APP_ID_TIMESTAMP_KEY = "ts"; + public static final String APP_ID_CUSTOMER_ID_KEY = "CustomerId"; + public static final String APP_ID_AUTY_TYPE_KEY = "AuthType"; + + // 认证方式 + public static final String APP_AUTH_TYPE_JWT = "jwt"; + public static final String APP_AUTH_TYPE_MD5 = "md5"; + + + @Autowired + private ExtAppJwtAuthProcessor jwtAuthProcessor; + + @Autowired + private ExtAppMD5AuthProcessor md5AuthProcessor; + @Override public Mono auth(ServerWebExchange exchange, GatewayFilterChain chain) { + HttpHeaders headers = exchange.getRequest().getHeaders(); + + String token = headers.getFirst(ACCESS_TOKEN_HEADER_KEY); + String appId = headers.getFirst(APP_ID_HEADER_KEY); + String ts = headers.getFirst(APP_ID_TIMESTAMP_KEY); + String customerId = headers.getFirst(APP_ID_CUSTOMER_ID_KEY); + String authType = headers.getFirst(APP_ID_AUTY_TYPE_KEY); + + if (StringUtils.isAnyBlank(token, appId)) { + throw new RenException("请求头中的AccessToken和AppId不能为空"); + } + logger.info("外部应用请求认证拦截Aspect执行,appId:{}, token:{}, ts:{}, customerId:{}, authType:{}", + appId, token, ts, customerId, authType); + // 没传authType或者传的jwt都用jwtprocessor处理 + try { + if (StringUtils.isBlank(authType) || APP_AUTH_TYPE_JWT.equals(authType)) { + jwtAuthProcessor.auth(appId, token, StringUtils.isNotBlank(ts) ? new Long(ts) : null); + } else if (APP_AUTH_TYPE_MD5.equals(authType)) { + md5AuthProcessor.auth(appId, token, StringUtils.isNotBlank(ts) ? new Long(ts) : null); + } else { + throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "未知的认证类型"); + } + } catch (RenException e) { + return response(exchange, new Result<>().error(e.getCode(), e.getMsg())); + } catch (Exception e) { + logger.error("外部应用请求认证发生未知错误:" + ExceptionUtils.getErrorStackTrace(e)); + return response(exchange, new Result<>().error("外部应用请求认证发生未知错误")); + } - return null; + return chain.filter(exchange); } } 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 9d530b6c55..59f52483b2 100644 --- a/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java +++ b/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java @@ -1,24 +1,31 @@ package com.epmet.filter; +import com.alibaba.fastjson.JSON; import com.epmet.auth.ExternalAuthProcessor; import com.epmet.auth.InternalAuthProcessor; import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.Constant; import com.epmet.commons.tools.exception.EpmetErrorCode; -import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.utils.Result; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; @@ -77,10 +84,11 @@ public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory().error(EpmetErrorCode.ERR401.getCode(), + EpmetErrorCode.ERR401.getMsg())); } return chain.filter(exchange); @@ -174,4 +182,12 @@ public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory response(ServerWebExchange exchange, Object object) { + String json = JSON.toJSONString(object); + DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(json.getBytes(StandardCharsets.UTF_8)); + exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8); + exchange.getResponse().setStatusCode(HttpStatus.OK); + return exchange.getResponse().writeWith(Flux.just(buffer)); + } + } diff --git a/epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenUtils.java b/epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenUtils.java index 33baf31c52..452627b9a3 100644 --- a/epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenUtils.java +++ b/epmet-gateway/src/main/java/com/epmet/jwt/JwtTokenUtils.java @@ -62,6 +62,18 @@ public class JwtTokenUtils { } } + public Claims getClaimByToken(String token, String secret) { + try { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(token) + .getBody(); + } catch (Exception e) { + logger.debug("validate is token error, token = " + token, e); + return null; + } + } + /** * @return java.util.Date * @param token diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java index caa9bd6301..7ed9ff3f18 100644 --- a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/EpmetCommonServiceOpenFeignClient.java @@ -46,4 +46,11 @@ public interface EpmetCommonServiceOpenFeignClient { */ @PostMapping("/commonservice/externalapp/getcustomerids") Result> getExternalCustomerIds(); + + /** + * 查询秘钥(仅限内部使用) + * @return + */ + @PostMapping("/commonservice/externalapp/get-secret") + Result getSecret(@RequestBody String appId); } diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java index f21808fc8c..4640f13b45 100644 --- a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/feign/fallback/EpmetCommonServiceOpenFeignClientFallback.java @@ -34,4 +34,9 @@ public class EpmetCommonServiceOpenFeignClientFallback implements EpmetCommonSer public Result> getExternalCustomerIds() { return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "getExternalCustomerIds", null); } + + @Override + public Result getSecret(String appId) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_COMMON_SERVICE, "getSecret", appId); + } } diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/controller/ExternalAppController.java b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/controller/ExternalAppController.java index ffab33bbbe..f1229c7902 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/controller/ExternalAppController.java +++ b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/controller/ExternalAppController.java @@ -2,6 +2,7 @@ package com.epmet.controller; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.exception.ValidateException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; @@ -10,6 +11,7 @@ import com.epmet.dto.form.ExternalAppFormDTO; import com.epmet.dto.result.ExternalAppAuthResultDTO; import com.epmet.dto.result.ExternalAppResultDTO; import com.epmet.service.ExternalAppAuthService; +import com.epmet.service.ExternalAppSecretService; import com.epmet.service.ExternalAppService; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -34,6 +36,9 @@ public class ExternalAppController { @Autowired private ExternalAppService externalAppService; + @Autowired + private ExternalAppSecretService externalAppSecretService; + /** * 外部请求认证 * @param formDTO @@ -128,4 +133,17 @@ public class ExternalAppController { return new Result().ok(newSecret); } + /** + * 查询秘钥(仅限内部使用) + * @return + */ + @PostMapping("/get-secret") + public Result getSecret(@RequestBody String appId) { + if (StringUtils.isBlank(appId)) { + throw new ValidateException(EpmetErrorCode.CUSTOMER_VALIDATE_ERROR.getCode(), "缺少应用ID参数"); + } + String secret = externalAppSecretService.getSecretByAppId(appId); + return new Result().ok(secret); + } + } diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/dao/ExternalAppSecretDao.java b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/dao/ExternalAppSecretDao.java index fd2342c7c6..7faeae8ed4 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/dao/ExternalAppSecretDao.java +++ b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/dao/ExternalAppSecretDao.java @@ -41,4 +41,6 @@ public interface ExternalAppSecretDao extends BaseDao { ExternalAppSecretEntity getSecretsByAppId(@Param("appId") String appId); int updateSecret(@Param("appId") String appId, @Param("secret") String secret); + + String getSecretByAppId(String appId); } \ No newline at end of file diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/ExternalAppSecretService.java b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/ExternalAppSecretService.java index 7f6be4bd5a..3a68251684 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/ExternalAppSecretService.java +++ b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/ExternalAppSecretService.java @@ -25,4 +25,5 @@ package com.epmet.service; * @since v1.0.0 2020-08-18 */ public interface ExternalAppSecretService { + String getSecretByAppId(String appId); } \ No newline at end of file diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/ExternalAppSecretServiceImpl.java b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/ExternalAppSecretServiceImpl.java index 567baf3fb2..da89e8ce1c 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/ExternalAppSecretServiceImpl.java +++ b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/service/impl/ExternalAppSecretServiceImpl.java @@ -17,7 +17,9 @@ package com.epmet.service.impl; +import com.epmet.dao.ExternalAppSecretDao; import com.epmet.service.ExternalAppSecretService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * 外部应用秘钥列表 @@ -28,4 +30,11 @@ import org.springframework.stereotype.Service; @Service public class ExternalAppSecretServiceImpl implements ExternalAppSecretService { + @Autowired + private ExternalAppSecretDao externalAppSecretDao; + + @Override + public String getSecretByAppId(String appId) { + return externalAppSecretDao.getSecretByAppId(appId); + } } \ No newline at end of file diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/utils/externalapp/ExtAppJwtTokenUtils.java b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/utils/externalapp/ExtAppJwtTokenUtils.java index 490b2445e8..0f1674b319 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/utils/externalapp/ExtAppJwtTokenUtils.java +++ b/epmet-module/epmet-common-service/common-service-server/src/main/java/com/epmet/utils/externalapp/ExtAppJwtTokenUtils.java @@ -80,14 +80,13 @@ public class ExtAppJwtTokenUtils { //String appId = "acc4ad66c82a7b46e741364b4c62dce2"; // String customrId = "b09527201c4409e19d1dbc5e3c3429a1"; //孔村 - String secret = "657cd46d385a4c2ba6d9355aee24654ac3951deab7e6436e91201561b94969b5"; - String appId = "5efcfb775125d656f39583b8110a3d7d"; + String secret = "c4096eb0497943c78327c5192621b209c38f20592f6a49cc8c79e8b77f3bd5c8"; + String appId = "f358d63a89f3670c197c62ca4c3a0366"; String customrId = "2fe0065f70ca0e23ce4c26fca5f1d933"; claim.put("customerId", customrId); claim.put("appId", appId); - claim.put("customerId", customrId); - long ts = System.currentTimeMillis() - 1000 * 60 * 4; + long ts = System.currentTimeMillis() + 1000 * 60 * 1; System.out.println("时间戳:" + ts); claim.put("ts", ts); diff --git a/epmet-module/epmet-common-service/common-service-server/src/main/resources/mapper/ExternalAppSecretDao.xml b/epmet-module/epmet-common-service/common-service-server/src/main/resources/mapper/ExternalAppSecretDao.xml index a192df36b1..f363e43d7c 100644 --- a/epmet-module/epmet-common-service/common-service-server/src/main/resources/mapper/ExternalAppSecretDao.xml +++ b/epmet-module/epmet-common-service/common-service-server/src/main/resources/mapper/ExternalAppSecretDao.xml @@ -40,5 +40,13 @@ AND DEL_FLAG = 0 + + + \ No newline at end of file From e243877112ffc85c71cc030f846f3788b9ad47ff Mon Sep 17 00:00:00 2001 From: wxz Date: Thu, 24 Sep 2020 18:05:35 +0800 Subject: [PATCH 03/20] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E4=BA=86=E7=99=BD?= =?UTF-8?q?=E5=90=8D=E5=8D=95=E7=9A=84=E6=A6=82=E5=BF=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java | 5 ----- epmet-gateway/src/main/resources/bootstrap.yml | 3 --- 2 files changed, 8 deletions(-) diff --git a/epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java b/epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java index 9811dfbd9a..84872c0fb2 100644 --- a/epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java +++ b/epmet-gateway/src/main/java/com/epmet/filter/CpProperty.java @@ -27,11 +27,6 @@ public class CpProperty { */ private List externalAuthUrls; - /** - * 白名单 - */ - private List urlWhiteList; - /** * 不处理token,直接通过 */ diff --git a/epmet-gateway/src/main/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml index 32724f1913..750440f69f 100644 --- a/epmet-gateway/src/main/resources/bootstrap.yml +++ b/epmet-gateway/src/main/resources/bootstrap.yml @@ -445,9 +445,6 @@ epmet: - /data/report/kcscreen/** - /epmetuser/customerstaff/customerlist - # url认证白名单,先判断白名单,在白名单中的url直接放行,不再判断上述需要认证的名单 - urlWhiteList: - swaggerUrls: jwt: From 02e2f6c07cf1f530dc826c9326cb94c514c8c835 Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 25 Sep 2020 14:06:25 +0800 Subject: [PATCH 04/20] =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=82=E4=B8=8E?= =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toscreen/PublicPartExtractService.java | 32 +++++++++++ .../extract/toscreen/ScreenOrgService.java | 32 +++++++++++ .../impl/PublicPartExtractServiceImpl.java | 54 +++++++++++++++++++ .../impl/ScreenCustomerAgencyServiceImpl.java | 8 +-- 4 files changed, 120 insertions(+), 6 deletions(-) create mode 100644 epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/PublicPartExtractService.java create mode 100644 epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/ScreenOrgService.java create mode 100644 epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/PublicPartExtractService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/PublicPartExtractService.java new file mode 100644 index 0000000000..388559649d --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/PublicPartExtractService.java @@ -0,0 +1,32 @@ +package com.epmet.service.evaluationindex.extract.toscreen; + +/** + * @desc: 大屏 公众参与抽取服务接口 + * @Author: LiuJanJun + * @Date: 2020/9/25 10:03 上午 + * @Version: 1.0 + */ +public interface PublicPartExtractService { + + /** + * desc: 抽取公众参与 人均议题 总次数和平均参与度 + * target:screen_user_join + * + * @param + * @return java.lang.Boolean + * @author LiuJanJun + * @date 2020/9/25 10:24 上午 + */ + Boolean extractTotalDataMonthly(); + + /** + * desc: 抽取公众参与 各类总数 + * target:screen_public_parti_total_data + * + * @param + * @return java.lang.Boolean + * @author LiuJanJun + * @date 2020/9/25 10:24 上午 + */ + Boolean extractPerTotalDataDaily(); +} diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/ScreenOrgService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/ScreenOrgService.java new file mode 100644 index 0000000000..bb177bd877 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/ScreenOrgService.java @@ -0,0 +1,32 @@ +package com.epmet.service.evaluationindex.extract.toscreen; + +/** + * @desc: 大屏 产品内部客户组织结构数据 + * @Author: LiuJanJun + * @Date: 2020/9/25 10:03 上午 + * @Version: 1.0 + */ +public interface ScreenOrgService { + + /** + * desc: 抽取公众参与 人均议题 总次数和平均参与度 + * target:screen_user_join + * + * @param + * @return java.lang.Boolean + * @author LiuJanJun + * @date 2020/9/25 10:24 上午 + */ + Boolean getInnerCustomerAgencyTree(); + + /** + * desc: 抽取公众参与 各类总数 + * target:screen_public_parti_total_data + * + * @param + * @return java.lang.Boolean + * @author LiuJanJun + * @date 2020/9/25 10:24 上午 + */ + Boolean extractPerTotalDataDaily(); +} diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java new file mode 100644 index 0000000000..ae0aab7fa0 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java @@ -0,0 +1,54 @@ +package com.epmet.service.evaluationindex.extract.toscreen.impl; + +import com.epmet.service.evaluationindex.extract.todata.FactOriginProjectMainDailyService; +import com.epmet.service.evaluationindex.extract.toscreen.PublicPartExtractService; +import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService; +import com.epmet.service.evaluationindex.screen.ScreenPublicPartiTotalDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * desc:公众参与抽取到大屏的接口实现类 + * + * @author: LiuJanJun + * @date: 2020/9/25 10:46 上午 + * @version: 1.0 + */ +@Service +public class PublicPartExtractServiceImpl implements PublicPartExtractService { + + @Autowired + private ScreenPublicPartiTotalDataService screenPublicPartiTotalDataService; + @Autowired + private FactOriginProjectMainDailyService factOriginProjectMainDailyService; + @Autowired + private ScreenCustomerAgencyService agencyService; + + + /** + * desc: 【月】抽取公众参与 人均议题 总次数和平均参与度 + * target:screen_user_join + * + * @return java.lang.Boolean + * @author LiuJanJun + * @date 2020/9/25 10:24 上午 + */ + @Override + public Boolean extractTotalDataMonthly() { + //agencyService.initAgencies(); + return null; + } + + /** + * desc: 【日】抽取公众参与 各类总数 + * target:screen_public_parti_total_data + * + * @return java.lang.Boolean + * @author LiuJanJun + * @date 2020/9/25 10:24 上午 + */ + @Override + public Boolean extractPerTotalDataDaily() { + return null; + } +} diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java index 13d056ced5..404ee7240c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java @@ -22,13 +22,13 @@ import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.utils.DateUtils; import com.epmet.constant.DataSourceConstant; import com.epmet.constant.OrgSourceTypeConstant; +import com.epmet.constant.ScreenConstant; import com.epmet.dao.evaluationindex.screen.ScreenCustomerAgencyDao; import com.epmet.dao.evaluationindex.screen.ScreenCustomerGridDao; import com.epmet.dto.extract.form.PartyBaseInfoFormDTO; import com.epmet.dto.extract.result.CustomerAgencyInfoResultDTO; import com.epmet.dto.extract.result.OrgNameResultDTO; import com.epmet.dto.screen.result.TreeResultDTO; -import com.epmet.constant.ScreenConstant; import com.epmet.entity.evaluationindex.screen.ScreenCustomerAgencyEntity; import com.epmet.entity.org.CustomerAgencyEntity; import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService; @@ -39,10 +39,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.stream.Collectors; /** @@ -114,7 +110,7 @@ public class ScreenCustomerAgencyServiceImpl implements ScreenCustomerAgencyServ @Transactional(rollbackFor = Exception.class) @Override public void initAgencies(List agencies2Add, List agencies2Update) { - String dateEndTime = DateUtils.format(new Date(), "YYYYmmdd"); + String dateEndTime = DateUtils.format(new Date(), DateUtils.DATE_PATTERN_YYYYMMDD); if (!CollectionUtils.isEmpty(agencies2Add)) { // 添加 for (CustomerAgencyEntity e : agencies2Add) { From 043bd045e9c263fb24aba3212b79c63e0b2379b3 Mon Sep 17 00:00:00 2001 From: jianjun Date: Fri, 25 Sep 2020 14:18:21 +0800 Subject: [PATCH 05/20] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E6=95=B0=20=E6=B7=BB=E5=8A=A0=20=E6=98=AF=E5=90=A6=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datareport/controller/screen/AgencyController.java | 2 +- .../service/evaluationindex/screen/AgencyService.java | 2 +- .../evaluationindex/screen/impl/AgencyServiceImpl.java | 6 ------ .../resources/mapper/screen/ScreenCustomerAgencyDao.xml | 2 ++ .../main/resources/mapper/screen/ScreenCustomerGridDao.xml | 1 + 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/AgencyController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/AgencyController.java index 1828f19ac8..07b6bf2093 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/AgencyController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/AgencyController.java @@ -31,8 +31,8 @@ public class AgencyController { private AgencyService agencyService; /** - * @Description 1、组织机构树 * @param + * @Description 1、组织机构树 只返回 is_display = '1'的 * @author zxc * @date 2020/8/18 2:04 下午 */ diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/AgencyService.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/AgencyService.java index d633b94ea2..f881373c1b 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/AgencyService.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/AgencyService.java @@ -14,8 +14,8 @@ import com.epmet.evaluationindex.screen.dto.result.TreeResultDTO; public interface AgencyService { /** - * @Description 1、组织机构树 * @param + * @Description 1、组织机构树 只返回 is_display = '1'的 * @author zxc * @date 2020/8/18 2:04 下午 */ diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AgencyServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AgencyServiceImpl.java index c5bf2bab81..3ecb962cc8 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AgencyServiceImpl.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AgencyServiceImpl.java @@ -13,7 +13,6 @@ import com.epmet.evaluationindex.screen.dto.form.CompartmentFormDTO; import com.epmet.evaluationindex.screen.dto.result.AgencyDistributionResultDTO; import com.epmet.evaluationindex.screen.dto.result.CompartmentResultDTO; import com.epmet.evaluationindex.screen.dto.result.TreeResultDTO; -import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.exceptions.TooManyResultsException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -48,11 +47,6 @@ public class AgencyServiceImpl implements AgencyService { // 1. 查询客户根组织ID String customerId = externalAppRequestParam.getCustomerId(); - - // 验签关闭,customerId无法获取,暂时写死 - if (StringUtils.isBlank(customerId)) { - customerId = "b09527201c4409e19d1dbc5e3c3429a1"; - } TreeResultDTO rootAgency = null; try { rootAgency = screenCustomerAgencyDao.selectRootAgencyId(customerId); 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 932149d9c5..969bcea847 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 @@ -16,6 +16,7 @@ WHERE del_flag = 0 AND pid = '0' + AND IS_DISPLAY = '1' AND customer_id = #{customerId} @@ -31,6 +32,7 @@ screen_customer_agency WHERE del_flag = '0' + AND IS_DISPLAY = '1' AND pids = #{subAgencyPids} ORDER BY created_time DESC diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenCustomerGridDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenCustomerGridDao.xml index 6cafd96036..b17fe0f6a8 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenCustomerGridDao.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenCustomerGridDao.xml @@ -77,6 +77,7 @@ screen_customer_grid WHERE del_flag = '0' + AND IS_DISPLAY = '1' AND parent_agency_id = #{agencyId} ORDER BY created_time DESC From 0322747773916d6fedc289576a1d30b3f1aee41a Mon Sep 17 00:00:00 2001 From: wxz Date: Fri, 25 Sep 2020 14:31:46 +0800 Subject: [PATCH 06/20] =?UTF-8?q?=E5=B0=86=E5=A4=96=E9=83=A8=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E8=AE=A4=E8=AF=81-jwt=E6=96=B9=E5=BC=8F-=E7=9A=84cust?= =?UTF-8?q?omerId=E6=94=BE=E5=88=B0=E5=A4=B4=E9=87=8C=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E4=BB=A5=E4=BE=BF=E4=B8=9A=E5=8A=A1=E6=9C=8D=E5=8A=A1=E5=8F=96?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/auth/ExtAppAuthProcessor.java | 3 ++- .../main/java/com/epmet/auth/ExtAppJwtAuthProcessor.java | 6 +++++- .../main/java/com/epmet/auth/ExtAppMD5AuthProcessor.java | 3 ++- .../src/main/java/com/epmet/auth/ExternalAuthProcessor.java | 4 ++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppAuthProcessor.java index 4dc7a22c71..507f2dc54d 100644 --- a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppAuthProcessor.java +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppAuthProcessor.java @@ -2,6 +2,7 @@ package com.epmet.auth; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.web.server.ServerWebExchange; /** @@ -13,7 +14,7 @@ public abstract class ExtAppAuthProcessor { private int diffMillins = 1000 * 60 * 5; - public abstract void auth(String appId, String token, Long ts); + public abstract void auth(String appId, String token, Long ts, ServerWebExchange exchange); /** * 时间戳校验 diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppJwtAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppJwtAuthProcessor.java index 431907cde5..923e85c441 100644 --- a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppJwtAuthProcessor.java +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppJwtAuthProcessor.java @@ -15,6 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; /** * jwt 认证处理器 @@ -31,7 +32,7 @@ public class ExtAppJwtAuthProcessor extends ExtAppAuthProcessor { private RedisUtils redisUtils; @Override - public void auth(String appId, String token, Long ts) { + public void auth(String appId, String token, Long ts, ServerWebExchange exchange) { String secret; if (StringUtils.isBlank(secret = getTokenFromCache(appId))) { throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), String.format("根据AppId:【%s】没有找到对应的秘钥", appId)); @@ -65,6 +66,9 @@ public class ExtAppJwtAuthProcessor extends ExtAppAuthProcessor { logger.error("AppId不对应,token外部的:{}, token内部解析出来的:{}", appId, appIdIn); throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "AppId不匹配"); } + + // 添加客户ID等到请求头 + exchange.getRequest().mutate().header("CustomerId", customerId); } /** diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppMD5AuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppMD5AuthProcessor.java index c1869cb1ab..c9fa8e5c2a 100644 --- a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppMD5AuthProcessor.java +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppMD5AuthProcessor.java @@ -13,6 +13,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; /** * md5 认证处理器 @@ -29,7 +30,7 @@ public class ExtAppMD5AuthProcessor extends ExtAppAuthProcessor { private RedisUtils redisUtils; @Override - public void auth(String appId, String token, Long ts) { + public void auth(String appId, String token, Long ts, ServerWebExchange exchange) { if (ts == null) { throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "需要传入时间戳参数"); } diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java index 7b46e870ce..c2614b488a 100644 --- a/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExternalAuthProcessor.java @@ -61,9 +61,9 @@ public class ExternalAuthProcessor extends AuthProcessor { // 没传authType或者传的jwt都用jwtprocessor处理 try { if (StringUtils.isBlank(authType) || APP_AUTH_TYPE_JWT.equals(authType)) { - jwtAuthProcessor.auth(appId, token, StringUtils.isNotBlank(ts) ? new Long(ts) : null); + jwtAuthProcessor.auth(appId, token, StringUtils.isNotBlank(ts) ? new Long(ts) : null, exchange); } else if (APP_AUTH_TYPE_MD5.equals(authType)) { - md5AuthProcessor.auth(appId, token, StringUtils.isNotBlank(ts) ? new Long(ts) : null); + md5AuthProcessor.auth(appId, token, StringUtils.isNotBlank(ts) ? new Long(ts) : null, exchange); } else { throw new RenException(EpmetErrorCode.OPER_EXTERNAL_APP_AUTH_ERROR.getCode(), "未知的认证类型"); } From 92304b167f4657eaa2f79c0e770a9722f17ba217 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Fri, 25 Sep 2020 15:01:28 +0800 Subject: [PATCH 07/20] =?UTF-8?q?=E5=85=9A=E5=BB=BA=E5=BC=95=E9=A2=86?= =?UTF-8?q?=E3=80=90=E5=85=9A=E5=91=98=E5=BB=BA=E7=BE=A4=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E7=BE=A4=E6=88=90=E5=91=98=E6=95=B0=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/ScreenPartyBranchDataFormDTO.java | 97 ++++++++ .../ScreenPartyLinkMassesDataFormDTO.java | 73 ++++++ .../dto/extract/result/GridPartyGuideDTO.java | 23 ++ .../com/epmet/controller/DemoController.java | 10 + .../extract/FactOriginGroupMainDailyDao.java | 10 + .../screen/ScreenCustomerAgencyDao.java | 10 + .../screen/ScreenCustomerGridDao.java | 10 + .../screen/ScreenPartyBranchDataDao.java | 9 + .../screen/ScreenPartyLinkMassesDataDao.java | 29 +++ .../FactOriginGroupMainDailyService.java | 10 + .../FactOriginGroupMainDailyServiceImpl.java | 18 ++ .../extract/toscreen/PartyGuideService.java | 4 +- .../impl/PartyBaseInfoServiceImpl.java | 3 +- .../toscreen/impl/PartyGuideServiceImpl.java | 233 +++++++++++++++++- .../screen/ScreenCustomerAgencyService.java | 10 + .../screen/ScreenCustomerGridService.java | 10 + .../screen/ScreenPartyBranchDataService.java | 11 + .../ScreenPartyLinkMassesDataService.java | 31 +++ .../impl/ScreenCustomerAgencyServiceImpl.java | 13 + .../impl/ScreenCustomerGridServiceImpl.java | 13 + .../ScreenPartyBranchDataServiceImpl.java | 17 +- .../ScreenPartyLinkMassesDataServiceImpl.java | 45 ++++ .../extract/FactOriginGroupMainDailyDao.xml | 26 ++ .../screen/ScreenCpcBaseDataDao.xml | 1 + .../screen/ScreenCustomerAgencyDao.xml | 16 ++ .../screen/ScreenCustomerGridDao.xml | 16 ++ .../screen/ScreenPartyBranchDataDao.xml | 51 ++++ .../screen/ScreenPartyLinkMassesDataDao.xml | 60 +++++ 28 files changed, 851 insertions(+), 8 deletions(-) create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/form/ScreenPartyBranchDataFormDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/form/ScreenPartyLinkMassesDataFormDTO.java create mode 100644 epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/result/GridPartyGuideDTO.java diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/form/ScreenPartyBranchDataFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/form/ScreenPartyBranchDataFormDTO.java new file mode 100644 index 0000000000..06b95d02d2 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/form/ScreenPartyBranchDataFormDTO.java @@ -0,0 +1,97 @@ +package com.epmet.dto.extract.form; + +import com.epmet.commons.tools.constant.NumConstant; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2020/9/25 9:07 上午 + */ +@Data +public class ScreenPartyBranchDataFormDTO implements Serializable { + + private static final long serialVersionUID = -5521810726686859779L; + + /** + * 客户Id + */ + private String customerId; + + /** + * 年Id + */ + private String yearId; + + /** + * 月份Id + */ + private String monthId; + + /** + * 数据类别 :party:支部建设; union:联合建设;党员志愿服务:voluntaryservice + */ + private String type; + + /** + * 组织类别 agency:组织;部门:department;网格:grid + */ + private String orgType; + + /** + * 组织Id 可以为网格,机关id + */ + private String orgId; + + /** + * 上级组织Id + */ + private String parentId; + + /** + * 组织名称 + */ + private String orgName; + + /** + * 会议分类Id + */ + private String meetCategoryId; + + /** + * 会议分类名称(三会党课、主题党日.....等等) + */ + private String meetCategoryName; + + /** + * 组织次数 + */ + private Integer organizeCount; + + /** + * 参加人数 + */ + private Integer joinUserCount; + + /** + * 平均参加人数 + */ + private Integer averageJoinUserCount; + + private String delFlag; + + private Integer revision; + + private String createdBy; + + private String updatedBy; + + public ScreenPartyBranchDataFormDTO() { + this.delFlag = NumConstant.ZERO_STR; + this.revision = NumConstant.ZERO; + this.createdBy = "APP_USER"; + this.updatedBy = "APP_USER"; + this.type = "voluntaryservice"; + } +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/form/ScreenPartyLinkMassesDataFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/form/ScreenPartyLinkMassesDataFormDTO.java new file mode 100644 index 0000000000..3ff541a16d --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/form/ScreenPartyLinkMassesDataFormDTO.java @@ -0,0 +1,73 @@ +package com.epmet.dto.extract.form; + +import com.epmet.commons.tools.constant.NumConstant; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2020/9/24 6:03 下午 + */ +@Data +public class ScreenPartyLinkMassesDataFormDTO implements Serializable { + + private static final long serialVersionUID = -7534140815638694052L; + + /** + * 客户Id + */ + private String customerId; + + /** + * 组织类别 agency:组织;部门:department;网格:grid + */ + private String orgType; + + /** + * 组织Id 可以为网格,机关id + */ + private String orgId; + + /** + * 上级组织Id + */ + private String parentId; + + /** + * 组织名称 + */ + private String orgName; + + /** + * 党员建群总数 + */ + private Integer createGroupTotal; + + /** + * 群成员总数 + */ + private Integer groupUserTotal; + + /** + * 数据更新至: yyyy|yyyyMM|yyyyMMdd(08-21新增) + */ + private String dataEndTime; + + private String delFlag; + + private Integer revision; + + private String createdBy; + + private String updatedBy; + + public ScreenPartyLinkMassesDataFormDTO() { + this.createGroupTotal = NumConstant.ZERO; + this.groupUserTotal = NumConstant.ZERO; + this.delFlag = NumConstant.ZERO_STR; + this.revision = NumConstant.ZERO; + this.createdBy = "APP_USER"; + this.updatedBy = "APP_USER"; + } +} diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/result/GridPartyGuideDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/result/GridPartyGuideDTO.java new file mode 100644 index 0000000000..7646ff9567 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/extract/result/GridPartyGuideDTO.java @@ -0,0 +1,23 @@ +package com.epmet.dto.extract.result; + +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Author zxc + * @DateTime 2020/9/25 10:10 上午 + */ +@Data +@AllArgsConstructor +public class GridPartyGuideDTO implements Serializable { + + private static final long serialVersionUID = 8986034496647129566L; + + private List orgIds; + + private List result; +} diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java index 4f136ffc56..010b6ed47c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java @@ -37,6 +37,7 @@ import com.epmet.service.evaluationindex.extract.todata.FactOriginProjectLogDail import com.epmet.service.evaluationindex.extract.todata.FactOriginTopicMainDailyService; import com.epmet.service.evaluationindex.extract.toscreen.PartyBaseInfoService; import com.epmet.service.evaluationindex.extract.toscreen.ScreenCentralZoneDataAbsorptionService; +import com.epmet.service.evaluationindex.extract.toscreen.PartyGuideService; import com.epmet.service.evaluationindex.indexcal.*; import com.epmet.service.stats.DimAgencyService; import com.epmet.service.stats.DimCustomerPartymemberService; @@ -647,6 +648,15 @@ public class DemoController { return new Result(); } + @Autowired + private PartyGuideService partyGuideService; + + @PostMapping("zxczxc") + public Result getZxcZxc(@RequestBody CustomerIdAndDateIdFormDTO formDTO){ + partyGuideService.partyGuideExtract(formDTO.getCustomerId(),formDTO.getDateId()); + return new Result(); + } + @PostMapping("centralzonedatacleaning") public Result centralZoneDataCleaning(@RequestBody ScreenCentralZoneDataFormDTO param){ screenCentralZoneDataAbsorptionService.centralZoneDataHub(param); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginGroupMainDailyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginGroupMainDailyDao.java index 5844aa19f8..66a156557d 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginGroupMainDailyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginGroupMainDailyDao.java @@ -18,6 +18,7 @@ package com.epmet.dao.evaluationindex.extract; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.dto.extract.result.PartyCreateGroupCountResultDTO; import com.epmet.dto.extract.FactOriginGroupMainDailyDTO; import com.epmet.dto.extract.form.GridHeartedFormDTO; @@ -137,4 +138,13 @@ public interface FactOriginGroupMainDailyDao extends BaseDao selectGroupMemberList(@Param("list") List groupIdList); + + /** + * @Description 查询党员建组信息 + * @param customerId + * @param monthId + * @author zxc + * @date 2020/9/25 9:46 上午 + */ + List selectPartyCreateGroupInfo(@Param("customerId") String customerId, @Param("monthId") String monthId,@Param("gridIds") List gridIds); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenCustomerAgencyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenCustomerAgencyDao.java index bf64ec0495..62ba836b5c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenCustomerAgencyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenCustomerAgencyDao.java @@ -19,6 +19,7 @@ package com.epmet.dao.evaluationindex.screen; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.extract.form.PartyBaseInfoFormDTO; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.dto.extract.result.CustomerAgencyInfoResultDTO; import com.epmet.dto.extract.result.OrgNameResultDTO; import com.epmet.dto.screen.result.TreeResultDTO; @@ -154,6 +155,15 @@ public interface ScreenCustomerAgencyDao extends BaseDao selectAllAgencyIdToParty(@Param("customerId")String customerId,@Param("dateId")String dateId); + /** + * @Description 查询客户下所有机关ID + * @Param customerId + * @Param monthId + * @author zxc + * @date 2020/9/25 10:39 上午 + */ + List selectAllAgencyIdToPartyLinkMessage(String customerId, String monthId); + /** * @Description 查询org名称【机关】 * @param agencyIds diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenCustomerGridDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenCustomerGridDao.java index 658b7c4126..d917f62ffb 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenCustomerGridDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenCustomerGridDao.java @@ -22,6 +22,7 @@ import com.epmet.dto.ScreenCustomerGridDTO; import com.epmet.dto.extract.form.GovernAbilityGridMonthlyFormDTO; import com.epmet.dto.extract.form.PartyAbilityGridMonthlyFormDTO; import com.epmet.dto.extract.form.PartyBaseInfoFormDTO; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.dto.extract.result.GridInfoResultDTO; import com.epmet.dto.extract.result.OrgNameResultDTO; import com.epmet.dto.indexcal.PageQueryGridFormDTO; @@ -143,6 +144,15 @@ public interface ScreenCustomerGridDao extends BaseDao */ List selectAllGridIdToParty(String customerId, String dateId); + /** + * @Description 查询客户下所有网格ID + * @Param customerId + * @Param monthId + * @author zxc + * @date 2020/9/25 10:43 上午 + */ + List selectAllGridIdToPartyLinkMessage(@Param("customerId") String customerId,@Param("monthId") String monthId); + /** * @Description 查询org名称 * @param gridIds diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyBranchDataDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyBranchDataDao.java index 385f27d2f9..8c5211cefc 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyBranchDataDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyBranchDataDao.java @@ -18,6 +18,7 @@ package com.epmet.dao.evaluationindex.screen; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.extract.form.ScreenPartyBranchDataFormDTO; import com.epmet.dto.screencoll.form.PartyBranchDataFormDTO; import com.epmet.entity.evaluationindex.screen.ScreenPartyBranchDataEntity; import org.apache.ibatis.annotations.Mapper; @@ -56,4 +57,12 @@ public interface ScreenPartyBranchDataDao extends BaseDao list, @Param("customerId")String customerId); + + /** + * @Description 插入建设情况数据 + * @param lists + * @author zxc + * @date 2020/9/25 9:16 上午 + */ + void insertScreenPartyBranchData(@Param("lists") List lists); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyLinkMassesDataDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyLinkMassesDataDao.java index 857958ad1c..586ab1d0a8 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyLinkMassesDataDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyLinkMassesDataDao.java @@ -18,6 +18,7 @@ package com.epmet.dao.evaluationindex.screen; import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.dto.screencoll.form.PartyLinkMassesDataFormDTO; import com.epmet.entity.evaluationindex.screen.ScreenPartyLinkMassesDataEntity; import org.apache.ibatis.annotations.Mapper; @@ -55,4 +56,32 @@ public interface ScreenPartyLinkMassesDataDao extends BaseDao list, @Param("customerId")String customerId); + + /** + * @Description 批量插入党员联系群众数据 + * @param lists + * @author zxc + * @date 2020/9/24 6:06 下午 + */ + void insertScreenPartyLinkMassesData(@Param("lists")List lists); + + /** + * @Description 删除旧的党员联系群众 + * @param customerId + * @param monthId + * @param orgIds + * @author zxc + * @date 2020/9/22 3:28 下午 + */ + Integer deleteOldPartyLinkInfo(@Param("customerId") String customerId,@Param("monthId") String monthId,@Param("orgIds") List orgIds); + + /** + * @Description 查询党员联系群众信息 + * @Param customerId + * @Param monthId + * @Param agencyId + * @author zxc + * @date 2020/9/25 1:19 下午 + */ + List selectPartyLinkMassesInfo(@Param("customerId")String customerId,@Param("monthId") String monthId,@Param("agencyId") String agencyId); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginGroupMainDailyService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginGroupMainDailyService.java index bf40ac8388..fdaac9d36e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginGroupMainDailyService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginGroupMainDailyService.java @@ -19,6 +19,7 @@ package com.epmet.service.evaluationindex.extract.todata; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.dto.extract.FactOriginGroupMainDailyDTO; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.dto.group.result.ExtractGroupMemberActionRecordResultDTO; import com.epmet.entity.evaluationindex.extract.FactOriginGroupMainDailyEntity; @@ -62,4 +63,13 @@ public interface FactOriginGroupMainDailyService extends BaseService originGroupData,List memberList); + + /** + * @Description 查询党员建组信息 + * @param customerId + * @param monthId + * @author zxc + * @date 2020/9/25 9:46 上午 + */ + List selectPartyCreateGroupInfo(String customerId,String monthId,List gridIds); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginGroupMainDailyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginGroupMainDailyServiceImpl.java index ed5aeca1a1..4cc0ebb248 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginGroupMainDailyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginGroupMainDailyServiceImpl.java @@ -21,13 +21,16 @@ import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.dao.evaluationindex.extract.FactOriginGroupMainDailyDao; import com.epmet.dto.extract.FactOriginGroupMainDailyDTO; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.dto.group.result.ExtractGroupMemberActionRecordResultDTO; import com.epmet.entity.evaluationindex.extract.FactOriginGroupMainDailyEntity; import com.epmet.service.evaluationindex.extract.todata.FactOriginGroupMainDailyService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -97,4 +100,19 @@ public class FactOriginGroupMainDailyServiceImpl extends BaseServiceImpl selectPartyCreateGroupInfo(String customerId, String monthId,List gridIds) { + if (!CollectionUtils.isEmpty(gridIds)){ + return baseDao.selectPartyCreateGroupInfo(customerId, monthId, gridIds); + } + return new ArrayList<>(); + } + } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/PartyGuideService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/PartyGuideService.java index 09dafb2a6a..8700a2b7e2 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/PartyGuideService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/PartyGuideService.java @@ -9,10 +9,10 @@ public interface PartyGuideService { /** * @Description 党建引领抽取 * @param customerId - * @param dateId + * @param monthId * @author zxc * @date 2020/9/24 5:10 下午 */ - Boolean partyGuideExtract(String customerId,String dateId); + Boolean partyGuideExtract(String customerId,String monthId); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyBaseInfoServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyBaseInfoServiceImpl.java index 6dcfe74f8c..f30e987bb9 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyBaseInfoServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyBaseInfoServiceImpl.java @@ -141,8 +141,7 @@ public class PartyBaseInfoServiceImpl implements PartyBaseInfoService { delAndInsert(result,customerId,dateId,orgIds); }else { // 级别为 street,district,city,province - List agencyIds = agencyIdList.stream().map(m -> m.getAgencyId()).collect(Collectors.toList()); - List directGridIds = gridService.selectDirectGrid(agencyIds); + List directGridIds = gridService.selectDirectGrid(orgIds); List userCountList = userGridDailyService.selectUserCount(customerId, dateId); agencyIdList.forEach(agency -> { String agencyId = agency.getAgencyId(); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyGuideServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyGuideServiceImpl.java index e820b39396..19b0eaa9d4 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyGuideServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyGuideServiceImpl.java @@ -1,8 +1,29 @@ package com.epmet.service.evaluationindex.extract.toscreen.impl; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.constant.ScreenConstant; +import com.epmet.dto.extract.form.PartyBaseInfoFormDTO; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; +import com.epmet.dto.extract.result.*; +import com.epmet.service.evaluationindex.extract.todata.FactOriginGroupMainDailyService; import com.epmet.service.evaluationindex.extract.toscreen.PartyGuideService; +import com.epmet.service.evaluationindex.screen.ScreenCustomerAgencyService; +import com.epmet.service.evaluationindex.screen.ScreenCustomerGridService; +import com.epmet.service.evaluationindex.screen.ScreenPartyBranchDataService; +import com.epmet.service.evaluationindex.screen.ScreenPartyLinkMassesDataService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @Author zxc @@ -12,15 +33,221 @@ import org.springframework.stereotype.Service; @Slf4j public class PartyGuideServiceImpl implements PartyGuideService { + @Autowired + private ScreenPartyLinkMassesDataService linkMassesDataService; + @Autowired + private ScreenPartyBranchDataService partyBranchDataService; + @Autowired + private FactOriginGroupMainDailyService groupMainService; + @Autowired + private ScreenCustomerAgencyService agencyService; + @Autowired + private ScreenCustomerGridService gridService; + /** * @Description 党建引领抽取 * @param customerId - * @param dateId + * @param monthId * @author zxc * @date 2020/9/24 5:10 下午 */ @Override - public Boolean partyGuideExtract(String customerId, String dateId) { - return null; + public Boolean partyGuideExtract(String customerId, String monthId) { + //【党员建群数,群成员数】 + List agencyIdList = agencyService.selectAllAgencyId(customerId); + if (!CollectionUtils.isEmpty(agencyIdList)){ + // 根据组织级别分组 + Map> groupByLevel = agencyIdList.stream().collect(Collectors.groupingBy(CustomerAgencyInfoResultDTO::getLevel)); + if (groupByLevel.containsKey(ScreenConstant.COMMUNITY)){ + // 社区级别 + List customerGridInfoList = groupByLevel.get(ScreenConstant.COMMUNITY); + disPose(customerGridInfoList,true,customerId,monthId); + } + if (groupByLevel.containsKey(ScreenConstant.STREET)){ + // 街道级别 + List customerGridInfoList = groupByLevel.get(ScreenConstant.STREET); + disPose(customerGridInfoList,false,customerId,monthId); + } + if (groupByLevel.containsKey(ScreenConstant.DISTRICT)){ + // 区级 + List customerGridInfoList = groupByLevel.get(ScreenConstant.DISTRICT); + disPose(customerGridInfoList,false,customerId,monthId); + } + if (groupByLevel.containsKey(ScreenConstant.CITY)){ + // 市级 + List customerGridInfoList = groupByLevel.get(ScreenConstant.CITY); + disPose(customerGridInfoList,false,customerId,monthId); + } + if (groupByLevel.containsKey(ScreenConstant.PROVINCE)){ + // 省级 + List customerGridInfoList = groupByLevel.get(ScreenConstant.PROVINCE); + disPose(customerGridInfoList,false,customerId,monthId); + } + } + return true; + } + + /** + * @Description 处理 + * @Param agencyIdList + * @Param isGrid + * @Param customerId + * @Param monthId + * @author zxc + * @date 2020/9/25 2:57 下午 + */ + public void disPose(List agencyIdList, Boolean isGrid, String customerId, String monthId) { + List result = new ArrayList<>(); + if (!CollectionUtils.isEmpty(agencyIdList)){ + List orgIds = agencyIdList.stream().map(m -> m.getAgencyId()).collect(Collectors.toList()); + if (isGrid == true){ + agencyIdList.forEach(agency -> { + GridPartyGuideDTO gridPartyGuideDTO = communityLevelSubGrid(customerId, monthId, agency); + orgIds.addAll(gridPartyGuideDTO.getOrgIds()); + result.addAll(gridPartyGuideDTO.getResult()); + }); + Map> groupByAgency = result.stream().collect(Collectors.groupingBy(ScreenPartyLinkMassesDataFormDTO::getParentId)); + groupByAgency.forEach((agencyId,gridList) -> { + ScreenPartyLinkMassesDataFormDTO form = new ScreenPartyLinkMassesDataFormDTO(); + List orgNameAgencyList = agencyService.selectOrgNameAgency(result.stream().map(m -> m.getParentId()).distinct().collect(Collectors.toList())); + if (!CollectionUtils.isEmpty(orgNameAgencyList)){ + orgNameAgencyList.forEach(name -> { + if (agencyId.equals(name.getAgencyId())){ + form.setOrgName(name.getAgencyName()); + form.setParentId(name.getParentId()); + } + }); + } + form.setOrgId(agencyId); + form.setCustomerId(customerId); + form.setDataEndTime(monthId); + form.setOrgType(ScreenConstant.AGENCY); + form.setCreateGroupTotal(gridList.stream().collect(Collectors.summingInt(ScreenPartyLinkMassesDataFormDTO::getCreateGroupTotal))); + form.setGroupUserTotal(gridList.stream().collect(Collectors.summingInt(ScreenPartyLinkMassesDataFormDTO::getGroupUserTotal))); + result.add(form); + }); + delAndInsertLink(result,customerId,monthId,orgIds); + }else { + // 级别为 street,district,city,province + List directGridIds = gridService.selectDirectGrid(orgIds); + agencyIdList.forEach(agency -> { + String agencyId = agency.getAgencyId(); + List disGridIds = new ArrayList<>(); + directGridIds.forEach(grid -> { + if (agencyId.equals(grid.getAgencyId())){ + disGridIds.add(grid.getGridId()); + } + }); + // 不为空 存在直属网格 + if (!CollectionUtils.isEmpty(disGridIds)){ + List gridResult = new ArrayList<>(); + List partyLinkMassesDataList = groupMainService.selectPartyCreateGroupInfo(customerId, monthId, disGridIds); + List orgNameList = agencyService.selectOrgNameGrid(partyLinkMassesDataList.stream().map(m -> m.getOrgId()).collect(Collectors.toList())); + if (!CollectionUtils.isEmpty(partyLinkMassesDataList)){ + partyLinkMassesDataList.forEach(party -> { + orgNameList.forEach(org -> { + if (party.getOrgId().equals(org.getGridId())){ + party.setOrgName(org.getGridName()); + } + }); + ScreenPartyLinkMassesDataFormDTO copyParty = ConvertUtils.sourceToTarget(party, ScreenPartyLinkMassesDataFormDTO.class); + gridResult.add(copyParty); + }); + } + delAndInsertLink(gridResult,customerId,monthId,disGridIds); + } + List screenPartyLinkMassesDataGrid = groupMainService.selectPartyCreateGroupInfo(customerId, monthId, disGridIds); + List screenPartyLinkMassesDataList = linkMassesDataService.selectPartyLinkMassesInfo(customerId, monthId, agencyId); + screenPartyLinkMassesDataList.addAll(screenPartyLinkMassesDataGrid); + if (!CollectionUtils.isEmpty(screenPartyLinkMassesDataList)){ + ScreenPartyLinkMassesDataFormDTO form = new ScreenPartyLinkMassesDataFormDTO(); + form.setOrgId(agencyId); + form.setOrgType(ScreenConstant.AGENCY); + form.setOrgName(screenPartyLinkMassesDataList.get(NumConstant.ZERO).getOrgName()); + form.setCustomerId(customerId); + form.setDataEndTime(monthId); + form.setParentId(screenPartyLinkMassesDataList.get(NumConstant.ZERO).getParentId()); + form.setGroupUserTotal(screenPartyLinkMassesDataList.stream().collect(Collectors.summingInt(ScreenPartyLinkMassesDataFormDTO::getGroupUserTotal))); + form.setCreateGroupTotal(screenPartyLinkMassesDataList.stream().collect(Collectors.summingInt(ScreenPartyLinkMassesDataFormDTO::getCreateGroupTotal))); + result.add(form); + } + }); + delAndInsertLink(result,customerId,monthId,orgIds); + } + } + } + + /** + * @Description 社区级别的处理 + * @Param customerId + * @Param monthId + * @Param agency + * @author zxc + * @date 2020/9/25 10:06 上午 + */ + public GridPartyGuideDTO communityLevelSubGrid(String customerId, String monthId, CustomerAgencyInfoResultDTO agency){ + String agencyId = agency.getAgencyId(); + // 获取下级所有agencyId【根据agencyMap中的level判断下级orgId是否是gridId】(此处直接作为gridId) + Map agencyMap = agencyService.selectAllSubAgencyId(agencyId, customerId); + List gridIds = (List) agencyMap.get(agencyId); + List partyLinkMassesDataList = groupMainService.selectPartyCreateGroupInfo(customerId, monthId, gridIds); + List orgIds = partyLinkMassesDataList.stream().map(m -> m.getOrgId()).collect(Collectors.toList()); + List orgNameList = agencyService.selectOrgNameGrid(orgIds); + partyLinkMassesDataList.forEach(party -> { + orgNameList.forEach(orgName -> { + if (party.getOrgId().equals(orgName.getGridId())){ + party.setOrgName(orgName.getGridName()); + } + }); + }); + return new GridPartyGuideDTO(gridIds,partyLinkMassesDataList); + } + + /** + * @Description 删除并插入党员联系群众【党员建群数,群成员数】 + * @Param result + * @Param customerId + * @Param monthId + * @Param orgIds + * @author zxc + * @date 2020/9/25 2:57 下午 + */ + @Transactional(rollbackFor = Exception.class) + public void delAndInsertLink(List result, String customerId, String monthId, List orgIds){ + List screenPartyLinkMassesAgencyList = agencyService.selectAllAgencyIdToPartyLinkMessage(customerId, monthId); + List resultList = gridService.selectAllGridIdToPartyLinkMessage(customerId, monthId); + resultList.addAll(screenPartyLinkMassesAgencyList); + List finalResult = new ArrayList<>(); + // 因为是根据级别来删除,插入,所以把需要操作的orgIds单独出来 + resultList.forEach(rl -> { + orgIds.forEach(orgId -> { + if (rl.getOrgId().equals(orgId)){ + finalResult.add(rl); + } + }); + }); + if (!CollectionUtils.isEmpty(result)){ + finalResult.forEach(fr -> { + result.forEach(r -> { + if (fr.getOrgId().equals(r.getOrgId())){ + BeanUtils.copyProperties(r,fr); + } + }); + }); + } + Integer delNum; + do { + delNum = linkMassesDataService.deleteOldPartyLinkInfo(customerId, monthId, orgIds); + }while (delNum > NumConstant.ZERO); + List> partition = ListUtils.partition(finalResult, NumConstant.ONE_HUNDRED); + partition.forEach(p -> { + linkMassesDataService.insertScreenPartyLinkMassesData(p); + }); } + + + + + + // TODO 党员志愿服务【参与人数,组织次数】 } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerAgencyService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerAgencyService.java index 9d74cc81e7..0b2ee8e93e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerAgencyService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerAgencyService.java @@ -18,6 +18,7 @@ package com.epmet.service.evaluationindex.screen; import com.epmet.dto.extract.form.PartyBaseInfoFormDTO; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.dto.extract.result.CustomerAgencyInfoResultDTO; import java.util.List; @@ -78,6 +79,15 @@ public interface ScreenCustomerAgencyService{ */ List selectAllAgencyIdToParty(String customerId,String dateId); + /** + * @Description 查询客户下所有机关ID + * @Param customerId + * @Param dateId + * @author zxc + * @date 2020/9/25 10:39 上午 + */ + List selectAllAgencyIdToPartyLinkMessage(String customerId, String dateId); + /** * @Description 查询org名称【网格】 * @param gridIds diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerGridService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerGridService.java index e8a39967e2..02e3b21f67 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerGridService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenCustomerGridService.java @@ -22,6 +22,7 @@ import com.epmet.commons.mybatis.service.BaseService; import com.epmet.dto.extract.form.GovernAbilityGridMonthlyFormDTO; import com.epmet.dto.extract.form.PartyAbilityGridMonthlyFormDTO; import com.epmet.dto.extract.form.PartyBaseInfoFormDTO; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.dto.extract.result.GridInfoResultDTO; import com.epmet.entity.evaluationindex.screen.ScreenCustomerGridEntity; import com.epmet.entity.org.CustomerGridEntity; @@ -50,6 +51,15 @@ public interface ScreenCustomerGridService extends BaseService selectAllGridIdToParty(String customerId, String dateId); + /** + * @Description 查询客户下所有网格ID + * @Param customerId + * @Param monthId + * @author zxc + * @date 2020/9/25 10:43 上午 + */ + List selectAllGridIdToPartyLinkMessage(String customerId, String monthId); + /** * @Description 查询机关的直属网格 * @param agencyIds diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyBranchDataService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyBranchDataService.java index 657faf457d..68197d665c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyBranchDataService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyBranchDataService.java @@ -18,8 +18,11 @@ package com.epmet.service.evaluationindex.screen; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.dto.extract.form.ScreenPartyBranchDataFormDTO; import com.epmet.entity.evaluationindex.screen.ScreenPartyBranchDataEntity; +import java.util.List; + /** * 基层党建-建设情况数据(支部,联建,志愿服务)按月 * @@ -28,4 +31,12 @@ import com.epmet.entity.evaluationindex.screen.ScreenPartyBranchDataEntity; */ public interface ScreenPartyBranchDataService extends BaseService { + /** + * @Description 插入建设情况数据 + * @param lists + * @author zxc + * @date 2020/9/25 9:16 上午 + */ + void insertScreenPartyBranchData(List lists); + } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyLinkMassesDataService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyLinkMassesDataService.java index 669e20f18d..f03255904a 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyLinkMassesDataService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyLinkMassesDataService.java @@ -18,8 +18,11 @@ package com.epmet.service.evaluationindex.screen; import com.epmet.commons.mybatis.service.BaseService; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.entity.evaluationindex.screen.ScreenPartyLinkMassesDataEntity; +import java.util.List; + /** * 党建引领-党员联系群众数据 * @@ -28,4 +31,32 @@ import com.epmet.entity.evaluationindex.screen.ScreenPartyLinkMassesDataEntity; */ public interface ScreenPartyLinkMassesDataService extends BaseService { + /** + * @Description 批量插入党员联系群众数据 + * @param lists + * @author zxc + * @date 2020/9/24 6:06 下午 + */ + void insertScreenPartyLinkMassesData(List lists); + + /** + * @Description 删除旧的党员联系群众 + * @param customerId + * @param monthId + * @param orgIds + * @author zxc + * @date 2020/9/22 3:28 下午 + */ + Integer deleteOldPartyLinkInfo(String customerId, String monthId, List orgIds); + + /** + * @Description 查询党员联系群众信息 + * @Param customerId + * @Param monthId + * @Param agencyId + * @author zxc + * @date 2020/9/25 1:19 下午 + */ + List selectPartyLinkMassesInfo(String customerId, String monthId,String agencyId); + } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java index 404ee7240c..9b7d925e05 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java @@ -26,6 +26,7 @@ import com.epmet.constant.ScreenConstant; import com.epmet.dao.evaluationindex.screen.ScreenCustomerAgencyDao; import com.epmet.dao.evaluationindex.screen.ScreenCustomerGridDao; import com.epmet.dto.extract.form.PartyBaseInfoFormDTO; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.dto.extract.result.CustomerAgencyInfoResultDTO; import com.epmet.dto.extract.result.OrgNameResultDTO; import com.epmet.dto.screen.result.TreeResultDTO; @@ -159,6 +160,18 @@ public class ScreenCustomerAgencyServiceImpl implements ScreenCustomerAgencyServ return screenCustomerAgencyDao.selectAllAgencyIdToParty(customerId,dateId); } + /** + * @Description 查询客户下所有机关ID + * @Param customerId + * @Param monthId + * @author zxc + * @date 2020/9/25 10:39 上午 + */ + @Override + public List selectAllAgencyIdToPartyLinkMessage(String customerId, String monthId) { + return screenCustomerAgencyDao.selectAllAgencyIdToPartyLinkMessage(customerId, monthId); + } + /** * @Description 查询org名称 * @param gridIds diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java index 344fe266e4..f1ac5f0d71 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerGridServiceImpl.java @@ -27,6 +27,7 @@ import com.epmet.dao.evaluationindex.screen.ScreenCustomerGridDao; import com.epmet.dto.extract.form.GovernAbilityGridMonthlyFormDTO; import com.epmet.dto.extract.form.PartyAbilityGridMonthlyFormDTO; import com.epmet.dto.extract.form.PartyBaseInfoFormDTO; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.dto.extract.result.GridInfoResultDTO; import com.epmet.entity.evaluationindex.screen.ScreenCustomerGridEntity; import com.epmet.entity.org.CustomerGridEntity; @@ -109,6 +110,18 @@ public class ScreenCustomerGridServiceImpl extends BaseServiceImpl selectAllGridIdToPartyLinkMessage(String customerId, String monthId) { + return screenCustomerGridDao.selectAllGridIdToPartyLinkMessage(customerId, monthId); + } + /** * @Description 查询机关的直属网格 * @param agencyIds diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyBranchDataServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyBranchDataServiceImpl.java index 8c1f8e9182..271ac60c71 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyBranchDataServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyBranchDataServiceImpl.java @@ -20,9 +20,13 @@ package com.epmet.service.evaluationindex.screen.impl; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.dao.evaluationindex.screen.ScreenPartyBranchDataDao; +import com.epmet.dto.extract.form.ScreenPartyBranchDataFormDTO; import com.epmet.entity.evaluationindex.screen.ScreenPartyBranchDataEntity; import com.epmet.service.evaluationindex.screen.ScreenPartyBranchDataService; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; /** * 基层党建-建设情况数据(支部,联建,志愿服务)按月 @@ -33,5 +37,16 @@ import org.springframework.stereotype.Service; @Service public class ScreenPartyBranchDataServiceImpl extends BaseServiceImpl implements ScreenPartyBranchDataService { - + /** + * @Description 插入建设情况数据 + * @param lists + * @author zxc + * @date 2020/9/25 9:16 上午 + */ + @Override + public void insertScreenPartyBranchData(List lists) { + if (!CollectionUtils.isEmpty(lists)){ + baseDao.insertScreenPartyBranchData(lists); + } + } } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyLinkMassesDataServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyLinkMassesDataServiceImpl.java index 256246ad11..2aec948249 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyLinkMassesDataServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyLinkMassesDataServiceImpl.java @@ -18,11 +18,17 @@ package com.epmet.service.evaluationindex.screen.impl; +import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.constant.DataSourceConstant; import com.epmet.dao.evaluationindex.screen.ScreenPartyLinkMassesDataDao; +import com.epmet.dto.extract.form.ScreenPartyLinkMassesDataFormDTO; import com.epmet.entity.evaluationindex.screen.ScreenPartyLinkMassesDataEntity; import com.epmet.service.evaluationindex.screen.ScreenPartyLinkMassesDataService; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; /** * 党建引领-党员联系群众数据 @@ -31,7 +37,46 @@ import org.springframework.stereotype.Service; * @since v1.0.0 2020-09-22 */ @Service +@DataSource(DataSourceConstant.EVALUATION_INDEX) public class ScreenPartyLinkMassesDataServiceImpl extends BaseServiceImpl implements ScreenPartyLinkMassesDataService { + /** + * @Description 批量插入党员联系群众数据 + * @param lists + * @author zxc + * @date 2020/9/24 6:06 下午 + */ + @Override + public void insertScreenPartyLinkMassesData(List lists) { + if (!CollectionUtils.isEmpty(lists)){ + baseDao.insertScreenPartyLinkMassesData(lists); + } + } + + /** + * @Description 删除旧的党员联系群众 + * @param customerId + * @param monthId + * @param orgIds + * @author zxc + * @date 2020/9/22 3:28 下午 + */ + @Override + public Integer deleteOldPartyLinkInfo(String customerId, String monthId, List orgIds) { + return baseDao.deleteOldPartyLinkInfo(customerId, monthId, orgIds); + } + + /** + * @Description 查询党员联系群众信息 + * @Param customerId + * @Param monthId + * @Param agencyId + * @author zxc + * @date 2020/9/25 1:19 下午 + */ + @Override + public List selectPartyLinkMassesInfo(String customerId, String monthId, String agencyId) { + return baseDao.selectPartyLinkMassesInfo(customerId, monthId, agencyId); + } } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginGroupMainDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginGroupMainDailyDao.xml index 134c359fd2..a6c9b62bee 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginGroupMainDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginGroupMainDailyDao.xml @@ -238,4 +238,30 @@ m.GROUP_ID =#{groupId} + + + \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCpcBaseDataDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCpcBaseDataDao.xml index 343deb4dd1..9de96650b5 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCpcBaseDataDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCpcBaseDataDao.xml @@ -194,6 +194,7 @@ org_id = #{orgId} ) + LIMIT 1000 diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerAgencyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerAgencyDao.xml index e5d5305639..df9a6fd514 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerAgencyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerAgencyDao.xml @@ -304,4 +304,20 @@ ) + + + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml index 19d1947e11..459e873378 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml @@ -296,4 +296,20 @@ DEL_FLAG = 0 AND CUSTOMER_ID = #{customerId} + + + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyBranchDataDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyBranchDataDao.xml index a7058e4a08..92b2b888b7 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyBranchDataDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyBranchDataDao.xml @@ -58,4 +58,55 @@ ) + + + + INSERT INTO screen_party_branch_data ( + ID, + CUSTOMER_ID, + YEAR_ID, + MONTH_ID, + TYPE, + ORG_TYPE, + ORG_ID, + PARENT_ID, + ORG_NAME, + MEET_CATEGORY_ID, + MEET_CATEGORY_NAME, + ORGANIZE_COUNT, + JOIN_USER_COUNT, + AVERAGE_JOIN_USER_COUNT, + DEL_FLAG, + REVISION, + CREATED_BY, + CREATED_TIME, + UPDATED_BY, + UPDATED_TIME + ) + VALUES + + ( + REPLACE ( UUID(), '-', '' ), + #{item.customerId}, + #{item.yearId}, + #{item.monthId}, + #{item.type}, + #{item.orgType}, + #{item.orgId}, + #{item.parentId}, + #{item.orgName}, + #{item.meetCategoryId}, + #{item.meetCategoryName}, + #{item.organizeCount}, + #{item.joinUserCount}, + #{item.averageJoinUserCount}, + #{item.delFlag}, + #{item.revision}, + #{item.createdBy}, + NOW(), + #{item.updatedBy}, + NOW() + ) + + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyLinkMassesDataDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyLinkMassesDataDao.xml index f6760538d1..20d7c3f7e7 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyLinkMassesDataDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyLinkMassesDataDao.xml @@ -9,6 +9,41 @@ limit 1000; + + + delete from screen_party_link_masses_data + where CUSTOMER_ID = #{customerId} + and DATA_END_TIME = #{monthId} + and + ( + + org_id = #{orgId} + + ) + LIMIT 1000 + + + + + insert into screen_party_link_masses_data ( @@ -49,4 +84,29 @@ + + + INSERT INTO screen_party_link_masses_data ( ID, CUSTOMER_ID, ORG_TYPE, ORG_ID, PARENT_ID, ORG_NAME, CREATE_GROUP_TOTAL, GROUP_USER_TOTAL, DEL_FLAG, REVISION, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, DATA_END_TIME ) + VALUES + + ( + REPLACE ( UUID(), '-', '' ), + #{item.customerId}, + #{item.orgType}, + #{item.orgId}, + #{item.parentId}, + #{item.orgName}, + #{item.createGroupTotal}, + #{item.groupUserTotal}, + #{item.delFlag}, + #{item.revision}, + #{item.createdBy}, + NOW(), + #{item.updatedBy}, + NOW(), + #{item.dataEndTime} + ) + + + From 657efe0f60ab24f58bf63b1664e983e9f4c7ab81 Mon Sep 17 00:00:00 2001 From: wxz Date: Fri, 25 Sep 2020 15:17:02 +0800 Subject: [PATCH 08/20] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E8=AE=A4=E8=AF=81=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E5=92=8C=E7=B1=BB=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-report/data-report-server/pom.xml | 4 +- .../controller/fact/FactIndexController.java | 1 - .../controller/screen/AgencyController.java | 20 +-- .../screen/DistributionController.java | 6 - .../screen/GrassRootsGovernController.java | 6 - .../screen/GrassrootsPartyDevController.java | 5 - .../controller/screen/IndexController.java | 19 +-- .../controller/screen/KcScreenController.java | 146 +++++------------- .../screen/PartyMemberLeadController.java | 6 - .../screen/ScreenProjectController.java | 2 - .../screen/ScreenUserController.java | 3 - .../evaluationindex/screen/AgencyService.java | 3 +- .../screen/KcScreenService.java | 22 +-- .../screen/impl/AgencyServiceImpl.java | 4 +- .../screen/impl/KcScreenServiceImpl.java | 36 ++--- 15 files changed, 72 insertions(+), 211 deletions(-) diff --git a/epmet-module/data-report/data-report-server/pom.xml b/epmet-module/data-report/data-report-server/pom.xml index 6dd6fefbcb..3f0c56a777 100644 --- a/epmet-module/data-report/data-report-server/pom.xml +++ b/epmet-module/data-report/data-report-server/pom.xml @@ -62,11 +62,11 @@ 0.3.1 - + com.epmet diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/fact/FactIndexController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/fact/FactIndexController.java index c7eb8ac820..fbf0e78748 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/fact/FactIndexController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/fact/FactIndexController.java @@ -1,6 +1,5 @@ package com.epmet.datareport.controller.fact; -import com.epmet.commons.extappauth.annotation.InternalAppRequestAuth; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/AgencyController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/AgencyController.java index 07b6bf2093..035dab63d9 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/AgencyController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/AgencyController.java @@ -1,21 +1,13 @@ package com.epmet.datareport.controller.screen; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.datareport.service.evaluationindex.screen.AgencyService; import com.epmet.evaluationindex.screen.dto.form.CompartmentFormDTO; import com.epmet.evaluationindex.screen.dto.result.CompartmentResultDTO; import com.epmet.evaluationindex.screen.dto.result.TreeResultDTO; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; +import org.springframework.web.bind.annotation.*; /** * 组织相关api @@ -36,14 +28,9 @@ public class AgencyController { * @author zxc * @date 2020/8/18 2:04 下午 */ - @ExternalAppRequestAuth @PostMapping("tree") - public Result tree(HttpServletRequest request, ExternalAppRequestParam externalAppRequestParam){ - String customerId = request.getHeader("CustomerId"); - if(StringUtils.isBlank(externalAppRequestParam.getCustomerId())){ - externalAppRequestParam.setCustomerId(customerId); - } - return new Result().ok(agencyService.tree(externalAppRequestParam)); + public Result tree(@RequestHeader("CustomerId") String customerId){ + return new Result().ok(agencyService.tree(customerId)); } /** @@ -52,7 +39,6 @@ public class AgencyController { * @author zxc * @date 2020/8/18 2:33 下午 */ - @ExternalAppRequestAuth @PostMapping("compartment") public Result compartment(@RequestBody CompartmentFormDTO compartmentFormDTO){ ValidatorUtils.validateEntity(compartmentFormDTO, CompartmentFormDTO.Compartment.class); diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/DistributionController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/DistributionController.java index 30f0f82584..8c17f03238 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/DistributionController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/DistributionController.java @@ -1,6 +1,5 @@ package com.epmet.datareport.controller.screen; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.datareport.service.evaluationindex.screen.DistributionService; @@ -33,7 +32,6 @@ public class DistributionController { * @author zxc * @date 2020/8/18 10:59 上午 */ - @ExternalAppRequestAuth @PostMapping("branch") public Result> branch(@RequestBody BranchFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO, BranchFormDTO.Branch.class); @@ -46,7 +44,6 @@ public class DistributionController { * @author zxc * @date 2020/8/18 11:10 上午 */ - @ExternalAppRequestAuth @PostMapping("user") public Result user(@RequestBody UserFormDTO userFormDTO){ ValidatorUtils.validateEntity(userFormDTO, UserFormDTO.User.class); @@ -59,7 +56,6 @@ public class DistributionController { * @author zxc * @date 2020/8/18 11:20 上午 */ - @ExternalAppRequestAuth @PostMapping("parymember") public Result parymember(@RequestBody ParymemberFormDTO parymemberFormDTO){ ValidatorUtils.validateEntity(parymemberFormDTO, ParymemberFormDTO.Parymember.class); @@ -72,7 +68,6 @@ public class DistributionController { * @author zxc * @date 2020/8/19 1:29 下午 */ - @ExternalAppRequestAuth @PostMapping("project") public Result> project(@RequestBody ProjectFormDTO projectFormDTO){ ValidatorUtils.validateEntity(projectFormDTO, ProjectFormDTO.Project.class); @@ -85,7 +80,6 @@ public class DistributionController { * @author zxc * @date 2020/8/19 1:52 下午 */ - @ExternalAppRequestAuth @PostMapping("topprofile") public Result topProfile(@RequestBody TopProfileFormDTO topProfileFormDTO){ ValidatorUtils.validateEntity(topProfileFormDTO, TopProfileFormDTO.TopProfile.class); diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/GrassRootsGovernController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/GrassRootsGovernController.java index 1ee85baeb4..4cec62dc66 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/GrassRootsGovernController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/GrassRootsGovernController.java @@ -1,6 +1,5 @@ package com.epmet.datareport.controller.screen; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.datareport.service.evaluationindex.screen.GrassRootsGovernService; @@ -39,7 +38,6 @@ public class GrassRootsGovernController { * @author wangc * @date 2020.08.20 11:16 **/ - @ExternalAppRequestAuth @PostMapping("userpointrank") public Result userPointRank(@RequestBody AgencyAndNumFormDTO param){ ValidatorUtils.validateEntity(param,AgencyFormDTO.CommonAgencyIdGroup.class); @@ -54,7 +52,6 @@ public class GrassRootsGovernController { * @author wangc * @date 2020.08.20 13:55 **/ - @ExternalAppRequestAuth @PostMapping("difficultprojects") public Result> difficultProject(@RequestBody AgencyNumTypeParamFormDTO param){ ValidatorUtils.validateEntity(param, AgencyNumTypeParamFormDTO.AgencyNumTypeParamGroup.class); @@ -69,7 +66,6 @@ public class GrassRootsGovernController { * @author wangc * @date 2020.08.20 14:37 **/ - @ExternalAppRequestAuth @PostMapping("publicpartiprofile") public Result publicPartiProfile(@RequestBody AgencyFormDTO param){ ValidatorUtils.validateEntity(param, AgencyFormDTO.CommonAgencyIdGroup.class); @@ -84,7 +80,6 @@ public class GrassRootsGovernController { * @author wangc * @date 2020.08.20 15:32 **/ - @ExternalAppRequestAuth @PostMapping("publicpartirank") public Result> publicPartiRank(@RequestBody AgencyAndNumFormDTO param){ ValidatorUtils.validateEntity(param,AgencyFormDTO.CommonAgencyIdGroup.class); @@ -99,7 +94,6 @@ public class GrassRootsGovernController { * @author wangc * @date 2020.08.20 17:46 **/ - @ExternalAppRequestAuth @PostMapping("governcapacityrank") public Result> governCapacityRank(@RequestBody AgencyAndNumFormDTO param){ ValidatorUtils.validateEntity(param,AgencyFormDTO.CommonAgencyIdGroup.class); diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/GrassrootsPartyDevController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/GrassrootsPartyDevController.java index db7c83089f..f7273b3da8 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/GrassrootsPartyDevController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/GrassrootsPartyDevController.java @@ -1,6 +1,5 @@ package com.epmet.datareport.controller.screen; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.datareport.service.evaluationindex.screen.GrassrootsPartyDevService; @@ -38,7 +37,6 @@ public class GrassrootsPartyDevController { * @author wangc * @date 2020.08.18 16:59 **/ - @ExternalAppRequestAuth @PostMapping("basicinfo") public Result baseInfo(@RequestBody ParymemberFormDTO param){ ValidatorUtils.validateEntity(param, ParymemberFormDTO.Parymember.class); @@ -53,7 +51,6 @@ public class GrassrootsPartyDevController { * @author wangc * @date 2020.08.18 17:54 **/ - @ExternalAppRequestAuth @PostMapping("ageinfo") public Result ageInfo(@RequestBody ParymemberFormDTO param){ ValidatorUtils.validateEntity(param, ParymemberFormDTO.Parymember.class); @@ -68,7 +65,6 @@ public class GrassrootsPartyDevController { * @author wangc * @date 2020.08.19 11:02 **/ - @ExternalAppRequestAuth @PostMapping("branchbuildtrend") public Result branchBuildTrend(@RequestBody BranchBuildTrendFormDTO param){ ValidatorUtils.validateEntity(param, BranchBuildTrendFormDTO.branchBuildTrendGroup.class); @@ -83,7 +79,6 @@ public class GrassrootsPartyDevController { * @author wangc * @date 2020.08.19 15:25 **/ - @ExternalAppRequestAuth @PostMapping("branchbuildrank") public Result branchBuildRank(@RequestBody BranchBuildRankFormDTO param){ ValidatorUtils.validateEntity(param, BranchBuildRankFormDTO.BranchBuildRankGroup.class); diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java index 162065563b..d3ece6a658 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java @@ -1,8 +1,5 @@ package com.epmet.datareport.controller.screen; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; -import com.epmet.commons.extappauth.annotation.InternalAppRequestAuth; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.datareport.eum.OrgTypeEnum; @@ -10,10 +7,7 @@ import com.epmet.datareport.service.evaluationindex.screen.IndexService; import com.epmet.evaluationindex.screen.dto.form.*; import com.epmet.evaluationindex.screen.dto.result.*; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -36,7 +30,6 @@ public class IndexController { * @author zxc * @date 2020/8/19 2:53 下午 */ - @ExternalAppRequestAuth @PostMapping("yearaverageindex") public Result yearAverageIndex(@RequestBody YearAverageIndexFormDTO yearAverageIndexFormDTO){ ValidatorUtils.validateEntity(yearAverageIndexFormDTO, YearAverageIndexFormDTO.YearAverageIndex.class); @@ -49,7 +42,6 @@ public class IndexController { * @author zxc * @date 2020/8/19 3:17 下午 */ - @ExternalAppRequestAuth @PostMapping("monthindexanalysis/piechart") public Result monthPieChart(@RequestBody MonthPieChartFormDTO monthPieChartFormDTO){ ValidatorUtils.validateEntity(monthPieChartFormDTO, MonthPieChartFormDTO.MonthPieChart.class); @@ -62,7 +54,6 @@ public class IndexController { * @author zxc * @date 2020/8/19 5:27 下午 */ - @ExternalAppRequestAuth @PostMapping("monthindexanalysis/barchart") public Result monthBarchart(@RequestBody MonthBarchartFormDTO monthBarchartFormDTO){ ValidatorUtils.validateEntity(monthBarchartFormDTO, MonthBarchartFormDTO.MonthBarchart.class); @@ -75,7 +66,6 @@ public class IndexController { * @author zxc * @date 2020/8/20 10:02 上午 */ - @ExternalAppRequestAuth @PostMapping("subagencyindexrank") public Result> subAgencyIndexRank(@RequestBody SubAgencyIndexRankFormDTO subAgencyIndexRankFormDTO){ ValidatorUtils.validateEntity(subAgencyIndexRankFormDTO, SubAgencyIndexRankFormDTO.SubAgencyIndexRank.class); @@ -90,8 +80,6 @@ public class IndexController { * @Author zhangyong * @Date 13:39 2020-09-11 **/ - @InternalAppRequestAuth - @ExternalAppRequestAuth @PostMapping("dataclient/subagencyindexrank") public Result> getSubAgencyIndexRank(@RequestBody SubAgencyIndexRankYMFormDTO formDTO) { ValidatorUtils.validateEntity(formDTO, SubAgencyIndexRankYMFormDTO.SubAgencyIndexRank.class); @@ -104,10 +92,9 @@ public class IndexController { * @author jianjun.liu * @date 2020/8/20 10:02 上午 */ - @ExternalAppRequestAuth @PostMapping("gridindexrank") - public Result> gridIndexRank(ExternalAppRequestParam extParam, @RequestBody GridIndexRankFormDTO formDTO) { - formDTO.setCustomerId(extParam.getCustomerId()); + public Result> gridIndexRank(@RequestHeader("CustomerId") String customerId, @RequestBody GridIndexRankFormDTO formDTO) { + formDTO.setCustomerId(customerId); ValidatorUtils.validateEntity(formDTO); formDTO.setOrgType(OrgTypeEnum.GRID.getCode()); return new Result>().ok(indexService.selectIndexRankByOrgType(formDTO)); diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/KcScreenController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/KcScreenController.java index 8e9a3d0bfa..855be093c1 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/KcScreenController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/KcScreenController.java @@ -1,8 +1,5 @@ package com.epmet.datareport.controller.screen; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; -import com.epmet.commons.extappauth.annotation.InternalAppRequestAuth; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.datareport.service.evaluationindex.screen.KcScreenService; @@ -17,10 +14,7 @@ import com.epmet.dto.result.issue.KcIssueSummary; import com.epmet.dto.result.issue.KcPartiTrendResultDTO; import com.epmet.evaluationindex.screen.dto.result.HomepageSummaryResultDTO; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -39,42 +33,37 @@ public class KcScreenController { /** - * @param externalAppRequestParam * @Description 首页-平台各类总数 * @author sun */ @PostMapping("homepage/summary") - public Result homepageSummary(ExternalAppRequestParam externalAppRequestParam){ - return new Result().ok(kcScreenService.homepageSummary(externalAppRequestParam)); + public Result homepageSummary(@RequestHeader("CustomerId") String customerId){ + return new Result().ok(kcScreenService.homepageSummary(customerId)); } /** - * @param externalAppRequestParam * @Description 公益互助-各类总数汇总 * @author sun */ @PostMapping("heart/summary") - public Result heartSummary(ExternalAppRequestParam externalAppRequestParam){ - return new Result().ok(kcScreenService.heartSummary(externalAppRequestParam)); + public Result heartSummary(@RequestHeader("CustomerId") String customerId){ + return new Result().ok(kcScreenService.heartSummary(customerId)); } /** - * @param externalAppRequestParam * @Description 公益互助-公益活动次数 * @author sun */ @PostMapping("heart/actcounttrend") - public Result heartActcounttrend(ExternalAppRequestParam externalAppRequestParam){ - return new Result().ok(kcScreenService.heartActcounttrend(externalAppRequestParam)); + public Result heartActcounttrend(@RequestHeader("CustomerId") String customerId){ + return new Result().ok(kcScreenService.heartActcounttrend(customerId)); } /** * 议题分析-各类总数 - * @param externalAppRequestParam * @return */ @PostMapping("issue/summary") - public Result getIssueSummary(ExternalAppRequestParam externalAppRequestParam) { - String customerId = externalAppRequestParam.getCustomerId(); + public Result getIssueSummary(@RequestHeader("CustomerId") String customerId) { //String customerId = "b09527201c4409e19d1dbc5e3c3429a1"; KcIssueSummary issueSummary = kcScreenService.getIssueSummary(customerId); return new Result().ok(issueSummary); @@ -82,300 +71,247 @@ public class KcScreenController { /** * 参与趋势 - * @param externalAppRequestParam * @return */ @PostMapping("issue/partitrend") - public Result getIssuePartiTrend(ExternalAppRequestParam externalAppRequestParam) { - String customerId = externalAppRequestParam.getCustomerId(); - //String customerId = "b09527201c4409e19d1dbc5e3c3429a1"; + public Result getIssuePartiTrend(@RequestHeader("CustomerId") String customerId) { KcPartiTrendResultDTO trendResultDTO = kcScreenService.getIssuePartiTrend(customerId); return new Result().ok(trendResultDTO); } /** * 按照议题数量排名 - * @param externalAppRequestParam * @return */ @PostMapping("issue/gridtotalrank") - public Result getIssueGridTotalRank(ExternalAppRequestParam externalAppRequestParam) { - String customerId = externalAppRequestParam.getCustomerId(); - //String customerId = "2fe0065f70ca0e23ce4c26fca5f1d933"; + public Result getIssueGridTotalRank(@RequestHeader("CustomerId") String customerId) { return new Result().ok(kcScreenService.getIssueGridTotalRank(customerId)); } /** * 议题分析-审核效率排名 - * @param externalAppRequestParam * @return */ @PostMapping("issue/avgaudittimerank") - public Result getAvgAuditTimeRank(ExternalAppRequestParam externalAppRequestParam) { - String customerId = externalAppRequestParam.getCustomerId(); - //String customerId = "2fe0065f70ca0e23ce4c26fca5f1d933"; + public Result getAvgAuditTimeRank(@RequestHeader("CustomerId") String customerId) { return new Result().ok(kcScreenService.getAvgAuditTimeRank(customerId)); } /** * 议题分析-议题效率 - * @param externalAppRequestParam * @return */ @PostMapping("issue/effective") - public Result getIssueEffective(ExternalAppRequestParam externalAppRequestParam) { - String customerId = externalAppRequestParam.getCustomerId(); + public Result getIssueEffective(@RequestHeader("CustomerId") String customerId) { //String customerId = "2fe0065f70ca0e23ce4c26fca5f1d933"; return new Result().ok(kcScreenService.getIssueEffective(customerId)); } /** - * @param externalAppRequestParam * @Description 公益互助-志愿者画像 * @author sun */ @PostMapping("heart/volunteerportrayal") - public Result heartVolunteerportrayal(ExternalAppRequestParam externalAppRequestParam){ - return new Result().ok(kcScreenService.heartVolunteerportrayal(externalAppRequestParam)); + public Result heartVolunteerportrayal(@RequestHeader("CustomerId") String customerId){ + return new Result().ok(kcScreenService.heartVolunteerportrayal(customerId)); } /** - * @param externalAppRequestParam * @Description 公益互助-个人(志愿者)公益时长排名 * @author sun */ @PostMapping("heart/volunteerrank") - public Result> heartVolunteerrank(ExternalAppRequestParam externalAppRequestParam, @RequestBody HeartVolunteerrankFormDTO formDTO){ + public Result> heartVolunteerrank(@RequestHeader("CustomerId") String customerId, @RequestBody HeartVolunteerrankFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO, HeartVolunteerrankFormDTO.AddUserInternalGroup.class); - formDTO.setCustomerId(externalAppRequestParam.getCustomerId()); + formDTO.setCustomerId(customerId); return new Result>().ok(kcScreenService.heartVolunteerrank(formDTO)); } /** - * @param externalAppRequestParam * @Description 邻里党群-各类总数 * @author sun */ @PostMapping("group/summary") - public Result groupSummary(ExternalAppRequestParam externalAppRequestParam){ - return new Result().ok(kcScreenService.groupSummary(externalAppRequestParam)); + public Result groupSummary(@RequestHeader("CustomerId") String customerId){ + return new Result().ok(kcScreenService.groupSummary(customerId)); } /** - * @param externalAppRequestParam * @Description 邻里党群-话题参与趋势 * @author sun */ @PostMapping("group/partitopictrend") - public Result groupPartitopictrend(ExternalAppRequestParam externalAppRequestParam){ - return new Result().ok(kcScreenService.groupPartitopictrend(externalAppRequestParam)); + public Result groupPartitopictrend(@RequestHeader("CustomerId") String customerId){ + return new Result().ok(kcScreenService.groupPartitopictrend(customerId)); } /** - * @param externalAppRequestParam * @Description 邻里党群-社群数量排名 * @author sun */ @PostMapping("group/gridgroupcountrank") - public Result groupGridgroupcountrank(ExternalAppRequestParam externalAppRequestParam){ - return new Result().ok(kcScreenService.groupGridgroupcountrank(externalAppRequestParam)); + public Result groupGridgroupcountrank(@RequestHeader("CustomerId") String customerId){ + return new Result().ok(kcScreenService.groupGridgroupcountrank(customerId)); } /** - * @param externalAppRequestParam * @Description 邻里党群-社群数量排名 * @author sun */ @PostMapping("group/usercountrank") - public Result> groupUserCountRank(ExternalAppRequestParam externalAppRequestParam, @RequestBody GroupUserCountRankFormDTO formDTO){ + public Result> groupUserCountRank(@RequestHeader("CustomerId") String customerId, @RequestBody GroupUserCountRankFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO, GroupUserCountRankFormDTO.AddUserInternalGroup.class); - formDTO.setCustomerId(externalAppRequestParam.getCustomerId()); + formDTO.setCustomerId(customerId); return new Result>().ok(kcScreenService.groupUserCountRank(formDTO)); } /** - * @param externalAppRequestParam * @Description 邻里党群-话题转化率排名 * @author sun */ @PostMapping("group/topicshiftissueratiorank") - public Result> groupTopicShiftIssueRatioRank(ExternalAppRequestParam externalAppRequestParam, @RequestBody GroupTopicShiftIssueRatioRankFormDTO formDTO){ + public Result> groupTopicShiftIssueRatioRank(@RequestHeader("CustomerId") String customerId, @RequestBody GroupTopicShiftIssueRatioRankFormDTO formDTO){ ValidatorUtils.validateEntity(formDTO, GroupTopicShiftIssueRatioRankFormDTO.AddUserInternalGroup.class); - formDTO.setCustomerId(externalAppRequestParam.getCustomerId()); + formDTO.setCustomerId(customerId); return new Result>().ok(kcScreenService.groupTopicShiftIssueRatioRank(formDTO)); } /** * 项目各类总数汇总 - * @param externalAppRequestParam * @return */ @PostMapping("project/summary") - public Result getProjectSummary(ExternalAppRequestParam externalAppRequestParam){ - //String customerId = "2fe0065f70ca0e23ce4c26fca5f1d933"; - String customerId = externalAppRequestParam.getCustomerId(); + public Result getProjectSummary(@RequestHeader("CustomerId") String customerId){ return new Result().ok(kcScreenService.getProjectSummary(customerId)); } /** * 项目分析-网格下项目数量排名 - * @param externalAppRequestParam * @return */ @PostMapping("project/gridcountrank") - public Result getProjectGridCountRank(ExternalAppRequestParam externalAppRequestParam){ - //String customerId = "2fe0065f70ca0e23ce4c26fca5f1d933"; - String customerId = externalAppRequestParam.getCustomerId(); + public Result getProjectGridCountRank(@RequestHeader("CustomerId") String customerId){ return new Result().ok(kcScreenService.getGridProjectCountRank(customerId)); } /** * 项目分析-项目类别 - * @param externalAppRequestParam * @return */ @PostMapping("project/categoryanalysis") - public Result> getProjectCategoryAnalysis(ExternalAppRequestParam externalAppRequestParam){ - //String customerId = "2fe0065f70ca0e23ce4c26fca5f1d933"; - String customerId = externalAppRequestParam.getCustomerId(); + public Result> getProjectCategoryAnalysis(@RequestHeader("CustomerId") String customerId){ return new Result>().ok(kcScreenService.getProjectCategoryAnalysis(customerId)); } /** * 网格项目平均结案时间 - * @param externalAppRequestParam * @return */ @PostMapping("project/avgclosedtimeanalysis") - public Result> getGridProjectAvgClosedTimeAnalysis(ExternalAppRequestParam externalAppRequestParam){ - //String customerId = "2fe0065f70ca0e23ce4c26fca5f1d933"; - String customerId = externalAppRequestParam.getCustomerId(); + public Result> getGridProjectAvgClosedTimeAnalysis(@RequestHeader("CustomerId") String customerId){ return new Result>().ok(kcScreenService.getGridProjectAvgClosedTimeAnalysis(customerId)); } /** * 项目分析-居民满意度 - * @param externalAppRequestParam * @return */ @PostMapping("project/statis") - public Result getProjectSatisfactionAnalyze(ExternalAppRequestParam externalAppRequestParam){ - String customerId = externalAppRequestParam.getCustomerId(); + public Result getProjectSatisfactionAnalyze(@RequestHeader("CustomerId") String customerId){ return new Result().ok(kcScreenService.getProjectSatisfactionAnalyze(customerId)); } /** * 用户-summary - * @param externalAppRequestParam * @return */ @PostMapping("user/summary") - public Result getUserSummary(ExternalAppRequestParam externalAppRequestParam){ - String customerId = externalAppRequestParam.getCustomerId(); - //String customerId = "2fe0065f70ca0e23ce4c26fca5f1d933"; + public Result getUserSummary(@RequestHeader("CustomerId") String customerId){ return new Result().ok(kcScreenService.getUserSummary(customerId)); } /** * 用户量趋势 - * @param externalAppRequestParam * @return */ @PostMapping("user/trend") - public Result getUserTrend(ExternalAppRequestParam externalAppRequestParam){ - String customerId = externalAppRequestParam.getCustomerId(); + public Result getUserTrend(@RequestHeader("CustomerId") String customerId){ return new Result().ok(kcScreenService.getUserTrend(customerId)); } /** * 网格用户数量排名 - * @param externalAppRequestParam * @return */ @PostMapping("user/griduserrank") - public Result getUserRank(ExternalAppRequestParam externalAppRequestParam){ - String customerId = externalAppRequestParam.getCustomerId(); + public Result getUserRank(@RequestHeader("CustomerId") String customerId){ return new Result().ok(kcScreenService.getUserRank(customerId)); } /** * 用户画像 - * @param externalAppRequestParam * @return */ @PostMapping("user/userportrayal") - public Result getUserPortrayal(ExternalAppRequestParam externalAppRequestParam){ - String customerId = externalAppRequestParam.getCustomerId(); + public Result getUserPortrayal(@RequestHeader("CustomerId") String customerId){ return new Result().ok(kcScreenService.getUserPortrayal(customerId)); } /** * 用户积分排名 - * @param externalAppRequestParam * @return */ @PostMapping("user/pointsrank") - public Result getUserPointsRank(ExternalAppRequestParam externalAppRequestParam, + public Result getUserPointsRank(@RequestHeader("CustomerId") String customerId, @RequestBody PageFormDTO form) { - String customerId = externalAppRequestParam.getCustomerId(); return new Result().ok(kcScreenService.getUserPointsRank(customerId, form.getPageNo(), form.getPageSize())); } /** * 党建声音-各类总数 - * @param externalAppRequestParam * @return */ @PostMapping("news/summary") - public Result getNewsSummary(ExternalAppRequestParam externalAppRequestParam){ - String customerId = externalAppRequestParam.getCustomerId(); + public Result getNewsSummary(@RequestHeader("CustomerId") String customerId){ return new Result().ok(kcScreenService.getNewsSummary(customerId)); } /** * 新闻阅读参与趋势 - * @param externalAppRequestParam * @return */ @PostMapping("news/partitrend") - public Result getNewsPartiTrend(ExternalAppRequestParam externalAppRequestParam){ - String customerId = externalAppRequestParam.getCustomerId(); + public Result getNewsPartiTrend(@RequestHeader("CustomerId") String customerId){ return new Result().ok(kcScreenService.getNewsPartiTrend(customerId)); } /** * 党建声音-分类的news数量 - * @param externalAppRequestParam * @return */ @PostMapping("news/category") - public Result> getNewsCountGroupByCategory(ExternalAppRequestParam externalAppRequestParam){ - String customerId = externalAppRequestParam.getCustomerId(); + public Result> getNewsCountGroupByCategory(@RequestHeader("CustomerId") String customerId){ return new Result>().ok(kcScreenService.getNewsCountOfCategory(customerId)); } /** * 党建声音-分类的用户参与数排行 - * @param externalAppRequestParam * @return */ @PostMapping("news/userparticategoryrank") - public Result getNewsPartiCategoryRank(ExternalAppRequestParam externalAppRequestParam){ - String customerId = externalAppRequestParam.getCustomerId(); + public Result getNewsPartiCategoryRank(@RequestHeader("CustomerId") String customerId){ return new Result().ok(kcScreenService.getNewsPartiCategoryRank(customerId)); } /** * 党建声音-热点新闻排行 - * @param externalAppRequestParam * @return */ @PostMapping("news/hotrank") - public Result> listNewsHotRank(ExternalAppRequestParam externalAppRequestParam, + public Result> listNewsHotRank(@RequestHeader("CustomerId") String customerId, @RequestBody PageFormDTO form){ - String customerId = externalAppRequestParam.getCustomerId(); return new Result>().ok(kcScreenService.getNewsHotRank(customerId, form.getPageNo(), form.getPageSize())); } diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/PartyMemberLeadController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/PartyMemberLeadController.java index 5530fae8b0..ca1104f534 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/PartyMemberLeadController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/PartyMemberLeadController.java @@ -1,6 +1,5 @@ package com.epmet.datareport.controller.screen; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.datareport.service.evaluationindex.screen.PartyMemberLeadService; @@ -33,7 +32,6 @@ public class PartyMemberLeadController { * @author zxc * @date 2020/8/20 1:56 下午 */ - @ExternalAppRequestAuth @PostMapping("fineexample") public Result fineExample(@RequestBody FineExampleFormDTO fineExampleFormDTO){ ValidatorUtils.validateEntity(fineExampleFormDTO, FineExampleFormDTO.FineExample.class); @@ -46,7 +44,6 @@ public class PartyMemberLeadController { * @author zxc * @date 2020/8/20 2:35 下午 */ - @ExternalAppRequestAuth @PostMapping("contactmasslinechart") public Result contactMassLineChart(@RequestBody ContactMassLineChartFormDTO contactMassLineChartFormDTO){ ValidatorUtils.validateEntity(contactMassLineChartFormDTO, ContactMassLineChartFormDTO.ContactMassLineChart.class); @@ -59,7 +56,6 @@ public class PartyMemberLeadController { * @author zxc * @date 2020/8/20 3:19 下午 */ - @ExternalAppRequestAuth @PostMapping("volunteerservice") public Result volunteerService(@RequestBody VolunteerServiceFormDTO volunteerServiceFormDTO){ ValidatorUtils.validateEntity(volunteerServiceFormDTO, VolunteerServiceFormDTO.VolunteerService.class); @@ -74,7 +70,6 @@ public class PartyMemberLeadController { * @author wangc * @date 2020.08.21 11:05 **/ - @ExternalAppRequestAuth @PostMapping("advancedbranchrank") Result> advancedBranchRank(@RequestBody AgencyAndNumFormDTO param){ ValidatorUtils.validateEntity(param, AgencyFormDTO.CommonAgencyIdGroup.class); @@ -89,7 +84,6 @@ public class PartyMemberLeadController { * @author wangc * @date 2020.08.21 14:22 **/ - @ExternalAppRequestAuth @PostMapping("advancedpartymemberrank") Result> advancedPartymemberRank(@RequestBody AgencyAndNumFormDTO param){ ValidatorUtils.validateEntity(param, AgencyFormDTO.CommonAgencyIdGroup.class); diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/ScreenProjectController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/ScreenProjectController.java index 5417767ee6..483e3edcc1 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/ScreenProjectController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/ScreenProjectController.java @@ -1,6 +1,5 @@ package com.epmet.datareport.controller.screen; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.datareport.service.evaluationindex.screen.ScreenProjectService; @@ -31,7 +30,6 @@ public class ScreenProjectController { * @author zxc * @date 2020/8/19 4:36 下午 */ - @ExternalAppRequestAuth @PostMapping("detail") public Result projectDetail(@RequestBody ProjectDetailFormDTO projectDetailFormDTO){ ValidatorUtils.validateEntity(projectDetailFormDTO, ProjectDetailFormDTO.ProjectDetail.class); diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/ScreenUserController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/ScreenUserController.java index 5e7c544c38..bc6997d45f 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/ScreenUserController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/ScreenUserController.java @@ -1,6 +1,5 @@ package com.epmet.datareport.controller.screen; -import com.epmet.commons.extappauth.annotation.InternalAppRequestAuth; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; @@ -35,7 +34,6 @@ public class ScreenUserController { * @Description 热心市民积分排行列表 * @author sun */ - @InternalAppRequestAuth @PostMapping("userpointrank") public Result> userPointRank(@LoginUser TokenDto tokenDTO, @RequestBody UserPointRankFormDTO formDTO) { ValidatorUtils.validateEntity(formDTO, UserPointRankFormDTO.AddUserInternalGroup.class); @@ -47,7 +45,6 @@ public class ScreenUserController { * @Description 党员(指标得分)排行 * @author sun */ - @InternalAppRequestAuth @PostMapping("partindexscroerank") public Result> partIndexScroeRank(@LoginUser TokenDto tokenDTO, @RequestBody PartIndexScroeRankFormDTO formDTO) { ValidatorUtils.validateEntity(formDTO, PartIndexScroeRankFormDTO.AddUserInternalGroup.class); diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/AgencyService.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/AgencyService.java index f881373c1b..eee423ca41 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/AgencyService.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/AgencyService.java @@ -1,6 +1,5 @@ package com.epmet.datareport.service.evaluationindex.screen; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.evaluationindex.screen.dto.form.CompartmentFormDTO; import com.epmet.evaluationindex.screen.dto.result.CompartmentResultDTO; import com.epmet.evaluationindex.screen.dto.result.TreeResultDTO; @@ -19,7 +18,7 @@ public interface AgencyService { * @author zxc * @date 2020/8/18 2:04 下午 */ - TreeResultDTO tree(ExternalAppRequestParam externalAppRequestParam); + TreeResultDTO tree(String customerId); /** * @Description 2、组织区域查询 diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/KcScreenService.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/KcScreenService.java index d17df56ba1..480601a129 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/KcScreenService.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/KcScreenService.java @@ -1,6 +1,5 @@ package com.epmet.datareport.service.evaluationindex.screen; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.dto.result.issue.*; import com.epmet.dto.result.project.*; import com.epmet.dto.result.user.*; @@ -22,32 +21,28 @@ import com.epmet.evaluationindex.screen.dto.result.HomepageSummaryResultDTO; public interface KcScreenService { /** - * @param externalAppRequestParam * @Description 首页-平台各类总数 * @author sun */ - HomepageSummaryResultDTO homepageSummary(ExternalAppRequestParam externalAppRequestParam); + HomepageSummaryResultDTO homepageSummary(String customerId); /** - * @param externalAppRequestParam * @Description 公益互助-各类总数汇总 * @author sun */ - HeartSummaryResultDTO heartSummary(ExternalAppRequestParam externalAppRequestParam); + HeartSummaryResultDTO heartSummary(String customerId); /** - * @param externalAppRequestParam * @Description 公益互助-公益活动次数 * @author sun */ - HeartActcounttrendResultDTO heartActcounttrend(ExternalAppRequestParam externalAppRequestParam); + HeartActcounttrendResultDTO heartActcounttrend(String customerId); /** - * @param externalAppRequestParam * @Description 公益互助-志愿者画像 * @author sun */ - HeartVolunteerportrayalResultDTO heartVolunteerportrayal(ExternalAppRequestParam externalAppRequestParam); + HeartVolunteerportrayalResultDTO heartVolunteerportrayal(String customerId); /** * @param formDTO @@ -67,25 +62,22 @@ public interface KcScreenService { /** - * @param externalAppRequestParam * @Description 邻里党群-各类总数 * @author sun */ - GroupSummaryResultDTO groupSummary(ExternalAppRequestParam externalAppRequestParam); + GroupSummaryResultDTO groupSummary(String customerId); /** - * @param externalAppRequestParam * @Description 邻里党群-话题参与趋势 * @author sun */ - GroupPartitopictrendResultDTO groupPartitopictrend(ExternalAppRequestParam externalAppRequestParam); + GroupPartitopictrendResultDTO groupPartitopictrend(String customerId); /** - * @param externalAppRequestParam * @Description 邻里党群-社群数量排名 * @author sun */ - GroupGridgroupcountrankResultDTO groupGridgroupcountrank(ExternalAppRequestParam externalAppRequestParam); + GroupGridgroupcountrankResultDTO groupGridgroupcountrank(String customerId); /** * @param formDTO diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AgencyServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AgencyServiceImpl.java index 3ecb962cc8..104e941333 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AgencyServiceImpl.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/AgencyServiceImpl.java @@ -1,7 +1,6 @@ package com.epmet.datareport.service.evaluationindex.screen.impl; import com.epmet.commons.dynamic.datasource.annotation.DataSource; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.exception.RenException; import com.epmet.constant.DataSourceConstant; @@ -43,9 +42,8 @@ public class AgencyServiceImpl implements AgencyService { */ @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) @Override - public TreeResultDTO tree(ExternalAppRequestParam externalAppRequestParam) { + public TreeResultDTO tree(String customerId) { // 1. 查询客户根组织ID - String customerId = externalAppRequestParam.getCustomerId(); TreeResultDTO rootAgency = null; try { diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/KcScreenServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/KcScreenServiceImpl.java index b82d6b654f..6a84e531d7 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/KcScreenServiceImpl.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/KcScreenServiceImpl.java @@ -1,7 +1,6 @@ package com.epmet.datareport.service.evaluationindex.screen.impl; import com.epmet.commons.dynamic.datasource.annotation.DataSource; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.constant.DataSourceConstant; import com.epmet.datareport.dao.evaluationindex.screen.ScreenPartyUserRankDataDao; @@ -99,37 +98,34 @@ public class KcScreenServiceImpl implements KcScreenService { private ScreenKcNewsRankDao screenKcNewsRankDao; /** - * @param externalAppRequestParam * @Description 首页-平台各类总数 * @author sun */ @Override - public HomepageSummaryResultDTO homepageSummary(ExternalAppRequestParam externalAppRequestParam) { - return screenKcPlatformSummaryDailyDao.selectSummaryDaily(externalAppRequestParam.getCustomerId()); + public HomepageSummaryResultDTO homepageSummary(String customerId) { + return screenKcPlatformSummaryDailyDao.selectSummaryDaily(customerId); } /** - * @param externalAppRequestParam * @Description 公益互助-各类总数汇总 * @author sun */ @Override - public HeartSummaryResultDTO heartSummary(ExternalAppRequestParam externalAppRequestParam) { - return screenKcActSummaryDailyDao.selectHeartSummary(externalAppRequestParam.getCustomerId()); + public HeartSummaryResultDTO heartSummary(String customerId) { + return screenKcActSummaryDailyDao.selectHeartSummary(customerId); } /** - * @param externalAppRequestParam * @Description 公益互助-公益活动次数 * @author sun */ @Override - public HeartActcounttrendResultDTO heartActcounttrend(ExternalAppRequestParam externalAppRequestParam) { + public HeartActcounttrendResultDTO heartActcounttrend(String customerId) { HeartActcounttrendResultDTO resultDTO = new HeartActcounttrendResultDTO(); LinkedList xAxis = new LinkedList<>(); LinkedList actCountDataList = new LinkedList<>(); //1.按客户查询最近十二个月数据 - List list = screenKcActTrendMonthlyDao.selectActTrendMonthly(externalAppRequestParam.getCustomerId()); + List list = screenKcActTrendMonthlyDao.selectActTrendMonthly(customerId); //2.倒序遍历封装数据 for (int i = list.size() - 1; i >= 0; i--) { xAxis.add(list.get(i).getMonthId()); @@ -142,16 +138,15 @@ public class KcScreenServiceImpl implements KcScreenService { } /** - * @param externalAppRequestParam * @Description 公益互助-志愿者画像 * @author sun */ @Override - public HeartVolunteerportrayalResultDTO heartVolunteerportrayal(ExternalAppRequestParam externalAppRequestParam) { + public HeartVolunteerportrayalResultDTO heartVolunteerportrayal(String customerId) { HeartVolunteerportrayalResultDTO resultDTO = new HeartVolunteerportrayalResultDTO(); GenderDistributionResultDTO genderDistribution = new GenderDistributionResultDTO(); //1.根据客户Id查询最近日期志愿者统计数据 - AgeDistributionResultDTO ageDistribution = screenKcVolunteerSummaryDailyDao.selectVolunteerSummaryDaily(externalAppRequestParam.getCustomerId()); + AgeDistributionResultDTO ageDistribution = screenKcVolunteerSummaryDailyDao.selectVolunteerSummaryDaily(customerId); //2.封装数据并返回 if (null == ageDistribution) { resultDTO.setAgeDistribution(new AgeDistributionResultDTO()); @@ -219,14 +214,13 @@ public class KcScreenServiceImpl implements KcScreenService { } /** - * @param externalAppRequestParam * @Description 邻里党群-各类总数 * @author sun */ @Override - public GroupSummaryResultDTO groupSummary(ExternalAppRequestParam externalAppRequestParam) { + public GroupSummaryResultDTO groupSummary(String customerId) { //1.按客户查询最近一天各网格各项数据的汇总值 - GroupSummaryResultDTO resultDTO = screenKcGroupSummaryGridDailyDao.selectGroupSummaryDaily(externalAppRequestParam.getCustomerId()); + GroupSummaryResultDTO resultDTO = screenKcGroupSummaryGridDailyDao.selectGroupSummaryDaily(customerId); if (null == resultDTO) { return new GroupSummaryResultDTO(); } @@ -246,17 +240,16 @@ public class KcScreenServiceImpl implements KcScreenService { } /** - * @param externalAppRequestParam * @Description 邻里党群-话题参与趋势 * @author sun */ @Override - public GroupPartitopictrendResultDTO groupPartitopictrend(ExternalAppRequestParam externalAppRequestParam) { + public GroupPartitopictrendResultDTO groupPartitopictrend(String customerId) { GroupPartitopictrendResultDTO resultDTO = new GroupPartitopictrendResultDTO(); LinkedList xAxis = new LinkedList<>(); LinkedList actCountDataList = new LinkedList<>(); //1.按客户查询最近十二个月所有网格汇总数据 - List list = screenKcTopicTrendGridMonthlyDao.selectActTrendMonthly(externalAppRequestParam.getCustomerId()); + List list = screenKcTopicTrendGridMonthlyDao.selectActTrendMonthly(customerId); //2.倒序遍历封装数据 for (int i = list.size() - 1; i >= 0; i--) { xAxis.add(list.get(i).getMonthId()); @@ -269,17 +262,16 @@ public class KcScreenServiceImpl implements KcScreenService { } /** - * @param externalAppRequestParam * @Description 邻里党群-社群数量排名 * @author sun */ @Override - public GroupGridgroupcountrankResultDTO groupGridgroupcountrank(ExternalAppRequestParam externalAppRequestParam) { + public GroupGridgroupcountrankResultDTO groupGridgroupcountrank(String customerId) { GroupGridgroupcountrankResultDTO resultDTO = new GroupGridgroupcountrankResultDTO(); LinkedList gridNameDataList = new LinkedList<>(); LinkedList groupCountDataList = new LinkedList<>(); //1.按日期降序,查询客户最近一天所有网格数据,按每个网格的社区总数降序排列 - LinkedList list = screenKcGroupSummaryGridDailyDao.selectGridDailyList(externalAppRequestParam.getCustomerId()); + LinkedList list = screenKcGroupSummaryGridDailyDao.selectGridDailyList(customerId); //2.封装数据 list.forEach(l -> { gridNameDataList.add(l.getGridName()); From 5e129bc5faa836183ca39131e49981991f9b4e2b Mon Sep 17 00:00:00 2001 From: wxz Date: Fri, 25 Sep 2020 15:32:07 +0800 Subject: [PATCH 09/20] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E9=89=B4=E6=9D=83=E4=BE=9D=E8=B5=96=EF=BC=8C?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E7=9B=B8=E5=85=B3=E6=B3=A8=E8=A7=A3=E5=92=8C?= =?UTF-8?q?=E7=B1=BB=E7=9A=84=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-statistical-server/pom.xml | 2 +- .../FactIndexCollectController.java | 55 ++---- .../controller/IndexCalculateController.java | 12 +- .../controller/KcScreenCollController.java | 159 +++++++++--------- .../ShiBeiScreenCollController.java | 108 ++++-------- 5 files changed, 132 insertions(+), 204 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/pom.xml b/epmet-module/data-statistical/data-statistical-server/pom.xml index e40e69ed9f..ee196b5cbf 100644 --- a/epmet-module/data-statistical/data-statistical-server/pom.xml +++ b/epmet-module/data-statistical/data-statistical-server/pom.xml @@ -70,7 +70,7 @@ com.epmet - epmet-commons-extapp-auth + common-service-client 2.0.0 compile diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/FactIndexCollectController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/FactIndexCollectController.java index 0a8740c63b..77f2ce51ec 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/FactIndexCollectController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/FactIndexCollectController.java @@ -1,15 +1,10 @@ package com.epmet.controller; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.indexcollect.form.*; import com.epmet.service.evaluationindex.indexcoll.FactIndexCollectService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * 指标采集相关api @@ -27,128 +22,112 @@ public class FactIndexCollectController { /** * 1、党建能力-党员相关指标上报(按照月份) * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-20 **/ - @ExternalAppRequestAuth @PostMapping("gridpartymemberdata") - public Result gridPartyMemberData(ExternalAppRequestParam externalAppRequestParam, @RequestBody GridPartyMemberDataFormDTO formDTO) { - factIndexCollectService.insertGridPartyMemberData(formDTO,externalAppRequestParam.getCustomerId() ); + public Result gridPartyMemberData(@RequestHeader("CustomerId") String customerId, @RequestBody GridPartyMemberDataFormDTO formDTO) { + factIndexCollectService.insertGridPartyMemberData(formDTO, customerId); return new Result(); } /** * 2、党建能力-网格相关指标上报(按照月份) * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-20 **/ - @ExternalAppRequestAuth @PostMapping("gridpartyability") - public Result gridPartyAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody GridPartyAbilityDataFormDTO formDTO) { - factIndexCollectService.insertGridPartyAbility(formDTO, externalAppRequestParam.getCustomerId()); + public Result gridPartyAbility(@RequestHeader("CustomerId") String customerId, @RequestBody GridPartyAbilityDataFormDTO formDTO) { + factIndexCollectService.insertGridPartyAbility(formDTO, customerId); return new Result(); } /** * 3、党建能力-街道及社区相关指标 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-20 **/ - @ExternalAppRequestAuth @PostMapping("orgpartyability") - public Result orgPartyAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody OrgPartyAbilityDataFormDTO formDTO) { - factIndexCollectService.insertOrgPartyAbility(formDTO, externalAppRequestParam.getCustomerId()); + public Result orgPartyAbility(@RequestHeader("CustomerId") String customerId, @RequestBody OrgPartyAbilityDataFormDTO formDTO) { + factIndexCollectService.insertOrgPartyAbility(formDTO, customerId); return new Result(); } /** * 4、服务能力-网格相关指标 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-20 **/ - @ExternalAppRequestAuth @PostMapping("gridserviceability") - public Result gridServiceAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody GridServiceAbilityDataFormDTO formDTO) { - factIndexCollectService.insertGridServiceAbility(formDTO, externalAppRequestParam.getCustomerId()); + public Result gridServiceAbility(@RequestHeader("CustomerId") String customerId, @RequestBody GridServiceAbilityDataFormDTO formDTO) { + factIndexCollectService.insertGridServiceAbility(formDTO, customerId); return new Result(); } /** * 5、服务能力-组织(街道|社区|全区)相关指标 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-20 **/ - @ExternalAppRequestAuth @PostMapping("orgserviceability") - public Result orgServiceAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody OrgServiceAbilityDataFormDTO formDTO) { - factIndexCollectService.insertOrgServiceAbility(formDTO, externalAppRequestParam.getCustomerId()); + public Result orgServiceAbility(@RequestHeader("CustomerId") String customerId, @RequestBody OrgServiceAbilityDataFormDTO formDTO) { + factIndexCollectService.insertOrgServiceAbility(formDTO, customerId); return new Result(); } /** * 6、治理能力-网格相关指标 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-20 **/ - @ExternalAppRequestAuth @PostMapping("gridgovrnability") - public Result gridGovrnAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody GridGovrnAbilityDataFormDTO formDTO) { - factIndexCollectService.insertGridGovrnAbility(formDTO, externalAppRequestParam.getCustomerId()); + public Result gridGovrnAbility(@RequestHeader("CustomerId") String customerId, @RequestBody GridGovrnAbilityDataFormDTO formDTO) { + factIndexCollectService.insertGridGovrnAbility(formDTO, customerId); return new Result(); } /** * 7、治理能力-街道及社区相关指标 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-20 **/ - @ExternalAppRequestAuth @PostMapping("orggovrnability") - public Result orgGovrnAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody OrgGovrnAbilityDataFormDTO formDTO) { - factIndexCollectService.insertOrgGovrnAbility(formDTO, externalAppRequestParam.getCustomerId()); + public Result orgGovrnAbility(@RequestHeader("CustomerId") String customerId, @RequestBody OrgGovrnAbilityDataFormDTO formDTO) { + factIndexCollectService.insertOrgGovrnAbility(formDTO, customerId); return new Result(); } /** * 8、治理能力-部门相关指标 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-20 **/ - @ExternalAppRequestAuth @PostMapping("deptgovrnability") - public Result deptGovrnAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody DeptGovrnAbilityDataFormDTO formDTO) { - factIndexCollectService.insertDeptGovrnAbility(formDTO, externalAppRequestParam.getCustomerId()); + public Result deptGovrnAbility(@RequestHeader("CustomerId") String customerId, @RequestBody DeptGovrnAbilityDataFormDTO formDTO) { + factIndexCollectService.insertDeptGovrnAbility(formDTO, customerId); return new Result(); } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/IndexCalculateController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/IndexCalculateController.java index c6e24b6893..ae50deb189 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/IndexCalculateController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/IndexCalculateController.java @@ -1,7 +1,5 @@ package com.epmet.controller; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.commons.tools.enums.EnvEnum; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.redis.RedisKeys; @@ -20,10 +18,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.PreDestroy; import java.util.Date; @@ -103,11 +98,8 @@ public class IndexCalculateController { * @Author zhangyongç * @Date 10:52 2020-08-20 **/ - @ExternalAppRequestAuth @PostMapping("all") - public Result indexCalculate(ExternalAppRequestParam externalAppRequestParam, @RequestBody CalculateCommonFormDTO formDTO) { - String customerId = externalAppRequestParam.getCustomerId(); - //String customerId = "epmettest"; + public Result indexCalculate(@RequestHeader("CustomerId") String customerId, @RequestBody CalculateCommonFormDTO formDTO) { formDTO.setCustomerId(customerId); indexCalculate(formDTO); return new Result().ok(true); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/KcScreenCollController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/KcScreenCollController.java index 09d06df653..b64d7855a0 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/KcScreenCollController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/KcScreenCollController.java @@ -1,16 +1,11 @@ package com.epmet.controller; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.screencoll.ScreenCollFormDTO; import com.epmet.dto.screencoll.form.*; import com.epmet.service.evaluationindex.screen.KcScreenCollService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * 孔村大屏数据采集api @@ -31,16 +26,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_platform_summary_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("homepage/platformsummary") - public Result platFormSummary(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertPlatFormSummary(formDTO, externalAppRequestParam.getCustomerId()); + public Result platFormSummary(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertPlatFormSummary(formDTO, customerId); return new Result(); } @@ -50,16 +45,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_issue_summary_grid_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("issue/summary") - public Result issueSummary(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertIssueSummary(formDTO, externalAppRequestParam.getCustomerId()); + public Result issueSummary(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertIssueSummary(formDTO, customerId); return new Result(); } @@ -69,16 +64,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table: screen_kc_issue_trend_grid_monthly * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("issue/trend") - public Result issueTrend(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertIssueTrend(formDTO, externalAppRequestParam.getCustomerId()); + public Result issueTrend(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertIssueTrend(formDTO, customerId); return new Result(); } @@ -88,16 +83,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_user_summary_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("user/summary") - public Result userSummary(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertUserSummary(formDTO, externalAppRequestParam.getCustomerId()); + public Result userSummary(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertUserSummary(formDTO, customerId); return new Result(); } @@ -107,16 +102,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_volunteer_heat_rank_grid_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("volunteer/heartrank") - public Result volunteerHeartRank(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertVolunteerHeartRank(formDTO, externalAppRequestParam.getCustomerId()); + public Result volunteerHeartRank(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertVolunteerHeartRank(formDTO, customerId); return new Result(); } @@ -126,16 +121,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_user_trend_grid_monthly * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("user/userheartrank") - public Result userHeartRank(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertUserHeartRank(formDTO, externalAppRequestParam.getCustomerId()); + public Result userHeartRank(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertUserHeartRank(formDTO, customerId); return new Result(); } @@ -145,16 +140,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_act_summary_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("act/summary") - public Result actSummary(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertActSummary(formDTO, externalAppRequestParam.getCustomerId()); + public Result actSummary(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertActSummary(formDTO, customerId); return new Result(); } @@ -164,16 +159,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_act_trend_monthly * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("act/trend") - public Result actTrend(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertActTrend(formDTO, externalAppRequestParam.getCustomerId()); + public Result actTrend(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertActTrend(formDTO, customerId); return new Result(); } @@ -183,16 +178,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_volunteer_summary_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("act/volunteersummary") - public Result volunteerSummary(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertVolunteerSummary(formDTO, externalAppRequestParam.getCustomerId()); + public Result volunteerSummary(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertVolunteerSummary(formDTO, customerId); return new Result(); } @@ -202,16 +197,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_project_summary_grid_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("project/summary") - public Result projectSummary(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertProjectSummary(formDTO, externalAppRequestParam.getCustomerId()); + public Result projectSummary(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertProjectSummary(formDTO, customerId); return new Result(); } @@ -221,16 +216,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_project_category_grid_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("project/categorysummary") - public Result categorySummary(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertCategorySummary(formDTO, externalAppRequestParam.getCustomerId()); + public Result categorySummary(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertCategorySummary(formDTO, customerId); return new Result(); } @@ -240,16 +235,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_project_satis_grid_monthly * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("project/satisanalysis") - public Result projectSatisanalysis(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertProjectSatisanalysis(formDTO, externalAppRequestParam.getCustomerId()); + public Result projectSatisanalysis(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertProjectSatisanalysis(formDTO, customerId); return new Result(); } @@ -259,16 +254,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_news_summary_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("news/summary") - public Result newsSummary(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertNewsSummary(formDTO, externalAppRequestParam.getCustomerId()); + public Result newsSummary(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertNewsSummary(formDTO, customerId); return new Result(); } @@ -278,16 +273,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_news_trend_monthly * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("news/trend") - public Result newsTrend(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertNewsTrend(formDTO, externalAppRequestParam.getCustomerId()); + public Result newsTrend(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertNewsTrend(formDTO, customerId); return new Result(); } @@ -297,16 +292,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_news_rank * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("news/hotrank") - public Result newsHotRank(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertNewsHotRank(formDTO, externalAppRequestParam.getCustomerId()); + public Result newsHotRank(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertNewsHotRank(formDTO, customerId); return new Result(); } @@ -316,16 +311,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_news_category_analysis * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("news/categoryanalysis") - public Result newsCategoryAnalysis(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertNewsCategoryAnalysis(formDTO, externalAppRequestParam.getCustomerId()); + public Result newsCategoryAnalysis(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertNewsCategoryAnalysis(formDTO, customerId); return new Result(); } @@ -335,16 +330,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_group_summary_grid_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("group/summary") - public Result groupSummary(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertGroupSummary(formDTO, externalAppRequestParam.getCustomerId()); + public Result groupSummary(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertGroupSummary(formDTO, customerId); return new Result(); } @@ -354,16 +349,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_group_detail_grid_daily * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("group/detail") - public Result groupDetail(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertGroupDetail(formDTO, externalAppRequestParam.getCustomerId()); + public Result groupDetail(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertGroupDetail(formDTO, customerId); return new Result(); } @@ -373,16 +368,16 @@ public class KcScreenCollController { * 所以如果项目上是分批上传,第一次为isFirst=true,后面isFirst应为false * table:screen_kc_topic_trend_grid_monthly * - * @param externalAppRequestParam + * * @param formDTO * @return void * @Author zhangyong * @Date 15:57 2020-09-09 **/ - @ExternalAppRequestAuth + @PostMapping("group/topictrend") - public Result groupTopicTrend(ExternalAppRequestParam externalAppRequestParam, @RequestBody ScreenCollFormDTO formDTO) { - kcScreenCollService.insertGroupTopicTrend(formDTO, externalAppRequestParam.getCustomerId()); + public Result groupTopicTrend(@RequestHeader("CustomerId") String customerId, @RequestBody ScreenCollFormDTO formDTO) { + kcScreenCollService.insertGroupTopicTrend(formDTO, customerId); return new Result(); } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/ShiBeiScreenCollController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/ShiBeiScreenCollController.java index 73d6db7bb6..a55567eb45 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/ShiBeiScreenCollController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/ShiBeiScreenCollController.java @@ -1,15 +1,10 @@ package com.epmet.controller; -import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; -import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.screencoll.form.*; import com.epmet.service.evaluationindex.screen.ShiBeiScreenCollService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** @@ -28,144 +23,126 @@ public class ShiBeiScreenCollController { /** * 9、党建引领|基层治理-居民(党员)积分排行榜 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("partyuserrankdata") - public Result partyUserRankData(ExternalAppRequestParam externalAppRequestParam, @RequestBody PartyUserRankDataListFormDTO formDTO) { - shiBeiScreenCollService.insertPartyUserRankData(formDTO, externalAppRequestParam.getCustomerId()); + public Result partyUserRankData(@RequestHeader("CustomerId") String customerId, @RequestBody PartyUserRankDataListFormDTO formDTO) { + shiBeiScreenCollService.insertPartyUserRankData(formDTO, customerId); return new Result(); } /** * 8、党建引领-党员联系群众数据 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("partylinkmassesdata") - public Result partyLinkMassesData(ExternalAppRequestParam externalAppRequestParam, @RequestBody PartyLinkMassesDataListFormDTO formDTO) { - shiBeiScreenCollService.insertPartyLinkMassesData(formDTO, externalAppRequestParam.getCustomerId()); + public Result partyLinkMassesData(@RequestHeader("CustomerId") String customerId, @RequestBody PartyLinkMassesDataListFormDTO formDTO) { + shiBeiScreenCollService.insertPartyLinkMassesData(formDTO, customerId); return new Result(); } /** * 7、基层党建-建设情况数据(支部、联建、志愿) * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("meetdata") - public Result meetData(ExternalAppRequestParam externalAppRequestParam, @RequestBody PartyBranchDataListFormDTO formDTO) { - shiBeiScreenCollService.insertPartyBranchData(formDTO, externalAppRequestParam.getCustomerId()); + public Result meetData(@RequestHeader("CustomerId") String customerId, @RequestBody PartyBranchDataListFormDTO formDTO) { + shiBeiScreenCollService.insertPartyBranchData(formDTO, customerId); return new Result(); } /** * 6、党建引领-组织排行 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("orgrankdata") - public Result orgRankData(ExternalAppRequestParam externalAppRequestParam, @RequestBody OrgRankDataListFormDTO formDTO) { - shiBeiScreenCollService.insertOrgRankData(formDTO, externalAppRequestParam.getCustomerId()); + public Result orgRankData(@RequestHeader("CustomerId") String customerId, @RequestBody OrgRankDataListFormDTO formDTO) { + shiBeiScreenCollService.insertOrgRankData(formDTO, customerId); return new Result(); } /** * 5、基层治理-治理能力数据 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("governrankdata") - public Result governRankData(ExternalAppRequestParam externalAppRequestParam, @RequestBody GovernRankDataListFormDTO formDTO) { - shiBeiScreenCollService.insertGovernRankData(formDTO, externalAppRequestParam.getCustomerId()); + public Result governRankData(@RequestHeader("CustomerId") String customerId, @RequestBody GovernRankDataListFormDTO formDTO) { + shiBeiScreenCollService.insertGovernRankData(formDTO, customerId); return new Result(); } /** * 4、事件数据 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("eventdata") - public Result eventData(ExternalAppRequestParam externalAppRequestParam, @RequestBody EventDataListFormDTO formDTO) { - shiBeiScreenCollService.insertEventData(formDTO, externalAppRequestParam.getCustomerId()); + public Result eventData(@RequestHeader("CustomerId") String customerId, @RequestBody EventDataListFormDTO formDTO) { + shiBeiScreenCollService.insertEventData(formDTO, customerId); return new Result(); } /** * 3、难点赌点 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("difficultydata") - public Result difficultyData(ExternalAppRequestParam externalAppRequestParam, @RequestBody DifficultyDataFormDTO formDTO) { - shiBeiScreenCollService.insertDifficultyData(formDTO, externalAppRequestParam.getCustomerId()); + public Result difficultyData(@RequestHeader("CustomerId") String customerId, @RequestBody DifficultyDataFormDTO formDTO) { + shiBeiScreenCollService.insertDifficultyData(formDTO, customerId); return new Result(); } /** * 2、党员基本情况 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("cpcbasedata") - public Result cpcbaseData(ExternalAppRequestParam externalAppRequestParam, @RequestBody CpcBaseDataListFormDTO formDTO) { - shiBeiScreenCollService.insertCpcbaseData(formDTO, externalAppRequestParam.getCustomerId()); + public Result cpcbaseData(@RequestHeader("CustomerId") String customerId, @RequestBody CpcBaseDataListFormDTO formDTO) { + shiBeiScreenCollService.insertCpcbaseData(formDTO, customerId); return new Result(); } /** * 1、指数_按月统计 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("indexdatamonthly") - public Result indexDataMonthly(ExternalAppRequestParam externalAppRequestParam, @RequestBody IndexDataListMonthlyFormDTO formDTO) { - shiBeiScreenCollService.insertIndexDataMonthly(formDTO, externalAppRequestParam.getCustomerId()); + public Result indexDataMonthly(@RequestHeader("CustomerId") String customerId, @RequestBody IndexDataListMonthlyFormDTO formDTO) { + shiBeiScreenCollService.insertIndexDataMonthly(formDTO, customerId); return new Result(); } @@ -174,112 +151,98 @@ public class ShiBeiScreenCollController { /** * 17、指数_按年统计 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("indexdatayearly") - public Result indexDataYearly(ExternalAppRequestParam externalAppRequestParam, @RequestBody IndexDataListYearlyFormDTO formDTO) { - shiBeiScreenCollService.insertIndexDataYearly(formDTO, externalAppRequestParam.getCustomerId()); + public Result indexDataYearly(@RequestHeader("CustomerId") String customerId, @RequestBody IndexDataListYearlyFormDTO formDTO) { + shiBeiScreenCollService.insertIndexDataYearly(formDTO, customerId); return new Result(); } /** * 16、部门信息上传 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("customerdept") - public Result customerDept(ExternalAppRequestParam externalAppRequestParam, @RequestBody CustomerDeptListFormDTO formDTO) { - shiBeiScreenCollService.insertCustomerDept(formDTO, externalAppRequestParam.getCustomerId()); + public Result customerDept(@RequestHeader("CustomerId") String customerId, @RequestBody CustomerDeptListFormDTO formDTO) { + shiBeiScreenCollService.insertCustomerDept(formDTO, customerId); return new Result(); } /** * 15、网格信息上传 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("customergrid") - public Result customerGrid(ExternalAppRequestParam externalAppRequestParam, @RequestBody CustomerGridListFormDTO formDTO) { - shiBeiScreenCollService.insertCustomerGrid(formDTO, externalAppRequestParam.getCustomerId()); + public Result customerGrid(@RequestHeader("CustomerId") String customerId, @RequestBody CustomerGridListFormDTO formDTO) { + shiBeiScreenCollService.insertCustomerGrid(formDTO, customerId); return new Result(); } /** * 14、组织层级 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("customeragency") - public Result customerAgency(ExternalAppRequestParam externalAppRequestParam, @RequestBody CustomerAgencyListFormDTO formDTO) { - shiBeiScreenCollService.insertCustomerAgency(formDTO, externalAppRequestParam.getCustomerId()); + public Result customerAgency(@RequestHeader("CustomerId") String customerId, @RequestBody CustomerAgencyListFormDTO formDTO) { + shiBeiScreenCollService.insertCustomerAgency(formDTO, customerId); return new Result(); } /** * 12、中央区各类总数 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("usertotaldata") - public Result userTotalData(ExternalAppRequestParam externalAppRequestParam, @RequestBody UserTotalDataListFormDTO formDTO) { - shiBeiScreenCollService.insertUserTotalData(formDTO, externalAppRequestParam.getCustomerId()); + public Result userTotalData(@RequestHeader("CustomerId") String customerId, @RequestBody UserTotalDataListFormDTO formDTO) { + shiBeiScreenCollService.insertUserTotalData(formDTO, customerId); return new Result(); } /** * 11、基层治理-公众参与 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("userjoin") - public Result userJoin(ExternalAppRequestParam externalAppRequestParam, @RequestBody UserJoinListFormDTO formDTO) { - shiBeiScreenCollService.insertUserJoin(formDTO, externalAppRequestParam.getCustomerId()); + public Result userJoin(@RequestHeader("CustomerId") String customerId, @RequestBody UserJoinListFormDTO formDTO) { + shiBeiScreenCollService.insertUserJoin(formDTO, customerId); return new Result(); } /** * 10、党建引领-先锋模范数据 * - * @param externalAppRequestParam * @param formDTO * @return com.epmet.commons.tools.utils.Result * @Author zhangyong * @Date 10:52 2020-08-18 **/ - @ExternalAppRequestAuth @PostMapping("pioneerdata") - public Result pioneerData(ExternalAppRequestParam externalAppRequestParam, @RequestBody PioneerDataListFormDTO formDTO) { - shiBeiScreenCollService.insertPioneerData(formDTO, externalAppRequestParam.getCustomerId()); + public Result pioneerData(@RequestHeader("CustomerId") String customerId, @RequestBody PioneerDataListFormDTO formDTO) { + shiBeiScreenCollService.insertPioneerData(formDTO, customerId); return new Result(); } @@ -293,10 +256,9 @@ public class ShiBeiScreenCollController { * @Author zhangyong * @Date 09:44 2020-08-25 **/ - @ExternalAppRequestAuth @PostMapping("publicpartitotaldata") - public Result publicPartiTotalData(ExternalAppRequestParam externalAppRequestParam, @RequestBody PublicPartiTotalDataListFormDTO formDTO) { - shiBeiScreenCollService.insertPublicPartiTotalData(formDTO, externalAppRequestParam.getCustomerId()); + public Result publicPartiTotalData(@RequestHeader("CustomerId") String customerId, @RequestBody PublicPartiTotalDataListFormDTO formDTO) { + shiBeiScreenCollService.insertPublicPartiTotalData(formDTO, customerId); return new Result(); } } From d5d54899068f31f5fa6fe4b298abc5067985a02c Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Fri, 25 Sep 2020 15:41:35 +0800 Subject: [PATCH 10/20] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=94=B9=E7=89=88-?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=87=AA=E6=B5=8B=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/dto/form/IndexScoreFormDTO.java | 34 ++++++++++++ .../dto/result/IndexScoreResultDTO.java | 55 +++++++++++++++++++ .../controller/screen/IndexController.java | 14 +++++ .../screen/ScreenIndexDataMonthlyDao.java | 12 ++-- .../evaluationindex/screen/IndexService.java | 7 +++ .../screen/impl/IndexServiceImpl.java | 32 +++++++++++ .../screen/ScreenIndexDataMonthlyDao.xml | 19 +++++++ .../screen/ScreenPartyUserRankDataDao.xml | 12 ++-- 8 files changed, 175 insertions(+), 10 deletions(-) create mode 100644 epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/IndexScoreFormDTO.java create mode 100644 epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/IndexScoreResultDTO.java diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/IndexScoreFormDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/IndexScoreFormDTO.java new file mode 100644 index 0000000000..70a7b6d36b --- /dev/null +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/IndexScoreFormDTO.java @@ -0,0 +1,34 @@ +package com.epmet.evaluationindex.screen.dto.form; + + +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 组织月度指数得分--接口入参 + * @Author sun + */ +@Data +public class IndexScoreFormDTO implements Serializable { + private static final long serialVersionUID = -2880432640584616651L; + /** + * 组织或网格Id + */ + @NotBlank(message = "组织或网格ID不能为空",groups = {IndexScoreFormDTO.AddUserInternalGroup.class}) + private String orgId; + /** + * 类型(组织:agency 网格:grid) + */ + @NotBlank(message = "数据类型不能为空",groups = {IndexScoreFormDTO.AddUserInternalGroup.class}) + private String orgType; + /** + * 月份Id eg:202009 + */ + @NotBlank(message = "月份Id不能为空",groups = {IndexScoreFormDTO.AddUserInternalGroup.class}) + private String monthId; + public interface AddUserInternalGroup {} + +} diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/IndexScoreResultDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/IndexScoreResultDTO.java new file mode 100644 index 0000000000..33ffff9c5d --- /dev/null +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/result/IndexScoreResultDTO.java @@ -0,0 +1,55 @@ +package com.epmet.evaluationindex.screen.dto.result; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 组织月度指数得分--接口返参 + * @Author sun + */ +@Data +public class IndexScoreResultDTO implements Serializable { + + private static final long serialVersionUID = 3860268744336541373L; + + /** + * 年度平均指数(保留一位小数) + */ + @JsonIgnore + private String total; + private BigDecimal totalScore; + /** + * 党建能力(保留一位小数) + */ + @JsonIgnore + private String party; + private BigDecimal partyDevAbility; + /** + * 党建能力权重(保留一位小数) + */ + private String partyDevAbilityWeight; + /** + * 治理能力(保留一位小数) + */ + @JsonIgnore + private String govern; + private BigDecimal governAbility; + /** + * 治理能力权重(保留一位小数) + */ + private String governAbilityWeight; + /** + * 服务能力(保留一位小数) + */ + @JsonIgnore + private String service; + private BigDecimal serviceAbility; + /** + * 服务能力权重(保留一位小数) + */ + private String serviceAbilityWeight; + +} diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java index d3ece6a658..98e2207514 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/controller/screen/IndexController.java @@ -1,5 +1,7 @@ package com.epmet.datareport.controller.screen; +import com.epmet.commons.tools.annotation.LoginUser; +import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.datareport.eum.OrgTypeEnum; @@ -100,4 +102,16 @@ public class IndexController { return new Result>().ok(indexService.selectIndexRankByOrgType(formDTO)); } + /** + * @param tokenDTO + * @Description 组织月度指数得分 + * @author sun + */ + @PostMapping("month/indexscore") + public Result indexScore(@LoginUser TokenDto tokenDTO, @RequestBody IndexScoreFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, IndexScoreFormDTO.AddUserInternalGroup.class); + return new Result().ok(indexService.indexScore(formDTO)); + } + + } diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataMonthlyDao.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataMonthlyDao.java index 9025780837..c042885cc6 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataMonthlyDao.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataMonthlyDao.java @@ -17,10 +17,7 @@ package com.epmet.datareport.dao.evaluationindex.screen; -import com.epmet.evaluationindex.screen.dto.form.GridIndexRankFormDTO; -import com.epmet.evaluationindex.screen.dto.form.PeerComparisonFormDTO; -import com.epmet.evaluationindex.screen.dto.form.SubAgencyIndexRankFormDTO; -import com.epmet.evaluationindex.screen.dto.form.SubAgencyIndexRankYMFormDTO; +import com.epmet.evaluationindex.screen.dto.form.*; import com.epmet.evaluationindex.screen.dto.result.*; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -84,4 +81,11 @@ public interface ScreenIndexDataMonthlyDao{ * @author sun */ List selectScoreList(PeerComparisonFormDTO formDTO); + + /** + * @param formDTO + * @Description 根据组织或网格Id以及月份Id查询各项月度指数得分 + * @author sun + */ + IndexScoreResultDTO selectMonthData(IndexScoreFormDTO formDTO); } diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/IndexService.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/IndexService.java index 21b6bd2554..a577e666a6 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/IndexService.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/IndexService.java @@ -62,4 +62,11 @@ public interface IndexService { * @return */ List selectIndexRankByOrgType(GridIndexRankFormDTO formDTO); + + /** + * @param formDTO + * @Description 组织月度指数得分 + * @author sun + */ + IndexScoreResultDTO indexScore(IndexScoreFormDTO formDTO); } diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/IndexServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/IndexServiceImpl.java index 087034645d..93276c8725 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/IndexServiceImpl.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/IndexServiceImpl.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; +import java.text.NumberFormat; import java.time.LocalDate; import java.util.ArrayList; import java.util.Comparator; @@ -258,4 +259,35 @@ public class IndexServiceImpl implements IndexService { BigDecimal b = bigDecimal.setScale(NumConstant.ONE, BigDecimal.ROUND_HALF_UP); return Double.valueOf(b.toString()); } + + /** + * @param formDTO + * @Description 组织月度指数得分 + * @author sun + */ + @Override + public IndexScoreResultDTO indexScore(IndexScoreFormDTO formDTO) { + //screen_index_data_monthly 根据组织id和月份获取月度指标得分 + //1.根据组织或网格Id以及月份Id查询各项月度指数得分 + IndexScoreResultDTO resultDTO = screenIndexDataMonthlyDao.selectMonthData(formDTO); + + //2.将数据改成正确格式 四舍五入保留一位小数 权重转成百分比 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMaximumFractionDigits(1); + + BigDecimal num = new BigDecimal(resultDTO.getTotal()).setScale(1, BigDecimal.ROUND_HALF_UP).stripTrailingZeros(); + resultDTO.setTotalScore(num); + BigDecimal num1 = new BigDecimal(resultDTO.getParty()).setScale(1, BigDecimal.ROUND_HALF_UP).stripTrailingZeros(); + resultDTO.setPartyDevAbility(num1); + resultDTO.setPartyDevAbilityWeight(nf.format(Double.parseDouble(resultDTO.getPartyDevAbilityWeight()))); + BigDecimal num2 = new BigDecimal(resultDTO.getGovern()).setScale(1, BigDecimal.ROUND_HALF_UP).stripTrailingZeros(); + resultDTO.setGovernAbility(num2); + resultDTO.setGovernAbilityWeight(nf.format(Double.parseDouble(resultDTO.getGovernAbilityWeight()))); + BigDecimal num3 = new BigDecimal(resultDTO.getService()).setScale(1, BigDecimal.ROUND_HALF_UP).stripTrailingZeros(); + resultDTO.setServiceAbility(num3); + resultDTO.setServiceAbilityWeight(nf.format(Double.parseDouble(resultDTO.getServiceAbilityWeight()))); + + return resultDTO; + } + } diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataMonthlyDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataMonthlyDao.xml index f84ce8c28d..3f7bec2b57 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataMonthlyDao.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataMonthlyDao.xml @@ -165,4 +165,23 @@ LIMIT #{pageSize} + + + diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenPartyUserRankDataDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenPartyUserRankDataDao.xml index ff0ccf9630..b1c3cccd70 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenPartyUserRankDataDao.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenPartyUserRankDataDao.xml @@ -58,11 +58,11 @@ screen_party_user_rank_data WHERE del_flag = '0' - - + + AND org_id = #{orgId} - + AND grid_id = #{orgId} @@ -85,11 +85,11 @@ WHERE del_flag = '0' AND party_flag = '1' - - + + AND org_id = #{orgId} - + AND grid_id = #{orgId} From d904e52b3e7e82c8808a9a09bc6c24cb51ba01b0 Mon Sep 17 00:00:00 2001 From: zhaoqifeng Date: Fri, 25 Sep 2020 16:58:33 +0800 Subject: [PATCH 11/20] =?UTF-8?q?=E6=B2=BB=E7=90=86=E8=83=BD=E5=8A=9B?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/controller/DemoController.java | 11 ++ .../extract/FactOriginProjectLogDailyDao.java | 21 +++ .../FactOriginProjectMainDailyDao.java | 35 +++++ .../FactIndexGovrnAblityOrgMonthlyDao.java | 12 ++ .../screen/ScreenGovernRankDataDao.java | 15 +++ .../FactOriginProjectLogDailyService.java | 21 +++ .../FactOriginProjectMainDailyService.java | 31 +++++ .../FactOriginProjectLogDailyServiceImpl.java | 10 ++ ...FactOriginProjectMainDailyServiceImpl.java | 15 +++ .../GovernRankDataExtractServiceImpl.java | 124 ++++++++++++++++-- ...FactIndexGovrnAblityOrgMonthlyService.java | 11 ++ ...ndexGovrnAblityGridMonthlyServiceImpl.java | 5 + ...IndexGovrnAblityOrgMonthlyServiceImpl.java | 5 + .../screen/ScreenGovernRankDataService.java | 19 ++- .../impl/ScreenGovernRankDataServiceImpl.java | 26 ++++ .../extract/FactOriginProjectLogDailyDao.xml | 65 +++++++++ .../extract/FactOriginProjectMainDailyDao.xml | 104 +++++++++++++++ .../FactOriginProjectOrgPeriodDailyDao.xml | 5 +- .../FactIndexGovrnAblityOrgMonthlyDao.xml | 13 ++ .../screen/ScreenGovernRankDataDao.xml | 17 +++ 20 files changed, 553 insertions(+), 12 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java index 010b6ed47c..6139427c1d 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java @@ -35,6 +35,7 @@ import com.epmet.service.evaluationindex.extract.dataToIndex.IndexCollCommunityS import com.epmet.service.evaluationindex.extract.dataToIndex.IndexCollStreetService; import com.epmet.service.evaluationindex.extract.todata.FactOriginProjectLogDailyService; import com.epmet.service.evaluationindex.extract.todata.FactOriginTopicMainDailyService; +import com.epmet.service.evaluationindex.extract.toscreen.GovernRankDataExtractService; import com.epmet.service.evaluationindex.extract.toscreen.PartyBaseInfoService; import com.epmet.service.evaluationindex.extract.toscreen.ScreenCentralZoneDataAbsorptionService; import com.epmet.service.evaluationindex.extract.toscreen.PartyGuideService; @@ -105,6 +106,8 @@ public class DemoController { private IndexCollStreetService indexCollStreetService; @Autowired private ScreenCentralZoneDataAbsorptionService screenCentralZoneDataAbsorptionService; + @Autowired + private GovernRankDataExtractService governRankDataExtractService; @GetMapping("testAlarm") public void testAlarm() { @@ -662,4 +665,12 @@ public class DemoController { screenCentralZoneDataAbsorptionService.centralZoneDataHub(param); return new Result(); } + + @PostMapping("governRank") + public Result governRank(@RequestBody CustomerIdAndDateIdFormDTO formDTO){ + governRankDataExtractService.extractGridData(formDTO.getCustomerId(), formDTO.getDateId()); + governRankDataExtractService.extractCommunityData(formDTO.getCustomerId(), formDTO.getDateId()); + governRankDataExtractService.extractStreetData(formDTO.getCustomerId(), formDTO.getDateId()); + return new Result(); + } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectLogDailyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectLogDailyDao.java index d57370166e..422c9f83ea 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectLogDailyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectLogDailyDao.java @@ -115,4 +115,25 @@ public interface FactOriginProjectLogDailyDao extends BaseDao selectProjectParticipatedAgency(@Param("customerId") String customerId, @Param("dimId") String dimId, @Param("dateType")String dateType); + + /** + * 网格项目响应度 + * @author zhaoqifeng + * @date 2020/9/25 10:01 + * @param customerId + * @param monthId + * @return java.util.List + */ + List selectGridResponse(@Param("customerId") String customerId, @Param("monthId") String monthId); + + /** + * 组织项目响应度 + * @author zhaoqifeng + * @date 2020/9/25 10:01 + * @param customerId + * @param monthId + * @param level + * @return java.util.List + */ + List selectOrgResponse(@Param("customerId") String customerId, @Param("monthId") String monthId, @Param("level")String level); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectMainDailyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectMainDailyDao.java index 2b5c16dc5e..01bf423d48 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectMainDailyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginProjectMainDailyDao.java @@ -134,4 +134,39 @@ public interface FactOriginProjectMainDailyDao extends BaseDao + */ + List getSelfProject(@Param("customerId") String customerId, @Param("monthId")String monthId, + @Param("level") String level); + + + /** + * 组织解决项目数 + * @author zhaoqifeng + * @date 2020/9/25 15:16 + * @param customerId + * @param monthId + * @param level + * @return java.util.List + */ + List getResolveProject(@Param("customerId") String customerId, @Param("monthId")String monthId, + @Param("level") String level); + + /** + * 网格解决项目数 + * @author zhaoqifeng + * @date 2020/9/25 15:16 + * @param customerId + * @param monthId + * @return java.util.List + */ + List getGridResolveProject(@Param("customerId") String customerId, @Param("monthId")String monthId); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyDao.java index c3c85c1ffd..5d172d1e06 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyDao.java @@ -77,4 +77,16 @@ public interface FactIndexGovrnAblityOrgMonthlyDao extends BaseDao + */ + List selectOrgByCustomer(@Param("customerId") String customerId, @Param("monthId") String monthId, + @Param("type") String type); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenGovernRankDataDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenGovernRankDataDao.java index d40a702dbe..da8d5ea7ef 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenGovernRankDataDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenGovernRankDataDao.java @@ -75,4 +75,19 @@ public interface ScreenGovernRankDataDao extends BaseDao */ List initGridDataList(@Param("customerId") String customerId); + + + /** + * 删除旧数据 + * @author zhaoqifeng + * @date 2020/9/25 10:38 + * @param customerId + * @param orgType + * @param deleteSize + * @param orgIds + * @return java.lang.Integer + */ + Integer deleteRankData(@Param("customerId") String customerId, @Param("orgType") String orgType, @Param("monthId") String monthId, + @Param("deleteSize") Integer deleteSize, + @Param("orgIds")List orgIds); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginProjectLogDailyService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginProjectLogDailyService.java index d5364a836f..f95de230b7 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginProjectLogDailyService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginProjectLogDailyService.java @@ -197,4 +197,25 @@ public interface FactOriginProjectLogDailyService extends BaseService getAgencyWorkPieceRatio(String customerId, String dimId,String dateType); + /** + * 网格项目响应度 + * @author zhaoqifeng + * @date 2020/9/25 9:56 + * @param customerId + * @param monthId + * @return java.util.List + */ + List getGridResponse(String customerId, String monthId); + + /** + * 组织项目响应度 + * @author zhaoqifeng + * @date 2020/9/25 9:56 + * @param customerId + * @param monthId + * @param level + * @return java.util.List + */ + List getOrgResponse(String customerId, String monthId, String level); + } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginProjectMainDailyService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginProjectMainDailyService.java index 9440cf9bc8..bc061d6064 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginProjectMainDailyService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginProjectMainDailyService.java @@ -185,4 +185,35 @@ public interface FactOriginProjectMainDailyService extends BaseService + */ + List getSelfProject(String customerId, String monthId, String level); + /** + * 已解决项目数 + * @author zhaoqifeng + * @date 2020/9/25 15:34 + * @param customerId + * @param monthId + * @param level + * @return java.util.List + */ + List getResolveProject(String customerId, String monthId, String level); + + /** + * 网格已解决项目数 + * @author zhaoqifeng + * @date 2020/9/25 15:34 + * @param customerId + * @param monthId + * @return java.util.List + */ + List getGridResolveProject(String customerId, String monthId); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginProjectLogDailyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginProjectLogDailyServiceImpl.java index 4808614df1..f966247b6e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginProjectLogDailyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginProjectLogDailyServiceImpl.java @@ -267,5 +267,15 @@ public class FactOriginProjectLogDailyServiceImpl extends BaseServiceImpl getGridResponse(String customerId, String monthId) { + return baseDao.selectGridResponse(customerId, monthId); + } + + @Override + public List getOrgResponse(String customerId, String monthId, String level) { + return baseDao.selectOrgResponse(customerId, monthId, level); + } + } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginProjectMainDailyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginProjectMainDailyServiceImpl.java index 68bea2819d..6e8c7124e8 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginProjectMainDailyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginProjectMainDailyServiceImpl.java @@ -198,4 +198,19 @@ public class FactOriginProjectMainDailyServiceImpl extends BaseServiceImpl getSelfProject(String customerId, String monthId, String level) { + return baseDao.getSelfProject(customerId, monthId, level); + } + + @Override + public List getResolveProject(String customerId, String monthId, String level) { + return baseDao.getResolveProject(customerId, monthId, level); + } + + @Override + public List getGridResolveProject(String customerId, String monthId) { + return baseDao.getGridResolveProject(customerId, monthId); + } } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/GovernRankDataExtractServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/GovernRankDataExtractServiceImpl.java index 58e149d6fd..05f90029d5 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/GovernRankDataExtractServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/GovernRankDataExtractServiceImpl.java @@ -1,15 +1,21 @@ package com.epmet.service.evaluationindex.extract.toscreen.impl; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.constant.IndexCalConstant; import com.epmet.constant.OrgTypeConstant; import com.epmet.dao.evaluationindex.indexcoll.FactIndexGovrnAblityOrgMonthlyDao; +import com.epmet.dto.extract.result.OrgStatisticsResultDTO; import com.epmet.entity.evaluationindex.indexcoll.FactIndexGovrnAblityGridMonthlyEntity; +import com.epmet.entity.evaluationindex.indexcoll.FactIndexGovrnAblityOrgMonthlyEntity; import com.epmet.entity.evaluationindex.screen.ScreenGovernRankDataEntity; +import com.epmet.service.evaluationindex.extract.todata.FactOriginProjectLogDailyService; +import com.epmet.service.evaluationindex.extract.todata.FactOriginProjectMainDailyService; import com.epmet.service.evaluationindex.extract.toscreen.GovernRankDataExtractService; import com.epmet.service.evaluationindex.indexcoll.FactIndexGovrnAblityGridMonthlyService; import com.epmet.service.evaluationindex.indexcoll.FactIndexGovrnAblityOrgMonthlyService; import com.epmet.service.evaluationindex.screen.ScreenGovernRankDataService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; @@ -21,6 +27,7 @@ import java.util.List; * @dscription * @date 2020/9/24 14:31 */ +@Service public class GovernRankDataExtractServiceImpl implements GovernRankDataExtractService { @Autowired private ScreenGovernRankDataService screenGovernRankDataService; @@ -28,37 +35,138 @@ public class GovernRankDataExtractServiceImpl implements GovernRankDataExtractSe private FactIndexGovrnAblityOrgMonthlyService factIndexGovrnAblityOrgMonthlyService; @Autowired private FactIndexGovrnAblityGridMonthlyService factIndexGovrnAblityGridMonthlyService; + @Autowired + private FactOriginProjectLogDailyService factOriginProjectLogDailyService; + @Autowired + private FactOriginProjectMainDailyService factOriginProjectMainDailyService; + public static void main(String[] args) { + String monthId = "202006"; + System.out.println(monthId.substring(0,4)); + } @Override public void extractGridData(String customerId, String monthId) { List list = screenGovernRankDataService.initList(customerId, OrgTypeConstant.GRID, null); if (CollectionUtils.isEmpty(list)) { return; } + list.forEach(entity -> { + entity.setYearId(monthId.substring(NumConstant.ZERO, NumConstant.FOUR)); + entity.setMonthId(monthId); + }); List gridList = factIndexGovrnAblityGridMonthlyService.getGridByCustomer(customerId, monthId); - list.forEach(entity -> gridList.stream().filter(gridAblity -> entity.getOrgId().equals(gridAblity.getGridId())).forEach(grid -> { - BigDecimal total = new BigDecimal(grid.getProjectTotal()); - entity.setYearId(grid.getYearId()); - entity.setMonthId(grid.getMonthId()); - //TODO 响应率 - //解决率 + list.forEach(entity -> gridList.stream().filter(gridAbility -> entity.getOrgId().equals(gridAbility.getGridId())).forEach(grid -> { + BigDecimal resolveCount = new BigDecimal(grid.getResolveProjectCount()); - entity.setResolvedRatio(resolveCount.divide(total, NumConstant.SIX, RoundingMode.HALF_UP)); //自治率 BigDecimal selfCount = new BigDecimal(grid.getSelfSolveProjectCount()); - entity.setGovernRatio(selfCount.divide(total, NumConstant.SIX, RoundingMode.HALF_UP)); + if(grid.getResolveProjectCount()!= NumConstant.ZERO) { + entity.setGovernRatio(selfCount.divide(resolveCount, NumConstant.SIX, RoundingMode.HALF_UP)); + } //满意率 entity.setSatisfactionRatio(grid.getSatisfactionRatio()); })); + + //响应率 响应次数/流转到网格的次数 + List responseList = factOriginProjectLogDailyService.getGridResponse(customerId, monthId); + list.forEach(entity -> responseList.stream().filter(response -> entity.getOrgId().equals(response.getOrgId())).forEach(dto -> { + BigDecimal sum = new BigDecimal(dto.getSum()); + BigDecimal count = new BigDecimal(dto.getCount()); + entity.setResponseRatio(count.divide(sum, NumConstant.SIX, RoundingMode.HALF_UP)); + })); + + //解决率 已解决项目数/办结项目数 + List resolveList = factOriginProjectMainDailyService.getGridResolveProject(customerId, monthId); + list.forEach(entity -> resolveList.stream().filter(resolve -> entity.getOrgId().equals(resolve.getOrgId())).forEach(dto -> { + BigDecimal sum = new BigDecimal(dto.getSum()); + BigDecimal count = new BigDecimal(dto.getCount()); + entity.setResolvedRatio(count.divide(sum, NumConstant.SIX, RoundingMode.HALF_UP)); + })); + + screenGovernRankDataService.delAndSaveRankData(customerId, OrgTypeConstant.GRID, monthId, IndexCalConstant.DELETE_SIZE, list); } @Override public void extractCommunityData(String customerId, String monthId) { + List list = screenGovernRankDataService.initList(customerId, OrgTypeConstant.AGENCY, OrgTypeConstant.COMMUNITY); + if (CollectionUtils.isEmpty(list)) { + return; + } + list.forEach(entity -> { + entity.setYearId(monthId.substring(NumConstant.ZERO, NumConstant.FOUR)); + entity.setMonthId(monthId); + }); + List orgList = factIndexGovrnAblityOrgMonthlyService.getOrgByCustomer(customerId, monthId, + OrgTypeConstant.COMMUNITY); + list.forEach(entity -> orgList.stream().filter(orgAbility -> entity.getOrgId().equals(orgAbility.getAgencyId())).forEach(org -> { + //满意率 + entity.setSatisfactionRatio(org.getSatisfactionRatio()); + })); + //响应率 响应次数/流转到网格的次数 + List responseList = factOriginProjectLogDailyService.getOrgResponse(customerId, monthId, OrgTypeConstant.COMMUNITY); + list.forEach(entity -> responseList.stream().filter(response -> entity.getOrgId().equals(response.getAgencyId())).forEach(dto -> { + BigDecimal sum = new BigDecimal(dto.getSum()); + BigDecimal count = new BigDecimal(dto.getCount()); + entity.setResponseRatio(count.divide(sum, NumConstant.SIX, RoundingMode.HALF_UP)); + })); + //自制率 自治项目数/办结项目数 + List selfList = factOriginProjectMainDailyService.getSelfProject(customerId, monthId, OrgTypeConstant.COMMUNITY); + list.forEach(entity -> selfList.stream().filter(self -> entity.getOrgId().equals(self.getAgencyId())).forEach(dto -> { + BigDecimal sum = new BigDecimal(dto.getSum()); + BigDecimal count = new BigDecimal(dto.getCount()); + entity.setGovernRatio(count.divide(sum, NumConstant.SIX, RoundingMode.HALF_UP)); + })); + //解决率 已解决项目数/办结项目数 + List resolveList = factOriginProjectMainDailyService.getResolveProject(customerId, monthId, + OrgTypeConstant.COMMUNITY); + list.forEach(entity -> resolveList.stream().filter(resolve -> entity.getOrgId().equals(resolve.getAgencyId())).forEach(dto -> { + BigDecimal sum = new BigDecimal(dto.getSum()); + BigDecimal count = new BigDecimal(dto.getCount()); + entity.setResolvedRatio(count.divide(sum, NumConstant.SIX, RoundingMode.HALF_UP)); + })); + screenGovernRankDataService.delAndSaveRankData(customerId, OrgTypeConstant.AGENCY, monthId, IndexCalConstant.DELETE_SIZE, list); } @Override public void extractStreetData(String customerId, String monthId) { + List list = screenGovernRankDataService.initList(customerId, OrgTypeConstant.AGENCY, OrgTypeConstant.STREET); + if (CollectionUtils.isEmpty(list)) { + return; + } + list.forEach(entity -> { + entity.setYearId(monthId.substring(NumConstant.ZERO, NumConstant.FOUR)); + entity.setMonthId(monthId); + }); + List orgList = factIndexGovrnAblityOrgMonthlyService.getOrgByCustomer(customerId, monthId, + OrgTypeConstant.STREET); + list.forEach(entity -> orgList.stream().filter(orgAbility -> entity.getOrgId().equals(orgAbility.getAgencyId())).forEach(org -> { + //满意率 + entity.setSatisfactionRatio(org.getSatisfactionRatio()); + })); + //响应率 响应次数/流转到网格的次数 + List responseList = factOriginProjectLogDailyService.getOrgResponse(customerId, monthId, OrgTypeConstant.STREET); + list.forEach(entity -> responseList.stream().filter(response -> entity.getOrgId().equals(response.getAgencyId())).forEach(dto -> { + BigDecimal sum = new BigDecimal(dto.getSum()); + BigDecimal count = new BigDecimal(dto.getCount()); + entity.setResponseRatio(count.divide(sum, NumConstant.SIX, RoundingMode.HALF_UP)); + })); + //自制率 自治项目数/办结项目数 + List selfList = factOriginProjectMainDailyService.getSelfProject(customerId, monthId, OrgTypeConstant.STREET); + list.forEach(entity -> selfList.stream().filter(self -> entity.getOrgId().equals(self.getAgencyId())).forEach(dto -> { + BigDecimal sum = new BigDecimal(dto.getSum()); + BigDecimal count = new BigDecimal(dto.getCount()); + entity.setGovernRatio(count.divide(sum, NumConstant.SIX, RoundingMode.HALF_UP)); + })); + //解决率 已解决项目数/办结项目数 + List resolveList = factOriginProjectMainDailyService.getResolveProject(customerId, monthId, + OrgTypeConstant.STREET); + list.forEach(entity -> resolveList.stream().filter(resolve -> entity.getOrgId().equals(resolve.getAgencyId())).forEach(dto -> { + BigDecimal sum = new BigDecimal(dto.getSum()); + BigDecimal count = new BigDecimal(dto.getCount()); + entity.setResolvedRatio(count.divide(sum, NumConstant.SIX, RoundingMode.HALF_UP)); + })); + screenGovernRankDataService.delAndSaveRankData(customerId, OrgTypeConstant.AGENCY, monthId, IndexCalConstant.DELETE_SIZE, list); } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyService.java index 6e709fa4fb..4c38049785 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyService.java @@ -49,4 +49,15 @@ public interface FactIndexGovrnAblityOrgMonthlyService extends BaseService list); + + /** + * 根据客户查询组织治理能力 + * @author zhaoqifeng + * @date 2020/9/25 13:56 + * @param customerId + * @param monthId + * @param type + * @return java.util.List + */ + List getOrgByCustomer(String customerId, String monthId, String type); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/impl/FactIndexGovrnAblityGridMonthlyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/impl/FactIndexGovrnAblityGridMonthlyServiceImpl.java index 5143882c49..3f9c73afb3 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/impl/FactIndexGovrnAblityGridMonthlyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/impl/FactIndexGovrnAblityGridMonthlyServiceImpl.java @@ -1,9 +1,12 @@ package com.epmet.service.evaluationindex.indexcoll.impl; +import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.constant.DataSourceConstant; import com.epmet.dao.evaluationindex.indexcoll.FactIndexGovrnAblityGridMonthlyDao; import com.epmet.entity.evaluationindex.indexcoll.FactIndexGovrnAblityGridMonthlyEntity; import com.epmet.service.evaluationindex.indexcoll.FactIndexGovrnAblityGridMonthlyService; +import org.springframework.stereotype.Service; import java.util.List; @@ -12,6 +15,8 @@ import java.util.List; * @dscription * @date 2020/9/24 14:36 */ +@Service +@DataSource(DataSourceConstant.EVALUATION_INDEX) public class FactIndexGovrnAblityGridMonthlyServiceImpl extends BaseServiceImpl implements FactIndexGovrnAblityGridMonthlyService { @Override public List getGridByCustomer(String customerId, String monthId) { diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/impl/FactIndexGovrnAblityOrgMonthlyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/impl/FactIndexGovrnAblityOrgMonthlyServiceImpl.java index 6f6d5f15a5..a19669e39d 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/impl/FactIndexGovrnAblityOrgMonthlyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/indexcoll/impl/FactIndexGovrnAblityOrgMonthlyServiceImpl.java @@ -46,4 +46,9 @@ public class FactIndexGovrnAblityOrgMonthlyServiceImpl extends BaseServiceImpl list) { insertBatch(list); } + + @Override + public List getOrgByCustomer(String customerId, String monthId, String type) { + return baseDao.selectOrgByCustomer(customerId, monthId, type); + } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenGovernRankDataService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenGovernRankDataService.java index 5c5fb96844..0f9b23b166 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenGovernRankDataService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenGovernRankDataService.java @@ -32,12 +32,27 @@ import java.util.List; public interface ScreenGovernRankDataService extends BaseService { /** * 构造screen_govern_rank_data 初始数据,先赋值为0 - * @author zhaoqifeng - * @date 2020/9/24 14:41 + * * @param customerId * @param orgType * @param agencyLevel * @return java.util.List + * @author zhaoqifeng + * @date 2020/9/24 14:41 */ List initList(String customerId, String orgType, String agencyLevel); + + /** + * 保存抽取结果 + * + * @param customerId + * @param orgType + * @param monthId + * @param deleteSize + * @param entityList + * @return void + * @author zhaoqifeng + * @date 2020/9/25 10:32 + */ + void delAndSaveRankData(String customerId, String orgType, String monthId, Integer deleteSize, List entityList); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenGovernRankDataServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenGovernRankDataServiceImpl.java index e4fea260dc..4679187995 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenGovernRankDataServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenGovernRankDataServiceImpl.java @@ -18,13 +18,19 @@ package com.epmet.service.evaluationindex.screen.impl; +import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.constant.DataSourceConstant; import com.epmet.constant.OrgTypeConstant; import com.epmet.dao.evaluationindex.screen.ScreenGovernRankDataDao; import com.epmet.entity.evaluationindex.screen.ScreenGovernRankDataEntity; +import com.epmet.entity.evaluationindex.screen.ScreenPioneerDataEntity; import com.epmet.service.evaluationindex.screen.ScreenGovernRankDataService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @@ -37,6 +43,7 @@ import java.util.List; */ @Service @Slf4j +@DataSource(DataSourceConstant.EVALUATION_INDEX) public class ScreenGovernRankDataServiceImpl extends BaseServiceImpl implements ScreenGovernRankDataService { @@ -58,4 +65,23 @@ public class ScreenGovernRankDataServiceImpl extends BaseServiceImpl entityList) { + if (CollectionUtils.isEmpty(entityList)) { + return; + } + List orgIds = new ArrayList<>(); + for (ScreenGovernRankDataEntity entity : entityList) { + orgIds.add(entity.getOrgId()); + } + int deleteNum; + do { + deleteNum = baseDao.deleteRankData(customerId, orgType, monthId, deleteSize, orgIds); + } while (deleteNum != NumConstant.ZERO); + + insertBatch(entityList); + } } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectLogDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectLogDailyDao.xml index 00e1e590bb..38fa735f61 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectLogDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectLogDailyDao.xml @@ -187,4 +187,69 @@ ORDER BY project.ID,score DESC + + \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml index 6129ab0f2f..5b9c58b5ea 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectMainDailyDao.xml @@ -178,4 +178,108 @@ and t1.CLOSED_STATUS=#{closedStatus} + + + \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml index e29b35bfb5..0c1010e48c 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginProjectOrgPeriodDailyDao.xml @@ -48,7 +48,8 @@ SELECT f.CUSTOMER_ID, f.ORG_ID AS "agencyId", - SUM( TOTAL_PERIOD ) AS "sum", + SUM( TIMESTAMPDIFF( MINUTE, ( DATE_FORMAT( f.INFORMED_DATE, '%Y-%m-%d %H:%i' )), + ( DATE_FORMAT( f.PERIOD_TILL_REPLY_FIRSTLY, '%Y-%m-%d %H:%i' )) ) ) AS "sum", COUNT( f.ID ) AS "count" FROM fact_origin_project_org_period_daily f @@ -57,7 +58,7 @@ WHERE f.ORG_TYPE = #{orgType} AND DATE_FORMAT(INFORMED_DATE, '%Y%m') = #{monthId} - AND TOTAL_PERIOD != 0 + AND PERIOD_TILL_REPLY_FIRSTLY IS NOT NULL AND f.CUSTOMER_ID = #{customerId} GROUP BY f.CUSTOMER_ID, diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyDao.xml index 4644c01b11..dfdf6c3b59 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/indexcoll/FactIndexGovrnAblityOrgMonthlyDao.xml @@ -115,4 +115,17 @@ AND customer_id = #{customerId} AND month_id = #{monthId} + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenGovernRankDataDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenGovernRankDataDao.xml index a85df25770..2b70609ca3 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenGovernRankDataDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenGovernRankDataDao.xml @@ -8,6 +8,23 @@ where CUSTOMER_ID = #{customerId} AND MONTH_ID = #{monthId} limit 1000; + + delete from screen_govern_rank_data + where CUSTOMER_ID = #{customerId} + AND MONTH_ID = #{monthId} + + and ORG_TYPE=#{orgType} + + + and + ( + + ORG_ID = #{orgId} + + ) + + limit #{deleteSize} + + + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml index 459e873378..7f4df45113 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml @@ -312,4 +312,18 @@ del_flag = '0' AND CUSTOMER_ID = #{customerId} + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/heart/ActInfoDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/heart/ActInfoDao.xml index ea26569ba8..3b5bc0edcf 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/heart/ActInfoDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/heart/ActInfoDao.xml @@ -32,4 +32,32 @@ vi.USER_ID =#{userId} + + + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/heart/ActUserRelation.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/heart/ActUserRelation.xml new file mode 100644 index 0000000000..ae81f1cbe2 --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/heart/ActUserRelation.xml @@ -0,0 +1,24 @@ + + + + + + + + From dd37fead60639b0b4bf2cee04aaaa0e748c813af Mon Sep 17 00:00:00 2001 From: jianjun Date: Sat, 26 Sep 2020 08:26:53 +0800 Subject: [PATCH 15/20] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/stats/FactIssueGridMonthlyDao.java | 14 ++++++--- .../impl/PublicPartExtractServiceImpl.java | 31 ++++++++++++++++++- .../impl/FactIssueGridMonthlyServiceImpl.java | 2 +- .../mapper/stats/FactIssueGridMonthlyDao.xml | 12 ++++++- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/stats/FactIssueGridMonthlyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/stats/FactIssueGridMonthlyDao.java index 502363d1b0..2a2fc36ed9 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/stats/FactIssueGridMonthlyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/stats/FactIssueGridMonthlyDao.java @@ -26,7 +26,7 @@ import org.apache.ibatis.annotations.Param; import java.util.List; /** - * 网格议题数量(按月) + * 网格议题数量(按月) * * @author generator generator@elink-cn.com * @since v1.0.0 2020-06-17 @@ -35,21 +35,25 @@ import java.util.List; public interface FactIssueGridMonthlyDao extends BaseDao { /** * 统计网格议题各个指标月度增量 - * @author zhaoqifeng - * @date 2020/6/19 10:41 + * * @param customerId * @param monthId * @return java.util.List + * @author zhaoqifeng + * @date 2020/6/19 10:41 */ List selectGridMonthlyInc(@Param("customerId") String customerId, @Param("monthId") String monthId); /** * 删除 - * @author zhaoqifeng - * @date 2020/6/23 14:02 + * * @param customerId * @param monthId * @return void + * @author zhaoqifeng + * @date 2020/6/23 14:02 */ void deleteByCustomerId(@Param("customerId") String customerId, @Param("monthId") String monthId); + + List getIssueCount(@Param("customerId") String customerId, @Param("monthId") String monthId); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java index dd409600a8..3fd70b4e5a 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java @@ -1,11 +1,13 @@ package com.epmet.service.evaluationindex.extract.toscreen.impl; import com.alibaba.fastjson.JSON; +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.constant.OrgTypeConstant; import com.epmet.dto.extract.form.ExtractScreenFormDTO; +import com.epmet.dto.extract.result.GridUserCountResultDTO; import com.epmet.entity.evaluationindex.screen.ScreenUserJoinEntity; import com.epmet.entity.stats.DimAgencyEntity; import com.epmet.entity.stats.DimGridEntity; @@ -14,6 +16,7 @@ import com.epmet.service.evaluationindex.extract.toscreen.PublicPartExtractServi import com.epmet.service.stats.DimAgencyService; import com.epmet.service.stats.DimGridService; import com.epmet.service.stats.FactIssueGridMonthlyService; +import com.epmet.service.stats.user.FactRegUserGridMonthlyService; import com.epmet.util.DimIdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -25,6 +28,7 @@ import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * desc:公众参与抽取到大屏的接口实现类 @@ -42,13 +46,15 @@ public class PublicPartExtractServiceImpl implements PublicPartExtractService { private DimGridService dimGridService; @Autowired private FactIssueGridMonthlyService factIssueGridMonthlyService; + @Autowired + private FactRegUserGridMonthlyService factRegUserGridMonthlyService; /** * desc: 【月】抽取公众参与 人均议题 总次数和平均参与度 * target:screen_user_join * 总参与:统计周期内议题表决的人数 - * 百人人均议题:统计周期内总的议题数/(用户数/100) + * 百人人均议题:统计周期内总的议题数/(注册用户数/100) * 百人平均参与度:每个议题的实际参与数/应参与数 的平均值:(每个议题的实际参与数/应参与数)的和)/被表决的议题数 * 不考虑市北:人均议题:统计周期内议题总数/发过议题的人数 参与度:各个行为(表决)的总数/发生行为的人数 * @@ -76,6 +82,29 @@ public class PublicPartExtractServiceImpl implements PublicPartExtractService { //构建组织数据 Map insertMap = new HashMap<>(); orgList.forEach(org -> buildUserJoinEntity(formDTO, org, insertMap)); + //获取议题月份增量 + List issueTotal = factIssueGridMonthlyService.getIssueCount(formDTO.getCustomerId(), formDTO.getMonthId()); + if (CollectionUtils.isEmpty(issueTotal)) { + log.error("抽取【公众参与-人均议题】,获取议题增量为空"); + return; + } + List userCountList = factRegUserGridMonthlyService.selectGridUserCount(formDTO.getCustomerId(), formDTO.getMonthId()); + if (CollectionUtils.isEmpty(issueTotal)) { + log.error("抽取【公众参与-人均议题】,获取注册用户数为空"); + return; + } + Map userCountMap = userCountList.stream().collect(Collectors.toMap(GridUserCountResultDTO::getGridId, o -> o)); + issueTotal.forEach(issue -> { + String gridId = issue.getGridId(); + ScreenUserJoinEntity entity = insertMap.get(gridId); + entity.setJoinTotal(issue.getIssueIncr()); + GridUserCountResultDTO user = userCountMap.get(gridId); + //百人人均议题:统计周期内总的议题数/(注册用户数/100) + BigDecimal avgIssueCount = new BigDecimal(issue.getIssueIncr()).divide(new BigDecimal(user.getUserCount()).divide(new BigDecimal(NumConstant.ONE_HUNDRED))); + // 需要修改字段类型 + //entity.setAvgIssue(avgIssueCount); + }); + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/impl/FactIssueGridMonthlyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/impl/FactIssueGridMonthlyServiceImpl.java index cabdb020ca..c002e0e3ca 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/impl/FactIssueGridMonthlyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/stats/impl/FactIssueGridMonthlyServiceImpl.java @@ -75,7 +75,7 @@ public class FactIssueGridMonthlyServiceImpl extends BaseServiceImpl getIssueCount(String customerId, String monthId) { - return null; + return baseDao.getIssueCount(customerId, monthId); } } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/stats/FactIssueGridMonthlyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/stats/FactIssueGridMonthlyDao.xml index 35ca051fa1..e02c95dcfb 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/stats/FactIssueGridMonthlyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/stats/FactIssueGridMonthlyDao.xml @@ -67,7 +67,7 @@ SUM(IFNULL(CLOSED_CASE_UNRESOLVED_INCR, 0)) AS "closedCaseUnresolvedIncr" FROM dim_grid dg - LEFT JOIN fact_issue_grid_daily figd ON figd.GRID_ID = dg.ID AND figd.DEL_FLAG = 0 + LEFT JOIN fact_issue_grid_daily figd ON figd.GRID_ID = dg.ID AND figd.DEL_FLAG = '0' AND figd.MONTH_ID = #{monthId} WHERE dg.DEL_FLAG = 0 @@ -75,4 +75,14 @@ GROUP BY dg.AGENCY_ID, dg.ID + + \ No newline at end of file From 02a94de52682d96b992695b93b3812c63c562988 Mon Sep 17 00:00:00 2001 From: yinzuomei <576302893@qq.com> Date: Sat, 26 Sep 2020 19:04:25 +0800 Subject: [PATCH 16/20] =?UTF-8?q?screen=5Fpioneer=5Fdata=E5=85=9A=E5=91=98?= =?UTF-8?q?=E5=8F=82=E4=B8=8E=E8=AE=AE=E4=BA=8B=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/controller/DemoController.java | 31 +++++-- .../extract/FactOriginIssueLogDailyDao.java | 17 ++++ .../epmet/dao/heart/ActUserRelationDao.java | 2 + .../FactOriginIssueLogDailyService.java | 12 +++ .../FactOriginIssueLogDailyServiceImpl.java | 15 ++++ .../impl/PioneerDataExtractServiceImpl.java | 86 +++++++++++++++---- .../impl/ScreenExtractServiceImpl.java | 2 +- .../extract/FactOriginIssueLogDailyDao.xml | 26 ++++++ .../extract/FactOriginTopicMainDailyDao.xml | 2 +- 9 files changed, 170 insertions(+), 23 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java index da39652186..d67cded1db 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java @@ -35,10 +35,7 @@ import com.epmet.service.evaluationindex.extract.dataToIndex.IndexCollCommunityS import com.epmet.service.evaluationindex.extract.dataToIndex.IndexCollStreetService; import com.epmet.service.evaluationindex.extract.todata.FactOriginProjectLogDailyService; import com.epmet.service.evaluationindex.extract.todata.FactOriginTopicMainDailyService; -import com.epmet.service.evaluationindex.extract.toscreen.GovernRankDataExtractService; -import com.epmet.service.evaluationindex.extract.toscreen.PartyBaseInfoService; -import com.epmet.service.evaluationindex.extract.toscreen.PartyGuideService; -import com.epmet.service.evaluationindex.extract.toscreen.ScreenCentralZoneDataAbsorptionService; +import com.epmet.service.evaluationindex.extract.toscreen.*; import com.epmet.service.evaluationindex.indexcal.*; import com.epmet.service.stats.DimAgencyService; import com.epmet.service.stats.DimCustomerPartymemberService; @@ -655,7 +652,7 @@ public class DemoController { @PostMapping("zxczxc") public Result getZxcZxc(@RequestBody CustomerIdAndDateIdFormDTO formDTO){ - partyGuideService.partyGuideExtract(formDTO.getCustomerId(),formDTO.getDateId()); +// partyGuideService.partyGuideExtract(formDTO.getCustomerId(),formDTO.getDateId()); return new Result(); } @@ -672,4 +669,28 @@ public class DemoController { governRankDataExtractService.extractStreetData(formDTO.getCustomerId(), formDTO.getDateId()); return new Result(); } + + @Autowired + private PioneerDataExtractService pioneerDataExtractService; + + @PostMapping("insertScreenPioneerData") + public Result insertScreenPioneerData(@RequestParam("customerId") String customerId, @RequestParam("dateId") String dateId) { + if (StringUtils.isNotBlank(customerId) && StringUtils.isNotBlank(dateId)) { + pioneerDataExtractService.extractGridPioneerData(customerId, dateId); + pioneerDataExtractService.extractCommunityPioneerData(customerId, dateId); + pioneerDataExtractService.extractExceptCommunityPioneerData(customerId, dateId); + } else { + QueryWrapper customerEntityQueryWrapper = new QueryWrapper<>(); + List customerEntityList = dimCustomerDao.selectList(customerEntityQueryWrapper); + for (DimCustomerEntity customerEntity : customerEntityList) { + pioneerDataExtractService.extractGridPioneerData(customerEntity.getId(), "20200926"); + pioneerDataExtractService.extractCommunityPioneerData(customerEntity.getId(), "20200926"); + pioneerDataExtractService.extractExceptCommunityPioneerData(customerEntity.getId(), "20200926"); + } + } + return new Result(); + } + + + } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginIssueLogDailyDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginIssueLogDailyDao.java index 1e4ab97477..9ac027b1fa 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginIssueLogDailyDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/extract/FactOriginIssueLogDailyDao.java @@ -72,4 +72,21 @@ public interface FactOriginIssueLogDailyDao extends BaseDao selectPartyActiveIssueVote(@Param("customerId")String customerId,@Param("monthId") String monthId,@Param("isParty") Integer isParty); + + /** + * @return int + * @param customerId + * @param gridId + * @param communityId + * @param agencyPath + * @param isParty + * @author yinzuomei + * @description 党员参与议事:支持或者反对的次数 + * @Date 2020/9/26 18:05 + **/ + int calPartyPartiIssueTotal(@Param("customerId")String customerId, + @Param("gridId")String gridId, + @Param("communityId")String communityId, + @Param("agencyPath")String agencyPath, + @Param("isParty")String isParty); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/heart/ActUserRelationDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/heart/ActUserRelationDao.java index 4cda82f06a..32cbbaf408 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/heart/ActUserRelationDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/heart/ActUserRelationDao.java @@ -1,6 +1,7 @@ package com.epmet.dao.heart; import com.epmet.dto.extract.result.JoinUserCountResultDTO; +import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -9,6 +10,7 @@ import java.util.List; * @Author zxc * @DateTime 2020/9/25 5:21 下午 */ +@Mapper public interface ActUserRelationDao { /** diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginIssueLogDailyService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginIssueLogDailyService.java index 625804fff9..671888fb14 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginIssueLogDailyService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/FactOriginIssueLogDailyService.java @@ -28,4 +28,16 @@ import com.epmet.entity.evaluationindex.extract.FactOriginIssueLogDailyEntity; */ public interface FactOriginIssueLogDailyService extends BaseService { + /** + * @return int + * @param customerId + * @param gridId + * @param communityId + * @param agencyPath + * @param isParty + * @author yinzuomei + * @description 党员参与议事:支持或者反对的次数 + * @Date 2020/9/26 17:57 + **/ + int calPartyPartiIssueTotal(String customerId, String gridId, String communityId, String agencyPath, String isParty); } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginIssueLogDailyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginIssueLogDailyServiceImpl.java index df81cee703..af081dfef5 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginIssueLogDailyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/todata/impl/FactOriginIssueLogDailyServiceImpl.java @@ -36,4 +36,19 @@ import org.springframework.stereotype.Service; public class FactOriginIssueLogDailyServiceImpl extends BaseServiceImpl implements FactOriginIssueLogDailyService { + /** + * @param customerId + * @param gridId + * @param communityId + * @param agencyPath + * @param isParty + * @return int + * @author yinzuomei + * @description 党员参与议事:支持或者反对的次数 + * @Date 2020/9/26 17:57 + **/ + @Override + public int calPartyPartiIssueTotal(String customerId, String gridId, String communityId, String agencyPath, String isParty) { + return baseDao.calPartyPartiIssueTotal(customerId,gridId,communityId,agencyPath,isParty); + } } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PioneerDataExtractServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PioneerDataExtractServiceImpl.java index df9d7ab3c8..c4b5964404 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PioneerDataExtractServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PioneerDataExtractServiceImpl.java @@ -4,11 +4,13 @@ import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.constant.IndexCalConstant; import com.epmet.entity.evaluationindex.screen.ScreenPioneerDataEntity; +import com.epmet.service.evaluationindex.extract.todata.FactOriginIssueLogDailyService; import com.epmet.service.evaluationindex.extract.todata.FactOriginIssueMainDailyService; import com.epmet.service.evaluationindex.extract.todata.FactOriginProjectMainDailyService; import com.epmet.service.evaluationindex.extract.todata.FactOriginTopicMainDailyService; import com.epmet.service.evaluationindex.extract.toscreen.PioneerDataExtractService; import com.epmet.service.evaluationindex.screen.ScreenPioneerDataService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -24,6 +26,7 @@ import java.util.List; * @author yinzuomei@elink-cn.com * @date 2020/9/22 11:25 */ +@Slf4j @Service public class PioneerDataExtractServiceImpl implements PioneerDataExtractService { @@ -35,6 +38,9 @@ public class PioneerDataExtractServiceImpl implements PioneerDataExtractService private FactOriginIssueMainDailyService factOriginIssueMainDailyService; @Autowired private FactOriginProjectMainDailyService factOriginProjectMainDailyService; + @Autowired + private FactOriginIssueLogDailyService factOriginIssueLogDailyService; + /** * @param customerId @@ -54,11 +60,15 @@ public class PioneerDataExtractServiceImpl implements PioneerDataExtractService gridList.forEach(entity -> { entity.setDataEndTime(dateId); String gridId = entity.getOrgId(); - //1、党员参与议事 todo - entity.setIssueTotal(NumConstant.ZERO); - //2、党员参与议事占比 todo - entity.setIssueRatio(BigDecimal.ZERO); - + //1、党员参与议事 + entity.setIssueTotal(calPartyPartiIssueTotal(customerId,gridId,null,null,NumConstant.ONE_STR)); + if(entity.getIssueTotal()==0){ + entity.setIssueRatio(BigDecimal.ZERO); + }else{ + //2、党员参与议事占比 + int issueTotal=calPartyPartiIssueTotal(customerId,gridId,null,null,null); + entity.setIssueRatio(new BigDecimal(entity.getIssueTotal()/issueTotal).setScale(NumConstant.SIX,RoundingMode.HALF_UP)); + } //3、党员发布话题: entity.setTopicTotal(getTopicTotal(customerId, gridId, null)); @@ -86,6 +96,12 @@ public class PioneerDataExtractServiceImpl implements PioneerDataExtractService entity.setShiftProjectTotal(getGridOrCommunityShiftProjectTotal(customerId, gridId, null)); //8、议题转项目占比 : 占网格内议题总数的比率 entity.setShiftProjectRatio(entity.getShiftProjectTotal() == NumConstant.ZERO ? BigDecimal.ZERO : new BigDecimal(entity.getShiftProjectTotal() / gridIssueTotal).setScale(NumConstant.SIX, RoundingMode.HALF_UP)); + }else{ +// log.info("当前网格内所有议题总数="+gridIssueTotal); + entity.setPublishIssueTotal(NumConstant.ZERO); + entity.setPublishIssueRatio(BigDecimal.ZERO); + entity.setShiftProjectTotal(NumConstant.ZERO); + entity.setShiftProjectRatio(BigDecimal.ZERO); } @@ -102,6 +118,25 @@ public class PioneerDataExtractServiceImpl implements PioneerDataExtractService screenPioneerDataService.delAndSavePioneerData(customerId, "grid", IndexCalConstant.DELETE_SIZE, gridList); } + /** + * @return int + * @param customerId + * @param gridId 网格id + * @param communityId 社区的id + * @param agencyPath 组织的pids包含自己 + * @param isParty 1党员 + * @author yinzuomei + * @description + * @Date 2020/9/26 17:41 + **/ + private int calPartyPartiIssueTotal(String customerId, + String gridId, + String communityId, + String agencyPath, + String isParty) { + return factOriginIssueLogDailyService.calPartyPartiIssueTotal(customerId,gridId,communityId,agencyPath,isParty); + } + @Override public void extractCommunityPioneerData(String customerId, String dateId) { //查询客户下所有的社区,初始数据值为0 @@ -112,11 +147,15 @@ public class PioneerDataExtractServiceImpl implements PioneerDataExtractService communityList.forEach(entity -> { entity.setDataEndTime(dateId); String communityId = entity.getOrgId(); - //1、党员参与议事 todo - entity.setIssueTotal(NumConstant.ZERO); - //2、党员参与议事占比 todo - entity.setIssueRatio(BigDecimal.ZERO); - + //1、党员参与议事 + entity.setIssueTotal(calPartyPartiIssueTotal(customerId,null,communityId,null,NumConstant.ONE_STR)); + if(entity.getIssueTotal()==0){ + entity.setIssueRatio(BigDecimal.ZERO); + }else{ + //2、党员参与议事占比 + int issueTotal=calPartyPartiIssueTotal(customerId,null,communityId,null,null); + entity.setIssueRatio(new BigDecimal(entity.getIssueTotal()/issueTotal).setScale(NumConstant.SIX,RoundingMode.HALF_UP)); + } //3、党员发布话题: entity.setTopicTotal(getTopicTotal(customerId, null, communityId)); @@ -144,6 +183,12 @@ public class PioneerDataExtractServiceImpl implements PioneerDataExtractService entity.setShiftProjectTotal(getGridOrCommunityShiftProjectTotal(customerId, null, communityId)); //8、议题转项目占比 : 占社区内议题总数的比率 entity.setShiftProjectRatio(entity.getShiftProjectTotal() == NumConstant.ZERO ? BigDecimal.ZERO : new BigDecimal(entity.getShiftProjectTotal() / communityIssueTotal).setScale(NumConstant.SIX, RoundingMode.HALF_UP)); + }else{ +// log.info("当前社区内所有议题总数="+communityIssueTotal); + entity.setPublishIssueTotal(NumConstant.ZERO); + entity.setPublishIssueRatio(BigDecimal.ZERO); + entity.setShiftProjectTotal(NumConstant.ZERO); + entity.setShiftProjectRatio(BigDecimal.ZERO); } @@ -170,17 +215,20 @@ public class PioneerDataExtractServiceImpl implements PioneerDataExtractService } agencyList.forEach(entity -> { entity.setDataEndTime(dateId); - String agencyId = entity.getOrgId(); - //1、党员参与议事 todo - entity.setIssueTotal(NumConstant.ZERO); - //2、党员参与议事占比 todo - entity.setIssueRatio(BigDecimal.ZERO); if (StringUtils.isEmpty(entity.getPid()) || NumConstant.ZERO_STR.equals(entity.getPid())) { entity.setAgencyPath(entity.getOrgId()); } else { entity.setAgencyPath(entity.getAgencyPids().concat(StrConstant.COLON).concat(entity.getOrgId())); } - + //1、党员参与议事 + entity.setIssueTotal(calPartyPartiIssueTotal(customerId,null,null,entity.getAgencyPath(),NumConstant.ONE_STR)); + if(entity.getIssueTotal()==0){ + entity.setIssueRatio(BigDecimal.ZERO); + }else{ + //2、党员参与议事占比 + int issueTotal=calPartyPartiIssueTotal(customerId,null,null,entity.getAgencyPath(),null); + entity.setIssueRatio(new BigDecimal(entity.getIssueTotal()/issueTotal).setScale(NumConstant.SIX,RoundingMode.HALF_UP)); + } //3、党员发布话题: entity.setTopicTotal(getAgencyTopicTotal(customerId, entity.getAgencyPath(),NumConstant.ONE_STR)); @@ -208,6 +256,12 @@ public class PioneerDataExtractServiceImpl implements PioneerDataExtractService entity.setShiftProjectTotal(getAgencyShiftProjectTotal(customerId, entity.getAgencyPath())); //8、议题转项目占比 : 占网格内议题总数的比率 entity.setShiftProjectRatio(entity.getShiftProjectTotal() == NumConstant.ZERO ? BigDecimal.ZERO : new BigDecimal(entity.getShiftProjectTotal() / agencyIssueTotal).setScale(NumConstant.SIX, RoundingMode.HALF_UP)); + }else{ +// log.info("当前组织内所有议题总数="+agencyIssueTotal); + entity.setPublishIssueTotal(NumConstant.ZERO); + entity.setPublishIssueRatio(BigDecimal.ZERO); + entity.setShiftProjectTotal(NumConstant.ZERO); + entity.setShiftProjectRatio(BigDecimal.ZERO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenExtractServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenExtractServiceImpl.java index 088ec91608..9c8b73e49e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenExtractServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/ScreenExtractServiceImpl.java @@ -74,7 +74,7 @@ public class ScreenExtractServiceImpl implements ScreenExtractService { * @date 2020/9/24 10:16 上午 */ public void extractDaily(String customerId,String dateId){ - partyBaseInfoService.statsPartyMemberBaseInfoToScreen(customerId,dateId); +// partyBaseInfoService.statsPartyMemberBaseInfoToScreen(customerId,dateId); pioneerDataExtractService.extractGridPioneerData(customerId,dateId); pioneerDataExtractService.extractCommunityPioneerData(customerId,dateId); pioneerDataExtractService.extractExceptCommunityPioneerData(customerId,dateId); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginIssueLogDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginIssueLogDailyDao.xml index 23659b879a..734f088d09 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginIssueLogDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginIssueLogDailyDao.xml @@ -93,4 +93,30 @@ AND CUSTOMER_ID = #{customerId} AND MONTH_ID = #{monthId} + + + \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginTopicMainDailyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginTopicMainDailyDao.xml index 31b2bc1772..4e6dd8a925 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginTopicMainDailyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/extract/FactOriginTopicMainDailyDao.xml @@ -106,7 +106,7 @@ WHERE T1.DEL_FLAG = '0' AND T1.CUSTOMER_ID = #{customerId} - AND m.CREATE_TOPIC_USER_IS_PARTY='1' + AND t1.CREATE_TOPIC_USER_IS_PARTY='1' AND T1.GRID_ID=#{gridId} From c4c3025efeb13b3a66fa4dbce8001f271466f24b Mon Sep 17 00:00:00 2001 From: sunyuchao Date: Sun, 27 Sep 2020 10:05:31 +0800 Subject: [PATCH 17/20] =?UTF-8?q?=E6=8C=87=E6=A0=87=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E8=A1=A8valueType=E5=AD=97=E6=AE=B5=E8=B5=8B=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...评价指标体系算法需求-备注.xlsx | Bin 63943 -> 64274 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/test/java/resources/评价指标体系算法需求-备注.xlsx b/epmet-module/data-statistical/data-statistical-server/src/test/java/resources/评价指标体系算法需求-备注.xlsx index 3dfdceaaff09653a87925bb2daa254e94b3076df..ea2e9e044c82c8eb971d59802f735a538572a6db 100644 GIT binary patch literal 64274 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 E0btD&IsgCw literal 63943 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

    uCa}Ci028dj}2d4KvB>XUxy4Er%+7f34UUY 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 BW#9k+ From 8f33f6dc70f61bb3e8d7883a6ca6b48d670675fb Mon Sep 17 00:00:00 2001 From: jianjun Date: Sun, 27 Sep 2020 10:33:34 +0800 Subject: [PATCH 18/20] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/screencoll/form/UserJoinFormDTO.java | 5 +- .../screen/ScreenUserJoinEntity.java | 4 +- .../impl/PublicPartExtractServiceImpl.java | 13 +++-- .../impl/ShiBeiScreenCollServiceImpl.java | 53 +++++++++++++++--- ...评价指标体系算法需求-备注.xlsx | Bin 64274 -> 64561 bytes 5 files changed, 60 insertions(+), 15 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screencoll/form/UserJoinFormDTO.java b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screencoll/form/UserJoinFormDTO.java index 9abd6012d6..b160224471 100644 --- a/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screencoll/form/UserJoinFormDTO.java +++ b/epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screencoll/form/UserJoinFormDTO.java @@ -3,6 +3,7 @@ package com.epmet.dto.screencoll.form; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; /** * 11、基层治理-公众参与 入参 @@ -47,7 +48,7 @@ public class UserJoinFormDTO implements Serializable { /** * 人均议题 */ - private Integer avgIssue; + private BigDecimal avgIssue; /** * 总的参与次数 @@ -57,5 +58,5 @@ public class UserJoinFormDTO implements Serializable { /** * 平均参与度 */ - private Integer avgJoin; + private BigDecimal avgJoin; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenUserJoinEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenUserJoinEntity.java index 75668a1215..138e19cd30 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenUserJoinEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/ScreenUserJoinEntity.java @@ -90,7 +90,7 @@ public class ScreenUserJoinEntity extends BaseEpmetEntity { /** * 人均议题 */ - private Integer avgIssue; + private BigDecimal avgIssue; /** * 人均议题较上月增长率(采集的时候后台自己计算) @@ -105,7 +105,7 @@ public class ScreenUserJoinEntity extends BaseEpmetEntity { /** * 平均参与度 */ - private Integer avgJoin; + private BigDecimal avgJoin; /** * 平均参与度较上月增长率(采集的时候后台自己计算) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java index 3fd70b4e5a..bb94830ba1 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PublicPartExtractServiceImpl.java @@ -53,7 +53,7 @@ public class PublicPartExtractServiceImpl implements PublicPartExtractService { /** * desc: 【月】抽取公众参与 人均议题 总次数和平均参与度 * target:screen_user_join - * 总参与:统计周期内议题表决的人数 + * 总参与:统计周期内议题表决(虽然可以评价 但是只有表决的人可以评价 所以按表决人数算)的人数 * 百人人均议题:统计周期内总的议题数/(注册用户数/100) * 百人平均参与度:每个议题的实际参与数/应参与数 的平均值:(每个议题的实际参与数/应参与数)的和)/被表决的议题数 * 不考虑市北:人均议题:统计周期内议题总数/发过议题的人数 参与度:各个行为(表决)的总数/发生行为的人数 @@ -102,7 +102,12 @@ public class PublicPartExtractServiceImpl implements PublicPartExtractService { //百人人均议题:统计周期内总的议题数/(注册用户数/100) BigDecimal avgIssueCount = new BigDecimal(issue.getIssueIncr()).divide(new BigDecimal(user.getUserCount()).divide(new BigDecimal(NumConstant.ONE_HUNDRED))); // 需要修改字段类型 - //entity.setAvgIssue(avgIssueCount); + entity.setAvgIssue(avgIssueCount); + + //百人平均参与度:每个议题的实际参与数/应参与数 的平均值:(每个议题的实际参与数/应参与数)的和)/被表决的议题数 + + + entity.setAvgJoin(new BigDecimal(0)); }); @@ -144,10 +149,10 @@ public class PublicPartExtractServiceImpl implements PublicPartExtractService { entity.setJoinTotal(0); entity.setJoinTotalUpRate(new BigDecimal("0")); entity.setJoinTotalUpFlag(""); - entity.setAvgIssue(0); + entity.setAvgIssue(new BigDecimal(0)); entity.setAvgIssueUpRate(new BigDecimal("0")); entity.setAvgIssueUpFlag(""); - entity.setAvgJoin(0); + entity.setAvgJoin(new BigDecimal(0)); entity.setAgvgJoinUpRate(new BigDecimal("0")); entity.setAgvgJoinUpFlag(""); result.put(entity.getOrgId(), entity); diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ShiBeiScreenCollServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ShiBeiScreenCollServiceImpl.java index 4a5e9697fb..9438f4c3ea 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ShiBeiScreenCollServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ShiBeiScreenCollServiceImpl.java @@ -413,15 +413,35 @@ public class ShiBeiScreenCollServiceImpl implements ShiBeiScreenCollService { * @Author zhangyong * @Date 15:38 2020-08-21 **/ - private BigDecimal calculateGrowthRateNumber(Integer old, Integer now){ - if (NumConstant.ZERO == old){ + private BigDecimal calculateGrowthRateNumber(Integer old, Integer now) { + if (NumConstant.ZERO == old) { return new BigDecimal(now * NumConstant.ONE_HUNDRED); } BigDecimal bignum1 = new BigDecimal((now - old) * NumConstant.ONE_HUNDRED); - BigDecimal bignum2 = bignum1.divide(new BigDecimal(old),2,BigDecimal.ROUND_HALF_UP); + BigDecimal bignum2 = bignum1.divide(new BigDecimal(old), 2, BigDecimal.ROUND_HALF_UP); return bignum2; } + /** + * 计算 本月数值 相较于 上月数值,的增长率 + * + * @param old 上月数值 + * @param now 本月数值 + * @return java.math.BigDecimal + * @Author zhangyong + * @Date 15:38 2020-08-21 + **/ + private BigDecimal calculateGrowthRateNumber(BigDecimal old, BigDecimal now) { + BigDecimal oneHundred = new BigDecimal(NumConstant.ONE_HUNDRED); + if (old.compareTo(new BigDecimal(NumConstant.ZERO)) == NumConstant.ZERO) { + return now.multiply(oneHundred); + } + BigDecimal bignum1 = now.subtract(old).multiply(oneHundred); + BigDecimal bignum2 = bignum1.divide(old, 2, BigDecimal.ROUND_HALF_UP); + return bignum2; + } + + /** * 计算 本月数值 相较于 上月数值,的增长率, 得出标识 * @@ -431,10 +451,29 @@ public class ShiBeiScreenCollServiceImpl implements ShiBeiScreenCollService { * @Author zhangyong * @Date 15:38 2020-08-21 **/ - private String calculateGrowthRateFlag(Integer old, Integer now){ - if (old > now){ + private String calculateGrowthRateFlag(Integer old, Integer now) { + if (old > now) { + return CompareConstant.DECR_STR; + } else if (old < now) { + return CompareConstant.INCR_STR; + } else { + return CompareConstant.EQ_STR; + } + } + + /** + * 计算 本月数值 相较于 上月数值,的增长率, 得出标识 + * + * @param old 上月数值 + * @param now 本月数值 + * @return java.util.String + * @Author zhangyong + * @Date 15:38 2020-08-21 + **/ + private String calculateGrowthRateFlag(BigDecimal old, BigDecimal now) { + if (old.compareTo(now) == 1) { return CompareConstant.DECR_STR; - } else if (old < now){ + } else if (old.compareTo(now) == -1) { return CompareConstant.INCR_STR; } else { return CompareConstant.EQ_STR; @@ -448,7 +487,7 @@ public class ShiBeiScreenCollServiceImpl implements ShiBeiScreenCollService { if (formDTO.getIsFirst()) { int deleteNum; do { - deleteNum = screenPioneerDataDao.deletePioneerDataByCustomerId(customerId,IndexCalConstant.DELETE_SIZE); + deleteNum = screenPioneerDataDao.deletePioneerDataByCustomerId(customerId, IndexCalConstant.DELETE_SIZE); } while (deleteNum != NumConstant.ZERO); } if (!CollectionUtils.isEmpty(formDTO.getDataList())) { diff --git a/epmet-module/data-statistical/data-statistical-server/src/test/java/resources/评价指标体系算法需求-备注.xlsx b/epmet-module/data-statistical/data-statistical-server/src/test/java/resources/评价指标体系算法需求-备注.xlsx index ea2e9e044c82c8eb971d59802f735a538572a6db..e7bd157f47e787b91e5067aa3e2daa3d21f2b00d 100644 GIT binary patch literal 64561 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 literal 64274 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 E0btD&IsgCw From 04a3d0145dc2ad23ad8e670bdea5c3c871cf2ad5 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Sun, 27 Sep 2020 10:36:19 +0800 Subject: [PATCH 19/20] =?UTF-8?q?=E5=85=9A=E5=BB=BA=E5=BC=95=E9=A2=86?= =?UTF-8?q?=E3=80=90=E7=BB=84=E7=BB=87=E6=AC=A1=E6=95=B0=EF=BC=8C=E5=8F=82?= =?UTF-8?q?=E4=B8=8E=E4=BA=BA=E6=95=B0=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/epmet/controller/DemoController.java | 5 +- .../screen/ScreenPartyBranchDataDao.java | 30 +++++++ .../screen/ScreenPartyLinkMassesDataDao.java | 3 +- .../toscreen/impl/PartyGuideServiceImpl.java | 81 ++++++++++++++++++- .../screen/ScreenPartyBranchDataService.java | 30 +++++++ .../ScreenPartyLinkMassesDataService.java | 3 +- .../impl/ScreenCustomerAgencyServiceImpl.java | 2 +- .../ScreenPartyBranchDataServiceImpl.java | 50 ++++++++++++ .../ScreenPartyLinkMassesDataServiceImpl.java | 5 +- .../screen/ScreenCustomerAgencyDao.xml | 3 +- .../screen/ScreenCustomerGridDao.xml | 3 +- .../screen/ScreenPartyBranchDataDao.xml | 59 ++++++++++++++ .../screen/ScreenPartyLinkMassesDataDao.xml | 1 - 13 files changed, 258 insertions(+), 17 deletions(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java index d67cded1db..8b0dc2156a 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/DemoController.java @@ -17,6 +17,7 @@ import com.epmet.dao.stats.DimDateDao; import com.epmet.dao.stats.DimMonthDao; import com.epmet.dto.AgencySubTreeDto; import com.epmet.dto.extract.form.ExtractOriginFormDTO; +import com.epmet.dto.extract.form.ScreenExtractFormDTO; import com.epmet.dto.indexcal.CalculateCommonFormDTO; import com.epmet.dto.screen.form.ScreenCentralZoneDataFormDTO; import com.epmet.dto.stats.form.CustomerIdAndDateIdFormDTO; @@ -651,8 +652,8 @@ public class DemoController { private PartyGuideService partyGuideService; @PostMapping("zxczxc") - public Result getZxcZxc(@RequestBody CustomerIdAndDateIdFormDTO formDTO){ -// partyGuideService.partyGuideExtract(formDTO.getCustomerId(),formDTO.getDateId()); + public Result getZxcZxc(@RequestBody ScreenExtractFormDTO formDTO){ + partyGuideService.partyGuideExtract(formDTO); return new Result(); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyBranchDataDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyBranchDataDao.java index 8c5211cefc..9911306d4e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyBranchDataDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyBranchDataDao.java @@ -65,4 +65,34 @@ public interface ScreenPartyBranchDataDao extends BaseDao lists); + + /** + * @Description 删除旧的建设情况数据 + * @Param customerId + * @Param monthId + * @Param orgIds + * @author zxc + * @date 2020/9/27 9:04 上午 + */ + Integer deleteOldScreenPartyBranchData(@Param("customerId")String customerId,@Param("monthId") String monthId,@Param("orgIds") List orgIds); + + /** + * @Description 根据orgId查询建设情况数据 + * @Param customerId + * @Param monthId + * @Param orgIds + * @author zxc + * @date 2020/9/27 9:38 上午 + */ + List selectScreenPartyBranchDataByOrgId(@Param("customerId") String customerId, @Param("monthId") String monthId,@Param("orgIds") List orgIds); + + /** + * @Description 根据parentId查询建设情况数据 + * @Param customerId + * @Param monthId + * @Param parentId + * @author zxc + * @date 2020/9/27 9:38 上午 + */ + List selectScreenPartyBranchDataByParentId(@Param("customerId")String customerId,@Param("monthId") String monthId,@Param("parentId") String parentId); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyLinkMassesDataDao.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyLinkMassesDataDao.java index 586ab1d0a8..14e2e781bc 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyLinkMassesDataDao.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/dao/evaluationindex/screen/ScreenPartyLinkMassesDataDao.java @@ -68,12 +68,11 @@ public interface ScreenPartyLinkMassesDataDao extends BaseDao orgIds); + Integer deleteOldPartyLinkInfo(@Param("customerId") String customerId, @Param("orgIds") List orgIds); /** * @Description 查询党员联系群众信息 diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyGuideServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyGuideServiceImpl.java index 57d1556e55..aac1f632bf 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyGuideServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/extract/toscreen/impl/PartyGuideServiceImpl.java @@ -2,6 +2,7 @@ package com.epmet.service.evaluationindex.extract.toscreen.impl; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.DateUtils; import com.epmet.constant.ScreenConstant; import com.epmet.dto.extract.form.ScreenExtractFormDTO; import com.epmet.dto.extract.form.ScreenPartyBranchDataFormDTO; @@ -286,13 +287,13 @@ public class PartyGuideServiceImpl implements PartyGuideService { if (party.getOrgId().equals(join.getOrgId())){ party.setAverageJoinUserCount(join.getJoinUserCount()); party.setAverageJoinUserCount(party.getJoinUserCount() / party.getOrganizeCount()); + party.setYearId(DateUtils.getYearId(monthId)); } }); }); } result.addAll(screenPartyBranchDataList); }); - // 社区级别的 Map> groupByAgency = result.stream().collect(Collectors.groupingBy(ScreenPartyBranchDataFormDTO::getParentId)); List orgNameAgencyList = agencyService.selectOrgNameAgency(orgIds); @@ -309,14 +310,61 @@ public class PartyGuideServiceImpl implements PartyGuideService { form.setOrgId(agencyId); form.setCustomerId(customerId); form.setOrgType(ScreenConstant.AGENCY); + form.setMonthId(monthId); + form.setYearId(DateUtils.getYearId(monthId)); form.setOrganizeCount(actList.stream().collect(Collectors.summingInt(ScreenPartyBranchDataFormDTO::getOrganizeCount))); form.setJoinUserCount(actList.stream().collect(Collectors.summingInt(ScreenPartyBranchDataFormDTO::getJoinUserCount))); form.setAverageJoinUserCount(form.getJoinUserCount() / form.getOrganizeCount()); result.add(form); }); - + delAndInsertOrganize(result,customerId,monthId,orgIds); }else { - + List directGridIds = gridService.selectDirectGrid(orgIds); + agencyIdList.forEach(agency -> { + String agencyId = agency.getAgencyId(); + List disGridIds = new ArrayList<>(); + directGridIds.forEach(grid -> { + if (agencyId.equals(grid.getAgencyId())){ + disGridIds.add(grid.getGridId()); + } + }); + // 存在直属网格 + if (!CollectionUtils.isEmpty(disGridIds)){ + List gridResult = new ArrayList<>(); + List joinUserCountList = actUserRelationService.selectJoinUserCount(customerId, monthId); + List orgNameList = agencyService.selectOrgNameGrid(disGridIds); + List screenPartyBranchDataList = actInfoService.selectActInfo(customerId, monthId, ScreenConstant.GRID, disGridIds); + if (!CollectionUtils.isEmpty(screenPartyBranchDataList)){ + screenPartyBranchDataList.forEach(party -> { + orgNameList.forEach(org -> { + if (party.getOrgId().equals(org.getGridId())){ + party.setOrgName(org.getGridName()); + } + }); + ScreenPartyBranchDataFormDTO copyParty = ConvertUtils.sourceToTarget(party, ScreenPartyBranchDataFormDTO.class); + gridResult.add(copyParty); + }); + } + } + List disPartyBranchDataList = partyBranchDataService.selectScreenPartyBranchDataByOrgId(customerId, monthId, disGridIds); + List screenPartyBranchDataList = partyBranchDataService.selectScreenPartyBranchDataByParentId(customerId, monthId, agencyId); + screenPartyBranchDataList.addAll(disPartyBranchDataList); + if (!CollectionUtils.isEmpty(screenPartyBranchDataList)){ + ScreenPartyBranchDataFormDTO form = new ScreenPartyBranchDataFormDTO(); + form.setOrgId(agencyId); + form.setOrgType(ScreenConstant.AGENCY); + form.setOrgName(screenPartyBranchDataList.get(NumConstant.ZERO).getOrgName()); + form.setCustomerId(customerId); + form.setMonthId(monthId); + form.setYearId(DateUtils.getYearId(monthId)); + form.setParentId(screenPartyBranchDataList.get(NumConstant.ZERO).getParentId()); + form.setJoinUserCount(screenPartyBranchDataList.stream().collect(Collectors.summingInt(ScreenPartyBranchDataFormDTO::getJoinUserCount))); + form.setOrganizeCount(screenPartyBranchDataList.stream().collect(Collectors.summingInt(ScreenPartyBranchDataFormDTO::getOrganizeCount))); + form.setAverageJoinUserCount(form.getJoinUserCount() / form.getOrganizeCount()); + result.add(form); + } + }); + delAndInsertOrganize(result,customerId,monthId,orgIds); } } } @@ -381,7 +429,7 @@ public class PartyGuideServiceImpl implements PartyGuideService { } Integer delNum; do { - delNum = linkMassesDataService.deleteOldPartyLinkInfo(customerId, monthId, orgIds); + delNum = linkMassesDataService.deleteOldPartyLinkInfo(customerId, orgIds); }while (delNum > NumConstant.ZERO); List> partition = ListUtils.partition(finalResult, NumConstant.ONE_HUNDRED); partition.forEach(p -> { @@ -403,6 +451,31 @@ public class PartyGuideServiceImpl implements PartyGuideService { List screenPartyBranchData = agencyService.selectAllAgencyIdToOrganize(customerId, monthId); List screenPartyBranchDataList = gridService.selectAllGridIdToOrganize(customerId, monthId); screenPartyBranchDataList.addAll(screenPartyBranchData); + List finalResult = new ArrayList<>(); + screenPartyBranchDataList.forEach(rl -> { + orgIds.forEach(orgId -> { + if (rl.getOrgId().equals(orgId)){ + finalResult.add(rl); + } + }); + }); + if (!CollectionUtils.isEmpty(result)){ + finalResult.forEach(fr -> { + result.forEach(r -> { + if (fr.getOrgId().equals(r.getOrgId())){ + BeanUtils.copyProperties(r,fr); + } + }); + }); + } + Integer delNum; + do { + delNum = partyBranchDataService.deleteOldScreenPartyBranchData(customerId, monthId, orgIds); + }while (delNum > NumConstant.ZERO); + List> partition = ListUtils.partition(finalResult, NumConstant.ONE_HUNDRED); + partition.forEach(p -> { + partyBranchDataService.insertScreenPartyBranchData(p); + }); } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyBranchDataService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyBranchDataService.java index 68197d665c..1fc80f30ca 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyBranchDataService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyBranchDataService.java @@ -39,4 +39,34 @@ public interface ScreenPartyBranchDataService extends BaseService lists); + /** + * @Description 删除旧的建设情况数据 + * @Param customerId + * @Param monthId + * @Param orgIds + * @author zxc + * @date 2020/9/27 9:04 上午 + */ + Integer deleteOldScreenPartyBranchData(String customerId, String monthId, List orgIds); + + /** + * @Description 根据orgId查询建设情况数据 + * @Param customerId + * @Param monthId + * @Param orgIds + * @author zxc + * @date 2020/9/27 9:38 上午 + */ + List selectScreenPartyBranchDataByOrgId(String customerId, String monthId, List orgIds); + + /** + * @Description 根据parentId查询建设情况数据 + * @Param customerId + * @Param monthId + * @Param parentId + * @author zxc + * @date 2020/9/27 9:38 上午 + */ + List selectScreenPartyBranchDataByParentId(String customerId, String monthId, String parentId); + } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyLinkMassesDataService.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyLinkMassesDataService.java index f03255904a..77b8cdb3eb 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyLinkMassesDataService.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/ScreenPartyLinkMassesDataService.java @@ -42,12 +42,11 @@ public interface ScreenPartyLinkMassesDataService extends BaseService orgIds); + Integer deleteOldPartyLinkInfo(String customerId, List orgIds); /** * @Description 查询党员联系群众信息 diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java index 0a79ebf476..d506856d0e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenCustomerAgencyServiceImpl.java @@ -175,7 +175,7 @@ public class ScreenCustomerAgencyServiceImpl implements ScreenCustomerAgencyServ @Override public List selectAllAgencyIdToOrganize(String customerId, String monthId) { - return null; + return screenCustomerAgencyDao.selectAllAgencyIdToOrganize(customerId, monthId); } /** diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyBranchDataServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyBranchDataServiceImpl.java index 271ac60c71..afd2e8aee3 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyBranchDataServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyBranchDataServiceImpl.java @@ -18,7 +18,10 @@ package com.epmet.service.evaluationindex.screen.impl; +import com.epmet.commons.dynamic.datasource.annotation.DataSource; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.constant.DataSourceConstant; import com.epmet.dao.evaluationindex.screen.ScreenPartyBranchDataDao; import com.epmet.dto.extract.form.ScreenPartyBranchDataFormDTO; import com.epmet.entity.evaluationindex.screen.ScreenPartyBranchDataEntity; @@ -26,6 +29,7 @@ import com.epmet.service.evaluationindex.screen.ScreenPartyBranchDataService; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.List; /** @@ -35,6 +39,7 @@ import java.util.List; * @since v1.0.0 2020-09-22 */ @Service +@DataSource(DataSourceConstant.EVALUATION_INDEX) public class ScreenPartyBranchDataServiceImpl extends BaseServiceImpl implements ScreenPartyBranchDataService { /** @@ -49,4 +54,49 @@ public class ScreenPartyBranchDataServiceImpl extends BaseServiceImpl orgIds) { + if (!CollectionUtils.isEmpty(orgIds)){ + return baseDao.deleteOldScreenPartyBranchData(customerId, monthId, orgIds); + } + return NumConstant.ZERO; + } + + /** + * @Description 根据orgId查询建设情况数据 + * @Param customerId + * @Param monthId + * @Param orgIds + * @author zxc + * @date 2020/9/27 9:38 上午 + */ + @Override + public List selectScreenPartyBranchDataByOrgId(String customerId, String monthId, List orgIds) { + if (!CollectionUtils.isEmpty(orgIds)){ + return baseDao.selectScreenPartyBranchDataByOrgId(customerId, monthId, orgIds); + } + return new ArrayList<>(); + } + + /** + * @Description 根据parentId查询建设情况数据 + * @Param customerId + * @Param monthId + * @Param parentId + * @author zxc + * @date 2020/9/27 9:38 上午 + */ + @Override + public List selectScreenPartyBranchDataByParentId(String customerId, String monthId, String parentId) { + return baseDao.selectScreenPartyBranchDataByParentId(customerId, monthId, parentId); + } } \ No newline at end of file diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyLinkMassesDataServiceImpl.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyLinkMassesDataServiceImpl.java index 2aec948249..2915297086 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyLinkMassesDataServiceImpl.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/evaluationindex/screen/impl/ScreenPartyLinkMassesDataServiceImpl.java @@ -57,14 +57,13 @@ public class ScreenPartyLinkMassesDataServiceImpl extends BaseServiceImpl orgIds) { - return baseDao.deleteOldPartyLinkInfo(customerId, monthId, orgIds); + public Integer deleteOldPartyLinkInfo(String customerId, List orgIds) { + return baseDao.deleteOldPartyLinkInfo(customerId, orgIds); } /** diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerAgencyDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerAgencyDao.xml index 594ded8702..1c1907e4a7 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerAgencyDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerAgencyDao.xml @@ -328,7 +328,8 @@ AGENCY_NAME AS orgName, CUSTOMER_ID AS customerId, PID AS parentId, - #{monthId} AS dataEndTime + #{monthId} AS monthId, + SUBSTR(#{monthId},1,4) AS yearId FROM screen_customer_agency WHERE diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml index 7f4df45113..ae09cefb52 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenCustomerGridDao.xml @@ -319,7 +319,8 @@ grid_name AS orgName, CUSTOMER_ID AS customerId, PARENT_AGENCY_ID AS parentId, - #{monthId} AS dataEndTime + #{monthId} AS monthId, + SUBSTR(#{monthId},1,4) AS yearId FROM screen_customer_grid WHERE diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyBranchDataDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyBranchDataDao.xml index 92b2b888b7..ae9430e214 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyBranchDataDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyBranchDataDao.xml @@ -109,4 +109,63 @@ ) + + + + delete from screen_party_branch_data + where CUSTOMER_ID = #{customerId} + and MONTH_ID = #{monthId} + and + ( + + org_id = #{orgId} + + ) + LIMIT 1000 + + + + + + + diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyLinkMassesDataDao.xml b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyLinkMassesDataDao.xml index 20d7c3f7e7..f2c7adcb3d 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyLinkMassesDataDao.xml +++ b/epmet-module/data-statistical/data-statistical-server/src/main/resources/mapper/evaluationindex/screen/ScreenPartyLinkMassesDataDao.xml @@ -13,7 +13,6 @@ delete from screen_party_link_masses_data where CUSTOMER_ID = #{customerId} - and DATA_END_TIME = #{monthId} and ( From 211706987486dee869a2f34c8f9af0d9082202fe Mon Sep 17 00:00:00 2001 From: jianjun Date: Sun, 27 Sep 2020 11:10:36 +0800 Subject: [PATCH 20/20] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8C=87=E6=A0=87?= =?UTF-8?q?=E5=80=BC=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/IndexDictEntity.java | 5 +++++ .../epmet/model/IndexExcelDataListener.java | 13 ++++++++++++- .../main/java/com/epmet/model/IndexModel.java | 5 +++++ ...评价指标体系算法需求-备注.xlsx | Bin 64561 -> 64588 bytes 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/IndexDictEntity.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/IndexDictEntity.java index 149c4c128c..d05a586f76 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/IndexDictEntity.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/entity/evaluationindex/screen/IndexDictEntity.java @@ -59,4 +59,9 @@ public class IndexDictEntity extends BaseEpmetEntity { * 正相关:positive;负相关:negative */ private String correlation; + + /** + * 指标值类型 无:none;整数:integer;小数: decimal;百分比:percent + */ + private String valueType; } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/model/IndexExcelDataListener.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/model/IndexExcelDataListener.java index fc8ec41c57..ea56c96a37 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/model/IndexExcelDataListener.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/model/IndexExcelDataListener.java @@ -42,7 +42,6 @@ public class IndexExcelDataListener extends AnalysisEventListener { List indexModelList = new ArrayList<>(); private String preWheight; - private Integer wheightSum = 0; /** * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。 */ @@ -104,6 +103,17 @@ public class IndexExcelDataListener extends AnalysisEventListener { } } + //指标值类型 无:none;整数:integer;小数: decimal;百分比:percent + if (StringUtils.isNotBlank(data.getValueType())) { + if ("整数".equals(data.getValueType())) { + data.setValueType("integer"); + } else if ("小数".equals(data.getValueType())) { + data.setValueType("decimal"); + } else if ("百分比".equals(data.getValueType())) { + data.setValueType("percent"); + } + } + IndexDictEntity entity = new IndexDictEntity(); IndexDictEntity entity2 = new IndexDictEntity(); IndexDictEntity entity3 = new IndexDictEntity(); @@ -306,6 +316,7 @@ public class IndexExcelDataListener extends AnalysisEventListener { entity5.setCorrelation(data.getCorrelation()); entity5.setLevel("5"); entity5.setIndexCode(Pinyin4jUtil.getSpellPinYin(data.getLevel5Index(), false, 4)); + entity.setValueType(data.getValueType()); indexDicMap.put(data.getLevel5Index(), entity5); } } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/model/IndexModel.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/model/IndexModel.java index b2e124ff09..cc1aed7759 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/model/IndexModel.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/model/IndexModel.java @@ -26,6 +26,11 @@ public class IndexModel { //没有阈值:无,有就是百分数 @ExcelProperty(value = "阈值") private String threshold; + /** + * 指标值类型 无:none;整数:integer;小数: decimal;百分比:percent + */ + @ExcelProperty(value = "五级指标值类型") + private String valueType; /** * 正相关:positive;负相关:negative */ diff --git a/epmet-module/data-statistical/data-statistical-server/src/test/java/resources/评价指标体系算法需求-备注.xlsx b/epmet-module/data-statistical/data-statistical-server/src/test/java/resources/评价指标体系算法需求-备注.xlsx index e7bd157f47e787b91e5067aa3e2daa3d21f2b00d..7f624f10bb926ad557fbafe646b70a5785ace043 100644 GIT binary patch delta 23112 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
    0G`D5s<2Pz#3;chh)W+#Prm=X-z>XGuHI2 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 delta 23104 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