diff --git a/epmet-commons/epmet-commons-tools/pom.xml b/epmet-commons/epmet-commons-tools/pom.xml index 258b1a09b2..d8073505ce 100644 --- a/epmet-commons/epmet-commons-tools/pom.xml +++ b/epmet-commons/epmet-commons-tools/pom.xml @@ -18,7 +18,7 @@ 1.3.3 2.6 4.6.1 - 4.1.0 + 4.1.3 2.9.9 1.2.60 2.8.6 @@ -95,6 +95,11 @@ easypoi-web ${easypoi.version} + + cn.afterturn + easypoi-annotation + ${easypoi.version} + joda-time joda-time diff --git a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppTakeTokenAuthProcessor.java b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppTakeTokenAuthProcessor.java index 6b527dc074..dcede2b1d0 100644 --- a/epmet-gateway/src/main/java/com/epmet/auth/ExtAppTakeTokenAuthProcessor.java +++ b/epmet-gateway/src/main/java/com/epmet/auth/ExtAppTakeTokenAuthProcessor.java @@ -1,7 +1,6 @@ package com.epmet.auth; import com.epmet.commons.security.jwt.JwtUtils; -import com.epmet.commons.security.sign.openapi.OpenApiSignUtils; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.redis.RedisKeys; @@ -12,7 +11,6 @@ import com.epmet.feign.EpmetCommonServiceOpenFeignClient; import com.epmet.openapi.constant.InClusterHeaderKeys; import com.epmet.openapi.constant.RequestParamKeys; import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.server.reactive.ServerHttpRequest; @@ -79,11 +77,11 @@ public class ExtAppTakeTokenAuthProcessor extends ExtAppAuthProcessor { EpmetCommonServiceOpenFeignClient commonService = SpringContextUtils.getBean(EpmetCommonServiceOpenFeignClient.class); Result result = commonService.getSecret(appId); if (result == null || !result.success()) { - throw new RenException("fetchToken方式的外部应用认证,获取secret失败"); + throw new RenException("TakeToken方式的外部应用认证,获取secret失败"); } String secret = result.getData(); if (StringUtils.isBlank(secret)) { - throw new RenException("fetchToken方式的外部应用认证,获取secret失败"); + throw new RenException("TakeToken方式的外部应用认证,获取secret失败"); } return secret; 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 c9a19fa8b8..6513d27f04 100644 --- a/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java +++ b/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java @@ -5,6 +5,7 @@ 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.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.IpUtils; import com.epmet.commons.tools.utils.Result; @@ -26,13 +27,13 @@ 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.MultiValueMap; 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; +import java.util.*; /** * app接口权限过滤器 @@ -43,152 +44,197 @@ import java.util.List; @Component("CpAuth") public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory { - private Logger logger = LoggerFactory.getLogger(getClass()); - - @Autowired - private InternalAuthProcessor internalAuthProcessor; - - @Autowired - private ExternalAuthProcessor externalAuthProcessor; - - @Override - public List shortcutFieldOrder() { - return Arrays.asList("enabled"); - } - - public CpAuthGatewayFilterFactory() { - super(CpAuthConfig.class); - } - - @Override - public GatewayFilter apply(CpAuthConfig config) { - return (exchange, chain) -> { - if (!config.isEnabled()) { - return chain.filter(exchange); - } - - //添加流水号 - ServerHttpRequest request = exchange.getRequest(); - List tranSerials = request.getHeaders().get(AppClientConstant.TRANSACTION_SERIAL_KEY); - if (CollectionUtils.isEmpty(tranSerials) || StringUtils.isBlank(tranSerials.get(0))) { - request.mutate().header(AppClientConstant.TRANSACTION_SERIAL_KEY, new String[]{getTransactionSerial()}); - } - - String authType = getAuthType(request); - String requestUri = request.getPath().pathWithinApplication().value(); - - logger.info("CpAuthGatewayFilterFactory当前requestUri=[" + requestUri + "],CpAuthGatewayFilterFactory拦截成功,客户端Id:{}", IpUtils.getClientIp(request)); - try { - switch (authType) { - case AuthTypeConstant.AUTH_TYPE_ALL: - externalAuthProcessor.auth(exchange, chain); - internalAuthProcessor.auth(exchange, chain); - break; - case AuthTypeConstant.AUTH_TYPE_EXTERNAL: - externalAuthProcessor.auth(exchange, chain); - break; - case AuthTypeConstant.AUTH_TYPE_INTERNAL: - internalAuthProcessor.auth(exchange, chain); - break; - } - } catch (RenException e) { - return response(exchange, new Result<>().error(e.getCode(), e.getMessage())); - } catch (Exception e) { - return response(exchange, new Result<>().error(e.getMessage())); - } - - return chain.filter(exchange); - }; - } - - /** - * 判断需要执行的认证方式(内部应用认证还是外部应用认证) - * @return - */ - private String getAuthType(ServerHttpRequest request) { - //String requestUri = request.getPath().pathWithinApplication().value(); - - // 是否在外部认证列表中(外部认证列表中的url,是对外部应用开放的,只有在这个列表中的url才对外部应用开放) - //boolean inExtAuthPaths = false; - // - //for (String url : cpProperty.getExternalAuthUrls()) { - // if (antPathMatcher.match(url, requestUri)) { - // inExtAuthPaths = true; - // } - //} - - String authType = ServerHttpRequestUtils.getRequestParam(request, RequestParamKeys.AUTH_TYPE); - if (StringUtils.isNotBlank(authType) && AuthTypes.TAKE_TOKEN.equals(authType)) { - return AuthTypeConstant.AUTH_TYPE_EXTERNAL; - } - - boolean needExternal = StringUtils.isNotBlank(request.getHeaders().getFirst(TokenHeaderKeyConstant.ACCESS_TOKEN_HEADER_KEY)); - boolean needInternal = StringUtils.isNotBlank(request.getHeaders().getFirst(TokenHeaderKeyConstant.AUTHORIZATION_TOKEN_HEADER_KEY)); - - if (needExternal && needInternal) { - return AuthTypeConstant.AUTH_TYPE_ALL; - } - - if (needExternal) { - // url对外部应用开放,并且头里面有AccessToken,那么走外部应用认证 - return AuthTypeConstant.AUTH_TYPE_EXTERNAL; - } - - return AuthTypeConstant.AUTH_TYPE_INTERNAL; - } - - /** - * 获取请求头 - * @param request - * @return - */ - private String getHeader(ServerHttpRequest request, String headerName) { - HttpHeaders headers = request.getHeaders(); - return headers.getFirst(headerName); - } - - /** - * 获取事务流水号 - * @return - */ - public static String getTransactionSerial() { - 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"}; - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 2; i++) { - sb.append(letterPool[(int) (Math.random() * 25)]); - } - - sb.append(System.currentTimeMillis()); - return sb.toString(); - } - - public static class CpAuthConfig { - - /** - * 控制是否开启认证 - */ - private boolean enabled; - - public CpAuthConfig() { - } - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - } - - 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)); - } + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private InternalAuthProcessor internalAuthProcessor; + + @Autowired + private ExternalAuthProcessor externalAuthProcessor; + + @Override + public List shortcutFieldOrder() { + return Arrays.asList("enabled"); + } + + public CpAuthGatewayFilterFactory() { + super(CpAuthConfig.class); + } + + @Override + public GatewayFilter apply(CpAuthConfig config) { + return (exchange, chain) -> { + if (!config.isEnabled()) { + return chain.filter(exchange); + } + + //1.添加流水号 + ServerHttpRequest request = exchange.getRequest(); + List tranSerials = request.getHeaders().get(AppClientConstant.TRANSACTION_SERIAL_KEY); + if (CollectionUtils.isEmpty(tranSerials) || StringUtils.isBlank(tranSerials.get(0))) { + request.mutate().header(AppClientConstant.TRANSACTION_SERIAL_KEY, new String[]{getTransactionSerial()}); + } + + //2.获取请求路径,参数 + String requestUri = request.getPath().pathWithinApplication().value(); + MultiValueMap queryParams = request.getQueryParams(); + String queryParamsStr = convertQueryParams2String(queryParams); + logger.info("CpAuthGatewayFilterFactory当前requestUri=[" + requestUri.concat(queryParamsStr) + "],CpAuthGatewayFilterFactory拦截成功,客户端Id:{}", IpUtils.getClientIp(request)); + + //3.认证 + String authType = getAuthType(request); + logger.info("认证类型为:{}", authType); + try { + switch (authType) { + case AuthTypeConstant.AUTH_TYPE_ALL: + externalAuthProcessor.auth(exchange, chain); + internalAuthProcessor.auth(exchange, chain); + break; + case AuthTypeConstant.AUTH_TYPE_EXTERNAL: + externalAuthProcessor.auth(exchange, chain); + break; + case AuthTypeConstant.AUTH_TYPE_INTERNAL: + internalAuthProcessor.auth(exchange, chain); + break; + } + } catch (RenException e) { + logger.error("CpAuthGatewayFilterFactory认证出错,错误信息:{}", ExceptionUtils.getErrorStackTrace(e)); + return response(exchange, new Result<>().error(e.getCode(), e.getMessage())); + } catch (Exception e) { + logger.error("CpAuthGatewayFilterFactory认证出错,错误信息:{}", ExceptionUtils.getErrorStackTrace(e)); + return response(exchange, new Result<>().error(e.getMessage())); + } + + return chain.filter(exchange); + }; + } + + /** + * @return + * @Description 将url参数转化为String + * @author wxz + * @date 2021.08.11 23:12 + */ + private String convertQueryParams2String(MultiValueMap queryParams) { + try { + if (queryParams == null || queryParams.size() == 0) { + return ""; + } + StringBuilder sb = new StringBuilder(""); + queryParams.entrySet().forEach(entry -> { + String key = entry.getKey(); + List values = entry.getValue(); + + String value = ""; + if (values != null && values.size() > 0) { + value = values.get(0); + } + + sb.append("&").append(key).append("=").append(value); + }); + String result = sb.toString(); + if (result.startsWith("&")) { + result = result.substring(1); + return "?".concat(result); + } + return ""; + } catch (Exception e) { + logger.warn("gateway中将url参数转化为String失败,程序继续执行,错误信息:".concat(ExceptionUtils.getErrorStackTrace(e))); + return ""; + } + } + + /** + * 判断需要执行的认证方式(内部应用认证还是外部应用认证) + * + * @return + */ + private String getAuthType(ServerHttpRequest request) { + //String requestUri = request.getPath().pathWithinApplication().value(); + + // 是否在外部认证列表中(外部认证列表中的url,是对外部应用开放的,只有在这个列表中的url才对外部应用开放) + //boolean inExtAuthPaths = false; + // + //for (String url : cpProperty.getExternalAuthUrls()) { + // if (antPathMatcher.match(url, requestUri)) { + // inExtAuthPaths = true; + // } + //} + + String authType = ServerHttpRequestUtils.getRequestParam(request, RequestParamKeys.AUTH_TYPE); + if (StringUtils.isNotBlank(authType) && AuthTypes.TAKE_TOKEN.equals(authType)) { + return AuthTypeConstant.AUTH_TYPE_EXTERNAL; + } + + boolean needExternal = StringUtils.isNotBlank(request.getHeaders().getFirst(TokenHeaderKeyConstant.ACCESS_TOKEN_HEADER_KEY)); + boolean needInternal = StringUtils.isNotBlank(request.getHeaders().getFirst(TokenHeaderKeyConstant.AUTHORIZATION_TOKEN_HEADER_KEY)); + + if (needExternal && needInternal) { + return AuthTypeConstant.AUTH_TYPE_ALL; + } + + if (needExternal) { + // url对外部应用开放,并且头里面有AccessToken,那么走外部应用认证 + return AuthTypeConstant.AUTH_TYPE_EXTERNAL; + } + + return AuthTypeConstant.AUTH_TYPE_INTERNAL; + } + + /** + * 获取请求头 + * + * @param request + * @return + */ + private String getHeader(ServerHttpRequest request, String headerName) { + HttpHeaders headers = request.getHeaders(); + return headers.getFirst(headerName); + } + + /** + * 获取事务流水号 + * + * @return + */ + public static String getTransactionSerial() { + 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"}; + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 2; i++) { + sb.append(letterPool[(int) (Math.random() * 25)]); + } + + sb.append(System.currentTimeMillis()); + return sb.toString(); + } + + public static class CpAuthConfig { + + /** + * 控制是否开启认证 + */ + private boolean enabled; + + public CpAuthConfig() { + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + } + + 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/resources/bootstrap.yml b/epmet-gateway/src/main/resources/bootstrap.yml index dce0862481..23c16efb82 100644 --- a/epmet-gateway/src/main/resources/bootstrap.yml +++ b/epmet-gateway/src/main/resources/bootstrap.yml @@ -481,6 +481,7 @@ epmet: - /message/template/** - /data/aggregator/project/projectdistribution - /data/aggregator/epmetuser/open-staffdetail + - /data/aggregator/pub/** #stats external包下 公共的类只外部暴露方法 纯外部使用的 暴漏整个 - /data/stats/statsuser/gm-uploadevent - /data/stats/statsuser/gm-uploaddata diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/form/BaseDataFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/form/BaseDataFormDTO.java index 1eae69043b..cbfa41f767 100644 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/form/BaseDataFormDTO.java +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/form/BaseDataFormDTO.java @@ -28,6 +28,7 @@ public class BaseDataFormDTO implements Serializable { private String dateId; private String startDateId; private String endDateId; + private String agencyName; public interface BaseData extends CustomerClientShowGroup{} public interface AgencyIdAndLevel extends CustomerClientShowGroup{} diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/form/SubTopicAndGroupFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/form/SubTopicAndGroupFormDTO.java deleted file mode 100644 index 7a64b567d7..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/form/SubTopicAndGroupFormDTO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.epmet.dataaggre.dto.datastats.form; - -import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; - -/** - * @Description 对外接口-查询下级话题和小组数-接口入参 - * @Auth sun - */ -@Data -public class SubTopicAndGroupFormDTO implements Serializable { - - private static final long serialVersionUID = -3381286960911634231L; - /** - * 当前组织id;从组织树取 - */ - @NotBlank(message = "组织ID不能为空", groups = SubTopicAndGroupFormDTO.Agency.class) - private String agencyId; - /** - * 当前组织级别;从组织树取 - * 机关级别(社区级:community, - * 乡(镇、街道)级:street, - * 区县级: district, - * 市级: city - * 省级:province) - */ - @NotBlank(message = "组织级别不能为空", groups = SubTopicAndGroupFormDTO.Agency.class) - private String agencyLevel; - /** - * 日维度Id【yyyyMMdd eg:20210808,默认前一天】 - */ - private String dateId; - public interface Agency extends CustomerClientShowGroup{} - -} diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/form/SubUserTotalFormDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/form/SubUserTotalFormDTO.java deleted file mode 100644 index f97af0583e..0000000000 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/form/SubUserTotalFormDTO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.epmet.dataaggre.dto.datastats.form; - -import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; - -/** - * @Description 对外接口-查询下级用户党员数-接口入参 - * @Auth sun - */ -@Data -public class SubUserTotalFormDTO implements Serializable { - - private static final long serialVersionUID = -3381286960911634231L; - /** - * 当前组织id;从组织树取 - */ - @NotBlank(message = "组织ID不能为空", groups = SubUserTotalFormDTO.Agency.class) - private String agencyId; - /** - * 当前组织级别;从组织树取 - * 机关级别(社区级:community, - * 乡(镇、街道)级:street, - * 区县级: district, - * 市级: city - * 省级:province) - */ - @NotBlank(message = "组织级别不能为空", groups = SubUserTotalFormDTO.Agency.class) - private String agencyLevel; - /** - * 日维度Id【yyyyMMdd eg:20210808,默认前一天】 - */ - private String dateId; - public interface Agency extends CustomerClientShowGroup{} - -} diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/result/SubTopicAndGroupResultDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/result/SubTopicAndGroupResultDTO.java index 0b76a3d2a1..3210cf7b8c 100644 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/result/SubTopicAndGroupResultDTO.java +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/result/SubTopicAndGroupResultDTO.java @@ -19,5 +19,6 @@ public class SubTopicAndGroupResultDTO implements Serializable { private Integer topicTotal = 0; //小组总数 private Integer groupTotal = 0; + private Integer sort = 1; } diff --git a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/result/SubUserTotalResultDTO.java b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/result/SubUserTotalResultDTO.java index 2f87e63143..aea6f6c0a7 100644 --- a/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/result/SubUserTotalResultDTO.java +++ b/epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/datastats/result/SubUserTotalResultDTO.java @@ -19,5 +19,9 @@ public class SubUserTotalResultDTO implements Serializable { private Integer userTotal = 0; //党员总数 private Integer partyMemberTotal = 0; + /** + * 排名 + */ + private Integer sort = 1; } diff --git a/epmet-module/data-aggregator/data-aggregator-server/pom.xml b/epmet-module/data-aggregator/data-aggregator-server/pom.xml index 6c2a9d38c6..0f216610be 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/pom.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/pom.xml @@ -91,6 +91,17 @@ true + + + org.apache.maven.plugins + maven-resources-plugin + + + xls + xlsx + + + ${project.basedir}/src/main/java diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/aspect/RequestLogAspect.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/aspect/RequestLogAspect.java index 34cf9f3d69..5bba1edfb0 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/aspect/RequestLogAspect.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/aspect/RequestLogAspect.java @@ -21,7 +21,7 @@ import javax.servlet.http.HttpServletRequest; public class RequestLogAspect extends BaseRequestLogAspect { @Override - @Around(value = "execution(* com.epmet.dataaggre.controller.*Controller.*(..)) ") + @Around(value = "execution(* com.epmet.dataaggre.controller..*Controller.*(..)) ") public Object proceed(ProceedingJoinPoint point) throws Throwable { return super.proceed(point, getRequest()); } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/pub/PubController.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/pub/PubController.java index 2d6b0fa999..8a0c8ae877 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/pub/PubController.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/pub/PubController.java @@ -1,5 +1,9 @@ package com.epmet.dataaggre.controller.pub; +import cn.afterturn.easypoi.entity.vo.TemplateExcelConstants; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; +import cn.afterturn.easypoi.view.EasypoiTemplateExcelView; +import com.epmet.commons.tools.utils.DateUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dataaggre.dto.datastats.form.BaseDataFormDTO; @@ -8,16 +12,19 @@ import com.epmet.dataaggre.dto.datastats.result.SubTopicAndGroupResultDTO; import com.epmet.dataaggre.dto.datastats.result.SubUserTotalResultDTO; import com.epmet.dataaggre.dto.datastats.result.WorkFactResultDTO; import com.epmet.dataaggre.service.datastats.DataStatsService; -import lombok.extern.log4j.Log4j; +import lombok.extern.slf4j.Slf4j; 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.servlet.ModelAndView; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 小程序相关配置,可以放在这,目前只放了footbar @@ -25,7 +32,7 @@ import java.util.List; * @author yinzuomei@elink-cn.com * @date 2021/7/27 18:36 */ -@Log4j +@Slf4j @RestController @RequestMapping("pub") public class PubController { @@ -89,30 +96,52 @@ public class PubController { /** * 导出数据,使用map接收 * - * @param map + * @param formDTO * @param response * @throws IOException + * @return */ - @PostMapping("/exportExcel") - public void exportExcel(@RequestBody BaseDataFormDTO formDTO, HttpServletResponse response) throws IOException { - /* try { - Map mapData = new HashMap<>(); - BaseStatsDataResultDTO baseStatsData = dataStatsService.getBaseStatsData(formDTO); - String templatePath = "excel/trace_temp.xlsx"; - log.info("exportExcel templatePath:{}",templatePath); - mapData.put("dataType", baseStatsData); + @RequestMapping("/exportExcel") + public ModelAndView exportExcel(@RequestBody BaseDataFormDTO formDTO) { + //String paramStr = "{\"agencyId\":\"7b6f9a9f9f38d5f9fa7ce94a93d6eb28\",\"agencyLevel\":\"city\",\"dateId\":\"20210616\",\"type\":\"thisWeek\",\"agencyName\":\"组织名称\"}"; + //formDTO = JSON.parseObject(paramStr, BaseDataFormDTO.class); + Map mapData = new HashMap<>(); + mapData.put("collectData", dataStatsService.getBaseStatsData(formDTO)); + mapData.put("subWorkFactList", dataStatsService.getSubWorkFact(formDTO)); + mapData.put("subUserTotalList", dataStatsService.subUserTotal(formDTO)); + mapData.put("subTopicAndGroupList", dataStatsService.subTopicAndGroup(formDTO)); + mapData.put("orgName",formDTO.getAgencyName()); + mapData.put("type",getSearchTimeStr(formDTO.getType())); + + long start = System.currentTimeMillis(); + //自定义导出字段 + //String templatePath = this.getClass().getClassLoader().getResource("excel/data_template.xlsx").getPath(); - start = System.currentTimeMillis(); - Workbook workbook = ExcelExportUtil.exportExcel(new TemplateExportParams(templatePath, "数据汇总"), baseStatsData); - //header - response.setHeader("content-Type", "application/vnd.ms-excel"); - response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("继续追踪导出详情-".concat(DateUtils.formatDate()) + ".xlsx", "UTF-8")); - //加密 - log.error("excelExport build wb cost:{}",System.currentTimeMillis()-start); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - }*/ + String templatePath = "excel/data_template.xlsx"; + log.info("exportExcel templatePath:"+templatePath); + ModelAndView mv = new ModelAndView(new EasypoiTemplateExcelView()); + mv.addObject(TemplateExcelConstants.FILE_NAME, DateUtils.format(new Date(),DateUtils.DATE_TIME_NO_SPLIT)); + TemplateExportParams templateExportParams = new TemplateExportParams(templatePath); + Integer[] integers = {0,1,2,3}; + templateExportParams.setSheetNum(integers); + mv.addObject(TemplateExcelConstants.PARAMS, templateExportParams); + mv.addObject(TemplateExcelConstants.MAP_DATA, mapData); + log.info("excelExport cost:{}",System.currentTimeMillis()-start); + return mv; + } + private String getSearchTimeStr(String type){ + //昨日/本周/本月 + switch (type){ + case "yesterday": + return "昨日"; + case "thisWeek": + return "本周"; + case "thisMonth": + return "本月"; + default: + return ""; + } } } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java index ac853e29e7..0fede9e608 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/datastats/impl/DataStatsServiceImpl.java @@ -1702,14 +1702,12 @@ public class DataStatsServiceImpl implements DataStatsService { } //4.按用户数降序排序并返回 - Collections.sort(resultList, new Comparator() { - @Override - public int compare(SubUserTotalResultDTO o1, SubUserTotalResultDTO o2) { - //降序 - return o2.getUserTotal().compareTo(o1.getUserTotal()); - } + Collections.sort(resultList, (o1, o2) -> { + //降序 + return o2.getUserTotal().compareTo(o1.getUserTotal()); }); - + AtomicInteger i = new AtomicInteger(1); + resultList.forEach(e->e.setSort(i.getAndIncrement())); return resultList; } @@ -1792,14 +1790,12 @@ public class DataStatsServiceImpl implements DataStatsService { } //4.按用户数降序排序并返回 - Collections.sort(resultList, new Comparator() { - @Override - public int compare(SubTopicAndGroupResultDTO o1, SubTopicAndGroupResultDTO o2) { - //降序 - return o2.getTopicTotal().compareTo(o1.getTopicTotal()); - } + Collections.sort(resultList, (o1, o2) -> { + //降序 + return o2.getTopicTotal().compareTo(o1.getTopicTotal()); }); - + AtomicInteger i = new AtomicInteger(1); + resultList.forEach(e->e.setSort(i.getAndIncrement())); return resultList; } diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/excel/data_template.xlsx b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/excel/data_template.xlsx new file mode 100644 index 0000000000..af7104be32 Binary files /dev/null and b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/excel/data_template.xlsx differ diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/datastats/FactGridMemberStatisticsDailyDao.xml b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/datastats/FactGridMemberStatisticsDailyDao.xml index fdbb6fdc04..ffec0be996 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/datastats/FactGridMemberStatisticsDailyDao.xml +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/resources/mapper/datastats/FactGridMemberStatisticsDailyDao.xml @@ -85,9 +85,11 @@ from fact_grid_member_statistics_daily member - - member.GRID_ID = #{gridId} + member.GRID_ID in ( + + #{gridId} + ) and member.STAFF_NAME like CONCAT('%',#{searchedStaffName},'%') diff --git a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/AdvancedBranchRankFormDTO.java b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/AdvancedBranchRankFormDTO.java index 27f638f3d2..cd3cf536af 100644 --- a/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/AdvancedBranchRankFormDTO.java +++ b/epmet-module/data-report/data-report-client/src/main/java/com/epmet/evaluationindex/screen/dto/form/AdvancedBranchRankFormDTO.java @@ -29,8 +29,9 @@ public class AdvancedBranchRankFormDTO implements Serializable { private String monthId; /** - * 组织类型 agency grid + * areaCode */ - private String orgType; + private String areaCode; + public interface AddUserInternalGroup {} } 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 51729c6479..43d30e9193 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 @@ -260,9 +260,17 @@ WHERE dm.del_flag = '0' AND rd.del_flag = '0' + + + AND org.AREA_CODE LIKE concat(#{areaCode}, '%') + + + AND dm.all_parent_ids LIKE concat('%', #{agencyId}, '%') + + AND dm.org_type = 'grid' AND dm.month_id = #{monthId} - AND dm.all_parent_ids LIKE concat('%', #{agencyId}, '%') + ORDER BY dm.index_total DESC LIMIT #{topNum}