Commit 98cac6df by shenjunjie

首次提交

parents
/target/
!.mvn/wrapper/maven-wrapper.jar
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
/log
*.log
/target
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhiwei</groupId>
<artifactId>brandkbs2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>brandkbs2</name>
<description>品牌知识库2.0</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<springboot.version>2.2.5.RELEASE</springboot.version>
<qbjc.bean.version>1.1.6.4-SNAPSHOT</qbjc.bean.version>
<springfox.version>2.7.0</springfox.version>
<fastjson.version>1.2.47</fastjson.version>
<easyexcel.version>3.0.5</easyexcel.version>
<marker.client.version>1.1.9-SNAPSHOT</marker.client.version>
<base-objects.version>2.0.0-SNAPSHOT</base-objects.version>
<es.version>7.9.2</es.version>
<dozer.version>5.5.1</dozer.version>
<dubbo.version>2.7.4.1</dubbo.version>
<curator.version>2.12.0</curator.version>
<push.log.version>2.17.0-SNAPSHOT</push.log.version>
</properties>
<dependencies>
<!-- 用户中心 -->
<dependency>
<groupId>com.zhiwei.middleware</groupId>
<artifactId>auth-center-client-autoconfigure</artifactId>
<version>0.0.9-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version>
</dependency>
<!--qbjc-bean -->
<dependency>
<groupId>com.zhiwei</groupId>
<artifactId>qbjc-bean</artifactId>
<version>${qbjc.bean.version}</version>
</dependency>
<!--spring-boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
<exclusion>
<artifactId>spring-boot-starter-validation</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--quartz-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox.version}</version>
</dependency>
<!-- alibaba -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- 标注中间件 -->
<dependency>
<groupId>com.zhiwei.middleware</groupId>
<artifactId>marker-client</artifactId>
<version>${marker.client.version}</version>
</dependency>
<!-- 基础包 -->
<dependency>
<groupId>com.zhiwei.base</groupId>
<artifactId>base-objects</artifactId>
<version>${base-objects.version}</version>
</dependency>
<!-- es -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${es.version}</version>
<exclusions>
<exclusion>
<artifactId>elasticsearch</artifactId>
<groupId>org.elasticsearch</groupId>
</exclusion>
<exclusion>
<artifactId>elasticsearch-rest-client</artifactId>
<groupId>org.elasticsearch.client</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>${es.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${es.version}</version>
<exclusions>
<exclusion>
<artifactId>log4j-api</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>${es.version}</version>
</dependency>
<!--dozer 实体类转换工具-->
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer-spring</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.8.0</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.zhiwei</groupId>
<artifactId>push-log</artifactId>
<version>${push.log.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<testSource>${java.version}</testSource>
<testTarget>${java.version}</testTarget>
</configuration>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<forkMode>once</forkMode>
<skipTests>true</skipTests>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- 平台登录的账号的用户名 -->
<sonar.login>shenjunjie</sonar.login>
<!-- SonarQube平台登录的账号的密码 -->
<sonar.password>shenjunjie</sonar.password>
<!-- SonarQube访问地址 -->
<sonar.host.url>https://sonar.zhiweidata.com</sonar.host.url>
<!-- 代码分析包括哪些文件需要分析,英文逗号分隔 -->
<sonar.inclusions>**/*.java,**/*.xml</sonar.inclusions>
</properties>
</profile>
</profiles>
<distributionManagement>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>User Porject Snapshot</name>
<url>http://192.168.0.30:8081/nexus/content/repositories/snapshots/</url>
<uniqueVersion>true</uniqueVersion>
</snapshotRepository>
<repository>
<id>nexus-releases</id>
<name>User Porject Release</name>
<url>http://192.168.0.30:8081/nexus/content/repositories/releases/</url>
</repository>
</distributionManagement>
<repositories>
<repository>
<id>nexus-snapshots</id>
<name>User Porject Snapshot</name>
<url>http://192.168.0.30:8081/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>nexus-releases</id>
<name>User Porject Snapshot</name>
<url>http://192.168.0.30:8081/nexus/content/repositories/releases/</url>
</repository>
</repositories>
</project>
package com.zhiwei.brandkbs2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* @author sjj
* @version 1.0
* @description
* @date 2022年4月18日9:54:31
*/
@EnableScheduling
@EnableCaching
/** mongoDB自定义启动 */
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, DataSourceAutoConfiguration.class})
@EnableAspectJAutoProxy
public class Brandkbs2Application {
public static void main(String[] args) {
SpringApplication.run(Brandkbs2Application.class, args);
}
}
package com.zhiwei.brandkbs2.auth;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import java.lang.annotation.*;
/**
* @author zzm
* @version V1.0
* @description 权限注解
* @date 2018/7/13 15:47
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Auth {
RoleEnum role();
}
package com.zhiwei.brandkbs2.auth;
import com.alibaba.fastjson.JSON;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.model.CommonCodeEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.UserInfo;
import com.zhiwei.brandkbs2.service.IUserService;
import com.zhiwei.middleware.auth.util.JwtUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Map;
/**
* @author sjj
* @version 1.0
* @description 权限切面
* @date 2022年4月18日11:02:02
*/
@Aspect
@Component
public class AuthAspect {
@Value("${jwt.key}")
private String jwtKey;
@Resource(name = "userServiceImpl")
private IUserService iUserService;
@Pointcut("execution(com.zhiwei.brandkbs2.model.ResponseResult com.zhiwei.brandkbs2.controller..*.*(..))")
// @Pointcut("within(com.zhiwei.brandkbs2.controller..*)")
public void auth() {
}
@Around("auth()")
public Object aroundCheckToken(ProceedingJoinPoint joinPoint) throws Throwable {
Signature signature = joinPoint.getSignature();
Method method = ((MethodSignature) signature).getMethod();
Class<?> classTarget = joinPoint.getTarget().getClass();
// 优先使用方法权限
Auth auth = method.getAnnotation(Auth.class);
if (null == auth) {
auth = classTarget.getAnnotation(Auth.class);
}
// 不需要验证权限
boolean noAuth = null == auth;
ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
HttpServletRequest request = servletRequestAttributes.getRequest();
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
String token = request.getHeader(jwtKey);
// 不存在token
if (null == token) {
return unAuthenticatedResponse(response, noAuth, joinPoint);
}
Map<String, Object> tokenInfo = JwtUtil.unsign(token, Map.class);
// 解析失败
if (null == tokenInfo) {
return unAuthenticatedResponse(response, noAuth, joinPoint);
}
String uid = tokenInfo.get(GenericAttribute.USER_ID).toString();
UserInfo userInfo = iUserService.queryUserInfo(uid, request.getHeader("pid"));
if (!noAuth && null == userInfo) {
return unAuthoriseResponse(response);
}
if (noAuth || (userInfo.getRoleId() <= auth.role().getState())) {
if (null == userInfo) {
userInfo = new UserInfo().setUserId(uid).setProjectId(request.getHeader("pid"));
}
UserThreadLocal.set(userInfo);
Object proceed = joinPoint.proceed();
UserThreadLocal.clear();
return proceed;
}
return unAuthoriseResponse(response);
}
// private Object localTestResponse(ProceedingJoinPoint joinPoint) throws Throwable {
// Map<String, Object> userInfo = new HashMap<>();
// userInfo.put("uid", "62734429af874c48ca5f7408");
// userInfo.put("rid", 1);
// userInfo.put("pid", "62661d5a06af3c654db15f53");
// UserThreadLocal.set(userInfo);
// Object proceed = joinPoint.proceed();
// UserThreadLocal.clear();
// return proceed;
// }
private Object unAuthenticatedResponse(HttpServletResponse response, boolean noAuth, ProceedingJoinPoint joinPoint) throws Throwable {
if (noAuth) {
return joinPoint.proceed();
}
if (null != response) {
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
response.setStatus(200);
PrintWriter printWriter = response.getWriter();
String json = JSON.toJSONString(new ResponseResult(CommonCodeEnum.UNAUTHENTICATED, Collections.EMPTY_LIST));
printWriter.write(json);
printWriter.flush();
printWriter.close();
}
return null;
}
private Object unAuthoriseResponse(HttpServletResponse response) throws Exception {
if (null != response) {
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
response.setStatus(200);
PrintWriter printWriter = response.getWriter();
String json = JSON.toJSONString(new ResponseResult(CommonCodeEnum.UN_AUTHORISE, Collections.EMPTY_LIST));
printWriter.write(json);
printWriter.flush();
printWriter.close();
}
return null;
}
}
package com.zhiwei.brandkbs2.auth;
import com.zhiwei.brandkbs2.pojo.UserInfo;
import java.util.Map;
/**
* @author sjj
* @version V1.0
* @description 存储当前线程的用户信息
* @date 2022年4月18日11:11:31
**/
public class UserThreadLocal {
private static final ThreadLocal<UserInfo> TOKEN_USER_INFO = new ThreadLocal<>();
public static Map<String, Object> get() {
return TOKEN_USER_INFO.get().toMap();
}
public static String getNickname() {
return TOKEN_USER_INFO.get().getNickname();
}
public static String getUserId() {
return TOKEN_USER_INFO.get().getUserId();
}
public static String getProjectId() {
return TOKEN_USER_INFO.get().getProjectId();
}
public static int getRoleId() {
return TOKEN_USER_INFO.get().getRoleId();
}
public static void set(UserInfo userInfo) {
TOKEN_USER_INFO.set(userInfo);
}
public static void clear() {
TOKEN_USER_INFO.remove();
}
}
package com.zhiwei.brandkbs2.common;
import com.zhiwei.middleware.mark.service.MarkerClient;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import java.util.concurrent.TimeUnit;
/**
* @author sjj
* @version 1.0
* @description 项目的配置
* @date 2022年4月24日11:10:50
**/
@Configuration
public class CommonConfig {
@Value("${application.name}")
private String appName;
@Value("${mark.registry.address}")
private String clientRegistry;
@Value("${mark.provider.group}")
private String providerGroup;
@Bean
public RestTemplate restTemplate() {
final OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
return new RestTemplate(new OkHttp3ClientHttpRequestFactory(client));
}
/**
* 获取标注中间件客户端
*
* @return 标注中间件客户端
*/
@Bean
public MarkerClient getMarkerClient() {
return MarkerClient.getService(clientRegistry, providerGroup, appName);
}
}
package com.zhiwei.brandkbs2.common;
import com.zhiwei.brandkbs2.es.ITaskService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @ClassName: ControlCenter
* @Description 主控中心
* @author: sjj
* @date: 2022-06-08 17:39
*/
@Component
public class ControlCenter {
public static final Logger log = LogManager.getLogger(ControlCenter.class);
@Resource(name = "taskServiceImpl")
private ITaskService taskService;
@Async("scheduledExecutor")
@Scheduled(cron = "0 0 1 * * ?")
public void messageFlowCount() {
log.info("定时按天录入各小时渠道进量-启动");
try {
taskService.channelRecordFromEs(1);
} catch (Exception e) {
log.error("定时按天录入各小时渠道进量-出错", e);
} finally {
log.info("定时按天录入各小时渠道进量-结束");
}
}
}
package com.zhiwei.brandkbs2.common;
/**
* @ClassName: GenericAttribute
* @Description 一般属性值
* @author: sjj
* @date: 2022-04-21 10:10
*/
public class GenericAttribute {
private GenericAttribute() {
}
/**
* es index
*/
public static final String ES_INDEX_PRE = "brandkbs2";
public static final String ES_INDEX_TEST = "brandkbs_test";
/** es c2 **/
public static final String ES_C2 = "c2";
/** es c5 **/
public static final String ES_C5 = "c5";
/** es foreign **/
public static final String ES_FOREIGN = "foreign";
/** es source **/
public static final String ES_SOURCE = "source";
/** es real_source **/
public static final String ES_REAL_SOURCE = "real_source";
/** es time **/
public static final String ES_TIME = "time";
/** es ctime **/
public static final String ES_CTIME = "ctime";
/** es mtime **/
public static final String ES_MTIME = "mtime";
/** es mtag **/
public static final String ES_MTAG = "mtag";
/** es mgroup **/
public static final String ES_MGROUP = "mgroup";
/** es forward **/
public static final String ES_FORWARD = "forward";
/** es brandkbs_cache_maps **/
public static final String ES_BRANDKBS_CACHE_MAPS = "brandkbs_cache_maps";
/** es mark_cache_maps **/
public static final String ES_MARK_CACHE_MAPS = "mark_cache_maps";
public static final String LINKED_GROUP_ID = "linkedGroupId";
// public static final String PLATFORM = "platform";
/**
* 用户属性
*/
public static final String NICK_NAME = "nickname";
public static final String USER_ID = "userId";
public static final String ROLE_ID = "roleId";
public static final String PROJECT_ID = "projectId";
public static final String AVATAR_URL= "avatarUrl";
/**
* 标签相关
*/
public static final String EMOTION_LABEL_KEY = "情感倾向";
public static final String BRAND_LABEL_KEY = "品牌归属";
/**
* 报告相关
*/
public static final String MONTH_REPORT = "月报";
public static final String WEEK_REPORT = "周报";
// public enum ChannelParam{
// 负面稿件数("negativeArticles"),
// 参与负面事件("negativeEvents"),
// 特殊稿件("specialArticles"),
// 经验判断("experience"),
// 正面_中性("positiveNeutral"),
// 正面_负面("positiveNegative"),
// 参与正面事件("positiveEvents");
//
// final String value;
// ChannelParam(String value){
// this.value = value;
// }
// public String value(){
// return value;
// }
// }
}
package com.zhiwei.brandkbs2.common;
import com.zhiwei.brandkbs2.service.ISystemInfoService;
import com.zhiwei.qbjc.bean.pojo.common.MessagePlatform;
import com.zhiwei.qbjc.bean.pojo.common.Tag;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @ClassName: GlobalPojo
* @Description 全局对象类
* @author: sjj
* @date: 2022-06-16 14:14
*/
@Component
public class GlobalPojo {
public static final Logger log = LogManager.getLogger(GlobalPojo.class);
@Resource(name = "systemInfoServiceImpl")
private ISystemInfoService systemInfoService;
/**
* 监测系统平台
**/
public static List<MessagePlatform> PLATFORMS;
/**
* 监测系统平台
**/
public static Map<String, List<Tag>> TAGS;
@PostConstruct
public void start() {
try {
updatePojo("启动获取");
} catch (Exception e) {
log.info("启动获取-出错", e);
}
}
@Async("scheduledExecutor")
@Scheduled(cron = "0 0/10 * * * ?")
public void updatePojo() {
try {
updatePojo("每十分钟");
} catch (Exception e) {
log.info("每10分钟更新任务失败", e);
}
}
private void updatePojo(String logMsg) {
PLATFORMS = systemInfoService.getPlatforms();
TAGS = systemInfoService.getTags().stream().collect(Collectors.groupingBy(Tag::getGroupName));
}
}
package com.zhiwei.brandkbs2.common;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import java.util.Objects;
/**
* @ClassName: RedisKeyPrefix
* @Description 缓存Key前缀整合类
* @author: sjj
* @date: 2022-05-23 14:28
*/
public class RedisKeyPrefix {
private RedisKeyPrefix() {
}
private static final String SEPARATOR = ":";
/**
* 稿件数据上传缓存key
*/
private static final String EVENT_DATA_UPLOAD_PROGRESS = "brandkbs:event:eventData:progress:";
/**
* 舆情事件导入进展
*/
private static final String YUQING_PROGRESS = "brandkbs:event:yuqingImport:progress:";
/**
* 舆情事件分析进度
*/
private static final String EVENT_ANALYSIS_PROGRESS = "brandkbs:event:analysis:progress:";
public static String eventAnalysisProgress(String eventId) {
return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.EVENT_ANALYSIS_PROGRESS, UserThreadLocal.getProjectId(), eventId);
}
public static String yuqingProgressKey(String linkedGroupId) {
return yuqingProgressKey(UserThreadLocal.getProjectId(), linkedGroupId);
}
public static String yuqingProgressKey(String projectId, String linkedGroupId) {
return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.YUQING_PROGRESS, projectId, linkedGroupId);
}
public static String eventDataProgressKey(String ticket) {
return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.EVENT_DATA_UPLOAD_PROGRESS, UserThreadLocal.getProjectId(), ticket);
}
private static String generateRedisKey(String... keys) {
Objects.requireNonNull(keys);
StringBuilder sb = new StringBuilder(keys[0]);
for (int i = 1; i < keys.length; i++) {
sb.append(SEPARATOR).append(keys[i]);
}
return sb.toString();
}
}
package com.zhiwei.brandkbs2.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Description:
* @Author: shentao
* @Date: 2020/4/27 13:47
*/
@Component
@Data
@ConfigurationProperties(prefix = "es")
public class EsProperties {
/**
* httpClusterNodes
*/
private String httpClusterNodes;
/**
* clusterName 集群名
*/
private String clusterName;
/**
* 集群节点s
*/
private String clusterNodes;
private String username;
private String password;
}
package com.zhiwei.brandkbs2.config;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
/**
* MongoConfig
*
* @ClassName: MongoConfig
* @Description MongoConfig
* @author shentao
* @date 2019年7月8日 上午10:32:02
*/
@Configuration
public class MongoConfig {
public static final Logger log = LogManager.getLogger(MongoConfig.class);
@Value("${mongo.connectionsPerHost}")
private int connectionsPerHost;
@Value("${mongo.threadsAllowedToBlockForConnectionMultiplier}")
private int threadsAllowedToBlockForConnectionMultiplier;
@Value("${mongo.connectTimeout}")
private int connectTimeout;
@Value("${mongo.maxWaitTime}")
private int maxWaitTime;
@Value("${mongo.autoConnectRetry}")
private boolean autoConnectRetry;
@Value("${mongo.socketKeepAlive}")
private boolean socketKeepAlive;
@Value("${mongo.socketTimeout}")
private int socketTimeout;
@Value("${mongo.slaveOk}")
private boolean slaveOk;
@Value("${primary.uri}")
private String uri;
@Value("${secondary.uri}")
private String uri2;
private MongoDbFactory mongoDbFactory() {
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
builder.connectionsPerHost(connectionsPerHost);
builder.connectTimeout(connectTimeout);
builder.threadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier);
builder.maxWaitTime(maxWaitTime);
return new SimpleMongoDbFactory(new MongoClientURI(uri, builder));
}
@Primary
@Bean(name = "primaryMongoTemplate")
public MongoTemplate getMongoTemplate() {
log.info("@Primary");
MongoDbFactory mongoDbFactory = mongoDbFactory();
DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, new MongoMappingContext());
// 不插入_class
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
return new MongoTemplate(mongoDbFactory(), converter);
}
@Primary
@Bean(name = "secondaryMongoTemplate")
public MongoTemplate getMongoTemplate2() {
log.info("@Secondary");
MongoDbFactory mongoDbFactory = mongoDbFactory2();
DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, new MongoMappingContext());
// 不插入_class
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
return new MongoTemplate(mongoDbFactory2(), converter);
}
private MongoDbFactory mongoDbFactory2() {
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
builder.connectionsPerHost(connectionsPerHost);
builder.connectTimeout(connectTimeout);
builder.threadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier);
builder.maxWaitTime(maxWaitTime);
return new SimpleMongoDbFactory(new MongoClientURI(uri2, builder));
}
}
package com.zhiwei.brandkbs2.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: Swagger2Config
* @Description Swagger2Config
* @author: sjj
* @date: 2022-05-11 11:21
*/
@Configuration
@EnableSwagger2
public class Swagger2Configuration {
@Value("${jwt.key}")
private String jwtKey;
private static final String PID_KEY = "pid";
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.zhiwei.brandkbs2.controller"))
.paths(PathSelectors.any())
.build().securitySchemes(securitySchemes()).securityContexts(securityContexts());
}
private List<SecurityContext> securityContexts() {
List<SecurityContext> securityContextList = new ArrayList<>();
List<SecurityReference> securityReferenceList = new ArrayList<>();
securityReferenceList.add(new SecurityReference(jwtKey, scopes()));
securityReferenceList.add(new SecurityReference(PID_KEY, scopes()));
securityContextList.add(SecurityContext
.builder()
.securityReferences(securityReferenceList)
.forPaths(PathSelectors.any())
.build()
);
return securityContextList;
}
private AuthorizationScope[] scopes() {
return new AuthorizationScope[]{new AuthorizationScope("global", "accessAnything")};
}
private List<ApiKey> securitySchemes() {
List<ApiKey> apiKeyList = new ArrayList<>();
apiKeyList.add(new ApiKey(jwtKey, jwtKey, "header"));
apiKeyList.add(new ApiKey(PID_KEY, PID_KEY, "header"));
return apiKeyList;
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("品牌知识库2.0api文档")
.description("品牌知识库2.0api文档")
// .termsOfServiceUrl("/")
.version("1.0")
.build();
}
}
package com.zhiwei.brandkbs2.config;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @ClassName: TaskPoolConfig
* @Description 线程池配置类
* @author: sjj
* @date: 2022-06-16 10:01
*/
@Configuration
@EnableAsync
public class TaskPoolConfig {
private static final Logger log = LogManager.getLogger(TaskPoolConfig.class);
@Bean
public Executor scheduledExecutor() {
log.info("start scheduledExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 配置核心线程数
executor.setCorePoolSize(5);
// 配置最大线程数
executor.setMaxPoolSize(5);
// 配置队列大小
executor.setQueueCapacity(10);
// 配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("scheduled-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 执行初始化
executor.initialize();
return executor;
}
@Bean
public ThreadPoolTaskExecutor esSearchExecutor() {
log.info("start esSearchExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 配置核心线程数
executor.setCorePoolSize(8);
// 配置最大线程数
executor.setMaxPoolSize(8);
// 配置队列大小
executor.setQueueCapacity(16);
// 配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("esSearch-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 执行初始化
executor.initialize();
return executor;
}
}
package com.zhiwei.brandkbs2.controller;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName: AppArticleController
* @Description 提供前台稿件相关信息展示
* @author: sjj
* @date: 2022-06-20 09:27
*/
@RestController
@RequestMapping("/app/articles")
@Api(tags = "前台稿件展示接口", description = "提供前台稿件相关信息展示")
@Auth(role = RoleEnum.CUSTOMER)
public class AppArticleController extends BaseController{
}
package com.zhiwei.brandkbs2.controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author sjj
* @version 1.0
* @description 基础Controller
* @date 2022年4月25日17:31:54
**/
public class BaseController {
/**
* http请求
*/
protected HttpServletRequest request;
/**
* http响应
*/
protected HttpServletResponse response;
@ModelAttribute
public void setRequestAndResponse(HttpServletRequest request, HttpServletResponse response) {
this.request = request;
this.response = response;
}
}
\ No newline at end of file
package com.zhiwei.brandkbs2.controller;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.service.ICommonService;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.middleware.mark.pojo.enums.TagField;
import com.zhiwei.middleware.mark.vo.MarkerTag;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @ClassName: CommonController
* @Description 基础信息接口
* @author: sjj
* @date: 2022-06-02 10:02
*/
@RestController
@RequestMapping("/common")
@Api(tags = "基础信息接口", description = "提供基础信息查询")
@Auth(role = RoleEnum.COMMON_ADMIN)
public class CommonController extends BaseController {
@Value("${qbjc.platform.url}")
private String qbjcPlatformUrl;
@Autowired
private RestTemplate restTemplate;
@Resource(name = "commonServiceImpl")
ICommonService commonService;
@ApiOperation("获取情感倾向标签信息")
@ApiImplicitParam(name = "linkedGroupId", value = "关联项目ID", required = true, paramType = "path", dataType = "string")
@GetMapping("/get/tag/emotion/{linkedGroupId}")
public ResponseResult getTagsWithEmotion(@PathVariable(value = "linkedGroupId") String linkedGroupId) {
List<String> res = new ArrayList<>();
List<MarkerTag> tags = commonService.getQbjcTags(linkedGroupId, TagField.GROUP_NAME.is("情感倾向"));
if (null != tags) {
res = tags.stream().map(MarkerTag::getName).collect(Collectors.toList());
}
return ResponseResult.success(res);
}
@ApiOperation("获取平台类型")
@GetMapping("/get/platform")
public ResponseResult getPlatform() {
try {
HttpEntity<JSONObject> entity = restTemplate.getForEntity(qbjcPlatformUrl, JSONObject.class);
return ResponseResult.success(Objects.requireNonNull(entity.getBody()).getJSONArray("data").toJavaList(JSONObject.class).stream().map(json -> json.getString("name")).collect(Collectors.toList()));
} catch (Exception e) {
return ResponseResult.failure(e.getMessage());
}
}
@ApiOperation("测试接口")
@GetMapping("/test")
public ResponseResult test() {
return ResponseResult.success("true");
}
}
package com.zhiwei.brandkbs2.controller;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.brandkbs2.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @ClassName: LoginController
* @Description 登录接口
* @author: sjj
* @date: 2022-05-05 13:56
*/
@RestController
@Api(tags = "用户登录接口", description = "实现用户登录")
public class LoginController extends BaseController {
@Value("${jwt.key}")
private String jwtKey;
@Value("${jwt.hour}")
private int jwtHour;
@Resource(name = "userServiceImpl")
private IUserService iUserService;
@Resource(name = "projectServiceImpl")
private IProjectService iProjectService;
@ApiOperation("用户登录")
@PostMapping("/user/login")
public ResponseResult login() {
return ResponseResult.success(iUserService.login().toMap());
}
@ApiOperation("用户信息获取")
@GetMapping("/user/getLoginInfo")
@Auth(role = RoleEnum.CUSTOMER)
public ResponseResult getLoginInfo() {
return ResponseResult.success(UserThreadLocal.get());
}
@ApiOperation("重置绑定关系(本地测试)")
@ApiImplicitParams(
@ApiImplicitParam(name = "username", value = "用户名", required = false, paramType = "query", dataType = "string"))
@PostMapping("/user/bind/reset")
public ResponseResult resetBind(@RequestBody JSONObject json) {
iUserService.resetBind(json.getString("username"));
return ResponseResult.success();
}
@ApiOperation("老用户账号绑定")
@ApiImplicitParams({
@ApiImplicitParam(name = "username", value = "用户名", required = false, paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "password", value = "密码", required = false, paramType = "query", dataType = "string")})
@PostMapping("/user/bind")
public ResponseResult bindUser(@RequestBody JSONObject json) {
String username = json.getString("username");
String password = json.getString("password");
return ResponseResult.success(iUserService.bindUser(username, password));
}
@ApiOperation("跳过绑定(赋默认权限)")
@PostMapping("/user/bind/skip")
public ResponseResult skipBindUser() {
return ResponseResult.success(iUserService.skipBindUser());
}
@ApiOperation("校验用户是否已有绑定关系")
@GetMapping("/user/login/checkBind")
public ResponseResult checkBind() {
return ResponseResult.success(iUserService.checkUserRoles());
}
@ApiOperation("获取当前用户拥有的所有项目(含过期)")
@GetMapping("/user/login/getUserAllProjects")
public ResponseResult getLoginUserAllProjects() {
return ResponseResult.success(iProjectService.getLoginUserAllProjects());
}
}
package com.zhiwei.brandkbs2.controller.admin;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.service.IBehaviorService;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.brandkbs2.util.Tools;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName: ArticleController
* @Description 稿件上传接口
* @author: sjj
* @date: 2022-05-17 09:15
*/
@RestController
@RequestMapping("/admin/article")
@Api(tags = "稿件上传接口", description = "提供稿件的上传功能")
@Auth(role = RoleEnum.COMMON_ADMIN)
public class ArticleController extends BaseController {
public static final Logger log = LogManager.getLogger(ArticleController.class);
@Value("${qbjc.interface.url}")
private String yuqingInterface;
@Value("${qbjc.interface.upload.token}")
private String token;
@Autowired
private RestTemplate restTemplate;
@javax.annotation.Resource(name = "behaviorServiceImpl")
private IBehaviorService behaviorService;
@javax.annotation.Resource(name = "projectServiceImpl")
private IProjectService projectService;
private static final Behavior.Operation OPERATION = new Behavior.Operation("稿件上传", true);
@ApiOperation("稿件上传-稿件模板下载")
@ApiImplicitParams(@ApiImplicitParam(name = "linkedGroupId", value = "绑定项目组名", required = true, paramType = "query", dataType = "string"))
@GetMapping("/upload/template/form")
public ResponseResult downloadTemplateForm(@RequestParam String linkedGroupId) {
try {
String group = projectService.getProjectByLinkedGroupId(linkedGroupId).getBrandLinkedGroup();
HttpEntity<String> requestEntity = new HttpEntity<>(getHeaders());
HttpEntity<Resource> entity = restTemplate.exchange(yuqingInterface + "/upload/template/form?project=" + group, HttpMethod.GET, requestEntity, Resource.class);
if (null != entity.getBody()) {
Tools.download(entity.getBody().getInputStream(), response.getOutputStream(), group + "_稿件模板", response);
}
return ResponseResult.success();
} catch (Exception e) {
log.error("稿件上传-稿件模板下载异常", e);
return ResponseResult.failure("稿件上传-稿件模板下载异常");
}
}
@ApiOperation("稿件上传-下载表格上传信息")
@ApiImplicitParams({@ApiImplicitParam(name = "formType", value = "表格类型:上传失败/上传成功", paramType = "body", dataType = "string"), @ApiImplicitParam(name = "id", value = "任务id", paramType = "body", dataType = "string")})
@PostMapping(value = "/upload/list/download/file")
public ResponseResult downloadUploadList(@RequestBody JSONObject info) {
try {
String id = info.getString("id");
String formType = info.getString("formType");
HttpEntity<JSONObject> requestEntity = new HttpEntity<>(getHeaders());
HttpEntity<Resource> entity = restTemplate.exchange(yuqingInterface + "/upload/list/download/file/" + id + "?formType=" + formType, HttpMethod.GET, requestEntity, Resource.class);
if (null != entity.getBody()) {
Tools.download(entity.getBody().getInputStream(), response.getOutputStream(), id + "_" + formType, response);
}
return ResponseResult.success();
} catch (Exception e) {
log.error("稿件上传-下载表格上传信息", e);
return ResponseResult.failure("稿件上传下载表格上传信息");
}
}
@ApiOperation("稿件上传-获取上传数据详情")
@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "任务id", required = true, paramType = "query", dataType = "string"), @ApiImplicitParam(name = "page", value = "页码", required = false, defaultValue = "1", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "pageSize", value = "每页记录数", required = false, defaultValue = "10", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "formType", value = "表格类型:上传失败/其他问题", required = true, paramType = "query", dataType = "string")})
@GetMapping("/upload/list/info")
public ResponseResult getListInfo(@RequestParam(value = "id") String id, @RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize, @RequestParam(value = "formType", defaultValue = "1") String formType) {
try {
Map<String, Object> params = new HashMap<>();
params.put("formType", formType);
params.put("id", id);
params.put("page", page);
params.put("pageSize", pageSize);
HttpEntity<String> requestEntity = new HttpEntity<>(getHeaders());
HttpEntity<JSONObject> entity = restTemplate.exchange(yuqingInterface + "/upload/list/info/" + id + "?formType={formType}&id={id}&page={page" + "}&pageSize={pageSize}", HttpMethod.GET, requestEntity, JSONObject.class, params);
// 其他问题数据非分页格式
if ("其他问题".equals(formType)) {
return ResponseResult.convertFromYuQingInterface(entity.getBody(), null);
}
return ResponseResult.convertFromYuQingInterface(entity.getBody(), pageSize);
} catch (Exception e) {
log.error("稿件上传-获取上传数据详情异常", e);
return ResponseResult.failure("稿件上传-获取上传数据详情异常");
}
}
@ApiOperation("稿件上传-获取列表")
@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "pageSize", value = "每页记录数", defaultValue = "10", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "linkedGroupId", value = "绑定项目组ID", required = true, paramType = "query", dataType = "string")})
@GetMapping("/upload/list")
public ResponseResult getList(@RequestParam(value = "linkedGroupId") String linkedGroupId, @RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
try {
Map<String, Object> params = new HashMap<>();
params.put("page", page);
params.put("pageSize", pageSize);
params.put("project", projectService.getProjectByLinkedGroupId(linkedGroupId).getBrandLinkedGroup());
HttpEntity<JSONObject> requestEntity = new HttpEntity<>(getHeaders());
HttpEntity<JSONObject> entity = restTemplate.exchange(yuqingInterface + "/upload/list?page={page}&pageSize={pageSize}&project={project}", HttpMethod.GET, requestEntity, JSONObject.class, params);
return ResponseResult.convertFromYuQingInterface(entity.getBody(), pageSize);
} catch (Exception e) {
log.error("稿件上传-获取列表异常", e);
return ResponseResult.failure("稿件上传-获取列表异常");
}
}
@ApiOperation("稿件上传-获取轮询列表")
@ApiImplicitParams({@ApiImplicitParam(name = "idlist", value = "包含id的列表,示例:{\\\"idlist\":[]}", required = true, paramType = "body", dataType = "list")})
@PostMapping("/upload/list/schedule")
public ResponseResult listSchedule(@RequestBody JSONObject info) {
try {
HttpEntity<JSONObject> requestEntity = new HttpEntity<>(info, getHeaders());
HttpEntity<JSONObject> entity = restTemplate.exchange(yuqingInterface + "/upload/list/schedule", HttpMethod.POST, requestEntity, JSONObject.class);
return ResponseResult.convertFromYuQingInterface(entity.getBody(), null);
} catch (Exception e) {
log.error("稿件上传-获取轮询列表异常", e);
return ResponseResult.failure("稿件上传-获取轮询列表异常");
}
}
@ApiOperation("稿件上传-上传表格")
@ApiImplicitParams({@ApiImplicitParam(name = "file", value = "上传表格", required = true, paramType = "form", dataType = "multipartFile"),
@ApiImplicitParam(name = "linkedGroupId", value = "绑定项目组ID", required = true, paramType = "form", dataType = "string")})
@PostMapping(value = "/upload/form", headers = "content-type=multipart/form-data")
public ResponseResult uploadForm(@RequestParam("file") MultipartFile file, @RequestParam String linkedGroupId) {
try {
MultiValueMap<String, Object> requestMap = new LinkedMultiValueMap<>(1);
ByteArrayResource byteArrayResource = new ByteArrayResource(file.getBytes()) {
@Override
public String getFilename() {
return file.getOriginalFilename();
}
};
requestMap.add("file", byteArrayResource);
requestMap.add("nickName", UserThreadLocal.getNickname());
requestMap.add("project", projectService.getProjectByLinkedGroupId(linkedGroupId).getBrandLinkedGroup());
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(requestMap, getHeadersForm());
HttpEntity<JSONObject> entity = restTemplate.exchange(yuqingInterface + "/upload/form", HttpMethod.POST, requestEntity, JSONObject.class);
behaviorService.pushBehavior(OPERATION, "上传表格", request);
return ResponseResult.convertFromYuQingInterface(entity.getBody(), null);
} catch (Exception e) {
log.error("稿件上传-上传表格异常", e);
return ResponseResult.failure("稿件上传-上传表格异常");
}
}
private HttpHeaders getHeaders() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("token", token);
httpHeaders.set("Content-Type", "application/json");
return httpHeaders;
}
private HttpHeaders getHeadersForm() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("token", token);
httpHeaders.set("Content-Type", "multipart/form-data");
return httpHeaders;
}
}
package com.zhiwei.brandkbs2.controller.admin;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportHighWordDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.dto.TagFilterDTO;
import com.zhiwei.brandkbs2.pojo.vo.ProjectVO;
import com.zhiwei.brandkbs2.service.IHighWordService;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.brandkbs2.service.ITagFilterService;
import com.zhiwei.brandkbs2.util.Tools;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.List;
/**
* @ClassName: BaseModuleController
* @Description 基础模块接口
* @author: sjj
* @date: 2022-05-31 16:06
*/
@RestController
@RequestMapping("/admin/module")
@Api(tags = "基础模块接口", description = "提供基础模块配置")
@Auth(role = RoleEnum.COMMON_ADMIN)
public class BaseModuleController extends BaseController {
@Resource(name = "tagFilterServiceImpl")
ITagFilterService tagFilterService;
@Resource(name = "highWordServiceImpl")
IHighWordService highWordService;
@Resource(name = "projectServiceImpl")
IProjectService projectService;
@ApiOperation("获取在用筛选器列表")
@GetMapping("/tagFilter")
public ResponseResult getTagFilter() {
return ResponseResult.success(tagFilterService.getTagFilter());
}
@ApiOperation("获取所有可选筛选器列表")
@GetMapping("/tagFilter/all")
public ResponseResult getTagFilterAll() {
return ResponseResult.success(tagFilterService.getTagFilterAll());
}
@ApiOperation("编辑筛选器列表")
@PutMapping("/tagFilter/update")
public ResponseResult updateTagFilter(@RequestBody List<TagFilterDTO> tagFilterDTOs) {
tagFilterService.updateTagFilter(tagFilterDTOs);
return ResponseResult.success();
}
@ApiOperation("获取高频关键词列表")
@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "size", value = "每页记录数", defaultValue = "10", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "keyword", value = "搜索关键字", paramType = "query", dataType = "string")})
@GetMapping("/highWord/list")
public ResponseResult findHighWordList(@RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "size", defaultValue = "10") int size, @RequestParam(value = "keyword", defaultValue = "") String keyword) {
return ResponseResult.success(highWordService.findHighWord(page, size, keyword));
}
@ApiOperation("添加高频关键词列表")
@ApiImplicitParams(@ApiImplicitParam(name = "list", value = "高频词列表", paramType = "body", dataType = "list"))
@PostMapping("/highWord/add")
public ResponseResult addHighWordList(@RequestBody JSONObject info) {
List<String> highWords = info.getJSONArray("list").toJavaList(String.class);
highWordService.addHighWordList(highWords);
return ResponseResult.success();
}
@ApiOperation("高频关键词删除")
@DeleteMapping(value = "/highWord/delete/{id}")
public ResponseResult deleteHighWord(@PathVariable String id) {
highWordService.deleteHighWord(id);
return ResponseResult.success();
}
@ApiOperation("高频关键词excel解析")
@PostMapping(value = "/highWord/excel/parse", headers = "content-type=multipart/form-data")
public ResponseResult parseExcelHighWord(@RequestParam("file") MultipartFile file) {
return Tools.parseExcelInfo(file);
}
@ApiOperation("高频关键词下载")
@GetMapping(value = "/highWord/download")
public ResponseResult downloadHighWord() {
List<ExportHighWordDTO> list = highWordService.downloadHighWord();
ProjectVO projectVO = projectService.getProjectVOById(UserThreadLocal.getProjectId());
EasyExcelUtil.download(projectVO.getBrandName() + "_高频关键词", "sheet1", ExportHighWordDTO.class, list, response);
return ResponseResult.success();
}
}
package com.zhiwei.brandkbs2.controller.admin;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.service.IBehaviorService;
import com.zhiwei.brandkbs2.service.IProjectService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @ClassName: BehaviorController
* @Description 用户行为管理接口
* @author: sjj
* @date: 2022-05-27 10:51
*/
@RestController
@RequestMapping("/admin/behavior")
@Api(tags = "用户行为管理接口", description = "提供用户行为的查询和导出功能")
@Auth(role = RoleEnum.COMMON_ADMIN)
public class BehaviorController extends BaseController {
@Resource(name = "behaviorServiceImpl")
private IBehaviorService behaviorService;
@Resource(name = "projectServiceImpl")
private IProjectService iProjectService;
@ApiOperation("分页查询用户行为列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "size", value = "每页记录数", defaultValue = "10", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "startTime", value = "开始时间", required = true, paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", required = true, paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "behavior", value = "行为所属(前台=false,后台=true)", defaultValue = "true", paramType = "query", dataType =
"boolean"),
@ApiImplicitParam(name = "keyword", value = "关键词",defaultValue = "", paramType = "query", dataType = "string"),
})
@GetMapping("/list")
public ResponseResult findList(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size,
@RequestParam("startTime") long startTime,
@RequestParam("endTime") long endTime,
@RequestParam(value = "behavior", defaultValue = "true") boolean behavior,
@RequestParam(value = "keyword", defaultValue = "") String keyword) {
return ResponseResult.success(behaviorService.findBehaviorList(page, size, startTime, endTime, behavior, keyword));
}
@ApiOperation("导出用户行为列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "startTime", value = "开始时间", required = true, paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", required = true, paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "behavior", value = "行为所属(前台=false,后台=true)", defaultValue = "true", paramType = "query", dataType =
"boolean")
})
@GetMapping("/download")
public ResponseResult download(@RequestParam("startTime") long startTime,
@RequestParam("endTime") long endTime,
@RequestParam(value = "behavior", defaultValue = "true") boolean behavior) {
List<ExportBehaviorDTO> downloadList = behaviorService.download(startTime, endTime, behavior);
String behaviorName = behavior ? "后台" : "前台";
String sheetName = iProjectService.getProjectVOById(UserThreadLocal.getProjectId()).getProjectName() + "_" + behaviorName;
EasyExcelUtil.download(sheetName + "用户行为", sheetName, ExportBehaviorDTO.class, downloadList, response);
return ResponseResult.success();
}
}
package com.zhiwei.brandkbs2.controller.admin;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportAdminChannelArticleDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportAdminChannelEventDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportChannelDTO;
import com.zhiwei.brandkbs2.enmus.ExperienceEnum;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.dto.ChannelDTO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.IChannelService;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.brandkbs2.util.Tools;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName: ChannelController
* @Description 基础模块接口
* @author: sjj
* @date: 2022-06-07 15:50
*/
@RestController
@RequestMapping("/admin/channel")
@Api(tags = "渠道模块接口", description = "提供渠道相关功能")
@Auth(role = RoleEnum.COMMON_ADMIN)
public class ChannelController extends BaseController {
@Resource(name = "channelServiceImpl")
IChannelService channelService;
@Resource(name = "projectServiceImpl")
IProjectService projectService;
@Value("${brandkbs.img.url}")
private String brandkbsImgPath;
@Value("${brandkbs.image.url}")
private String brandkbsImageUrl;
@ApiOperation("分页查询渠道列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "pageSize", value = "每页记录数", defaultValue = "10", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "linkedGroupId", value = "关联项目组ID", required = true, paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "emotion", value = "倾向筛选", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "platform", value = "平台筛选", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "show", value = "是否展示", paramType = "query", dataType = "Boolean"),
@ApiImplicitParam(name = "keyword", value = "关键字搜索", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "sorter", defaultValue = "{\"lastTime\":\"descend\"}", value = "排序字段", paramType = "query", dataType = "string")
})
@GetMapping("/list")
public ResponseResult findChannelList(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "pageSize", defaultValue = "10") int size,
@RequestParam(value = "linkedGroupId") String linkedGroupId,
@RequestParam(value = "emotion", defaultValue = "") String emotion,
@RequestParam(value = "platform", defaultValue = "") String platform,
@RequestParam(value = "show", required = false) Boolean show,
@RequestParam(value = "keyword", defaultValue = "") String keyword,
@RequestParam(value = "sorter", defaultValue = "{\"lastTime\":\"descend\"}") String sorter) {
PageVO<JSONObject> channelList = channelService.findChannelList(page, size, linkedGroupId, emotion, platform, show, keyword, sorter);
return ResponseResult.success(channelList);
}
@ApiOperation("分页查询稿件列表")
@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "size", value = "每页记录数", defaultValue = "10", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "channelId", value = "渠道ID", required = true, paramType = "query", dataType = "string")})
@GetMapping("/list/article")
public ResponseResult findArticleList(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size,
@RequestParam(value = "channelId") String channelId) {
return ResponseResult.success(channelService.findArticleList(page, size, channelId));
}
@ApiOperation("分页查询事件列表")
@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "pageSize", value = "每页记录数", defaultValue = "10", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "channelId", value = "渠道ID", required = true, paramType = "query", dataType = "string")})
@GetMapping("/list/event")
public ResponseResult findEventList(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "pageSize", defaultValue = "10") int size,
@RequestParam(value = "channelId") String channelId) {
return ResponseResult.success(channelService.findEventList(page, size, channelId));
}
@ApiOperation("切换展示状态")
@PutMapping("/switch/show/{channelId}")
public ResponseResult switchChannelShow(@PathVariable String channelId) {
channelService.switchChannelShow(channelId);
return ResponseResult.success();
}
@ApiOperation("修改经验评级")
@ApiImplicitParams({
@ApiImplicitParam(name = "channelId", value = "渠道ID", paramType = "body", dataType = "string"),
@ApiImplicitParam(name = "experience", value = "经验评级", paramType = "body", dataType = "string")
})
@PutMapping("/update/experience")
public ResponseResult updateExperience(@RequestBody JSONObject info) {
String channelId = info.getString("channelId");
String experience = info.getString("experience");
channelService.updateExperience(channelId, experience);
return ResponseResult.success();
}
@ApiOperation("获取单个渠道信息")
@ApiImplicitParam(name = "channelId", value = "渠道ID", required = true, paramType = "path", dataType = "int")
@GetMapping("/get/{channelId}")
public ResponseResult getChannel(@PathVariable("channelId") String channelId) {
return ResponseResult.success(channelService.getChannel(channelId));
}
@ApiOperation("修改渠道信息")
@ApiImplicitParams({@ApiImplicitParam(name = "file", value = "上传表格", paramType = "form", dataType = "multipartFile"),
@ApiImplicitParam(name = "id", value = "渠道id", required = true, paramType = "form", dataType = "string"),
@ApiImplicitParam(name = "tag", value = "标签名称", required = true, paramType = "form", dataType = "string")
})
@PostMapping("/update")
public ResponseResult updateChannel(@RequestParam(value = "file", required = false) MultipartFile file, @RequestParam String id,
@RequestParam String tag) {
channelService.updateChannel(new ChannelDTO(id, Tools.uploadFileUrl(file, brandkbsImgPath, brandkbsImageUrl), tag));
return ResponseResult.success();
}
@ApiOperation("获取所有渠道标签分类")
@GetMapping("/get/channelType")
public ResponseResult getChannelTypes() {
return ResponseResult.success(channelService.getChannelTypes());
}
@ApiOperation("根据渠道分类获取所有标签")
@ApiImplicitParam(name = "type", value = "渠道分类类别", required = true, paramType = "query", dataType = "string")
@GetMapping("/get/channelType/label")
public ResponseResult getChannelLabels(@RequestParam("type") String type) {
return ResponseResult.success(channelService.getChannelLabels(type));
}
@ApiOperation("下载渠道列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "linkedGroupId", value = "关联项目组ID", required = true, paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "emotion", value = "倾向筛选", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "platform", value = "平台筛选", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "show", value = "是否展示", paramType = "query", dataType = "boolean"),
@ApiImplicitParam(name = "keyword", value = "关键字搜索", paramType = "query", dataType = "string")
})
@GetMapping("/list/download")
public ResponseResult downloadChannelList(@RequestParam(value = "linkedGroupId") String linkedGroupId,
@RequestParam(value = "emotion", defaultValue = "") String emotion,
@RequestParam(value = "platform", defaultValue = "") String platform,
@RequestParam(value = "show", required = false) Boolean show,
@RequestParam(value = "keyword", defaultValue = "") String keyword) {
List<ExportChannelDTO> downloadChannelList = channelService.findDownloadChannelList(linkedGroupId, emotion, platform, show, keyword);
String brandName = projectService.getProjectByLinkedGroupId(linkedGroupId).getBrandName();
EasyExcelUtil.download(brandName + "_渠道列表数据", brandName, ExportChannelDTO.class, downloadChannelList, response);
return ResponseResult.success();
}
@ApiOperation("下载渠道下的稿件列表")
@ApiImplicitParam(name = "channelId", value = "渠道ID", required = true, paramType = "query", dataType = "String")
@GetMapping("/list/article/download")
public ResponseResult downloadArticleList(@RequestParam(value = "channelId") String channelId) {
List<ExportAdminChannelArticleDTO> downloadChannelArticleList = channelService.findDownloadChannelArticleList(channelId);
EasyExcelUtil.download(channelId + "_渠道稿件列表数据", channelId, ExportAdminChannelArticleDTO.class, downloadChannelArticleList, response);
return ResponseResult.success();
}
@ApiOperation("下载渠道下的事件列表")
@ApiImplicitParam(name = "channelId", value = "渠道ID", required = true, paramType = "query", dataType = "String")
@GetMapping("/list/event/download")
public ResponseResult downloadEventList(@RequestParam(value = "channelId") String channelId) {
List<ExportAdminChannelEventDTO> downloadChannelEventList = channelService.findDownloadChannelEventList(channelId);
EasyExcelUtil.download(channelId + "_渠道事件列表数据", channelId, ExportAdminChannelEventDTO.class, downloadChannelEventList, response);
return ResponseResult.success();
}
@ApiOperation("获取经验判断下拉框")
@GetMapping("/experienceLevels")
public ResponseResult experienceLevels() {
return ResponseResult.success(Arrays.stream(ExperienceEnum.values()).map(ExperienceEnum::getValue).collect(Collectors.toList()));
}
}
package com.zhiwei.brandkbs2.controller.admin;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.common.RedisKeyPrefix;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportEventDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportEventDataDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.pojo.dto.EventDataDTO;
import com.zhiwei.brandkbs2.pojo.dto.YqEventDTO;
import com.zhiwei.brandkbs2.pojo.vo.EventVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.pojo.vo.YqEventSearchVO;
import com.zhiwei.brandkbs2.service.IBehaviorService;
import com.zhiwei.brandkbs2.service.IEventService;
import com.zhiwei.brandkbs2.util.Tools;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
/**
* @ClassName: EventController
* @Description 事件管理相关
* @author: sjj
* @date: 2022-05-16 14:30
*/
@RestController
@RequestMapping("/admin/event")
@Api(tags = "事件管理接口", description = "提供事件的增、删、改、查等功能")
@Auth(role = RoleEnum.COMMON_ADMIN)
public class EventController extends BaseController {
@Resource(name = "eventServiceImpl")
private IEventService iEventService;
@Resource(name = "behaviorServiceImpl")
private IBehaviorService behaviorService;
private static final Behavior.Operation OPERATION = new Behavior.Operation("事件管理", true);
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Value("${brandkbs.file.url}")
private String brandkbsFilePath;
@ApiOperation("舆情事件tag筛选")
@ApiImplicitParam(name = "linkedGroupId", value = "关联项目组id", paramType = "query", dataType = "string")
@GetMapping("/yq/tag")
public ResponseResult searchCriteria(@RequestParam(value = "linkedGroupId") String linkedGroupId) {
return ResponseResult.success(iEventService.findEventTagListAll(linkedGroupId));
}
@ApiOperation("分页查询舆情事件列表")
@PostMapping("/yq/list")
public ResponseResult findYqEventList(@RequestBody YqEventSearchVO yqEventSearchVO) {
PageVO<JSONObject> yqEventList = iEventService.findYqEventList(yqEventSearchVO);
return ResponseResult.success(yqEventList);
}
@ApiOperation("后台分页查询事件列表")
@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "size", value = "每页记录数", defaultValue = "10", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "keyword", value = "关键字搜索", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "linkedGroupId", value = "关联项目组id", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "sorter", defaultValue = "{\"startTime\":\"descend\"}", value = "排序字段", paramType = "query", dataType = "string")
})
@GetMapping("/list")
public ResponseResult findEventList(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size,
@RequestParam(value = "linkedGroupId") String linkedGroupId,
@RequestParam(value = "keyword", defaultValue = "") String keyword,
@RequestParam(value = "sorter", defaultValue = "{\"startTime\":\"descend\"}") String sorter) {
return ResponseResult.success(iEventService.findEventList(page, size, linkedGroupId, keyword, sorter));
}
@ApiOperation("获取单个事件信息")
@ApiImplicitParam(name = "eventId", value = "事件ID", required = true, paramType = "path", dataType = "string")
@GetMapping("/get/{eventId}")
public ResponseResult getEvent(@PathVariable("eventId") String eventId) {
return ResponseResult.success(iEventService.getEventJSONByEventId(eventId));
}
@ApiOperation("获取事件数据列表")
@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", required = false, defaultValue = "1", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "size", value = "每页记录数", required = false, defaultValue = "10", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "eventId", value = "事件ID", required = true, paramType = "query", dataType = "string")})
@GetMapping("/data/get")
public ResponseResult getEventDatas(@RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "size", defaultValue = "10") int size, @RequestParam(value = "eventId") String eventId) {
return ResponseResult.success(iEventService.getEventDatas(page, size, eventId));
}
@ApiOperation("修改事件信息")
@PutMapping("/update")
public ResponseResult updateEvent(@RequestBody EventVO eventVO) {
iEventService.updateEvent(eventVO);
behaviorService.pushBehavior(OPERATION, "修改事件信息:" + eventVO.getId(), request);
return ResponseResult.success();
}
@ApiOperation("修改事件首发信息")
@PutMapping("/updateFirst")
public ResponseResult updateEventFirst(@RequestBody EventDataDTO eventDataDTO) {
iEventService.updateEventFirst(eventDataDTO);
behaviorService.pushBehavior(OPERATION, "修改事件首发信息:" + eventDataDTO.getEventId(), request);
return ResponseResult.success();
}
@ApiOperation("批量更新事件")
@ApiImplicitParam(name = "eventIds", value = "事件ID集合", paramType = "body", dataType = "list")
@PostMapping("/analyze")
public ResponseResult analysisEvents(@RequestBody JSONObject info) {
iEventService.analysisEvents(info.getJSONArray("eventIds").toJavaList(String.class));
behaviorService.pushBehavior(OPERATION, "批量更新事件", request);
return ResponseResult.success();
}
@ApiOperation("结束事件")
@ApiImplicitParam(name = "eventId", value = "事件ID", required = true, paramType = "path", dataType = "string")
@PutMapping("/end/{eventId}")
public ResponseResult endEvent(@PathVariable("eventId") String eventId) {
iEventService.endEvent(eventId);
behaviorService.pushBehavior(OPERATION, "结束事件:" + eventId, request);
return ResponseResult.success();
}
@ApiOperation("删除事件")
@ApiImplicitParam(name = "eventId", value = "事件ID", required = true, paramType = "path", dataType = "string")
@DeleteMapping("/delete/{eventId}")
public ResponseResult deleteEvent(@PathVariable("eventId") String eventId) {
String title = iEventService.deleteEvent(eventId);
behaviorService.pushBehavior(OPERATION, "删除事件:" + title, request);
return ResponseResult.success();
}
@ApiOperation("单条事件数据删除")
@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "数据ID", required = true, paramType = "body", dataType = "string"), @ApiImplicitParam(name = "eventId", value = "事件ID", required = true, paramType = "body", dataType = "string")})
@DeleteMapping("/data/delete")
public ResponseResult deleteEventData(@RequestBody JSONObject info) {
String id = info.getString("id");
String eventId = info.getString("eventId");
String title = iEventService.deleteEventData(id, eventId);
behaviorService.pushBehavior(OPERATION, "删除事件单条数据,eventId:" + eventId + ",数据id:" + id + ",事件标题:" + title, request);
return ResponseResult.success();
}
@ApiOperation("获取舆情事件导入进度")
@GetMapping("/yq/upload/progress/{linkedGroupId}")
public ResponseResult getYqEventsProgress(@PathVariable("linkedGroupId") String linkedGroupId) {
String progressKey = RedisKeyPrefix.yuqingProgressKey(linkedGroupId);
Set<String> keys = stringRedisTemplate.keys(progressKey);
if (CollectionUtils.isEmpty(keys)) {
return ResponseResult.success();
}
return ResponseResult.success(stringRedisTemplate.opsForValue().get(progressKey));
}
@ApiOperation("事件上传进度获取")
@GetMapping("data/upload/progress/{ticket}")
public ResponseResult getEventDataUploadProgress(@PathVariable String ticket) {
return ResponseResult.success(iEventService.getEventDataUploadProgress(ticket));
}
@ApiOperation("事件数据上传进度获取")
@ApiImplicitParams(@ApiImplicitParam(name = "eventIds", value = "事件id列表", paramType = "body", dataType = "list"))
@PostMapping("analyze/progress")
public ResponseResult getEventAnalyzeProgress(@RequestBody JSONObject info) {
return ResponseResult.success(iEventService.getEventAnalyzeProgress(info.getJSONArray("eventIds").toJavaList(String.class)));
}
@ApiOperation("事件上传模板下载")
@GetMapping("/download/template")
public ResponseResult templateDownload() {
String path = brandkbsFilePath + "事件上传模板.xlsx";
Tools.downloadFile(path, response);
return ResponseResult.success();
}
@ApiOperation("事件数据上传模板下载")
@GetMapping("data/download/template")
public ResponseResult dataTemplateDownload() {
String path = brandkbsFilePath + "事件数据上传模板.xlsx";
Tools.downloadFile(path, response);
return ResponseResult.success();
}
@ApiOperation("导出事件列表")
@ApiImplicitParam(name = "linkedGroupId", value = "关联项目组id", required = true, paramType = "query", dataType = "string")
@GetMapping("/download")
public ResponseResult downloadEvents(@RequestParam("linkedGroupId") String linkedGroupId) {
Pair<String, List<ExportEventDTO>> result = iEventService.downloadEvents(linkedGroupId);
String fileName = result.getLeft();
EasyExcelUtil.download(fileName + "_事件列表数据", fileName, ExportEventDTO.class, result.getRight(), response);
return ResponseResult.success();
}
@ApiOperation("导出事件数据列表")
@ApiImplicitParam(name = "eventId", value = "事件ID", required = true, paramType = "query", dataType = "string")
@GetMapping("/data/download")
public ResponseResult downloadEventDatas(@RequestParam("eventId") String eventId) {
Pair<String, List<ExportEventDataDTO>> result = iEventService.downloadEventDatas(eventId);
String title = result.getLeft();
EasyExcelUtil.download(title, title, ExportEventDataDTO.class, result.getRight(), response);
return ResponseResult.success();
}
@ApiOperation("批量导入舆情事件数据")
@ApiImplicitParams({@ApiImplicitParam(name = "list", paramType = "body", dataType = "list"), @ApiImplicitParam(name = "linkedGroupId", value = "关联项目id", paramType = "body", dataType = "string")})
@PutMapping("/upload/yq")
public ResponseResult addEventsByYq(@RequestBody JSONObject info) {
String linkedGroupId = info.getString("linkedGroupId");
List<YqEventDTO> yqEventList = info.getJSONArray("list").toJavaList(YqEventDTO.class);
iEventService.addYqEvents(linkedGroupId, yqEventList);
behaviorService.pushBehavior(OPERATION, "批量导入舆情事件数据", request);
return ResponseResult.success();
}
@ApiOperation("按搜索条件全部导入舆情事件数据")
@PutMapping("/upload/yqAll")
public ResponseResult addEventAllByYq(@RequestBody YqEventSearchVO yqEventSearchVO) {
iEventService.addYqEventAll(yqEventSearchVO);
behaviorService.pushBehavior(OPERATION, "全部导入舆情事件数据", request);
return ResponseResult.success();
}
@ApiOperation("文件上传事件")
@ApiImplicitParams({@ApiImplicitParam(name = "linkedGroupId", value = "关联项目组id", paramType = "form", dataType = "string"), @ApiImplicitParam(name = "fileUrl", value = "文件路径", required = true, paramType = "form", dataType = "string")})
@PostMapping(value = "/upload/file", headers = "content-type=multipart/form-data")
@Auth(role = RoleEnum.SUPER_ADMIN)
public ResponseResult addEventsByFile(@RequestParam(value = "linkedGroupId") String linkedGroupId, @RequestParam("fileUrl") String fileUrl) {
iEventService.addFileEvents(linkedGroupId, fileUrl);
behaviorService.pushBehavior(OPERATION, "文件上传事件", request);
return ResponseResult.success();
}
@ApiOperation("事件数据上传")
@ApiImplicitParams({@ApiImplicitParam(name = "file", value = "上传表格", paramType = "form", dataType = "multipartFile"), @ApiImplicitParam(name =
"linkedGroupId", value = "关联项目id", paramType = "form", dataType = "string")})
@PostMapping(value = "/data/upload", headers = "content-type=multipart/form-data")
public ResponseResult uploadEventDatas(@RequestParam("linkedGroupId") String linkedGroupId, @RequestParam("file") MultipartFile file) {
iEventService.uploadEventDatas(linkedGroupId, file);
behaviorService.pushBehavior(OPERATION, "事件数据上传", request);
return ResponseResult.success();
}
@ApiOperation("查询所有事件标签")
@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", required = false, defaultValue = "1", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "size", value = "每页记录数", required = false, defaultValue = "10", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "linkedGroupId", value = "关联性项目组id", required = true, paramType = "query", dataType = "string"), @ApiImplicitParam(name = "tagGroupName", value = "标签组名", required = true, paramType = "query", dataType = "string")})
@GetMapping("/tag/list")
public ResponseResult findEventTagList(@RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "size", defaultValue = "10") int size, @RequestParam(value = "linkedGroupId") String linkedGroupId, @RequestParam(value = "tagGroupName") String tagGroupName) {
return ResponseResult.success(iEventService.findEventTagList(page, size, linkedGroupId, tagGroupName));
}
@ApiOperation("查询所有事件标签组名")
@GetMapping("/tag/groupName")
public ResponseResult findEventTagGroupName(@RequestParam(value = "linkedGroupId") String linkedGroupId) {
return ResponseResult.success(iEventService.findEventTagGroupName(linkedGroupId));
}
}
package com.zhiwei.brandkbs2.controller.admin;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
import com.zhiwei.brandkbs2.easyexcel.dto.UploadKeywordDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.pojo.vo.ProjectVO;
import com.zhiwei.brandkbs2.service.IBehaviorService;
import com.zhiwei.brandkbs2.service.ICommonService;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.middleware.mark.vo.MarkerTag;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author sjj
* @version 1.0
* @description 项目管理接口
* @date 2022年4月18日11:15:52
*/
@RestController
@RequestMapping("/admin/project")
@Api(tags = "项目管理接口", description = "提供项目的增、删、改、查")
@Auth(role = RoleEnum.SUPER_ADMIN)
public class ProjectController extends BaseController {
@Autowired
private RestTemplate restTemplate;
@Resource(name = "projectServiceImpl")
private IProjectService iProjectService;
@Resource(name = "behaviorServiceImpl")
private IBehaviorService behaviorService;
@Resource(name = "commonServiceImpl")
private ICommonService commonService;
private static final Behavior.Operation OPERATION = new Behavior.Operation("项目管理", true);
@Value("${brandkbs.img.url}")
private String brandkbsImgPath;
@Value("${brandkbs.image.url}")
private String brandkbsImageUrl;
@Value("${qbjc.project.url}")
private String yqProjectUrl;
@Value("${hqd.groupAll.url}")
private String hqdGroupAllUrl;
@ApiOperation("添加项目配置")
@PostMapping("/add")
public ResponseResult addProject(@RequestBody ProjectVO projectVO) {
iProjectService.addProject(projectVO);
behaviorService.pushBehavior(OPERATION, "添加项目配置:" + projectVO.getId(), request);
return ResponseResult.success();
}
@ApiOperation("查询所有项目")
@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", required = false, defaultValue = "1", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "size", value = "每页记录数", required = false, defaultValue = "10", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "keyword", value = "搜索关键字", required = false, defaultValue = "", paramType = "query", dataType = "string")})
@GetMapping("/list")
public ResponseResult findProjectList(@RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "size", defaultValue = "10") int size, @RequestParam(value = "keyword", defaultValue = "") String keyword) {
return ResponseResult.success(iProjectService.findProjectList(page, size, keyword));
}
@ApiOperation("修改项目")
@PutMapping("/update")
public ResponseResult updateProject(@RequestBody ProjectVO projectVO) {
iProjectService.updateProject(projectVO);
behaviorService.pushBehavior(OPERATION, "修改项目:" + projectVO.getId(), request);
return ResponseResult.success();
}
@ApiOperation("删除项目")
@ApiImplicitParam(name = "pid", value = "项目ID", required = true, paramType = "path", dataType = "string")
@DeleteMapping("/delete/{pid}")
public ResponseResult deleteProject(@PathVariable("pid") String pid) {
iProjectService.deleteProject(pid, UserThreadLocal.getProjectId());
behaviorService.pushBehavior(OPERATION, "删除项目:" + pid, request);
return ResponseResult.success();
}
@ApiOperation("切换项目展示状态")
@ApiImplicitParam(name = "pid", value = "项目ID", required = true, paramType = "path", dataType = "string")
@PutMapping("/switch/projectShow/{pid}")
public ResponseResult switchProjectShow(@PathVariable String pid) {
boolean result = iProjectService.switchProjectShow(pid);
if (result) {
behaviorService.pushBehavior(OPERATION, "切换项目展示状态:" + pid, request);
return ResponseResult.success();
} else {
return ResponseResult.failure("启动状态下的项目,不允许调整展示状态");
}
}
@ApiOperation("切换项目状态")
@ApiImplicitParam(name = "pid", value = "项目ID", required = true, paramType = "path", dataType = "string")
@PutMapping("/switch/projectStart/{pid}")
public ResponseResult switchProjectStart(@PathVariable String pid) {
iProjectService.switchProjectStart(pid);
behaviorService.pushBehavior(OPERATION, "切换项目状态:" + pid, request);
return ResponseResult.success();
}
@ApiOperation("获取单个项目信息")
@ApiImplicitParam(name = "pid", value = "项目ID", required = true, paramType = "path", dataType = "string")
@GetMapping("/get/{pid}")
public ResponseResult getProjectVOById(@PathVariable("pid") String pid) {
return ResponseResult.success(iProjectService.getProjectVOById(pid));
}
@ApiOperation("图片上传")
@PostMapping(value = "/upload/img", headers = "content-type=multipart/form-data")
public ResponseResult uploadImg(@RequestParam("file") MultipartFile file) {
ResponseResult responseResult = Tools.uploadFile(file, brandkbsImgPath, brandkbsImageUrl);
behaviorService.pushBehavior(OPERATION, "图片上传", request);
return responseResult;
}
@ApiOperation("关键词excel解析")
@PostMapping(value = "/parse/excel/keyword", headers = "content-type=multipart/form-data")
public ResponseResult parseExcelKeyword(@RequestParam("file") MultipartFile file) {
return Tools.parseExcelInfo(file);
}
@ApiOperation("关键词excel下载")
@ApiImplicitParam(name = "pid", value = "项目ID", required = true, paramType = "path", dataType = "string")
@GetMapping("/download/keyword/{pid}")
public ResponseResult downloadArticles(@PathVariable("pid") String pid) {
ProjectVO project = iProjectService.getProjectVOById(pid);
EasyExcelUtil.download(project.getBrandName() + "_命中关键词", "sheet1", UploadKeywordDTO.class, UploadKeywordDTO.change2This(project.getHitKeywords()), response);
return ResponseResult.success();
}
@ApiOperation("获取关联项目列表")
@ApiImplicitParams({@ApiImplicitParam(name = "keyword", value = "搜索关键字", required = false, defaultValue = "", paramType = "query", dataType = "string")})
@GetMapping("/get/linkedGroups")
public ResponseResult getLinkedGroups(@RequestParam(value = "keyword", defaultValue = "") String keyword) {
ResponseEntity<JSONObject> entity = restTemplate.getForEntity(yqProjectUrl, JSONObject.class);
List<JSONObject> dataList = Objects.requireNonNull(entity.getBody()).getJSONArray("data").toJavaList(JSONObject.class);
List<JSONObject> resList = dataList.stream().filter(json -> json.getString("projectName").contains(keyword)).map(json -> {
JSONObject res = new JSONObject();
res.put("groupName", json.getString("projectName"));
res.put("id", json.getString("id"));
return res;
}).collect(Collectors.toList());
// List<String> groupNames = jsonArray.stream().map(object -> ((JSONObject) object).getString("groupName")).filter(group -> group.contains(keyword)).collect(Collectors.toList());
return ResponseResult.success(resList);
}
@ApiOperation("获取黑渠道分组列表")
@GetMapping("/get/blackGroups")
public ResponseResult getBlackChannel() {
ResponseEntity<JSONObject> entity = restTemplate.getForEntity(hqdGroupAllUrl, JSONObject.class);
JSONArray jsonArray = Objects.requireNonNull(entity.getBody()).getJSONArray("data");
List<Map<String, Object>> groupNames = jsonArray.stream().map(object -> {
JSONObject jsonObject = (JSONObject) object;
Map<String, Object> groupNamesMap = new HashMap<>(4);
groupNamesMap.put("groupName", jsonObject.getString("groupName"));
groupNamesMap.put("id", jsonObject.getInteger("id"));
return groupNamesMap;
}).collect(Collectors.toList());
return ResponseResult.success(groupNames);
}
@ApiOperation("获取标签信息")
@ApiImplicitParam(name = "linkedGroupId", value = "关联项目组名", required = true, paramType = "path", dataType = "string")
@GetMapping("/get/tags")
public ResponseResult getTags(@RequestParam(value = "linkedGroup") String linkedGroup) {
List<MarkerTag> tags = commonService.getQbjcTagsByGroupName(linkedGroup);
Map<String, List<MarkerTag>> res = tags.stream().filter(tag -> !tag.getGroupName().equals("情感倾向")).collect(Collectors.groupingBy(MarkerTag::getGroupName));
return ResponseResult.success(res);
}
@ApiOperation("获取当前用户拥有的所有项目及品牌列表")
@GetMapping("/user/getUserAllProjects")
@Auth(role = RoleEnum.CUSTOMER)
public ResponseResult getUserAllProjects() {
return ResponseResult.success(iProjectService.getUserAllProjects());
}
}
package com.zhiwei.brandkbs2.controller.admin;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.dto.ReportSettingsDTO;
import com.zhiwei.brandkbs2.service.IReportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author lxj
* @version 1.0
* @description 简报配置接口
* @date 2020/10/22 8:52
*/
@RestController
@RequestMapping("/admin/module/report")
@Api(tags = "简报配置接口", description = "提供简报配置功能")
@Auth(role= RoleEnum.COMMON_ADMIN)
public class ReportController {
@Resource(name = "reportServiceImpl")
private IReportService reportService;
@ApiOperation("获取简报设置")
@GetMapping("/settings")
public ResponseResult getReportSettings(){
return ResponseResult.success(reportService.getReportSettings());
}
@ApiOperation("添加或修改简报配置")
@PostMapping("/settings")
public ResponseResult upsertReportSettings(@RequestBody ReportSettingsDTO reportSettingsDTO) {
reportService.upsertReportSettings(reportSettingsDTO);
return ResponseResult.success();
}
}
package com.zhiwei.brandkbs2.controller.admin;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.pojo.dto.UserDTO;
import com.zhiwei.brandkbs2.service.IBehaviorService;
import com.zhiwei.brandkbs2.service.IUserService;
import com.zhiwei.middleware.auth.pojo.CenterUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @ClassName: UserController
* @Description 用户管理接口
* @author: sjj
* @date: 2022-04-28 14:21
*/
@RestController
@RequestMapping("/admin/user")
@Api(tags = "用户管理接口", description = "提供用户的增、删、改、查")
@Auth(role = RoleEnum.COMMON_ADMIN)
public class UserController extends BaseController {
@Resource(name = "userServiceImpl")
private IUserService iUserService;
@Resource(name = "behaviorServiceImpl")
private IBehaviorService behaviorService;
private static final Behavior.Operation OPERATION = new Behavior.Operation("用户管理", true);
@Autowired
private com.zhiwei.middleware.auth.core.UserInfoClient userInfoClient;
@ApiOperation("分页查询用户列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "页码", required = false, defaultValue = "1", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "size", value = "每页记录数", required = false, defaultValue = "10", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "keyword", value = "搜索关键字", required = false, defaultValue = "", paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "pid", value = "搜索项目ID", required = true, paramType = "query", dataType = "string"),
@ApiImplicitParam(name = "role", value = "角色类型", required = false, defaultValue = "-1", paramType = "query", dataType = "string")
})
@GetMapping("/list")
public ResponseResult findList(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size,
@RequestParam(value = "keyword", defaultValue = "") String keyword,
@RequestParam(value = "pid") String pid,
@RequestParam(value = "role", defaultValue = "-1") int role) {
return ResponseResult.success(iUserService.findUserList(page, size, keyword, pid, role));
}
@ApiOperation("根据手机号搜索用户信息")
@ApiImplicitParam(name = "phoneNumber", value = "手机号", required = true, paramType = "path", dataType = "long")
@GetMapping("/search/{phoneNumber}")
public ResponseResult searchUserDTO(@PathVariable("phoneNumber") long phoneNumber) {
CenterUser centerUser = userInfoClient.getUserByPhone(String.valueOf(phoneNumber));
if (null == centerUser) {
return ResponseResult.failure("无匹配用户");
}
UserDTO userDTO = new UserDTO();
userDTO.setId(String.valueOf(centerUser.getId()));
userDTO.setUsername(centerUser.getName());
userDTO.setNickname(centerUser.getNickName());
userDTO.setPhoneNumber(Long.parseLong(centerUser.getPhone()));
return ResponseResult.success(userDTO);
}
@ApiOperation("添加用户")
@PostMapping("/add")
public ResponseResult addUser(@RequestBody UserDTO userDTO) {
iUserService.addUser(userDTO);
behaviorService.pushBehavior(OPERATION, "添加用户:" + userDTO.getId(), request);
return ResponseResult.success();
}
@ApiOperation("删除用户")
@ApiImplicitParams({
@ApiImplicitParam(name = "uid", value = "用户ID", required = true, paramType = "path", dataType = "string"),
@ApiImplicitParam(name = "pid", value = "项目ID", required = true, paramType = "path", dataType = "string")})
@DeleteMapping("/delete")
@Auth(role = RoleEnum.ADMIN)
public ResponseResult deleteUser(@RequestParam(value = "uid") String userId, @RequestParam(value = "pid") String pid) {
iUserService.deleteUser(userId, pid);
behaviorService.pushBehavior(OPERATION, "删除用户:" + userId, request);
return ResponseResult.success();
}
@ApiOperation("编辑用户")
@PutMapping("/update")
public ResponseResult updateUser(@RequestBody UserDTO userDTO) {
iUserService.updateUser(userDTO);
behaviorService.pushBehavior(OPERATION, "编辑用户:" + userDTO, request);
return ResponseResult.success();
}
@ApiOperation("分页查询超级管理员")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "页码", required = false, defaultValue = "1", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "size", value = "每页记录数", required = false, defaultValue = "10", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "keyword", value = "搜索关键字", required = false, defaultValue = "", paramType = "query", dataType = "string")
})
@GetMapping("/list/superAdmin")
@Auth(role = RoleEnum.SUPER_ADMIN)
public ResponseResult findSuperAdminList(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size,
@RequestParam(value = "keyword", defaultValue = "") String keyword) {
return ResponseResult.success(iUserService.findSuperAdminList(page, size, keyword));
}
@ApiOperation("添加超级管理员")
@PostMapping("/add/superAdmin")
@Auth(role = RoleEnum.SUPER_ADMIN)
public ResponseResult addSuperAdmin(@RequestBody UserDTO userDTO) {
iUserService.addSuperAdmin(userDTO);
behaviorService.pushBehavior(OPERATION, "添加超级管理员:" + userDTO.getId(), request);
return ResponseResult.success();
}
@ApiOperation("删除超级管理员")
@ApiImplicitParams(
@ApiImplicitParam(name = "uid", value = "用户ID", required = true, paramType = "path", dataType = "string"))
@DeleteMapping("/delete/superAdmin")
@Auth(role = RoleEnum.SUPER_ADMIN)
public ResponseResult deleteSuperAdmin(@RequestParam(value = "uid") String userId) {
iUserService.deleteSuperAdmin(userId);
behaviorService.pushBehavior(OPERATION, "删除超级管理员:" + userId, request);
return ResponseResult.success();
}
}
\ No newline at end of file
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.AbstractBaseMongo;
import com.zhiwei.brandkbs2.pojo.ChannelIndex;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import java.util.List;
/**
* @ClassName: BaseMongoDao
* @Description 基础mongoDao实现
* @author: sjj
* @date: 2022-04-29 14:45
*/
public interface IBaseMongoDao<T extends AbstractBaseMongo> {
/**
* 插入一条数据
*/
void insertOne(T t, String... collectionNames);
/**
* 插入多条数据
*/
void insertMany(List<T> tList, String... collectionNames);
/**
* 插入一条数据(_id数据库自生成)
*/
void insertOneWithoutId(T t, String... collectionNames);
/**
* 通过id更新全量数据
*/
void updateOne(T t, String... collectionNames);
/**
* 通过id更新部分字段
*
* @param id 数据库唯一id
* @param update 需要更新部分的更新请求
*/
void updateOneByIdWithField(String id, Update update, String... collectionNames);
/**
* 通过id删除数据
*
* @param id 数据库唯一id
*/
void deleteOneById(String id, String... collectionNames);
/**
* 通过id查找单条数据
*
* @param id 数据库唯一id
* @return T
*/
T findOneById(String id, String... collectionNames);
/**
* 通过k-v查询单条数据
*
* @param key 属性名
* @param value 属性值
* @return T
*/
T findOne(String key, Object value, String... collectionNames);
/**
* 通过关键字模糊查询list
*
* @param keyword 模糊关键词
* @param fuzzKeys 需要模糊匹配的属性名
* @return list<T>
*/
List<T> findListByKeywordFuzz(String keyword, String[] fuzzKeys, String... collectionNames);
/**
* 通过关键字模糊查询list
*
* @param preQuery 查询请求
* @param keyword 模糊关键词
* @param fuzzKeys 需要模糊匹配的属性名
* @return list<T>
*/
List<T> findListByKeywordFuzz(Query preQuery, String keyword, String[] fuzzKeys, String... collectionNames);
/**
* 查询list
*
* @param preQuery 查询请求
* @return list<T>
*/
List<T> findList(Query preQuery,String... collectionNames);
/**
* 量查询
*
* @param preQuery 查询请求
* @return long
*/
long count(Query preQuery, String... collectionNames);
/**
* 添加模糊查询条件
*
* @param query query
* @param keyword 关键字
* @param fuzzKeys 匹配keys
*/
void addKeywordFuzz(Query query,String keyword,String... fuzzKeys);
/**
* 添加排序
*
* @param query query
* @param sorter 排序字段
*/
void addSort(Query query, String sorter);
/**
* 渠道唯一标识查询
*
* @param channelIndex 渠道标识
* @return 查询请求
*/
default Criteria addChannelIndex(ChannelIndex channelIndex) {
Criteria criteria = new Criteria();
criteria.and("platform").is(channelIndex.getPlatform());
criteria.and("realSource").is(channelIndex.getRealSource());
criteria.and("source").is(channelIndex.getSource());
criteria.and("linkedGroupId").is(channelIndex.getLinkedGroupId());
return criteria;
}
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.Behavior;
/**
* @ClassName: IBehaviorDao
* @Description IBehaviorDao
* @author: sjj
* @date: 2022-05-27 13:46
*/
public interface IBehaviorDao extends IBaseMongoDao<Behavior>, IShardingMongo {
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.Channel;
import com.zhiwei.brandkbs2.pojo.ChannelIndex;
/**
* @ClassName: IChannelDao
* @Description IChannelDao
* @author: sjj
* @date: 2022-06-16 15:30
*/
public interface IChannelDao extends IBaseMongoDao<Channel>{
Channel queryUnique(ChannelIndex channelIndex);
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.ChannelLabel;
import java.util.List;
/**
* @ClassName: ChannelLabelDao
* @Description 渠道标签Dao
* @author: sjj
* @date: 2022-06-20 16:53
*/
public interface IChannelLabelDao extends IBaseMongoDao<ChannelLabel>{
List<String> getChannelLabelType();
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.Event;
/**
* @ClassName: IEventDao
* @Description IEventDao
* @author: sjj
* @date: 2022-05-18 14:35
*/
public interface IEventDao extends IBaseMongoDao<Event>{
/**
* 是否已存在事件
*
* @param yqEventId 舆情事件id
* @param projectId 项目id
* @param linkedGroupId 关联项目组id
* @return 是否存在
*/
boolean existEventByUniqueIds(String yqEventId, String projectId, String linkedGroupId);
/**
* 根据联合id查询事件
*
* @param yqEventId 舆情事件id
* @param projectId 项目id
* @param linkedGroupId 关联项目id
* @return 事件
*/
Event getEventByUniqueIds(String yqEventId,String projectId,String linkedGroupId);
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.ChannelIndex;
import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.pojo.EventData;
import java.util.Date;
import java.util.List;
/**
* @ClassName: IEventDataDao
* @Description IEventDataDao
* @author: sjj
* @date: 2022-05-19 16:08
*/
public interface IEventDataDao extends IBaseMongoDao<EventData>, IShardingMongo {
/**
* 获取首发稿件
*
* @return EventData
*/
EventData findFirstData(String eventId, String collectionName);
/**
* 获取参与事件数
*
* @param channelIndex 渠道标识
* @return 参与事件数
*/
List<String> getEventCount(ChannelIndex channelIndex);
/**
* 获取传播量
*
* @param event 事件
* @return 传播量
*/
long getEventArticleCount(Event event);
/**
* 获取渠道参与传播量
*
* @param event 事件
* @return 传播量
*/
long getEventArticleWithChannelCount(Event event, ChannelIndex channelIndex);
/**
* 删除事件ID关联数据
*/
void deleteByEventId(String eventId, String collectionName);
/**
* 查询符合时间段的所有数据
*
* @param eventId 事件id
* @param startTime 起始时间
* @param endTime 结束时间
* @param collectionName 集合名
* @return list
*/
List<EventData> findEventDataListByTime(String eventId, Date startTime, Date endTime, String collectionName);
/**
* 查询事件下的所有数据量
*
* @param eventId 事件id
* @param collectionName 集合名
* @return list
*/
long findEventDataCount(String eventId, String collectionName);
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.HighWord;
/**
* @ClassName: IHighWordDao
* @Description IHighWordDao
* @author: sjj
* @date: 2022-06-06 09:47
*/
public interface IHighWordDao extends IBaseMongoDao<HighWord>{
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.Project;
/**
* @author sjj
* @version 1.0
* @description IProjectDao
* @date 2022年4月20日17:38:54
*/
public interface IProjectDao extends IBaseMongoDao<Project>{
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.qbjc.bean.pojo.common.MessagePlatform;
import com.zhiwei.qbjc.bean.pojo.common.Tag;
import java.util.List;
/**
* IQbjcPojoDao-interface
*
* @ClassName: IQbjcPojoDao
* @Description IQbjcPojoDao-interface
* @author sjj
* @date 2022年6月16日14:23:36
*/
public interface IQbjcPojoDao {
/**
* 获取qbjcPlatform
*
* @return platforms
*/
List<MessagePlatform> findMessagePlatformAll();
/**
* 获取qbjcTag
*
* @return tags
*/
List<Tag> findTagAll();
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.Report;
/**
* @ClassName: IReportDao
* @Description IReportDao
* @author: sjj
* @date: 2022-05-31 18:13
*/
public interface IReportDao extends IBaseMongoDao<Report> {
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.ReportSettings;
/**
* @ClassName: IReportSettingsDao
* @Description IReportSettingsDao
* @author: sjj
* @date: 2022-05-31 18:13
*/
public interface IReportSettingsDao extends IBaseMongoDao<ReportSettings> {
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.util.IndexUtil;
import java.util.Date;
/**
* @ClassName: IShardingMongo
* @Description 分库mongo接口
* @author: sjj
* @date: 2022-05-27 11:29
*/
public interface IShardingMongo {
String collectionPrefix();
String timePattern();
default String generateCollectionName() {
return IndexUtil.getIndex(collectionPrefix(), timePattern());
}
default String[] generateCollectionNames(Date startTime, Date endTime) {
return IndexUtil.getIndexes(collectionPrefix(), timePattern(), startTime, endTime).toArray(new String[0]);
}
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.TagFilter;
/**
* @ClassName: ITagFilterDao
* @Description ITagFilterDao
* @author: sjj
* @date: 2022-06-01 13:52
*/
public interface ITagFilterDao extends IBaseMongoDao<TagFilter>{
}
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.User;
/**
* @ClassName: IUserDao
* @Description 用户相关接口
* @author: sjj
* @date: 2022-04-28 18:10
*/
public interface IUserDao extends IBaseMongoDao<User>{
}
package com.zhiwei.brandkbs2.dao.impl;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.dao.IBaseMongoDao;
import com.zhiwei.brandkbs2.pojo.AbstractBaseMongo;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import javax.annotation.Resource;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* @ClassName: BaseMongoDaoImpl
* @Description mongo基础操作实现类
* @author: sjj
* @date: 2022-04-29 15:11
*/
public class BaseMongoDaoImpl<T extends AbstractBaseMongo> implements IBaseMongoDao<T> {
protected static final String ID = "_id";
private final String collectionName;
protected final Class<T> clazz;
@Resource(name = "primaryMongoTemplate")
protected MongoTemplate mongoTemplate;
public BaseMongoDaoImpl(String collectionName) {
this.collectionName = collectionName;
this.clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
@Override
public void insertOne(T t, String... collectionNames) {
mongoTemplate.insert(t, getCollections(collectionNames)[0]);
}
@Override
public void insertMany(List<T> tList, String... collectionNames) {
String[] collections = getCollections(collectionNames);
if (collections.length > 1) {
throw new IllegalArgumentException("collection cant not greater than 1");
}
mongoTemplate.insert(tList, collections[0]);
}
@Override
public void insertOneWithoutId(T t, String... collectionNames) {
t.setId(null);
mongoTemplate.insert(t, getCollections(collectionNames)[0]);
}
@Override
public void updateOne(T t, String... collectionNames) {
Document document = (Document) mongoTemplate.getConverter().convertToMongoType(t);
if (null != document) {
mongoTemplate.upsert(new Query(Criteria.where(ID).is(t.getId())), Update.fromDocument(document), getCollections(collectionNames)[0]);
}
}
@Override
public void updateOneByIdWithField(String id, Update update, String... collectionNames) {
mongoTemplate.upsert(new Query(Criteria.where(ID).is(id)), update, getCollections(collectionNames)[0]);
}
@Override
public void deleteOneById(String id, String... collectionNames) {
mongoTemplate.remove(new Query(Criteria.where(ID).is(id)), getCollections(collectionNames)[0]);
}
@Override
public T findOneById(String id, String... collectionNames) {
return mongoTemplate.findOne(new Query(Criteria.where(ID).is(id)), clazz, getCollections(collectionNames)[0]);
}
@Override
public T findOne(String key, Object value, String... collectionNames) {
return mongoTemplate.findOne(new Query(Criteria.where(key).is(value)), clazz, getCollections(collectionNames)[0]);
}
@Override
public List<T> findListByKeywordFuzz(String keyword, String[] fuzzKeys, String... collectionNames) {
return findListByKeywordFuzz(null, keyword, fuzzKeys, collectionNames);
}
@Override
public List<T> findListByKeywordFuzz(Query preQuery, String keyword, String[] fuzzKeys, String... collectionNames) {
String[] collections = getCollections(collectionNames);
Query query = new Query();
if (null != preQuery) {
query = preQuery;
}
List<T> res = new ArrayList<>();
if (StringUtils.isEmpty(keyword) || fuzzKeys.length == 0) {
for (String collection : collections) {
res.addAll(mongoTemplate.find(query, clazz, collection));
}
return res;
}
addKeywordFuzz(query, keyword, fuzzKeys);
for (String collection : collections) {
res.addAll(mongoTemplate.find(query, clazz, collection));
}
return res;
}
@Override
public List<T> findList(Query preQuery, String... collectionNames) {
return findListByKeywordFuzz(preQuery, null, null, collectionNames);
}
@Override
public long count(Query preQuery, String... collectionNames) {
Query query = new Query();
if (null != preQuery) {
query = preQuery;
}
long count = 0;
for (String collection : getCollections(collectionNames)) {
count += mongoTemplate.count(query, collection);
}
return count;
}
@Override
public void addKeywordFuzz(Query query, String keyword, String... fuzzKeys) {
if (StringUtils.isEmpty(keyword)) {
return;
}
Pattern pattern = Pattern.compile("^.*" + keyword + ".*$", Pattern.CASE_INSENSITIVE);
Criteria regex = Criteria.where(fuzzKeys[0]).regex(pattern);
for (int i = 1; i < fuzzKeys.length; i++) {
// 多字段模糊查询
regex.orOperator(Criteria.where(fuzzKeys[i]).regex(pattern));
}
query.addCriteria(regex);
}
@Override
public void addSort(Query query, String sorter) {
if (StringUtils.isEmpty(sorter)) {
return;
}
for (Map.Entry<String, Object> entry : JSONObject.parseObject(sorter).entrySet()) {
if (entry.getValue().toString().contains("desc")) {
query.with(Sort.by(Sort.Order.desc(entry.getKey())));
} else {
query.with(Sort.by(Sort.Order.asc(entry.getKey())));
}
}
}
private String[] getCollections(String... collectionNames) {
// 优先返回预设集合名
if (null != collectionName) {
return new String[]{collectionName};
}
if (null != collectionNames && collectionNames.length != 0) {
return collectionNames;
}
throw new IllegalArgumentException("collection can not be null");
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.IBehaviorDao;
import com.zhiwei.brandkbs2.pojo.Behavior;
import org.springframework.stereotype.Component;
/**
* @ClassName: BehaviorDaoImpl
* @Description BehaviorDaoImpl
* @author: sjj
* @date: 2022-05-27 13:48
*/
@Component("behaviorDao")
public class BehaviorDaoImpl extends BaseMongoDaoImpl<Behavior> implements IBehaviorDao {
private static final String COLLECTION_PREFIX = "brandkbs_behavior";
private static final String TIME_PATTERN = "yyyyMM";
public BehaviorDaoImpl() {
super(null);
}
@Override
public String collectionPrefix() {
return COLLECTION_PREFIX;
}
@Override
public String timePattern() {
return TIME_PATTERN;
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.IChannelDao;
import com.zhiwei.brandkbs2.pojo.Channel;
import com.zhiwei.brandkbs2.pojo.ChannelIndex;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
/**
* @ClassName: ChannelDaoImpl
* @Description ChannelDaoImpl
* @author: sjj
* @date: 2022-06-16 15:31
*/
@Component("channelDao")
public class ChannelDaoImpl extends BaseMongoDaoImpl<Channel> implements IChannelDao {
private static final String COLLECTION_PREFIX = "brandkbs_channel";
public ChannelDaoImpl() {
super(COLLECTION_PREFIX);
}
@Override
public Channel queryUnique(ChannelIndex channelIndex) {
Query query = Query.query(Criteria.where("linkedGroupId").is(channelIndex.getLinkedGroupId()).and("platform").is(channelIndex.getPlatform()).and(
"realSource").is(channelIndex.getRealSource()).and("source").is(channelIndex.getSource()));
return mongoTemplate.findOne(query, clazz);
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.dao.IChannelLabelDao;
import com.zhiwei.brandkbs2.pojo.ChannelLabel;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName: ChannelLabelDaoImpl
* @Description ChannelLabelDaoImpl
* @author: sjj
* @date: 2022-06-20 16:56
*/
@Component("channelLabelDao")
public class ChannelLabelDaoImpl extends BaseMongoDaoImpl<ChannelLabel> implements IChannelLabelDao {
private static final String COLLECTION_NAME = "brandkbs_channel_label";
public ChannelLabelDaoImpl() {
super(COLLECTION_NAME);
}
@Override
public List<String> getChannelLabelType() {
// 分组
Aggregation agg = Aggregation.newAggregation(Aggregation.group("type"));
AggregationResults<JSONObject> aggregate = mongoTemplate.aggregate(agg, COLLECTION_NAME, JSONObject.class);
List<JSONObject> mappedResults = aggregate.getMappedResults();
return mappedResults.stream().map(json -> json.getString("_id")).collect(Collectors.toList());
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.IEventDao;
import com.zhiwei.brandkbs2.pojo.Event;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
/**
* @ClassName: EventDaoImpl
* @Description 事件业务实现类
* @author: sjj
* @date: 2022-05-18 14:45
*/
@Component("eventDao")
public class EventDaoImpl extends BaseMongoDaoImpl<Event> implements IEventDao {
private static final String COLLECTION_NAME = "brandkbs_event";
public EventDaoImpl() {
super(COLLECTION_NAME);
}
@Override
public boolean existEventByUniqueIds(String yqEventId, String projectId, String linkedGroupId) {
return null != getEventByUniqueIds(yqEventId, projectId, linkedGroupId);
}
@Override
public Event getEventByUniqueIds(String yqEventId, String projectId, String linkedGroupId) {
Query query = new Query();
query.addCriteria(Criteria.where("yqEventId").is(yqEventId).and("projectId").is(projectId).and("linkedGroupId").is(linkedGroupId));
return mongoTemplate.findOne(query, Event.class);
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.dao.IEventDataDao;
import com.zhiwei.brandkbs2.pojo.ChannelIndex;
import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.pojo.EventData;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName: EventDataDaoImpl
* @Description 事件数据业务实现类
* @author: sjj
* @date: 2022-05-19 17:42
*/
@Component("eventDataDao")
public class EventDataDaoImpl extends BaseMongoDaoImpl<EventData> implements IEventDataDao {
private static final String COLLECTION_PREFIX = "brandkbs_event_data";
private static final String TIME_PATTERN = "yyyy";
public EventDataDaoImpl() {
super(null);
}
@Override
public String collectionPrefix() {
return COLLECTION_PREFIX;
}
@Override
public String timePattern() {
return TIME_PATTERN;
}
@Override
public EventData findFirstData(String eventId, String collectionName) {
Query query = new Query();
query.addCriteria(Criteria.where("eventId").is(eventId));
query.with(Sort.by(Sort.Order.asc("time")));
query.limit(1);
return mongoTemplate.findOne(query, clazz, collectionName);
}
@Override
public List<String> getEventCount(ChannelIndex channelIndex) {
// 添加渠道唯一标识
Criteria criteria = addChannelIndex(channelIndex);
// 分组
Aggregation agg = Aggregation.newAggregation(Aggregation.match(criteria), Aggregation.group("eventId").count().as("eventCount"));
AggregationResults<JSONObject> aggregate = mongoTemplate.aggregate(agg, "brandkbs_event_data_2022", JSONObject.class);
List<JSONObject> mappedResults = aggregate.getMappedResults();
return mappedResults.stream().map(json -> json.getString("_id")).collect(Collectors.toList());
}
@Override
public long getEventArticleCount(Event event) {
return count(Query.query(Criteria.where("eventId").is(event.getId())), event.getCollectionName());
}
@Override
public long getEventArticleWithChannelCount(Event event, ChannelIndex channelIndex) {
return count(Query.query(Criteria.where("eventId").is(event.getId()).and("source").is(channelIndex.getSource()).and("realSource").is(channelIndex.getRealSource()).and("platform").is(channelIndex.getPlatform())), event.getCollectionName());
}
@Override
public void deleteByEventId(String eventId, String collectionName) {
mongoTemplate.remove(new Query(Criteria.where("eventId").is(eventId)), collectionName);
}
@Override
public List<EventData> findEventDataListByTime(String eventId, Date startTime, Date endTime, String collectionName) {
Query query = Query.query(Criteria.where("eventId").is(eventId));
query.addCriteria(Criteria.where("time").gte(startTime).lt(endTime));
return mongoTemplate.find(query, EventData.class, collectionName);
}
@Override
public long findEventDataCount(String eventId, String collectionName) {
Query query = Query.query(Criteria.where("eventId").is(eventId));
return mongoTemplate.count(query, EventData.class, collectionName);
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.IHighWordDao;
import com.zhiwei.brandkbs2.pojo.HighWord;
import org.springframework.stereotype.Component;
/**
* @ClassName: HighWordDaoImpl
* @Description HighWordDaoImpl
* @author: sjj
* @date: 2022-06-06 09:48
*/
@Component("highWordDao")
public class HighWordDaoImpl extends BaseMongoDaoImpl<HighWord> implements IHighWordDao {
private static final String COLLECTION_NAME = "brandkbs_high_word";
public HighWordDaoImpl() {
super(COLLECTION_NAME);
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.IProjectDao;
import com.zhiwei.brandkbs2.pojo.Project;
import org.springframework.stereotype.Component;
/**
* @ClassName: ProjectDaoImlp
* @Description 项目业务接口实现类
* @author: sjj
* @date: 2022-04-21 13:51
*/
@Component("projectDao")
public class ProjectDaoImlp extends BaseMongoDaoImpl<Project> implements IProjectDao {
private static final String COLLECTION_NAME = "brandkbs_project";
public ProjectDaoImlp() {
super(COLLECTION_NAME);
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.IQbjcPojoDao;
import com.zhiwei.qbjc.bean.pojo.common.MessagePlatform;
import com.zhiwei.qbjc.bean.pojo.common.Tag;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* @ClassName: QbjcPojoDaoImpl
* @Description QbjcPojoDaoImpl
* @author: sjj
* @date: 2022-06-16 14:24
*/
@Component("qbjcPojoDao")
public class QbjcPojoDao implements IQbjcPojoDao {
@Resource(name = "secondaryMongoTemplate")
protected MongoTemplate mongoTemplate;
@Override
public List<MessagePlatform> findMessagePlatformAll() {
return mongoTemplate.find(new Query(), MessagePlatform.class);
}
@Override
public List<Tag> findTagAll() {
return mongoTemplate.find(new Query(), Tag.class);
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.IReportDao;
import com.zhiwei.brandkbs2.pojo.Report;
import org.springframework.stereotype.Component;
/**
* @ClassName: ReportDaoImpl
* @Description ReportDaoImpl
* @author: sjj
* @date: 2022-05-31 18:14
*/
@Component("reportDao")
public class ReportDaoImpl extends BaseMongoDaoImpl<Report> implements IReportDao {
private static final String COLLECTION_NAME = "brandkbs_report";
public ReportDaoImpl() {
super(COLLECTION_NAME);
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.IReportSettingsDao;
import com.zhiwei.brandkbs2.pojo.ReportSettings;
import org.springframework.stereotype.Component;
/**
* @ClassName: ReportSettingsDaoImpl
* @Description ReportSettingsDaoImpl
* @author: sjj
* @date: 2022-05-31 18:14
*/
@Component("reportSettingsDao")
public class ReportSettingsDaoImpl extends BaseMongoDaoImpl<ReportSettings> implements IReportSettingsDao {
private static final String COLLECTION_NAME = "brandkbs_report_settings";
public ReportSettingsDaoImpl() {
super(COLLECTION_NAME);
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.ITagFilterDao;
import com.zhiwei.brandkbs2.pojo.TagFilter;
import org.springframework.stereotype.Component;
/**
* @ClassName: TagFilterDaoImpl
* @Description TagFilterDaoImpl
* @author: sjj
* @date: 2022-06-01 14:26
*/
@Component("tagFilterDao")
public class TagFilterDaoImpl extends BaseMongoDaoImpl<TagFilter> implements ITagFilterDao {
private static final String COLLECTION_NAME = "brandkbs_tag_filter";
public TagFilterDaoImpl() {
super(COLLECTION_NAME);
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.IUserDao;
import com.zhiwei.brandkbs2.pojo.User;
import org.springframework.stereotype.Component;
/**
* @ClassName: UserDao
* @Description 用户相关实现类
* @author: sjj
* @date: 2022-04-28 18:10
*/
@Component("userDao")
public class UserDaoImpl extends BaseMongoDaoImpl<User> implements IUserDao {
private static final String COLLECTION_NAME = "brandkbs_user";
public UserDaoImpl() {
super(COLLECTION_NAME);
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.pojo.AbstractBaseMongo;
import com.zhiwei.brandkbs2.util.Md5Util;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
/**
* @ClassName: UserOldDaoImpl
* @Description 用户旧表
* @author: sjj
* @date: 2022-05-09 16:20
*/
@Component("userOldDao")
public class UserOldDaoImpl extends BaseMongoDaoImpl<UserOldDaoImpl.UserOld> {
private static final String collectionName = "brandkbs_user_old";
public UserOldDaoImpl() {
super(collectionName);
}
public UserOldDaoImpl.UserOld findOneByUsernameAndPassword(String username, String password) {
Query query = new Query();
query.addCriteria(Criteria.where("username").is(username).and("password").is(Md5Util.encodeByMd5(password)));
return mongoTemplate.findOne(query, UserOld.class);
}
@Setter
@Getter
@Document("brandkbs_user_old")
public static class UserOld extends AbstractBaseMongo {
String nick;
String username;
String password;
boolean superAdmin;
boolean bindUser;
}
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.pojo.AbstractBaseMongo;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @ClassName: UserProjectOldImpl
* @Description 用户项目关联旧表
* @author: sjj
* @date: 2022-05-09 17:02
*/
@Component("userProjectOldDao")
public class UserProjectOldDaoImpl extends BaseMongoDaoImpl<UserProjectOldDaoImpl.UserProjectOld>{
private static final String collectionName = "brandkbs_user_project_old";
public UserProjectOldDaoImpl() {
super(collectionName);
}
@Setter
@Getter
@Document("brandkbs_user_project_old")
public static class UserProjectOld extends AbstractBaseMongo{
String userId;
Integer roleId;
Date expiredTime;
Integer exportAmount;
String projectName;
}
}
package com.zhiwei.brandkbs2.easyexcel;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.zhiwei.brandkbs2.easyexcel.config.ReadExcelDTO;
import com.zhiwei.brandkbs2.easyexcel.config.WriteExcelDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
/**
* @author sjj
* @version 1.0
* @description easyExcel解析工具类
* @date 2022年4月20日09:34:12
*/
@Slf4j
public class EasyExcelUtil {
private EasyExcelUtil() {
}
/**
* 读取单个sheet
*
* @param filePath 文件路径
* @param readExcelDTO 读excel封装类
*/
public static void read(String filePath, ReadExcelDTO readExcelDTO) {
try {
EasyExcel.read(filePath, readExcelDTO.getClazz(), readExcelDTO.getAnalysisEventListener()).sheet().doRead();
} catch (Exception e) {
log.error("file:{},analysis error:", filePath, e);
}
}
/**
* 读取单个sheet
*
* @param file 上传的文件
* @param readExcelDTO 读excel封装类
*/
public static void read(MultipartFile file, ReadExcelDTO readExcelDTO) {
try {
EasyExcel.read(file.getInputStream(), readExcelDTO.getClazz(), readExcelDTO.getAnalysisEventListener()).sheet().doRead();
} catch (Exception e) {
log.error("file:{},analysis error:", file.getName(), e);
}
}
/**
* 读取多个sheet
*
* @param filePath 文件路径
* @param dataList 读excel封装类集合
*/
public static void read(String filePath, List<ReadExcelDTO<Object>> dataList) {
try {
ExcelReader excelReader = EasyExcel.read(filePath).build();
List<ReadSheet> readSheets = new ArrayList<>(dataList.size());
dataList.forEach(readExcelDTO -> {
ExcelReaderSheetBuilder sheetBuilder;
//优先根据sheet名称获取表格内容
if (StringUtils.isEmpty(readExcelDTO.getSheetName())) {
sheetBuilder = EasyExcel.readSheet(readExcelDTO.getSheetIndex());
} else {
sheetBuilder = EasyExcel.readSheet(readExcelDTO.getSheetName());
}
ReadSheet readSheet = sheetBuilder.head(readExcelDTO.getClazz())
.registerReadListener(readExcelDTO.getAnalysisEventListener()).build();
readSheets.add(readSheet);
});
excelReader.read(readSheets);
excelReader.finish();
} catch (Exception e) {
log.error("file:{},analysis error:", filePath, e);
}
}
/**
* 写单个sheet
*
* @param filePath 文件路径
* @param sheetName sheet名称
* @param clazz 字节码对象
* @param datas 返回数据
* @param <T> 指定写的类型
*/
public static <T> void write(String filePath, String sheetName, Class<T> clazz, List<T> datas) {
try {
EasyExcel.write(filePath, clazz).sheet(sheetName).doWrite(datas);
} catch (Exception e) {
log.error("file:{},write error:", filePath, e);
}
}
/**
* 写多个sheet
*
* @param filePath 文件路径
* @param dataList sheet名称和数据封装对象
*/
public static void write(String filePath, List<WriteExcelDTO> dataList) {
try {
ExcelWriter excelWriter = EasyExcel.write(filePath).build();
int size = dataList.size();
for (int i = 0; i < size; i++) {
WriteExcelDTO writeExcel = dataList.get(i);
WriteSheet writeSheet = EasyExcel.writerSheet(i, writeExcel.getSheetName()).head(writeExcel.getClazz()).build();
excelWriter.write(writeExcel.getDatas(), writeSheet);
}
excelWriter.finish();
} catch (Exception e) {
log.error("file:{},write error:", filePath, e);
}
}
/**
* 动态表头写表格
*
* @param filePath 文件路径
* @param sheetName sheet名称
* @param head 表头
* @param datas 数据
*/
public static void dynamicHeadWrite(String filePath, String sheetName, List<List<String>> head, List<List<Object>> datas) {
try {
EasyExcel.write(filePath).head(head).sheet(sheetName).doWrite(datas);
} catch (Exception e) {
log.error("file:{},write error:", filePath, e);
}
}
/**
* 单sheet下载
*
* @param fileName 文件名
* @param sheetName sheet名称
* @param clazz 字节码对象
* @param datas 返回数据
* @param response http响应
* @param <T> 指定解析的类型
*/
public static <T> void download(String fileName, String sheetName, Class<T> clazz, List<T> datas, HttpServletResponse response) {
try {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(datas);
} catch (Exception e) {
log.error("file:{},download error:", fileName, e);
}
}
/**
* 多sheet下载
*
* @param fileName 文件名
* @param dataList sheet名称和数据封装对象
* @param response http响应
*/
public static void download(String fileName, List<WriteExcelDTO<Object>> dataList, HttpServletResponse response) {
try {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
for (int i = 0; i < dataList.size(); i++) {
WriteExcelDTO<Object> writeExcel = dataList.get(i);
WriteSheet writeSheet = EasyExcel.writerSheet(i, writeExcel.getSheetName()).head(writeExcel.getClazz()).build();
excelWriter.write(writeExcel.getDatas(), writeSheet);
}
excelWriter.finish();
} catch (Exception e) {
log.error("file:{},download error:", fileName, e);
}
}
}
package com.zhiwei.brandkbs2.easyexcel.config;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.Data;
import lombok.ToString;
/**
* @author sjj
* @version 1.0
* @description 读excel配置类
* @date 2022年4月20日09:36:09
*/
@Data
@ToString
public class ReadExcelDTO<T> {
/**
* sheet索引
*/
private Integer sheetIndex;
/**
* sheet名称
*/
private String sheetName;
/**
* 类字节码
*/
private Class<T> clazz;
/**
* 解析监听器
*/
private AnalysisEventListener<T> analysisEventListener;
}
package com.zhiwei.brandkbs2.easyexcel.config;
import lombok.Data;
import lombok.ToString;
import java.util.List;
/**
* @author sjj
* @version 1.0
* @description 写excel配置类
* @date 2022年4月20日09:39:28
*/
@Data
@ToString
public class WriteExcelDTO<T> {
/**
* sheet名称
*/
private String sheetName;
/**
* 字节码对象
*/
private Class<T> clazz;
/**
* sheet数据
*/
private List<T> datas;
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @author sjj
* @version 1.0
* @description 后台导出渠道稿件实体类
* @date 2022年6月20日10:48:31
*/
@Data
@ToString
public class ExportAdminChannelArticleDTO {
@ExcelProperty("发布时间")
private Date time;
@ExcelProperty("链接")
private String url;
@ExcelProperty("标题")
private String title;
@ExcelProperty("平台")
private String platform;
@ExcelProperty("来源")
private String realSource;
@ExcelProperty("渠道")
private String source;
@ExcelProperty("是否首发")
private String first;
@ExcelProperty("情感倾向")
private String emotion;
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @author sjj
* @version 1.0
* @description 导出渠道事件实体类
* @date 2022年6月20日14:07:06
*/
@Data
@ToString
public class ExportAdminChannelEventDTO {
@ExcelProperty("开始时间")
private Date startTime;
@ExcelProperty("结束时间")
private Date endTime;
@ExcelProperty("事件名")
private String title;
@ExcelProperty("首发平台")
private String firstPlatform;
@ExcelProperty("首发来源")
private String firstRealSource;
@ExcelProperty("首发渠道")
private String firstSource;
@ExcelProperty("情感倾向")
private String emotion;
@ExcelProperty("事件类型")
private String eventType;
@ExcelProperty("传播量")
private Long eventArticleCount;
@ExcelProperty("渠道传播量")
private Long channelArticleCount;
@ExcelProperty("影响力")
private Double influence;
@ExcelProperty("关键词")
private String keyword;
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @author lxj
* @version 1.0
* @description 导出用户行为实体类
* @date 2019/11/12 15:14
*/
@Data
@ToString
public class ExportBehaviorDTO {
@ExcelProperty("用户名")
private String nickname;
@ExcelProperty("IP")
private String ip;
@ExcelProperty("操作时间")
private Date time;
@ExcelProperty("访问页面")
private String page;
@ExcelProperty("操作模块")
private String module;
@ExcelProperty("用户身份")
private String role;
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import com.zhiwei.brandkbs2.pojo.Channel;
import com.zhiwei.brandkbs2.util.Tools;
import lombok.Data;
/**
* @ClassName: ExportChannelDTO
* @Description 导出渠道实体
* @author: sjj
* @date: 2022-06-17 13:44
*/
@Data
public class ExportChannelDTO {
@ExcelProperty("平台")
private String platform;
@ExcelProperty("来源")
private String realSource;
@ExcelProperty("渠道名")
private String source;
@ExcelProperty("稿件数")
private Integer articleCount;
@ExcelProperty("事件数")
private Integer eventCount;
@ExcelProperty("渠道倾向")
private String emotion;
@ExcelProperty("渠道指数")
private Double emotionIndex;
@ExcelProperty("经验评级")
private String experienceLevel;
public static ExportChannelDTO createFromChannel(Channel channel) {
return Tools.convertMap(channel, ExportChannelDTO.class);
}
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @author lxj
* @version 1.0
* @description 导出事件实体类
* @date 2019/11/12 14:04
*/
@Data
@ToString
public class ExportEventDTO {
@ExcelProperty("开始时间")
private Date startTime;
@ExcelProperty("结束时间")
private Date endTime;
@ExcelProperty("事件名")
private String title;
@ExcelProperty("首发平台")
private String firstPlatform;
@ExcelProperty("首发来源")
private String firstRealSource;
@ExcelProperty("首发渠道")
private String firstSource;
@ExcelProperty("情感倾向")
private String emotion;
@ExcelProperty("事件类型")
private String eventType;
@ExcelProperty("传播量")
private Long articleCount;
@ExcelProperty("影响力")
private Double influence;
@ExcelProperty("关键词")
private String keyword;
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @author sjj
* @version 1.0
* @description 导出事件数据实体类
* @date 2022年5月25日15:13:08
*/
@Data
@ToString
public class ExportEventDataDTO {
@ExcelProperty("时间")
private Date time;
@ExcelProperty("链接")
private String url;
@ExcelProperty("稿件名")
private String title;
@ExcelProperty("平台")
private String platform;
@ExcelProperty("来源")
private String realSource;
@ExcelProperty("渠道名")
private String source;
@ExcelProperty("是否首发")
private String first;
@ExcelProperty("情感倾向")
private String emotion;
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import com.zhiwei.brandkbs2.pojo.HighWord;
import com.zhiwei.brandkbs2.util.Tools;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @ClassName: ExportHighWordDTO
* @Description 高频词导出传输实体
* @author: sjj
* @date: 2022-06-06 17:16
*/
@Data
@ToString
public class ExportHighWordDTO {
/**
* 名称
*/
@ExcelProperty("关键词")
private String keyword;
/**
* 创建时间
*/
@ExcelProperty("创建时间")
private Date cTime;
/**
* 上传人
*/
@ExcelProperty("上传人")
private String submitter;
public static ExportHighWordDTO createFromHighWord(HighWord highWord){
return Tools.convertMap(highWord,ExportHighWordDTO.class);
}
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @author lxj
* @version 1.0
* @description 解析事件数据上传文件
* @date 2019/9/9 16:22
*/
@Data
@ToString
public class UploadEventDTO {
@ExcelProperty("开始时间")
private Date startTime;
@ExcelProperty("结束时间")
private Date endTime;
@ExcelProperty("标题")
private String title;
@ExcelProperty("关键词")
private String keyword;
@ExcelProperty("情感倾向")
private String emotion;
@ExcelProperty("事件类型")
private String eventType;
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.pojo.EventData;
import com.zhiwei.brandkbs2.util.Tools;
import lombok.Data;
import lombok.ToString;
import org.apache.logging.log4j.util.Strings;
import java.util.Date;
import java.util.Optional;
/**
* @ClassName: UploadEventDataDTO
* @Description 事件数据导入传输类
* @author: sjj
* @date: 2022-05-20 14:07
*/
@Data
@ToString
public class UploadEventDataDTO {
@ExcelProperty("事件id")
private String eventId;
@ExcelProperty("时间")
private Date time;
@ExcelProperty("标题")
private String title;
@ExcelProperty("文本")
private String content;
@ExcelProperty("地址")
private String url;
@ExcelProperty("平台")
private String platform;
/**
* 第二级平台
*/
@ExcelProperty("来源")
private String realSource;
@ExcelProperty("渠道")
private String source;
@ExcelProperty("情感倾向")
private String emotion;
@ExcelProperty("品牌归属")
private String brand;
@ExcelProperty("专列事件")
private String eventTitle;
@ExcelProperty("原创/转发(微博平台)")
private boolean isForward;
/**
* 表格解析后的数据转换为事件数据传输格式
*
* @return 事件数据传输格式
*/
public EventData createEventData(Event event) {
EventData eventData = new EventData();
eventData.setPlatform(this.getPlatform());
eventData.setRealSource(this.getRealSource());
eventData.setSource(this.getSource());
eventData.setUrl(this.getUrl());
eventData.setTime(this.getTime());
//如果标题不为空,取前64个字符作为标题,如果为空,取内容的前32位作为标题
eventData.setTitle(Strings.isNotBlank(title) ? (title.length() > 64 ? title.substring(0, 64) : title) : content.length() > 32 ? content.substring(0, 32) : content);
eventData.setAggTitle(Tools.filterSpecialCharacter(title));
eventData.setContent(content);
eventData.setTime(this.getTime());
JSONObject tagInfo = new JSONObject();
Optional.ofNullable(this.getEmotion()).ifPresent(emotion -> tagInfo.put(GenericAttribute.EMOTION_LABEL_KEY, emotion));
Optional.ofNullable(this.getBrand()).ifPresent(brand -> tagInfo.put(GenericAttribute.BRAND_LABEL_KEY, brand));
eventData.setTagInfo(JSON.toJSONString(tagInfo));
eventData.setEmotion(this.getEmotion());
eventData.setForward(this.isForward);
eventData.setEventId(event.getId());
eventData.setProjectId(event.getProjectId());
eventData.setLinkedGroupId(event.getLinkedGroupId());
eventData.setCTime(new Date());
// TODO Type字段类型是否需要???
return eventData;
}
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;
import org.apache.commons.collections4.CollectionUtils;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author sjj
* @version 1.0
* @description 解析关键词上传文件
* @date 2022年4月20日09:57:21
*/
@Data
@ToString
public class UploadKeywordDTO {
@ExcelProperty("关键词")
private String keyword;
public static List<UploadKeywordDTO> change2This(List<String> list) {
if (CollectionUtils.isEmpty(list)) {
return Collections.emptyList();
} else {
return list.stream().map(str -> {
UploadKeywordDTO dto = new UploadKeywordDTO();
dto.setKeyword(str);
return dto;
}).collect(Collectors.toList());
}
}
}
package com.zhiwei.brandkbs2.easyexcel.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.zhiwei.brandkbs2.dao.IEventDao;
import com.zhiwei.brandkbs2.dao.IEventDataDao;
import com.zhiwei.brandkbs2.easyexcel.dto.UploadEventDataDTO;
import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.pojo.EventData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
/**
* @ClassName: EventDataListener
* @Description 事件数据上传监听类
* @author: sjj
* @date: 2022-05-23 13:54
*/
@Slf4j
public class EventDataListener extends AnalysisEventListener<UploadEventDataDTO> {
private final IEventDao eventDao;
private final IEventDataDao eventDataDao;
private final StringRedisTemplate stringRedisTemplate;
private final String linkedGroupId;
private final String redisKey;
public EventDataListener(IEventDao eventDao, IEventDataDao eventDataDao, StringRedisTemplate stringRedisTemplate, String linkedGroupId,
String redisKey) {
this.eventDao = eventDao;
this.eventDataDao = eventDataDao;
this.stringRedisTemplate = stringRedisTemplate;
this.linkedGroupId = linkedGroupId;
this.redisKey = redisKey;
}
@Override
public void invoke(UploadEventDataDTO eventDataDTO, AnalysisContext analysisContext) {
Event event = eventDao.findOneById(eventDataDTO.getEventId());
// 不允许上传其他关联组数据
if (event.getLinkedGroupId().equals(linkedGroupId)) {
EventData eventData = eventDataDTO.createEventData(event);
eventDataDao.insertOneWithoutId(eventData);
}
int progress = analysisContext.readRowHolder().getRowIndex() * 100 / (analysisContext.readSheetHolder().getApproximateTotalRowNumber() - 1);
stringRedisTemplate.opsForValue().set(redisKey, String.valueOf(progress));
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
log.info("redisKey:{},事件数据上传完成,共上传:{}条数据", redisKey, analysisContext.readRowHolder().getRowIndex());
}
}
package com.zhiwei.brandkbs2.easyexcel.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.zhiwei.brandkbs2.easyexcel.dto.UploadEventDTO;
import com.zhiwei.brandkbs2.service.IEventService;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
/**
* @author lxj
* @version 1.0
* @description 解析事件文件监听器
* @date 2019/11/12 9:00
*/
@Slf4j
public class EventFileListener extends AnalysisEventListener<UploadEventDTO> {
/**
* 每隔5条执行保存更新事件信息,然后清理list,方便内存回收
*/
private static final int BATCH_COUNT = 5;
/**
* 储存解析数据集合
*/
private final List<UploadEventDTO> datas = new ArrayList<>(BATCH_COUNT);
private final IEventService iEventService;
private final String projectId;
private final String linkedGroupId;
public EventFileListener(IEventService iEventService, String projectId, String linkedGroupId) {
this.iEventService = iEventService;
this.projectId = projectId;
this.linkedGroupId = linkedGroupId;
}
/**
* 每一条数据解析都会来调用
*
* @param data one row value.is same as {@link AnalysisContext#readRowHolder()}
* @param context 解析上下文
*/
@Override
public void invoke(UploadEventDTO data, AnalysisContext context) {
datas.add(data);
if (datas.size() >= BATCH_COUNT) {
addFileEvent();
datas.clear();
}
}
/**
* 所有数据解析完成了 都会来调用
*
* @param context 解析上下文
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
addFileEvent();
log.info("事件文件解析完成,此次更新:{} 条数据", context.readRowHolder().getRowIndex());
}
/**
* 保存更新事件信息逻辑
*/
private void addFileEvent() {
datas.forEach(eventDTO -> iEventService.addFileEvent(projectId, linkedGroupId, eventDTO));
}
}
package com.zhiwei.brandkbs2.enmus;
import java.util.Objects;
/**
* @author lxj
* @version 1.0
* @description 情绪枚举类
* @date 2019/8/29 9:52
*/
public enum EmotionEnum {
/**
* 全部
*/
ALL(-1),
/**
* 未定义
*/
UNDEFINED(0),
/**
* 正面的
*/
POSITIVE(1),
/**
* 中性的
*/
NEUTRAL(2),
/**
* 负面的
*/
NEGATIVE(3);
private final int state;
public static final String EMOTION_LABEL_KEY = "情感倾向";
public static final String POSITIVE_LABEL = "正面";
public static final String NEUTRAL_LABEL = "中性";
public static final String NEGATIVE_LABEL = "负面";
public static final String SENSITIVE_LABEL = "敏感";
public static final String SPECIAL_PR_LABEL = "PR";
public static final String SPECIAL_TS_LABEL = "投诉";
public static final String SPECIAL_NEGATIVE_LABEL = "关联负面";
EmotionEnum(int state) {
this.state = state;
}
public int getState() {
return state;
}
/**
* 获取事件数据情感倾向
*
* @param emotion 情感倾向
* @return 情感对应的数值
*/
public static int parseEventDataEmotion(String emotion) {
int value;
//防止报空指针异常
if (Objects.isNull(emotion)) {
value = EmotionEnum.UNDEFINED.getState();
} else {
switch (emotion) {
case SPECIAL_PR_LABEL:
case POSITIVE_LABEL:
value = EmotionEnum.POSITIVE.getState();
break;
case NEUTRAL_LABEL:
value = EmotionEnum.NEUTRAL.getState();
break;
case NEGATIVE_LABEL:
case SENSITIVE_LABEL:
case SPECIAL_TS_LABEL:
case SPECIAL_NEGATIVE_LABEL:
value = EmotionEnum.NEGATIVE.getState();
break;
default:
value = EmotionEnum.UNDEFINED.getState();
}
}
return value;
}
/**
* 获取事件情感倾向
*
* @param value 情感倾向
* @return 情感对应的数值
*/
public static int parseEventEmotion(String value) {
int emotion = EmotionEnum.NEUTRAL.getState();
if (Objects.nonNull(value)) {
switch (value) {
case "正面":
emotion = EmotionEnum.POSITIVE.getState();
break;
case "负面":
emotion = EmotionEnum.NEGATIVE.getState();
break;
case "中性":
default:
break;
}
}
return emotion;
}
}
package com.zhiwei.brandkbs2.enmus;
import com.alibaba.fastjson.JSONObject;
/**
* @ClassName: EventTag
* @Description 事件标签枚举类
* @author: sjj
* @date: 2022-05-26 15:51
*/
public enum EventTagEnum{
EVENT_ATTRIBUTE("事件属性"),
EVENT_TYPE("事件类型");
private final String name;
EventTagEnum(String name){
this.name = name;
}
public String getName() {
return name;
}
public static JSONObject eventType(String value){
JSONObject json = new JSONObject();
json.put(EventTagEnum.EVENT_TYPE.getName(), value);
return json;
}
}
package com.zhiwei.brandkbs2.enmus;
/**
* @ClassName: ExperienceEnum
* @Description 经验判断枚举类
* @author: sjj
* @date: 2022-06-17 14:39
*/
public enum ExperienceEnum {
FRIENDLY_ONE("友好1级","friendlyOne"),
FRIENDLY_TWO("友好2级","friendlyTwo"),
FRIENDLY_THREE("友好3级","friendlyThree"),
UNFRIENDLY_ONE("不友好1级","unfriendlyOne"),
UNFRIENDLY_TWO("不友好2级","unfriendlyTwo"),
UNFRIENDLY_THREE("不友好3级","unfriendlyThree"),
NEUTRAL("中性渠道","neutral");
private final String value;
private final String databaseName;
ExperienceEnum(String value,String databaseName) {
this.value = value;
this.databaseName = databaseName;
}
public String getValue() {
return this.value;
}
public String getDatabaseName(){
return this.databaseName;
}
public static String getDatabaseNameFromValue(String value) {
for (ExperienceEnum experienceEnum : ExperienceEnum.values()) {
if (experienceEnum.value.equals(value)) {
return experienceEnum.databaseName;
}
}
return null;
}
public static String getValueFromDataBaseName(String databaseName) {
for (ExperienceEnum experienceEnum : ExperienceEnum.values()) {
if (experienceEnum.databaseName.equals(databaseName)) {
return experienceEnum.value;
}
}
return null;
}
}
package com.zhiwei.brandkbs2.enmus;
/**
* @author sjj
* @version 1.0
* @description 用户角色枚举类
* @date 2022年4月18日10:56:45
*/
public enum RoleEnum {
/**
* 超级管理员
*/
SUPER_ADMIN(1, "超级管理员"),
/**
* 管理员
*/
ADMIN(2, "管理员"),
/**
* 维护人员
*/
COMMON_ADMIN(3, "维护人员"),
/**
* 客户
*/
CUSTOMER(4, "客户");
private final int state;
private final String name;
RoleEnum(int state, String name) {
this.state = state;
this.name = name;
}
public int getState() {
return state;
}
public static String getNameByState(int state) {
for (RoleEnum roleEnum : RoleEnum.values()) {
if (roleEnum.state == state) {
return roleEnum.name;
}
}
return "未知";
}
}
package com.zhiwei.brandkbs2.enmus.response;
import com.zhiwei.brandkbs2.model.ResultCode;
/**
* @author sjj
* @version 1.0
* @description 项目错误状态码及信息
* @date 2022年4月20日16:57:49
*/
public enum ProjectCodeEnum implements ResultCode {
/**
* 项目名已存在
*/
PROJECT_EXISTSNAME_ERROR(false, 1201, "项目名已存在!", 200),
/**
* 渠道计算比例错误
*/
PROJECT_CHANNEL_PROPORTION_ERROR(false, 1203, "渠道计算比例错误,请重新调整", 200),
/**
* 无法删除正在登录的项目
*/
PROJECT_DELETE_ERROR(false, 1204, "无法删除正在登录的项目", 200);
/**
* 操作是否成功
*/
final boolean success;
/**
* 操作代码
*/
final int code;
/**
* 提示信息
*/
final String message;
/**
* 聚合状态码
*/
final int aggCode;
ProjectCodeEnum(boolean success, int code, String message, int aggCode) {
this.success = success;
this.code = code;
this.message = message;
this.aggCode = aggCode;
}
@Override
public boolean success() {
return success;
}
@Override
public int code() {
return code;
}
@Override
public String message() {
return message;
}
@Override
public int aggCode() {
return aggCode;
}
}
package com.zhiwei.brandkbs2.es;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.pojo.ChannelIndex;
import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.util.Tools;
import org.apache.commons.lang3.time.FastDateFormat;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.action.search.ClearScrollRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
* @ClassName: EsClientDao
* @Description EsClientDao
* @author: sjj
* @date: 2022-06-10 14:38
*/
@Component("esClientDao")
public class EsClientDao {
private static final Logger log = LogManager.getLogger(EsClientDao.class);
private static final FastDateFormat DF = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
private static final String[] CHANNEL_RECORD_FETCH_SOURCE = new String[]{"c5", "foreign", "real_source", "source", "mtime", "time", "brandkbs_cache_maps"};
private static final String[] EVENT_FETCH_SOURCE = new String[]{"ind_full_text", "c5", "real_source", "source", "mtime", "time", "url", "mtag"};
private static final Long ONE_HOUR = 60 * 60 * 1000L;
// 滚动查询超时时间
private static final TimeValue TIME_VALUE = TimeValue.timeValueMinutes(8);
@Value("${test}")
private boolean test;
@Resource(name = "esClient")
private RestHighLevelClient esClient;
@Resource(name = "esSearchExecutor")
private ThreadPoolTaskExecutor executor;
public Map<String, JSONObject> searchByIds(Collection<String> queryIds) throws IOException {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds(queryIds.toArray(new String[0]));
sourceBuilder.query(queryBuilder).size(queryIds.size());
SearchResponse searchResponse = esClient.search(new SearchRequest(getIndexes()).source(sourceBuilder), RequestOptions.DEFAULT);
return Arrays.stream(searchResponse.getHits().getHits()).collect(Collectors.toMap(SearchHit::getId, hit -> new JSONObject(hit.getSourceAsMap())));
}
/**
* 搜索近几天的数据
*
* @param day 几天前天数
* @return 渠道记录结果
*/
public Map<ChannelIndex, ChannelIndex.ChannelRecord> searchChannelRecordRecentDay(int day) {
Map<ChannelIndex, ChannelIndex.ChannelRecord> res = new HashMap<>();
Calendar calendar = Calendar.getInstance();
long endTime = calendar.getTime().getTime();
calendar.add(Calendar.DAY_OF_MONTH, -day);
long startTime = calendar.getTime().getTime();
List<Long[]> cutTimes = Tools.cutTimeRange(startTime, endTime, ONE_HOUR);
List<CompletableFuture<Map<ChannelIndex, ChannelIndex.ChannelRecord>>> futures = new ArrayList<>(cutTimes.size());
cutTimes.forEach(times -> futures.add(CompletableFuture.supplyAsync(() -> searchChannelRecord(times[0], times[1]), executor)));
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).whenComplete((r, e) -> {
futures.forEach(f -> {
Map<ChannelIndex, ChannelIndex.ChannelRecord> channelIndexMap = f.join();
channelIndexMap.forEach((channelIndex, record) -> {
res.compute(channelIndex, (k, v) -> {
if (null == v) {
return record;
}
return v.mergeRecord(record);
});
});
});
}).join();
return res;
}
public Map<ChannelIndex, ChannelIndex.ChannelRecord> searchChannelRecord(long startTime, long endTime) {
Map<ChannelIndex, ChannelIndex.ChannelRecord> res = new HashMap<>();
try {
QueryBuilder queryBuilder = QueryBuilders.rangeQuery("mtime").gte(startTime).lt(endTime);
List<Map<String, Object>> results = searchScroll(queryBuilder, 10000, CHANNEL_RECORD_FETCH_SOURCE);
for (Map<String, Object> result : results) {
for (ChannelIndex channelIndex : ChannelIndex.getChannelIndexes(result)) {
res.compute(channelIndex, (k, v) -> {
if (null == v) {
v = new ChannelIndex.ChannelRecord();
}
return v.mergeRecord(new ChannelIndex.ChannelRecord(new Date((long) result.get(GenericAttribute.ES_TIME)), String.valueOf(result.get(
"id"))));
});
}
}
} catch (IOException e) {
log.error("searchChannelRecord-", e);
}
log.info("startTime:{},endTime:{},size:{}", DF.format(startTime), DF.format(endTime), res.size());
return res;
}
/**
* 搜索符合事件数据
*
* @param event
* @return
*/
public List<Map<String, Object>> searchByEvent(Event event) {
try {
RangeQueryBuilder timeBuilder = QueryBuilders.rangeQuery("time").gte(event.getStartTime());
if (event.isEndStatus()) {
timeBuilder.lt(event.getEndTime());
}
return searchScroll(timeBuilder, 2000, EVENT_FETCH_SOURCE);
} catch (IOException e) {
log.error("searchByEvent-", e);
}
return Collections.emptyList();
}
/**
* 滚动查询
*
* @param queryBuilder 查询条件
* @param size 每次滚动查询的量
* @param fetchSource 包含的属性阈
* @throws IOException
*/
private List<Map<String, Object>> searchScroll(QueryBuilder queryBuilder, int size, String[] fetchSource) throws IOException {
List<Map<String, Object>> res = new ArrayList<>();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder).size(size)
.fetchSource(fetchSource, null);
SearchResponse searchResponse = esClient.search(
new SearchRequest(getIndexes()).source(sourceBuilder).scroll(TIME_VALUE),
RequestOptions.DEFAULT);
while (true) {
if (0 == searchResponse.getHits().getHits().length) {
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(searchResponse.getScrollId());
esClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
break;
}
res.addAll(Arrays.stream(searchResponse.getHits().getHits()).map(SearchHit::getSourceAsMap).collect(Collectors.toList()));
SearchScrollRequest scrollRequest = new SearchScrollRequest(searchResponse.getScrollId());
scrollRequest.scroll(TIME_VALUE);
searchResponse = esClient.scroll(scrollRequest, RequestOptions.DEFAULT);
}
return res;
}
private String[] getIndexes() {
return getIndexList().toArray(new String[0]);
}
private List<String> getIndexList() {
List<String> res = new ArrayList<>();
if (test) {
res.add(GenericAttribute.ES_INDEX_TEST);
return res;
}
// 近三年数据库
Calendar date = Calendar.getInstance();
int year = date.get(Calendar.YEAR);
res.add(GenericAttribute.ES_INDEX_PRE + year);
res.add(GenericAttribute.ES_INDEX_PRE + (year - 1));
res.add(GenericAttribute.ES_INDEX_PRE + (year - 2));
return res;
}
}
package com.zhiwei.brandkbs2.es;
import com.zhiwei.brandkbs2.config.EsProperties;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @ClassName: EsRestClient
* @Description es客户端
* @author: sjj
* @date: 2022-05-26 17:08
*/
@Configuration
public class EsRestClient {
private static final Logger log = LogManager.getLogger(EsRestClient.class);
private static final String COLON = ":";
private static final String COMMA = ",";
private final EsProperties esProperties;
public EsRestClient(EsProperties esProperties) {
this.esProperties = esProperties;
}
@Bean(name = "esClient")
public RestHighLevelClient esClient() {
List<HttpHost> httpHostList = new ArrayList<>();
try {
Assert.hasText(esProperties.getClusterNodes(), "Cluster nodes source must not be null or empty!");
String[] nodes = StringUtils.delimitedListToStringArray(esProperties.getClusterNodes(), COMMA);
Arrays.stream(nodes).forEach(node -> {
String[] segments = StringUtils.delimitedListToStringArray(node, COLON);
Assert.isTrue(segments.length == 2,
() -> String.format("Invalid cluster node %s in %s! Must be in the format host:port!", node,
esProperties.getClusterNodes()));
String host = segments[0].trim();
String port = segments[1].trim();
Assert.hasText(host, () -> String.format("No host name given cluster node %s!", node));
Assert.hasText(port, () -> String.format("No port given in cluster node %s!", node));
httpHostList.add(new HttpHost(host, Integer.parseInt(port)));
});
} catch (Exception e) {
log.error("es client初始化异常", e);
}
HttpHost[] httpHosts = httpHostList.toArray(new HttpHost[0]);
// 判断,如果未配置用户名,则进行无用户名密码连接,配置了用户名,则进行用户名密码连接
RestHighLevelClient client;
if (StringUtils.isEmpty(esProperties.getUsername())) {
client = new RestHighLevelClient(RestClient.builder(httpHosts));
} else {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
// es账号密码
new UsernamePasswordCredentials(esProperties.getUsername(), esProperties.getPassword()));
client = new RestHighLevelClient(
RestClient.builder(httpHosts).setHttpClientConfigCallback((httpClientBuilder) -> {
// 这里可以设置一些参数,比如cookie存储、代理等等
httpClientBuilder.disableAuthCaching();
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}));
}
return client;
}
}
package com.zhiwei.brandkbs2.es;
/**
* @ClassName: ITaskService
* @Description 定时服务抽象类
* @author: sjj
* @date: 2022-06-16 15:27
*/
public interface ITaskService{
/**
* 渠道记录
*/
void channelRecordFromEs(int day);
}
package com.zhiwei.brandkbs2.exception;
import com.zhiwei.brandkbs2.model.ResultCode;
/**
* @author sjj
* @version 1.0
* @description 自定义异常类
* @date 2022年4月20日16:54:59
*/
public class CustomException extends RuntimeException {
/**
* 错误代码
*/
private final ResultCode resultCode;
public CustomException(String errorReason,ResultCode resultCode) {
super(errorReason);
this.resultCode = resultCode;
}
public CustomException(ResultCode resultCode){
this.resultCode = resultCode;
}
public ResultCode getResultCode(){
return resultCode;
}
}
package com.zhiwei.brandkbs2.exception;
import com.zhiwei.brandkbs2.model.ResultCode;
/**
* @author sjj
* @version 1.0
* @description 自定义异常捕获类
* @date 2022年4月20日16:55:19
*/
public class ExceptionCast {
public static void cast(ResultCode resultCode){
throw new CustomException(resultCode);
}
}
package com.zhiwei.brandkbs2.exception;
import com.google.common.collect.ImmutableMap;
import com.zhiwei.brandkbs2.model.CommonCodeEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.model.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.Collections;
import java.util.Objects;
/**
* 控制器增强
*
* @author sjj
* @version 1.0
* @description 统一异常处理类
* @date 2022年4月21日15:00:40
*/
@RestControllerAdvice
@Slf4j
public class ExceptionCatch {
/**
* 定义map,配置异常类型所对应的错误代码
*/
private static ImmutableMap<Class<? extends Throwable>, ResultCode> EXCEPTIONS;
/**
* 定义map的builder对象,去构建ImmutableMap
*/
protected static ImmutableMap.Builder<Class<? extends Throwable>, ResultCode> builder = ImmutableMap.builder();
/**
* 捕获CustomException此类异常
*
* @param customException 自定义异常类型
* @return 响应结果
*/
@ExceptionHandler(CustomException.class)
public ResponseResult customException(CustomException customException) {
ResultCode resultCode = customException.getResultCode();
//记录日志
log.error("catch customException:{}", resultCode.message());
return new ResponseResult(resultCode, Collections.EMPTY_LIST);
}
/**
* 捕获Exception此类异常
*
* @param exception Exception异常类型
* @return 响应结果
*/
@ExceptionHandler(Exception.class)
public ResponseResult exception(Exception exception) {
//记录日志
log.error("catch exception:", exception);
if (Objects.isNull(EXCEPTIONS)) {
//EXCEPTIONS构建成功
EXCEPTIONS = builder.build();
}
//从EXCEPTIONS中找异常类型所对应的错误代码
ResultCode resultCode = EXCEPTIONS.get(exception.getClass());
if (Objects.nonNull(resultCode)) {
return new ResponseResult(resultCode, Collections.EMPTY_LIST);
} else {
//返回500系统繁忙异常
return new ResponseResult(CommonCodeEnum.SERVER_ERROR, Collections.EMPTY_LIST);
}
}
static {
//定义异常类型所对应的错误代码
builder.put(HttpMessageNotReadableException.class, CommonCodeEnum.INVALID_PARAM);
builder.put(NullPointerException.class, CommonCodeEnum.NULL_POINTER_EXCEPTION);
}
}
package com.zhiwei.brandkbs2.listener;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.concurrent.*;
/**
* @author lxj
* @version 1.0
* @description 项目启动监听类
* @date 2019/9/2 14:00
*/
@Component
@Slf4j
public class ApplicationProjectListener {
private static final int CORE_POOL_SIZE = 50;
private static final int MAX_POOL_SIZE = 200;
private static final int QUEUE_SIZE = 128;
private static final long KEEP_ALIVE_TIME = 0L;
/**
* 项目共用线程池
*/
private static final ThreadPoolExecutor PROJECT_THREAD_POOL;
static {
ThreadFactory threadFactory = new ThreadFactoryBuilder().setDaemon(false).setNameFormat("project-asny-%d").build();
PROJECT_THREAD_POOL = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(QUEUE_SIZE), threadFactory,
//配置拒绝策略,抛出java.util.concurrent.RejectedExecutionException异常
new ThreadPoolExecutor.AbortPolicy());
}
/**
* 获取公用线程池
*
* @return 公用线程池
*/
public static ThreadPoolExecutor getThreadPool() {
return PROJECT_THREAD_POOL;
}
}
package com.zhiwei.brandkbs2.model;
/**
* @author lxj
* @version 1.0
* @description 全局状态码及信息
* @date 2019/8/5 10:12
*/
public enum CommonCodeEnum implements ResultCode {
/**
* 非法参数
*/
INVALID_PARAM(false, 403, "非法参数!", 200),
/**
* 操作成功
*/
SUCCESS(true, 200, "操作成功!", 200),
/**
* 操作失败
*/
FAIL(false, 400, "操作失败!", 200),
/**
* 未登录
*/
UNAUTHENTICATED(false, 401, "此操作需要登陆系统!", 200),
/**
* 权限不足
*/
UN_AUTHORISE(false, 402, "权限不足,无权操作!", 200),
/**
* 系统异常
*/
SERVER_ERROR(false, 500, "抱歉,系统繁忙,请稍后重试!", 200),
/**
* 空指针异常
*/
NULL_POINTER_EXCEPTION(false, 666, "空指针异常", 200);
/**
* 操作是否成功
*/
final boolean success;
/**
* 操作代码
*/
final int code;
/**
* 提示信息
*/
String message;
/**
* 聚合状态码
*/
final int aggCode;
CommonCodeEnum(boolean success, int code, String message, int aggCode) {
this.success = success;
this.code = code;
this.message = message;
this.aggCode = aggCode;
}
public CommonCodeEnum message(String message){
this.message = message;
return this;
}
@Override
public boolean success() {
return success;
}
@Override
public int code() {
return code;
}
@Override
public String message() {
return message;
}
@Override
public int aggCode() {
return aggCode;
}
}
package com.zhiwei.brandkbs2.model;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.*;
/**
* @author lxj
* @version 1.0
* @description 统一响应结果类
* @date 2019/8/5 10:14
*/
@Data
@ToString
@NoArgsConstructor
@ApiModel("响应结果实体类")
public class ResponseResult {
/**
* 操作是否成功
*/
@ApiModelProperty("操作是否成功")
private boolean success;
/**
* 操作状态码
*/
@ApiModelProperty("操作状态码")
private int code;
/**
* 提示信息
*/
@ApiModelProperty("提示信息")
private String message;
/**
* 聚合状态码
*/
@ApiModelProperty("聚合状态码")
private int aggCode;
/**
* 返回数据
*/
@ApiModelProperty("返回数据")
private Object data;
public ResponseResult(ResultCode resultCode, Object data) {
this.success = resultCode.success();
this.code = resultCode.code();
this.message = resultCode.message();
this.aggCode = resultCode.aggCode();
this.data = data;
}
/**
* 操作成功带返回数据
*
* @param data 返回数据
* @return 操作成功带返回数据
*/
public static ResponseResult success(Object data) {
return new ResponseResult(CommonCodeEnum.SUCCESS, data);
}
/**
* 操作成功不带返回数据
*
* @return 操作成功不带返回数据
*/
public static ResponseResult success() {
return success(Collections.EMPTY_LIST);
}
/**
* 操作失败带返回数据
*
* @param data 返回数据
* @return 操作失败带返回数据
*/
public static ResponseResult failure(Object data) {
return new ResponseResult(CommonCodeEnum.FAIL, data);
}
/**
* 舆情外部接口转换返回
*
* @param json
* @return
*/
public static ResponseResult convertFromYuQingInterface(JSONObject json, Integer pageSize) {
if (null == json) {
return ResponseResult.failure(null);
}
// 接口调用失败
if (!Boolean.TRUE.equals(json.getBooleanValue("status")) || 200 != json.getInteger("code")) {
return ResponseResult.failure(json.getString("message"));
}
// 非列表数据
if (null == pageSize) {
return ResponseResult.success(json.get("data"));
}
JSONObject data = json.getJSONObject("data");
if (null == data) {
return ResponseResult.success();
}
long total = Optional.ofNullable(data.getLong("total")).orElse(0L);
int page = Optional.ofNullable(data.getInteger("page")).orElse(0);
long totalNum = Optional.ofNullable(data.getLong("totalNum")).orElse(0L);
List<JSONObject> list = data.getJSONArray("list").toJavaList(JSONObject.class);
return ResponseResult.success(PageVO.createPageVo(totalNum, page, total, pageSize, list));
}
}
package com.zhiwei.brandkbs2.model;
/**
* @author sjj
* @version 1.0
* @description 状态码和信息
* 1000-- 登录错误代码
* 1100-- 用户错误代码
* 1200-- 项目错误代码
* 1300-- 标签错误代码
* 1400-- 事件错误代码
* 1500-- 渠道错误代码
* 1600-- 报道错误代码
* 1700-- 收藏错误代码
* 1800-- 预警事件错误代码
* 1900-- 稿件错误代码
* 2000-- 自定义事件错误代码
* @date 2022年4月18日11:02:53
*/
public interface ResultCode {
/**
* 操作是否成功,true为成功,false操作失败
*
* @return 操作是否成功
*/
boolean success();
/**
* 操作状态码
*
* @return 操作状态码
*/
int code();
/**
* 提示信息
*
* @return 提示信息
*/
String message();
/**
* 聚合状态码
*
* @return 聚合状态码
*/
int aggCode();
}
package com.zhiwei.brandkbs2.pojo;
import lombok.Data;
import org.springframework.data.annotation.Id;
/**
* @ClassName: AbstractBaseMongo
* @Description mongo抽象类
* @author: sjj
* @date: 2022-04-29 14:52
*/
@Data
public abstract class AbstractBaseMongo {
/**
* 主键ID
*/
@Id
String id;
}
package com.zhiwei.brandkbs2.pojo;
import com.zhiwei.middleware.mark.vo.MarkerTag;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* @author sjj
* @version 1.0
* @description 项目属性抽象类
* @date 2022年4月18日15:04:29
*/
@Setter
@Getter
public abstract class AbstractProject extends AbstractBaseMongo{
/**
* 项目名
*/
private String projectName;
/**
* 品牌名称
*/
private String brandName;
/**
* 品牌关联项目组
*/
private String brandLinkedGroup;
/**
* 品牌关联项目组ID
*/
private String brandLinkedGroupId;
/**
* 命中标签
*/
private List<MarkerTag> hitTags;
/**
* 命中关键词
*/
private List<String> hitKeywords;
/**
* 高频关键词
*/
private List<String> highKeywords;
/**
* 是否包含敏感
*/
private boolean isMergeSensitive;
/**
* 头像地址
*/
private String avatarUrl;
}
package com.zhiwei.brandkbs2.pojo;
import lombok.Getter;
import lombok.Setter;
/**
* @ClassName: BaseMap
* @Description 基础字段
* @author: sjj
* @date: 2022-06-20 11:21
*/
@Setter
@Getter
public class BaseMap {
/**
* url
*/
private String url;
/**
* title
*/
private String title;
/**
* content
*/
private String content;
/**
* time
*/
private Long time;
/**
* 平台
*/
private String platform;
/**
* 来源
*/
private String realSource;
/**
* 渠道
*/
private String source;
/**
* 是否转发
*/
private boolean forward;
/**
* 情感倾向
*/
private String emotion;
}
package com.zhiwei.brandkbs2.pojo;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
* @ClassName: Behavior
* @Description 用户行为实体类
* @author: sjj
* @date: 2022-05-27 11:11
*/
@Getter
@Setter
public class Behavior extends AbstractBaseMongo {
/**
* 用户ID
*/
private String userId;
/**
* 项目ID
*/
private String projectId;
/**
* IP地址
*/
private String ip;
/**
* 创建时间
*/
private Date cTime;
/**
* 访问页面
*/
private String page;
/**
* 操作模块
*/
private String module;
/**
* false:前台,true:后台
*/
private boolean backstage;
@Getter
public static class Operation {
private final String page;
private final boolean backstage;
public Operation(String page, boolean backstage) {
this.page = page;
this.backstage = backstage;
}
}
}
package com.zhiwei.brandkbs2.pojo;
import com.zhiwei.brandkbs2.util.Tools;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
import java.util.LinkedHashSet;
/**
* @ClassName: Channel
* @Description 渠道实体类
* @author: sjj
* @date: 2022-06-16 12:13
*/
@Setter
@Getter
public class Channel extends ChannelIndex {
/**
* 创建时间
*/
private Date cTime;
/**
* 最近发文
*/
private Date lastTime;
/**
* 图片地址
*/
private String imgUrl;
/**
* 渠道标签
*/
private String tag;
/**
* 发布稿件id列表
*/
private LinkedHashSet<String> articleIds;
/**
* 参与事件id列表
*/
private LinkedHashSet<String> eventIds;
/**
* 渠道倾向
*/
private String emotion ="未定义";
/**
* 渠道指数
*/
private Double EmotionIndex = 0d;
/**
* 经验评级
*/
private String experienceLevel;
/**
* 是否屏蔽
*/
private boolean show = true;
public void setLastTime(Date lastTime) {
if (null == this.lastTime || this.lastTime.before(lastTime)) {
this.lastTime = lastTime;
}
}
public void setArticleIds(LinkedHashSet<String> articleIds) {
if (null == this.articleIds) {
this.articleIds = articleIds;
} else {
this.articleIds.addAll(articleIds);
}
}
public void setChannelRecord(ChannelRecord channelRecord){
setLastTime(channelRecord.getLastTime());
setArticleIds(channelRecord.getArticleIds());
}
public ChannelIndex getChannelIndex(){
return Tools.convertMap(this,ChannelIndex.class);
}
public static Channel createFromChannelIndexRecord(ChannelIndex channelIndex, ChannelRecord channelRecord) {
Channel channel = new Channel();
channel.setCTime(new Date());
channel.setLinkedGroupId(channelIndex.getLinkedGroupId());
channel.setPlatform(channelIndex.getPlatform());
channel.setRealSource(channelIndex.getRealSource());
channel.setSource(channelIndex.getSource());
channel.setLastTime(channelRecord.getLastTime());
channel.setArticleIds(channelRecord.getArticleIds());
return channel;
}
}
package com.zhiwei.brandkbs2.pojo;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.common.GlobalPojo;
import com.zhiwei.qbjc.bean.tools.BeanTools;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.elasticsearch.search.SearchHit;
import java.util.*;
/**
* @ClassName: ChannelIndex
* @Description 渠道实体唯一判断标识
* @author: sjj
* @date: 2022-06-16 13:59
*/
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class ChannelIndex extends AbstractBaseMongo {
/**
* 关联项目组ID
*/
private String linkedGroupId;
/**
* 平台
*/
private String platform;
/**
* 来源
*/
private String realSource;
/**
* 渠道
*/
private String source;
public static List<ChannelIndex> getChannelIndexes(Map<String, Object> sourceAsMap ) {
List<ChannelIndex> res = new ArrayList<>();
String realSource = String.valueOf(sourceAsMap.get(GenericAttribute.ES_REAL_SOURCE));
String source = String.valueOf(sourceAsMap.get(GenericAttribute.ES_SOURCE));
Integer c5 = Integer.parseInt(String.valueOf(sourceAsMap.get(GenericAttribute.ES_C5)));
Integer foreign = Integer.parseInt(String.valueOf(sourceAsMap.get(GenericAttribute.ES_FOREIGN)));
List<Map<String, Object>> cacheMaps = (List<Map<String, Object>>) sourceAsMap.get(GenericAttribute.ES_BRANDKBS_CACHE_MAPS);
for (Map<String, Object> cacheMap : cacheMaps) {
String linkedGroupId = String.valueOf(cacheMap.get(GenericAttribute.LINKED_GROUP_ID));
String platform = BeanTools.filterPlatform(GlobalPojo.PLATFORMS, c5, foreign).getName();
res.add(new ChannelIndex(linkedGroupId, platform, realSource, source));
}
return res;
}
@Setter
@Getter
public static class ChannelRecord {
private Date lastTime;
private LinkedHashSet<String> articleIds = new LinkedHashSet<>();
public ChannelRecord() {
}
public ChannelRecord(Date lastTime, String articleId) {
this.lastTime = lastTime;
this.articleIds.add(articleId);
}
private void setLastTime(Date lastTime) {
if (null == this.lastTime || this.lastTime.before(lastTime)) {
this.lastTime = lastTime;
}
}
public ChannelRecord mergeRecord(ChannelRecord channelRecord) {
this.articleIds.addAll(channelRecord.getArticleIds());
setLastTime(channelRecord.getLastTime());
return this;
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
ChannelIndex that = (ChannelIndex) o;
return Objects.equals(linkedGroupId, that.linkedGroupId) && Objects.equals(platform, that.platform) && Objects.equals(realSource, that.realSource) && Objects.equals(source, that.source);
}
@Override
public int hashCode() {
return Objects.hash(linkedGroupId, platform, realSource, source);
}
}
package com.zhiwei.brandkbs2.pojo;
/**
* @ClassName: ChannelLabel
* @Description ChannelLabel
* @author: sjj
* @date: 2022-06-20 16:54
*/
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class ChannelLabel extends AbstractBaseMongo{
private String type;
private String label;
}
package com.zhiwei.brandkbs2.pojo;
import lombok.*;
/**
* @author sjj
* @version 1.0
* @description 项目竞品信息实体类
* @date 2022年4月20日15:06:45
*/
@Getter
@Setter
public class Contend extends AbstractProject{
/**
* 有无情感标注
*/
private boolean hasEmotion;
}
package com.zhiwei.brandkbs2.pojo;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.easyexcel.dto.UploadEventDTO;
import com.zhiwei.brandkbs2.enmus.EventTagEnum;
import com.zhiwei.brandkbs2.pojo.dto.YqEventDTO;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.Objects;
/**
* @ClassName: Event
* @Description 事件实体类
* @author: sjj
* @date: 2022-05-18 14:35
*/
@Getter
@Setter
@Document(collection = "brandkbs_event")
public class Event extends AbstractBaseMongo {
/**
* 对应事件数据存放集合名
*/
private String collectionName;
/**
* 标题
*/
private String title;
/**
* 开始时间
*/
private Date startTime;
/**
* 结束时间
*/
private Date endTime;
/**
* 关键字
*/
private String keyword;
/**
* 情感倾向
*/
private String emotion;
/**
* 结束状态
*/
private boolean endStatus;
/**
* 事件标签
*/
private JSONObject eventTag;
/**
* 创建时间
*/
private Date cTime;
/**
* 影响力
*/
private Double influence;
/**
* 项目ID
*/
private String projectId;
/**
* 关联项目组ID
*/
private String linkedGroupId;
/**
* 是否是舆情事件
*/
private String yqEventId;
public static Event createFromYqEventDTO(YqEventDTO yqEventDTO, String collectionName, String projectId, String linkedGroupId) {
Event event = new Event();
event.setTitle(yqEventDTO.getName());
event.setStartTime(yqEventDTO.getStartTime());
boolean isEnd = "结束".equals(yqEventDTO.getSpreadStatus());
event.setEndStatus(isEnd);
event.setEndTime(isEnd ? yqEventDTO.getEndTime() : null);
event.setKeyword(yqEventDTO.getKeyword());
event.setEmotion(yqEventDTO.getTagInfo().getString(EventTagEnum.EVENT_ATTRIBUTE.getName()));
event.setEventTag(yqEventDTO.getTagInfo());
event.setYqEventId(yqEventDTO.getYqEventId());
// 关联id
event.setCollectionName(collectionName);
event.setProjectId(projectId);
event.setLinkedGroupId(linkedGroupId);
return event;
}
public static Event createFromUploadEventDTO(UploadEventDTO eventDTO, String collectionName, String projectId, String linkedGroupId) {
Event event = new Event();
event.setCollectionName(collectionName);
event.setTitle(eventDTO.getTitle());
event.setStartTime(eventDTO.getStartTime());
event.setEndTime(eventDTO.getEndTime());
event.setEndStatus(Objects.nonNull(eventDTO.getEndTime()));
event.setKeyword(eventDTO.getKeyword());
event.setEmotion(eventDTO.getEmotion());
event.setEventTag(EventTagEnum.eventType(eventDTO.getEventType()));
// 关联id
event.setCollectionName(collectionName);
event.setProjectId(projectId);
event.setLinkedGroupId(linkedGroupId);
return event;
}
}
package com.zhiwei.brandkbs2.pojo;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.pojo.dto.EventDataDTO;
import com.zhiwei.brandkbs2.util.Tools;
import lombok.Getter;
import lombok.Setter;
import org.apache.poi.ss.formula.functions.Even;
import java.util.Date;
import java.util.Map;
/**
* @author sjj
* @version 1.0
* @description 事件数据实体类
* @date 2022年5月18日16:03:46
*/
@Getter
@Setter
public class EventData extends AbstractBaseMongo {
/**
* 事件ID
*/
private String eventId;
/**
* 平台
*/
private String platform;
/**
* 二级平台
*/
private String realSource;
/**
* 来源
*/
private String source;
/**
* 链接
*/
private String url;
/**
* 标题
*/
private String title;
/**
* 聚合标题
*/
private String aggTitle;
/**
* 文本内容
*/
private String content;
/**
* 项目ID
*/
private String projectId;
/**
* 关联项目组
*/
private String linkedGroupId;
/**
* 情感倾向
*/
private String emotion;
/**
* 文章时间
*/
private Date time;
/**
* 创建时间
*/
private Date cTime;
/**
* 标签数据
*/
private String tagInfo;
/**
* 原创/转发(微博平台)
*/
private boolean isForward;
public static EventData createFromEsMap(Map<String, Object> map, Event event) {
EventData data = new EventData();
JSONObject jsonMap = new JSONObject(map);
BaseMap baseMap = Tools.getBaseFromEsMap(map);
data.setEventId(event.getId());
data.setProjectId(event.getProjectId());
data.setLinkedGroupId(event.getLinkedGroupId());
data.setPlatform(baseMap.getPlatform());
data.setRealSource(baseMap.getRealSource());
data.setSource(baseMap.getSource());
data.setUrl(baseMap.getUrl());
data.setTitle(baseMap.getTitle());
data.setAggTitle(Tools.filterSpecialCharacter(baseMap.getTitle()));
data.setContent(baseMap.getContent());
data.setEmotion(baseMap.getEmotion());
data.setTime(new Date(baseMap.getTime()));
data.setForward(baseMap.isForward());
data.setCTime(new Date(jsonMap.getLong(GenericAttribute.ES_CTIME)));
// TagInfo
data.setTagInfo(Tools.change2TagInfoByMtag(jsonMap.getString(GenericAttribute.ES_MTAG)).toJSONString());
return data;
}
public static EventData createFromEventDataDTO(EventDataDTO eventDataDTO) {
return Tools.convertMap(eventDataDTO, EventData.class);
}
}
package com.zhiwei.brandkbs2.pojo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @ClassName: HighWord
* @Description 高频词实体
* @author: sjj
* @date: 2022-06-06 09:36
*/
@Getter
@Setter
@Document(collection = "brandkbs_high_word")
public class HighWord extends AbstractBaseMongo {
/**
* 名称
*/
private String keyword;
/**
* 创建时间
*/
private Date cTime;
/**
* 上传人
*/
private String submitter;
/**
* 项目ID
*/
private String projectId;
public static List<HighWord> createFromList(List<String> keywords, String projectId, String submitter) {
List<HighWord> res = new ArrayList<>();
Date now = new Date();
for (String keyword : keywords) {
HighWord highWord = new HighWord();
highWord.setKeyword(keyword);
highWord.setCTime(now);
highWord.setProjectId(projectId);
highWord.setSubmitter(submitter);
res.add(highWord);
}
return res;
}
}
package com.zhiwei.brandkbs2.pojo;
import com.zhiwei.brandkbs2.pojo.vo.ProjectVO;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author sjj
* @version 1.0
* @description 项目信息实体类
* @date 2019/8/15 9:08
*/
@Getter
@Setter
@Document(collection = "brandkbs_project")
public class Project extends AbstractProject {
/**
* 全网搜数据源(1:舆情库,2:商业数据库)
*/
private Integer wholeSearchDataSource;
/**
* 数据起始时间(能够绑定关联关系的时间点)
*/
private Date importTime;
/**
* 是否有竞品
*/
private boolean hasContend;
/**
* 竞品列表
*/
private List<Contend> contendList;
/**
* 模块展示列表(1:标注库 2:大库)
*/
private List<Integer> moduleShowList;
/**
* 重要渠道文件路径
*/
private String channelFileUrl;
/**
* 不友好渠道判断
*/
private Map<String,Double> negativeChannelParams;
/**
* 友好渠道判断
*/
private Map<String,Double> positiveChannelParams;
/**
* 黑渠道打通
*/
private Map<String,Object> blackChannelGroup;
/**
* 展示状态
* (只有停止的项目能切换该状态,为否时不允许前台登录,且不在前后台切换列表展示)
*/
private boolean isShow;
/**
* 启动状态
*/
private boolean isStart;
/**
* 创建时间
*/
private Date cTime;
/**
* 修改时间
*/
private Date uTime;
/**
* 项目主品牌配置信息转换
*
* @return 项目对象
*/
public ProjectVO creatProjectVo() {
ProjectVO projectVO = new ProjectVO();
projectVO.setId(this.getId());
// 主品牌
projectVO.setProjectName(this.getProjectName());
projectVO.setWholeSearchDataSource(this.getWholeSearchDataSource());
projectVO.setImportTime(this.getImportTime());
projectVO.setBrandName(this.getBrandName());
projectVO.setBrandLinkedGroup(this.getBrandLinkedGroup());
projectVO.setBrandLinkedGroupId(this.getBrandLinkedGroupId());
projectVO.setAvatarUrl(this.getAvatarUrl());
// 过滤逻辑
projectVO.setHitTags(this.getHitTags());
projectVO.setHitKeywords(this.getHitKeywords());
// 高频词
projectVO.setMergeSensitive(this.isMergeSensitive());
projectVO.setHighKeywords(this.getHighKeywords());
projectVO.setContendList(this.getContendList());
// 模块配置
projectVO.setModuleShowList(this.getModuleShowList());
projectVO.setChannelFileUrl(this.getChannelFileUrl());
projectVO.setNegativeChannelParams(this.getNegativeChannelParams());
projectVO.setPositiveChannelParams(this.getPositiveChannelParams());
projectVO.setBlackChannelGroup(this.getBlackChannelGroup());
return projectVO;
}
}
\ No newline at end of file
package com.zhiwei.brandkbs2.pojo;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.List;
/**
* @author sjj
* @version 1.0
* @description 简报实体类
* @date 2022年6月1日09:42:46
*/
@Setter
@Getter
@Document("brandkbs_report")
public class Report extends AbstractBaseMongo{
/**
* 简报标题
*/
private String title;
/**
* 开始时间
*/
private Date startTime;
/**
* 结束时间
*/
private Date endTime;
/**
* 发布时间
*/
private Date publishTime;
/**
* 报告类型
*/
private String type;
/**
* 是否是最新的
*/
private boolean latest;
/**
* 项目ID
*/
private String projectId;
/**
* 查看用户ID:0为全项目都可查看
*/
private String userId;
/**
* 竞品信息字符串
*/
@Deprecated
private List<String> contends;
/**
* 发布状态
*/
private boolean release;
}
package com.zhiwei.brandkbs2.pojo;
import com.zhiwei.brandkbs2.pojo.dto.ReportSettingsDTO;
import com.zhiwei.brandkbs2.util.Tools;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.List;
/**
* @author sjj
* @version 1.0
* @description 简报设置实体类
* @date 2022年5月31日18:06:55
*/
@Setter
@Getter
@Document("brandkbs_report_settings")
public class ReportSettings extends AbstractBaseMongo {
/**
* 报告类型
*/
private String type;
/**
* 简报后缀标题
*/
private String title;
/**
* 更新时间
*/
private Date uTime;
/**
* 对比竞品(存放对比竞品的linkedGroupId)
*/
private List<String> contendIds;
/**
* 开启状态
*/
private boolean used;
/**
* 项目id
*/
private String projectId;
public static ReportSettings createFromReportSettingsDTO(ReportSettingsDTO reportSettingsDTO, String projectId) {
ReportSettings reportSettings = Tools.convertMap(reportSettingsDTO, ReportSettings.class);
reportSettings.setProjectId(projectId);
return reportSettings;
}
}
package com.zhiwei.brandkbs2.pojo;
import com.zhiwei.brandkbs2.pojo.dto.TagFilterDTO;
import com.zhiwei.brandkbs2.util.Tools;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName: TagFilter
* @Description 标签筛选实体
* @author: sjj
* @date: 2022-06-01 13:53
*/
@Setter
@Getter
public class TagFilter extends AbstractBaseMongo {
/**
* 标签组名
*/
private String groupName;
/**
* 标签列表
*/
private List<Tag> tagList;
/**
* 排序字段
*/
private int groupNameSequence;
/**
* 项目ID
*/
private String projectId;
/**
* 关联组ID
*/
private String linkedGroupId;
@Setter
@Getter
public static class Tag {
/**
* 唯一id
*/
private String uniqueId;
/**
* 标签名
*/
private String name;
}
public static List<TagFilter> createFromTagFilterDTO(List<TagFilterDTO> tagFilterDTOs, String projectId, String linkedGroupId) {
List<TagFilter> res = new ArrayList<>();
int groupNameSequence = 0;
for (TagFilterDTO tagFilterDTO : tagFilterDTOs) {
TagFilter tagFilter = new TagFilter();
tagFilter.setGroupName(tagFilterDTO.getGroupName());
tagFilter.setTagList(tagFilterDTO.getTagList().stream().map(tagDTO -> Tools.convertMap(tagDTO, Tag.class)).collect(Collectors.toList()));
tagFilter.setGroupNameSequence(groupNameSequence++);
tagFilter.setProjectId(projectId);
tagFilter.setLinkedGroupId(linkedGroupId);
res.add(tagFilter);
}
return res;
}
}
package com.zhiwei.brandkbs2.pojo;
import com.zhiwei.middleware.auth.pojo.CenterUser;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
/**
* @author sjj
* @version 1.0
* @description 用户信息实体类
* @date 2022年4月27日18:03:43
*/
@Getter
@Setter
@Document(collection = "brandkbs_user")
public class User extends AbstractBaseMongo {
/**
* 昵称
*/
private String nickname;
/**
* 账号
*/
private String username;
/**
* 电话号码
*/
private long phoneNumber;
/**
* 头像地址
*/
private String avatarUrl;
/**
* 创建时间
*/
private Date cTime;
/**
* 用户角色列表
*/
private List<UserRole> roles;
/**
* 是否超管
*/
private boolean superAdmin;
/**
* 小程序-用户openid
*/
private String appletOpenId;
/**
* 微信开放平台关联唯一id
*/
private String wechatUnionId;
/**
* 公众号-用户openid
*/
private String subscriptionAccountOpenId;
public static User createFromCenterUser(CenterUser centerUser) {
User user = new User();
user.setId(String.valueOf(centerUser.getId()));
user.setNickname(centerUser.getNickName());
user.setUsername(centerUser.getName());
user.setPhoneNumber(Long.parseLong(centerUser.getPhone()));
user.setAvatarUrl(centerUser.getAvatarUrl());
user.setCTime(new Date());
user.setRoles(new ArrayList<>());
return user;
}
public User defaultRoleUser() {
Date now = new Date();
this.setSuperAdmin(false);
this.setRoles(Collections.singletonList(UserRole.defaultUserRole(now)));
return this;
}
}
package com.zhiwei.brandkbs2.pojo;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName: UserInfo
* @Description 用户信息实体类
* @author: sjj
* @date: 2022-05-11 14:16
*/
@Data
public class UserInfo {
private String nickname;
private String userId;
private Integer roleId;
private String projectId;
private String avatarUrl;
public UserInfo setUserId(String userId){
this.userId = userId;
return this;
}
public UserInfo setProjectId(String projectId){
this.projectId = projectId;
return this;
}
public UserInfo setAvatarUrl(String avatarUrl){
this.avatarUrl = avatarUrl;
return this;
}
public Map<String, Object> toMap() {
Map<String, Object> res = new HashMap<>();
res.put(GenericAttribute.NICK_NAME, this.nickname);
res.put(GenericAttribute.PROJECT_ID, this.projectId);
res.put(GenericAttribute.USER_ID, this.userId);
res.put(GenericAttribute.ROLE_ID, this.roleId);
res.put(GenericAttribute.AVATAR_URL, this.avatarUrl);
return res;
}
}
package com.zhiwei.brandkbs2.pojo;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.pojo.dto.UserDTO;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.time.DateUtils;
import java.util.Calendar;
import java.util.Date;
/**
* @ClassName: UserRole
* @Description 用户角色实体
* @author: sjj
* @date: 2022-04-29 13:38
*/
@Setter
@Getter
public class UserRole {
// 默认绑定阿里项目
private final static String DEFAULT_PROJECT_ID = "627a0880abed6402f00039ef";
// 默认导出1000
private final static int DEFAULT_EXPORT_LIMIT = 1000;
// 默认角色ID
private final static int DEFAULT_ROLE_ID = RoleEnum.CUSTOMER.getState();
private final static int MAX_EXPORT_LIMIT = 10000;
// 仅在header存储信息时使用到
private String userId;
/**
* 项目id
*/
private String projectId;
/**
* 角色id
*/
private Integer roleId;
// /**
// * 最近登录时间
// */
// private Date loginTime;
/**
* 过期时间,仅客户
*/
private Date expiredTime;
/**
* 舆情导出数量默认1000,超管默认10000
*/
private Integer exportAmount;
public UserRole(String projectId, int roleId, Date expiredTime, Integer exportAmount) {
this.projectId = projectId;
this.roleId = roleId;
this.expiredTime = expiredTime;
this.exportAmount = exportAmount;
}
public static UserRole createFromUserDto(UserDTO userDTO) {
int exportAmount = DEFAULT_EXPORT_LIMIT;
if (null != userDTO.getExportAmount() && userDTO.getExportAmount() < MAX_EXPORT_LIMIT) {
exportAmount = userDTO.getExportAmount();
}
Date expiredTime = null;
//当创建用户为客户时,添加过期时间
if (userDTO.getRoleId() == RoleEnum.CUSTOMER.getState()) {
Date date = new Date(userDTO.getExpiredTime());
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
expiredTime = calendar.getTime();
}
return new UserRole(userDTO.getProjectId(), userDTO.getRoleId(), expiredTime, exportAmount);
}
public static UserRole defaultUserRole(Date now) {
return new UserRole(DEFAULT_PROJECT_ID, DEFAULT_ROLE_ID, DateUtils.addDays(now, 30), DEFAULT_EXPORT_LIMIT);
}
}
package com.zhiwei.brandkbs2.pojo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
/**
* @author lxj
* @version 1.0
* @description 渠道信息传输类
* @date 2019/8/29 14:07
*/
@Data
@ToString
@AllArgsConstructor
@ApiModel("渠道信息传输类")
public class ChannelDTO {
/**
* 主键ID
*/
@ApiModelProperty("主键ID")
private String id;
/**
* 图片地址
*/
@ApiModelProperty("图片地址")
private String imgUrl;
/**
* 标签
*/
@ApiModelProperty("标签")
private String tag;
// /**
// * 合并渠道ID
// */
// @ApiModelProperty("合并渠道ID")
// private Integer mergeChannelId;
}
package com.zhiwei.brandkbs2.pojo.dto;
import com.zhiwei.brandkbs2.pojo.EventData;
import com.zhiwei.brandkbs2.util.Tools;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
* @ClassName: EventDataDTO
* @Description 事件数据传输类
* @author: sjj
* @date: 2022-05-25 11:24
*/
@Getter
@Setter
@ApiModel("事件数据传输类")
public class EventDataDTO {
@ApiModelProperty("数据id")
private String id;
@ApiModelProperty("事件id")
private String eventId;
@ApiModelProperty("报道标题")
private String title;
@ApiModelProperty("发布时间")
private Date time;
@ApiModelProperty("报道地址")
private String url;
@ApiModelProperty("所属平台")
private String platform;
@ApiModelProperty("所属来源")
private String realSource;
@ApiModelProperty("渠道名称")
private String source;
@ApiModelProperty("情感倾向")
private String emotion;
@ApiModelProperty("稿件内容")
private String content;
public static EventDataDTO createFromEventData(EventData eventData){
return Tools.convertMap(eventData,EventDataDTO.class);
}
}
package com.zhiwei.brandkbs2.pojo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.List;
import java.util.Map;
/**
* @ClassName: EventSearchDto
* @Description TODO
* @author: sjj
* @date: 2022-05-20 14:07
*/
@Data
@ToString
@ApiModel("事件信息传输类")
public class EventSearchDTO {
private Map<String, List<String>> tags;
@ApiModelProperty("搜索条件")
private String searchInfo;
private Integer page;
private Integer pageSize;
private Integer brandId;
private Long startTime;
private Long endTime;
}
package com.zhiwei.brandkbs2.pojo.dto;
import com.zhiwei.brandkbs2.pojo.ReportSettings;
import com.zhiwei.brandkbs2.util.Tools;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.List;
/**
* @author sjj
* @version 1.0
* @description 简报设置传输类
* @date 2022年5月31日18:06:55
*/
@Data
@ToString
public class ReportSettingsDTO {
/**
* 主键ID
*/
@ApiModelProperty("主键ID")
private String id;
/**
* 报告类型
*/
@ApiModelProperty("报告类型(月报/周报)")
private String type;
/**
* 简报后缀标题
*/
@ApiModelProperty("简报标题")
private String title;
/**
* 修改时间
*/
@ApiModelProperty("修改时间")
private String uTime;
/**
* 发布时间
*/
@ApiModelProperty("发布时间")
private String publishTime;
/**
* 对比竞品
*/
@ApiModelProperty("对比竞品id")
private List<String> contendIds;
/**
* 对比竞品名称
*/
@ApiModelProperty("对比竞品名称")
private List<String> contendBrandNames;
/**
* 开启状态
*/
@ApiModelProperty("开启状态")
private boolean used;
public static ReportSettingsDTO createFromReportSettings(ReportSettings reportSettings) {
ReportSettingsDTO reportSettingsDTO = Tools.convertMap(reportSettings, ReportSettingsDTO.class);
String publishTime = "每周一";
if("月报".equals(reportSettingsDTO.getType())){
publishTime = "每月1号";
}
reportSettingsDTO.setPublishTime(publishTime);
return reportSettingsDTO;
}
}
package com.zhiwei.brandkbs2.pojo.dto;
import com.google.common.collect.Maps;
import com.zhiwei.brandkbs2.pojo.TagFilter;
import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.middleware.mark.vo.MarkerTag;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @ClassName: TagFilterDTO
* @Description 标签筛选传输类
* @author: sjj
* @date: 2022-06-01 14:47
*/
@Getter
@Setter
public class TagFilterDTO {
@ApiModelProperty("标签组名")
private String groupName;
@ApiModelProperty("子标签名列表")
private List<TagDTO> tagList;
@Getter
@Setter
public static class TagDTO {
@ApiModelProperty("唯一id")
private String uniqueId;
@ApiModelProperty("标签名")
private String name;
@ApiModelProperty("是否使用")
private boolean used;
}
public static TagFilterDTO createFromTagFilter(TagFilter tagFilter){
TagFilterDTO tagFilterDTO = new TagFilterDTO();
tagFilterDTO.setGroupName(tagFilter.getGroupName());
tagFilterDTO.setTagList(tagFilter.getTagList().stream().map(tag->{
TagDTO tagDTO = new TagDTO();
tagDTO.setUsed(true);
tagDTO.setName(tag.getName());
tagDTO.setUniqueId(tag.getUniqueId());
return tagDTO;
}).collect(Collectors.toList()));
return tagFilterDTO;
}
public static List<TagFilterDTO> createFromQbjcTags(List<MarkerTag> qbjcTags) {
Map<String, List<MarkerTag>> groupNameList = qbjcTags.stream().collect(Collectors.groupingBy(MarkerTag::getGroupName));
return groupNameList.entrySet().stream().map(entry -> {
TagFilterDTO tagFilterDTO = new TagFilterDTO();
tagFilterDTO.setGroupName(entry.getKey());
tagFilterDTO.setTagList(entry.getValue().stream().map(markerTag -> Tools.convertMap(markerTag, TagDTO.class)).collect(Collectors.toList()));
return tagFilterDTO;
}).collect(Collectors.toList());
}
public static List<TagFilterDTO> createFromTagFilters(List<TagFilter> tagFilters) {
return tagFilters.stream().map(tagFilter -> {
TagFilterDTO tagFilterDTO = new TagFilterDTO();
tagFilterDTO.setGroupName(tagFilter.getGroupName());
tagFilterDTO.setTagList(tagFilter.getTagList().stream().map(tag -> {
TagDTO tagDTO = Tools.convertMap(tag, TagDTO.class);
tagDTO.setUsed(true);
return tagDTO;
}).collect(Collectors.toList()));
return tagFilterDTO;
}).collect(Collectors.toList());
}
/**
* 合并队列
*
* @param list1 队列1
* @param list2 队列2
* @return TagFilterDTOs
*/
public static List<TagFilterDTO> mergeLists(List<TagFilterDTO> list1, List<TagFilterDTO> list2) {
Map<String, List<TagFilterDTO>> mergeMap =
Stream.of(list1, list2).flatMap(Collection::stream).collect(Collectors.groupingBy(TagFilterDTO::getGroupName));
List<TagFilterDTO> collect = mergeMap.entrySet().stream().map(entry -> {
Map<String, TagDTO> resTagListMap = new HashMap<>();
for (TagFilterDTO tagFilterDTO : entry.getValue()) {
for (TagDTO tagDTO : tagFilterDTO.getTagList()) {
if (!resTagListMap.containsKey(tagDTO.getName())) {
resTagListMap.put(tagDTO.getName(), tagDTO);
} else {
// 优先存放被使用的
if (tagDTO.isUsed()) {
resTagListMap.put(tagDTO.getName(), tagDTO);
}
}
}
}
TagFilterDTO res = new TagFilterDTO();
res.setGroupName(entry.getKey());
res.setTagList(new ArrayList<>(resTagListMap.values()));
return res;
}).collect(Collectors.toList());
// 根据list1 groupName排序
Map<String, TagFilterDTO> groupNameMap = Maps.uniqueIndex(collect, TagFilterDTO::getGroupName);
Map<String, TagFilterDTO> res = new LinkedHashMap<>();
// 优先添加主队列
list1.forEach(tagFilterDTO -> {
String groupName = tagFilterDTO.getGroupName();
Optional.ofNullable(groupNameMap.get(groupName)).ifPresent(dto -> res.put(groupName, dto));
}
);
// 补全剩余队列
groupNameMap.forEach((groupName, tagFilterDTO) -> {
if (!res.containsKey(groupName)) {
res.put(groupName, tagFilterDTO);
}
});
return new ArrayList<>(res.values());
}
}
package com.zhiwei.brandkbs2.pojo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
/**
* @author sjj
* @version 1.0
* @description 用户信息传输类
* @date 2022年4月28日17:37:38
*/
@Data
@ToString
@ApiModel("用户信息传输类")
public class UserDTO {
/**
* 用户ID
*/
@ApiModelProperty("用户ID")
private String id;
/**
* 昵称
*/
@ApiModelProperty("昵称")
private String nickname;
/**
* 账号
*/
@ApiModelProperty("账号")
private String username;
/**
* 电话号码
*/
@ApiModelProperty("电话号码")
private long phoneNumber;
/**
* 项目ID
*/
@ApiModelProperty("项目ID")
private String projectId;
/**
* 权限ID
*/
@ApiModelProperty("权限ID")
private Integer roleId;
/**
* 过期时间,仅客户
*/
@ApiModelProperty("过期时间")
private long expiredTime;
/**
* 舆情导出数量,默认1000,超管10000
*/
@ApiModelProperty("舆情导出数量")
private Integer exportAmount;
}
package com.zhiwei.brandkbs2.pojo.dto;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.util.Tools;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @author sjj
* @version 1.0
* @description 輿情事件列表字段
* @date 2022年5月25日16:57:21
*/
@Data
@ToString
@ApiModel("輿情事件列表字段")
public class YqEventDTO {
/**
* 舆情系统事件ID
*/
@ApiModelProperty("舆情系统事件ID")
private String yqEventId;
/**
* 事件名称
*/
@ApiModelProperty("事件名称")
private String name;
/**
* 传播状态
*/
@ApiModelProperty("传播状态")
private String spreadStatus;
/**
* 开始时间
*/
@ApiModelProperty("开始时间")
private Date startTime;
/**
* 结束时间
*/
@ApiModelProperty("结束时间")
private Date endTime;
/**
* 关键字
*/
@ApiModelProperty("关键字")
private String keyword;
/**
* 标签数据
*/
@ApiModelProperty("标签数据")
private JSONObject tagInfo;
/**
* 是否已存在
*/
@ApiModelProperty("是否已存在")
private Boolean exists;
public static YqEventDTO createFromUrlJson(JSONObject json){
YqEventDTO res = Tools.convertMap(json, YqEventDTO.class);
res.setYqEventId(json.getString("id"));
return res;
}
}
package com.zhiwei.brandkbs2.pojo.vo;
import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.util.Tools;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @author sjj
* @version 1.0
* @description 用户行为展示类
* @date 2022年5月27日12:01:47
*/
@Data
@ToString
public class BehaviorVO {
/**
* 主键ID
*/
private String id;
/**
* 用户ID
*/
private String nickname;
/**
* IP地址
*/
private String ip;
/**
* 创建时间
*/
private Date cTime;
/**
* 访问页面
*/
private String page;
/**
* 操作模块
*/
private String module;
/**
* 角色ID
*/
private Integer roleId;
public static BehaviorVO createFromBehavior(Behavior behavior, String nickname, Integer roleId) {
BehaviorVO behaviorVO = Tools.convertMap(behavior, BehaviorVO.class);
// 补充nickname和role
behaviorVO.setNickname(nickname);
behaviorVO.setRoleId(roleId);
return behaviorVO;
}
}
package com.zhiwei.brandkbs2.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @author lxj
* @version 1.0
* @description 事件信息展示类
* @date 2019/9/9 18:03
*/
@Data
@ToString
@ApiModel("事件信息展示类")
public class EventVO {
/**
* 事件ID
*/
@ApiModelProperty("事件ID")
private String id;
/**
* 标题
*/
@ApiModelProperty("标题")
private String title;
/**
* 开始时间
*/
@ApiModelProperty("开始时间")
private Date startTime;
/**
* 关键词
*/
@ApiModelProperty("关键词")
private String keyword;
/**
* 事件类型
*/
@ApiModelProperty("事件标签")
@Deprecated
private String eventTag;
}
package com.zhiwei.brandkbs2.pojo.vo;
import com.zhiwei.brandkbs2.util.MongoUtil;
import lombok.Data;
import lombok.ToString;
import java.util.List;
/**
* @author zzm
* @version V1.0
* @description 分页信息
* @date 2017-10-11 10:03
**/
@Data
@ToString
public class PageVO<T> {
private Integer pageNum;
private Integer pageSize;
private Integer size;
private Long total;
private Long pages;
private List<T> list;
private Boolean hasNext;
public static <K, T> PageVO<K> createPageVo(MongoUtil.PageHelper<T> pageHelper, List<K> jsonObjects) {
PageVO<K> pageVO = new PageVO<>();
pageVO.setTotal(pageHelper.getTotal());
pageVO.setList(jsonObjects);
pageVO.setPageNum(pageHelper.getPageNum());
pageVO.setPageSize(pageHelper.getPageSize());
pageVO.setPages(pageHelper.getPages());
pageVO.setSize(pageHelper.getSize());
pageVO.setHasNext(pageHelper.getHasNext());
return pageVO;
}
public static <T> PageVO<T> createPageVo(long total, int pageNum, long pages, int size, List<T> tList) {
PageVO<T> pageVO = new PageVO<>();
pageVO.setTotal(total);
pageVO.setList(tList);
pageVO.setPageNum(pageNum);
pageVO.setPages(pages);
pageVO.setSize(size);
pageVO.setHasNext(pageNum < pages);
return pageVO;
}
public static <T> PageVO<T> createPageVoNew(long total, int pageNum, int size, List<T> tList) {
PageVO<T> pageVO = new PageVO<>();
long pages = (total + size - 1) / size;
pageVO.setTotal(total);
pageVO.setList(tList);
pageVO.setPageNum(pageNum);
pageVO.setPages(pages);
pageVO.setSize(size);
pageVO.setHasNext(pageNum < pages);
return pageVO;
}
}
package com.zhiwei.brandkbs2.pojo.vo;
import com.zhiwei.brandkbs2.pojo.Contend;
import com.zhiwei.brandkbs2.pojo.Project;
import com.zhiwei.middleware.mark.vo.MarkerTag;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author sjj
* @version 1.0
* @description 项目配置展示
* @date 2022年4月20日15:26:47
*/
@Data
@ToString
@ApiModel("项目配置展示类")
public class ProjectVO {
/**
* 项目主键ID
*/
@ApiModelProperty("项目主键ID")
private String id;
/**
* 项目名
*/
@ApiModelProperty("项目名")
private String projectName;
/**
* 全网搜数据源(1:舆情库,2:商业数据库)
*/
@ApiModelProperty("全网搜数据源(1:舆情库,2:商业数据库)")
private Integer wholeSearchDataSource;
/**
* 数据起始时间
*/
@ApiModelProperty("数据起始时间")
private Date importTime;
/**
* 头像地址
*/
@ApiModelProperty("头像地址")
private String avatarUrl;
/**
* 品牌关联项目
*/
@ApiModelProperty("品牌关联项目")
private String brandLinkedGroup;
/**
* 品牌关联项目
*/
@ApiModelProperty("品牌关联项目id")
private String brandLinkedGroupId;
/**
* 品牌名称
*/
@ApiModelProperty("品牌名称")
private String brandName;
/**
* 是否包含敏感
*/
@ApiModelProperty("是否包含敏感")
private boolean isMergeSensitive;
;
/**
* 命中标签
*/
@ApiModelProperty("命中标签")
private List<MarkerTag> hitTags;
/**
* 命中关键词列表
*/
@ApiModelProperty("命中关键词列表")
private List<String> hitKeywords;
/**
* 高频关键词列表
*/
@ApiModelProperty("高频关键字列表")
private List<String> highKeywords;
/**
* 竞品信息
*/
@ApiModelProperty("竞品配置信息")
private List<Contend> contendList;
/**
* 模块展示列表(1:标注库 2:大库)
*/
@ApiModelProperty("舆情数据源(模块展示列表(1:标注库 2:大库))")
private List<Integer> moduleShowList;
/**
* 黑渠道对应组
*/
@ApiModelProperty("黑渠道对应组")
private Map<String,Object> blackChannelGroup;
/**
* 重要渠道文件路径
*/
@ApiModelProperty("重要渠道文件路径")
private String channelFileUrl;
/**
* 不友好渠道判断,size:4
*/
@ApiModelProperty("不友好渠道判断,size:4")
private Map<String,Double> negativeChannelParams;
/**
* 友好渠道判断,size:5
*/
@ApiModelProperty("友好渠道判断,size:5")
private Map<String,Double> positiveChannelParams;
/**
* 项目主品牌配置信息转换
*
* @return 项目对象
*/
public Project creatProject(Date time) {
Project project = new Project();
project.setId(this.getId());
project.setProjectName(this.getProjectName());
project.setBrandName(this.getBrandName());
project.setBrandLinkedGroup(this.getBrandLinkedGroup());
project.setBrandLinkedGroupId(this.getBrandLinkedGroupId());
project.setHitTags(this.getHitTags());
project.setHitKeywords(this.getHitKeywords());
project.setHighKeywords(this.getHighKeywords());
project.setMergeSensitive(this.isMergeSensitive());
project.setAvatarUrl(this.getAvatarUrl());
project.setWholeSearchDataSource(this.getWholeSearchDataSource());
project.setImportTime(this.getImportTime());
project.setHasContend(null != this.getContendList());
project.setContendList(this.getContendList());
project.setModuleShowList(this.getModuleShowList());
project.setChannelFileUrl(this.getChannelFileUrl());
project.setNegativeChannelParams((this.getNegativeChannelParams()));
project.setPositiveChannelParams((this.getPositiveChannelParams()));
project.setBlackChannelGroup(this.getBlackChannelGroup());
project.setShow(true);
project.setStart(false);
project.setCTime(time);
project.setUTime(time);
return project;
}
// private static Map<String, Double> parse2NegativeChannelParmasMap(List<Double> negativeChannel) {
// if (4 != negativeChannel.size()) {
// ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM.message("不友好渠道传参异常"));
// }
// Map<String, Double> parmasMap = new HashMap<>(4);
// parmasMap.put(GenericAttribute.ChannelParam.负面稿件数.value(), negativeChannel.get(0));
// parmasMap.put(GenericAttribute.ChannelParam.参与负面事件.value(), negativeChannel.get(1));
// parmasMap.put(GenericAttribute.ChannelParam.特殊稿件.value(), negativeChannel.get(2));
// parmasMap.put(GenericAttribute.ChannelParam.经验判断.value(), negativeChannel.get(3));
// return parmasMap;
// }
//
// private static Map<String, Double> parse2PositiveChannelParmasMap(List<Double> positiveChannel) {
// if (5 != positiveChannel.size()) {
// ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM.message("友好渠道传参异常"));
// }
// Map<String, Double> parmasMap = new HashMap<>(5);
// parmasMap.put(GenericAttribute.ChannelParam.正面_中性.value(), positiveChannel.get(0));
// parmasMap.put(GenericAttribute.ChannelParam.正面_负面.value(), positiveChannel.get(1));
// parmasMap.put(GenericAttribute.ChannelParam.参与正面事件.value(), positiveChannel.get(2));
// parmasMap.put(GenericAttribute.ChannelParam.特殊稿件.value(), positiveChannel.get(3));
// parmasMap.put(GenericAttribute.ChannelParam.经验判断.value(), positiveChannel.get(4));
// return parmasMap;
// }
}
//package com.zhiwei.brandkbs2.pojo.vo;
//
//import com.zhiwei.brandkbs2.pojo.TagFilter;
//import io.swagger.annotations.ApiModelProperty;
//import lombok.Getter;
//import lombok.Setter;
//
//import java.util.List;
//import java.util.stream.Collectors;
//
///**
// * @ClassName: TagFilterVO
// * @Description 标签筛选展示类
// * @author: sjj
// * @date: 2022-06-01 13:46
// */
//@Setter
//@Getter
//public class TagFilterVO {
//
// @ApiModelProperty("标签组名")
// private String groupName;
//
// @ApiModelProperty("子标签名列表")
// private List<String> nameList;
//
// public static TagFilterVO createFromTagFilter(TagFilter tagFilter){
// TagFilterVO tagFilterVO = new TagFilterVO();
// tagFilterVO.setGroupName(tagFilter.getGroupName());
// tagFilterVO.setNameList(tagFilter.getTagList().stream().map(TagFilter.Tag::getName).collect(Collectors.toList()));
// return tagFilterVO;
// }
//
//}
package com.zhiwei.brandkbs2.pojo.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class YqEventSearchVO {
@ApiModelProperty("筛选事件标签")
private Map<String, List<String>> tags;
@ApiModelProperty("关键词")
private String keyword;
@ApiModelProperty("页码")
private Integer page;
@ApiModelProperty("每页记录数")
private Integer pageSize;
@ApiModelProperty("关联项目组id")
private String linkedGroupId;
@ApiModelProperty("起始时间")
private Long startTime;
@ApiModelProperty("结束时间")
private Long endTime;
}
package com.zhiwei.brandkbs2.service;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* @ClassName: IBehaviorService
* @Description 用户行为业务接口
* @author: sjj
* @date: 2022-05-27 11:05
*/
public interface IBehaviorService {
/**
* 添加用户行为
*
* @param module 操作模块
* @param request 请求
*/
void pushBehavior(Behavior.Operation operation, String module, HttpServletRequest request);
/**
* 分页查询用户行为列表
*
* @param page 页码
* @param size 大小
* @param startTime 开始时间
* @param endTime 结束时间
* @param backstage 前后台
* @param nickname 用户昵称
* @return 用户行为列表
*/
PageVO<BehaviorVO> findBehaviorList(int page, int size, long startTime, long endTime, boolean backstage, String nickname);
/**
* 下载用户行为的数据
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param backstage 前后台
* @return 下载用户行为的数据
*/
List<ExportBehaviorDTO> download(long startTime, long endTime, boolean backstage);
}
package com.zhiwei.brandkbs2.service;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportAdminChannelArticleDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportAdminChannelEventDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportChannelDTO;
import com.zhiwei.brandkbs2.pojo.dto.ChannelDTO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import java.util.List;
/**
* @ClassName: IChannelService
* @Description IChannelService
* @author: sjj
* @date: 2022-06-16 16:00
*/
public interface IChannelService {
/**
* 根据搜索条件查询渠道列表
*
* @param page 页码
* @param size 大小
* @param linkedGroupId 关联项目ID
* @param emotion 0:全部 1:友好 2:中性 3:不友好
* @param platform 平台
* @param show 展示
* @param keyword 搜索关键字
* @param sorter 排序字段
* @return 渠道列表
*/
PageVO<JSONObject> findChannelList(int page, int size, String linkedGroupId, String emotion, String platform, Boolean show, String keyword, String sorter);
/**
* 根据搜索条件查询稿件列表
*
* @param page 页码
* @param size 大小
* @param channelId 渠道ID
* @return 稿件列表
*/
PageVO<JSONObject> findArticleList(int page, int size, String channelId);
/**
* 根据搜索条件查询事件列表
*
* @param page 页码
* @param size 大小
* @param channelId 渠道ID
* @return 稿件列表
*/
PageVO<JSONObject> findEventList(int page, int size, String channelId);
/**
* 根据项目ID修改渠道展示状态
*
* @param channelId 渠道id
*/
void switchChannelShow(String channelId);
/**
* 修改渠道经验评级
*
* @param channelId 渠道ID
* @param experience 经验评级
*/
void updateExperience(String channelId, String experience);
/**
* 获取单个渠道信息
*
* @param channelId 渠道ID
* @return 单个渠道信息
*/
JSONObject getChannel(String channelId);
/**
* 修改渠道信息
*
* @param channelDTO 修改的渠道信息对象
*/
void updateChannel(ChannelDTO channelDTO);
/**
* 获取下载渠道列表
*/
List<ExportChannelDTO> findDownloadChannelList(String linkedGroupId, String emotion, String platform, Boolean show, String keyword);
/**
* 获取下载稿件列表
*/
List<ExportAdminChannelArticleDTO> findDownloadChannelArticleList(String channelId);
/**
* 获取下载事件列表
*/
List<ExportAdminChannelEventDTO> findDownloadChannelEventList(String channelId);
/**
* 获取所有渠道标签分类
*
* @return 渠道标签分类
*/
List<String> getChannelTypes();
/**
* 根据渠道类型获取渠道标签
*
* @param type 渠道分类类别
* @return 渠道标签
*/
List<String> getChannelLabels(String type);
}
package com.zhiwei.brandkbs2.service;
import com.zhiwei.middleware.mark.vo.MarkerTag;
import com.zhiwei.middleware.mark.vo.TagSearch;
import java.util.List;
/**
* @ClassName: CommonService
* @Description 基础服务类
* @author: sjj
* @date: 2022-06-02 11:22
*/
public interface ICommonService {
/**
* 获取qbjcTags
*
* @param linkedGroupId 项目组id
* @param tagSearches 搜索条件
* @return markTags
*/
List<MarkerTag> getQbjcTags(String linkedGroupId, TagSearch... tagSearches);
/**
* 获取qbjcTags
*
* @param groupName 项目组名
* @param tagSearches 搜索条件
* @return markTags
*/
List<MarkerTag> getQbjcTagsByGroupName(String groupName, TagSearch... tagSearches);
}
package com.zhiwei.brandkbs2.service;
import com.zhiwei.brandkbs2.pojo.Event;
/**
* @ClassName: IEventDataService
* @Description 事件数据业务接口抽象类
* @author: sjj
* @date: 2022-05-23 17:48
*/
public interface IEventDataService {
/**
* 更新事件数据
*
* @param event 事件对象
*/
void analysisEvent(Event event);
/**
* 删除事件数据
*
* @param id 数据id
* @param eventId 事件id
*/
String deleteOneByIdAndEventId(String id,String eventId);
}
package com.zhiwei.brandkbs2.service;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportEventDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportEventDataDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.UploadEventDTO;
import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.pojo.dto.EventDataDTO;
import com.zhiwei.brandkbs2.pojo.dto.YqEventDTO;
import com.zhiwei.brandkbs2.pojo.vo.EventVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.pojo.vo.YqEventSearchVO;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* @ClassName: IEventService
* @Description 事件管理业务接口
* @author: sjj
* @date: 2022-05-17 16:32
*/
public interface IEventService {
/**
* 根据事件id查询事件
*
* @param eventId 事件id
* @return 事件
*/
Event getEventById(String eventId);
/**
* 批量添加舆情事件数据
*
* @param linkedGroupId 关联项目ID
* @param yqEventList 舆情事件列表
*/
void addYqEvents(String linkedGroupId, List<YqEventDTO> yqEventList);
/**
* 批量添加舆情事件数据
*
* @param yqEventSearchVO 舆情事件搜索实体
*/
void addYqEventAll(YqEventSearchVO yqEventSearchVO);
/**
* 后台分页查询事件列表信息
*
* @param page 页码
* @param size 大小
* @param linkedGroupId 关联项目组id
* @param keyword 搜索关键字
* @param sorter 排序字段
* @return 事件列表信息
*/
PageVO<JSONObject> findEventList(int page, int size, String linkedGroupId, String keyword, String sorter);
/**
* 分页查询舆情监测系统的事件列表
*
* @param yqEventSearchVO 舆情事件搜索实体
* @return 舆情事件列表信息
*/
PageVO<JSONObject> findYqEventList(YqEventSearchVO yqEventSearchVO);
/**
* 稿件数据上传
*
* @param linkedGroupId 关联项目id
* @param file 文件
* @return 文件信息
*/
JSONObject uploadEventDatas(String linkedGroupId, MultipartFile file);
/**
* 根据票据获取文件上传进度
*
* @param ticket 票据
* @return 文件上传进度
*/
int getEventDataUploadProgress(String ticket);
/**
* 根据事件id获取更新进度
*
* @param eventIds 事件ids
* @return 事件更新进度
*/
JSONObject getEventAnalyzeProgress(List<String> eventIds);
/**
* 根据事件ID获取单个事件信息
*
* @param eventId 事件ID
* @return 单个事件信息
*/
JSONObject getEventJSONByEventId(String eventId);
/**
* 更新事件信息
*
* @param eventVO 事件展示信息对象
*/
void updateEvent(EventVO eventVO);
/**
* 更新首发事件信息
*
* @param eventDataDTO 事件数据传输对象
*/
void updateEventFirst(EventDataDTO eventDataDTO);
/**
* 结束事件
*
* @param eventId 事件ID
*/
void endEvent(String eventId);
/**
* 删除事件
*
* @param eventId 事件ID
* @return 事件标题
*/
String deleteEvent(String eventId);
/**
* 根据事件ID分页获取事件数据信息
*
* @param page 页码
* @param size 大小
* @param eventId 事件ID
* @return 稿件信息
*/
PageVO<JSONObject> getEventDatas(int page, int size, String eventId);
/**
* 删除事件数据
*
* @param id 数据id
* @param eventId 事件id
*/
String deleteEventData(String id, String eventId);
/**
* 获取事件数据列表下载信息
*
* @param eventId 事件ID
* @return 事件稿件列表下载信息
*/
Pair<String, List<ExportEventDataDTO>> downloadEventDatas(String eventId);
/**
* 获取事件列表下载信息
*
* @param linkedGroupId 关联项目组id
* @return 事件列表下载信息
*/
Pair<String, List<ExportEventDTO>> downloadEvents(String linkedGroupId);
/**
* 添加文件上传事件信息
*
* @param linkedGroupId 关联项目组id
* @param fileUrl 文件路径
*/
void addFileEvents(String linkedGroupId, String fileUrl);
/**
* 添加文件上传事件信息
*
* @param projectId 项目id
* @param linkedGroupId 关联项目组id
* @param eventDTO 事件传输对象
*/
void addFileEvent(String projectId, String linkedGroupId, UploadEventDTO eventDTO);
/**
* 批量更新事件
*
* @param eventIds 事件ID集合
*/
void analysisEvents(List<String> eventIds);
/**
* 搜索舆情全部事件标签
*
* @param linkedGroupId 关联项目组ID
* @return 事件标签列表
*/
JSONObject findEventTagListAll(String linkedGroupId);
/**
* 搜索舆情事件标签
*
* @param page 页码
* @param size 每页记录数
* @param linkedGroupId 关联项目组ID
* @param tagGroupName 标签组名
* @return 事件标签列表
*/
PageVO<JSONObject> findEventTagList(int page, int size, String linkedGroupId, String tagGroupName);
/**
* 获取舆情事件标签组名
*
* @param linkedGroupId 关联项目组ID
* @return 事件标签组名列表
*/
List<String> findEventTagGroupName(String linkedGroupId);
}
package com.zhiwei.brandkbs2.service;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportHighWordDTO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import java.util.List;
/**
* @ClassName: IHighWordService
* @Description 高频词服务接口
* @author: sjj
* @date: 2022-06-06 09:59
*/
public interface IHighWordService {
/**
* 分页查询高频词列表
*
* @param page 页码
* @param size 页码大小
* @param keyword 关键词
* @return PageVO<JSONObject>
*/
PageVO<JSONObject> findHighWord(int page, int size, String keyword);
/**
* 添加高频关键词
*
* @param highWords 高频词
*/
void addHighWordList(List<String> highWords);
/**
* 删除高频关键词
*
* @param id 高频词id
*/
void deleteHighWord(String id);
/**
* 下载高频关键词
*
* @return List<ExportHighWordDTO>
*/
List<ExportHighWordDTO> downloadHighWord();
}
package com.zhiwei.brandkbs2.service;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.pojo.AbstractProject;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.pojo.vo.ProjectVO;
import java.util.List;
/**
* @author sjj
* @version 1.0
* @description 项目业务接口
* @date 2022年4月18日16:49:10
*/
public interface IProjectService {
/**
* 添加项目
*
* @param projectVO 项目配置展示对象
*/
void addProject(ProjectVO projectVO);
/**
* 查询所有项目列表
*
* @param page 页码
* @param size 大小
* @param keyword 关键字
* @return 项目列表
*/
PageVO<JSONObject> findProjectList(int page, int size, String keyword);
/**
* 根据项目ID获取该项目信息
*
* @param pid 项目ID
* @return 项目信息
*/
ProjectVO getProjectVOById(String pid);
/**
* 修改项目
*
* @param projectVO 项目展示对象
*/
void updateProject(ProjectVO projectVO);
/**
* 根据项目ID删除项目
*
* @param pid 删除的项目ID
* @param loginPid 登录的项目ID
*/
void deleteProject(String pid, String loginPid);
/**
* 根据项目ID修改项目展示状态
*
* @param pid 删除的项目ID
*/
boolean switchProjectShow(String pid);
/**
* 根据项目ID修改项目启动状态
*
* @param pid 删除的项目ID
*/
void switchProjectStart(String pid);
/**
* 获取当前用户拥有的所有项目
* @return
*/
List<JSONObject> getUserAllProjects();
/**
* 获取当前用户拥有的所有项目(包括已过期)
* @return
*/
List<JSONObject> getLoginUserAllProjects();
/**
* 根据项目ID获取品牌筛选列表
*
* @param hasPrimary 是否要主品牌
* @return 品牌筛选列表
*/
List<JSONObject> getBrands(String projectId,boolean hasPrimary);
/**
* 根据关联项目组ID获取Project
*
* @param linkedGroupId 关联项目组ID
* @return project对象
*/
AbstractProject getProjectByLinkedGroupId(String linkedGroupId);
}
package com.zhiwei.brandkbs2.service;
import com.zhiwei.brandkbs2.pojo.dto.ReportSettingsDTO;
import java.util.Map;
/**
* @ClassName: IReportService
* @Description 报告业务接口
* @author: sjj
* @date: 2022-05-31 18:00
*/
public interface IReportService {
/**
* 获取项目报告配置信息
*
* @return 项目报告配置信息
*/
Map<String,ReportSettingsDTO> getReportSettings();
/**
* 保存报告配置
*
* @param reportSettingsDTO 报告配置传输类
*/
void upsertReportSettings(ReportSettingsDTO reportSettingsDTO);
}
package com.zhiwei.brandkbs2.service;
import com.zhiwei.qbjc.bean.pojo.common.MessagePlatform;
import com.zhiwei.qbjc.bean.pojo.common.Tag;
import java.util.List;
/**
* @ClassName: ISystemInfoService
* @Description 监测系统相关infoService
* @author: sjj
* @date: 2022-06-16 14:19
*/
public interface ISystemInfoService {
/**
* 获取监测系统Platforms
*
* @return List<MessagePlatform>
*/
List<MessagePlatform> getPlatforms();
/**
* 获取监测系统Tags
*
* @return List<Tag>
*/
List<Tag> getTags();
}
package com.zhiwei.brandkbs2.service;
import com.zhiwei.brandkbs2.pojo.dto.TagFilterDTO;
import java.util.List;
/**
* @ClassName: TagFilterService
* @Description 筛选器服务接口
* @author: sjj
* @date: 2022-06-01 13:40
*/
public interface ITagFilterService {
/**
* 获取在用筛选器列表
*
* @return 筛选器展示列表
*/
List<TagFilterDTO> getTagFilter();
/**
* 获取所有可选筛选器列表
*
* @return 筛选器传输列表
*/
List<TagFilterDTO> getTagFilterAll();
/**
* 编辑筛选器
*
* @param tagFilterDTOs 筛选器传输实体
*/
void updateTagFilter(List<TagFilterDTO> tagFilterDTOs);
/**
* 删除筛选器
*
* @param linkedGroupId 关联项目组id
*/
void deleteTagFilter(String linkedGroupId);
}
package com.zhiwei.brandkbs2.service;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.pojo.UserInfo;
import com.zhiwei.brandkbs2.pojo.dto.UserDTO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import java.util.List;
/**
* @ClassName: IUserService
* @Description 用户管理服务接口
* @author: sjj
* @date: 2022-04-28 14:58
*/
public interface IUserService {
/**
* 用户登录
*
* @return
*/
UserInfo login();
/**
* 查询用户信息
*
* @param userId
* @param pid
* @return
*/
UserInfo queryUserInfo(String userId, String pid);
/**
* 分页查询所有用户
*
* @param page 页码
* @param size 大小
* @param keyword 关键字
* @param pid 项目ID
* @param role 角色
* @return 所有用户
*/
PageVO<JSONObject> findUserList(int page, int size, String keyword, String pid, int role);
/**
* 添加用户
*
* @param userDTO
*/
void addUser(UserDTO userDTO);
/**
* 删除用户
*
* @param userId
* @param pid
*/
void deleteUser(String userId, String pid);
/**
* 编辑用户
*
* @param userDTO
*/
void updateUser(UserDTO userDTO);
/**
* 分页查询所有超级管理员
*
* @param page 页码
* @param size 大小
* @param keyword 关键字
* @return 所有超级管理员用户
*/
PageVO<JSONObject> findSuperAdminList(int page, int size, String keyword);
/**
* 添加超级管理员
*
* @param userDTO
*/
void addSuperAdmin(UserDTO userDTO);
/**
* 删除超级管理员
*
* @param userId
*/
void deleteSuperAdmin(String userId);
/**
* 旧用户绑定
*
* @param username
* @param password
*/
List<JSONObject> bindUser(String username, String password);
/**
* 跳过用户绑定
*/
List<JSONObject> skipBindUser();
/**
* 校验用户身份
*/
boolean checkUserRoles();
void resetBind(String username);
}
package com.zhiwei.brandkbs2.service.impl;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.dao.IBehaviorDao;
import com.zhiwei.brandkbs2.dao.IUserDao;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.listener.ApplicationProjectListener;
import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.pojo.User;
import com.zhiwei.brandkbs2.pojo.UserRole;
import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.IBehaviorService;
import com.zhiwei.brandkbs2.util.MongoUtil;
import com.zhiwei.brandkbs2.util.Tools;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* @ClassName: BehaviorServiceImpl
* @Description 用户行为业务接口实现类
* @author: sjj
* @date: 2022-05-27 13:41
*/
@Service("behaviorServiceImpl")
public class BehaviorServiceImpl implements IBehaviorService {
public static final Logger log = LogManager.getLogger(BehaviorServiceImpl.class);
@Resource(name = "behaviorDao")
private IBehaviorDao behaviorDao;
@Resource(name = "userDao")
private IUserDao userDao;
@Resource(name = "mongoUtil")
private com.zhiwei.brandkbs2.util.MongoUtil mongoUtil;
@Override
public void pushBehavior(Behavior.Operation operation, String module, HttpServletRequest request) {
try {
String userId = UserThreadLocal.getUserId();
String projectId = UserThreadLocal.getProjectId();
String collectionName = behaviorDao.generateCollectionName();
ApplicationProjectListener.getThreadPool().execute(() -> {
Behavior behavior = new Behavior();
behavior.setUserId(userId);
behavior.setProjectId(projectId);
behavior.setIp(Tools.getIpAddress(request));
behavior.setCTime(new Date());
behavior.setPage(operation.getPage());
behavior.setModule(module);
behavior.setBackstage(operation.isBackstage());
behaviorDao.insertOne(behavior, collectionName);
});
} catch (Exception e) {
log.error("用户行为保存失败,失败原因:", e);
}
}
@Override
public PageVO<BehaviorVO> findBehaviorList(int page, int size, long startTime, long endTime, boolean backstage, String nickname) {
Date start = new Date(startTime);
Date end = new Date(endTime);
String[] collectionNames = behaviorDao.generateCollectionNames(start, end);
Query query = new Query();
query.addCriteria(Criteria.where("cTime").gte(start).lt(end).and("backstage").is(backstage));
if (StringUtils.isNotEmpty(nickname)) {
List<User> userList = userDao.findList(Query.query(Criteria.where("nickname").regex(Pattern.compile("^.*" + nickname + ".*$", Pattern.CASE_INSENSITIVE))));
// 根据nickname未查询
if (CollectionUtils.isEmpty(userList)) {
return PageVO.createPageVo(0, page, 0, size, Collections.emptyList());
}
// 添加userId限制
query.addCriteria(Criteria.where("userId").in(userList.stream().map(User::getId).collect(Collectors.toList())));
}
long count = behaviorDao.count(query, collectionNames);
mongoUtil.start(page, size, query);
List<Behavior> behaviorList = behaviorDao.findList(query, collectionNames);
List<BehaviorVO> resList = behaviorList.stream().map(behavior -> {
Pair<String, Integer> nicknameAndRoleId = getNicknameAndRoleId(behavior.getUserId(), behavior.getProjectId());
return BehaviorVO.createFromBehavior(behavior, nicknameAndRoleId.getLeft(), nicknameAndRoleId.getRight());
}).collect(Collectors.toList());
MongoUtil.PageHelper<BehaviorVO> pageHelper = mongoUtil.pageHelperT(count, resList);
return PageVO.createPageVo(pageHelper, resList);
}
@Override
public List<ExportBehaviorDTO> download(long startTime, long endTime, boolean backstage) {
Date start = new Date(startTime);
Date end = new Date(endTime);
Query query = new Query();
query.addCriteria(Criteria.where("cTime").gte(start).lt(end).and("backstage").is(backstage));
List<Behavior> behaviorList = behaviorDao.findList(query, behaviorDao.generateCollectionNames(start, end));
List<ExportBehaviorDTO> resList = new ArrayList<>(behaviorList.size());
behaviorList.forEach(behavior -> {
ExportBehaviorDTO exportBehaviorDTO = new ExportBehaviorDTO();
Pair<String, Integer> nicknameAndRoleId = getNicknameAndRoleId(behavior.getUserId(), behavior.getProjectId());
exportBehaviorDTO.setNickname(nicknameAndRoleId.getLeft());
exportBehaviorDTO.setIp(behavior.getIp());
exportBehaviorDTO.setTime(behavior.getCTime());
exportBehaviorDTO.setPage(behavior.getPage());
exportBehaviorDTO.setModule(behavior.getModule());
exportBehaviorDTO.setRole(RoleEnum.getNameByState(nicknameAndRoleId.getRight()));
resList.add(exportBehaviorDTO);
});
return resList;
}
private Pair<String, Integer> getNicknameAndRoleId(String userId, String projectId) {
User user = userDao.findOneById(userId);
Integer roleId = -1;
if (user.isSuperAdmin()) {
roleId = RoleEnum.SUPER_ADMIN.getState();
} else {
List<UserRole> collect = user.getRoles().stream().filter(userRole -> userRole.getProjectId().equals(projectId)).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(collect)) {
roleId = collect.get(0).getRoleId();
}
}
return Pair.of(user.getNickname(), roleId);
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.dao.IChannelDao;
import com.zhiwei.brandkbs2.dao.IChannelLabelDao;
import com.zhiwei.brandkbs2.dao.IEventDao;
import com.zhiwei.brandkbs2.dao.IEventDataDao;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportAdminChannelArticleDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportAdminChannelEventDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportChannelDTO;
import com.zhiwei.brandkbs2.enmus.EventTagEnum;
import com.zhiwei.brandkbs2.enmus.ExperienceEnum;
import com.zhiwei.brandkbs2.es.EsClientDao;
import com.zhiwei.brandkbs2.exception.ExceptionCast;
import com.zhiwei.brandkbs2.model.CommonCodeEnum;
import com.zhiwei.brandkbs2.pojo.*;
import com.zhiwei.brandkbs2.pojo.dto.ChannelDTO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.IChannelService;
import com.zhiwei.brandkbs2.util.MongoUtil;
import com.zhiwei.brandkbs2.util.Tools;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
/**
* @ClassName: ChannelServiceImpl
* @Description ChannelServiceImpl
* @author: sjj
* @date: 2022-06-16 16:07
*/
@Service("channelServiceImpl")
public class ChannelServiceImpl implements IChannelService {
@Resource(name = "eventDataDao")
IEventDataDao eventDataDao;
@Resource(name = "channelDao")
IChannelDao channelDao;
@Resource(name = "eventDao")
IEventDao eventDao;
@Resource(name = "channelLabelDao")
IChannelLabelDao channelLabelDao;
@Resource(name = "esClientDao")
EsClientDao esClientDao;
@Resource(name = "mongoUtil")
MongoUtil mongoUtil;
@Override
public PageVO<JSONObject> findChannelList(int page, int size, String linkedGroupId, String emotion, String platform, Boolean show,
String keyword, String sorter) {
Query query = channelListQuery(linkedGroupId, show, emotion, platform, keyword, sorter);
long total = channelDao.count(query);
// 开启分页
mongoUtil.start(page, size, query);
List<Channel> channelList = channelDao.findList(query);
List<JSONObject> resList = channelList.stream().map(channel -> {
JSONObject result = new JSONObject();
result.put("id", channel.getId());
result.put("platform", channel.getPlatform());
result.put("realSource", channel.getRealSource());
result.put("source", channel.getSource());
result.put("articleCount", channel.getArticleIds().size());
result.put("eventCount", null == channel.getEventIds() ? 0 : channel.getEventIds().size());
result.put("emotion", channel.getEmotion());
result.put("emotionIndex", channel.getEmotionIndex());
result.put("experienceLevel", ExperienceEnum.getValueFromDataBaseName(channel.getExperienceLevel()));
result.put("lastTime", channel.getLastTime());
result.put("show", channel.isShow());
result.put("imgUrl", channel.getImgUrl());
result.put("tag", channel.getTag());
return result;
}).collect(Collectors.toList());
MongoUtil.PageHelper<JSONObject> pageHelper = mongoUtil.pageHelper(total, resList);
return PageVO.createPageVo(pageHelper, resList);
}
@Override
public PageVO<JSONObject> findArticleList(int page, int size, String channelId) {
try {
Channel channel = channelDao.findOneById(channelId);
LinkedHashSet<String> articleIds = channel.getArticleIds();
List<String> queryIds = Tools.pageList(page, size, articleIds);
List<JSONObject> resList = new ArrayList<>();
Map<String, JSONObject> idMaps = esClientDao.searchByIds(queryIds);
queryIds.forEach(id -> {
JSONObject sourceJson = idMaps.get(id);
JSONObject json = new JSONObject();
BaseMap baseMap = Tools.getBaseFromEsMap(sourceJson);
json.put("id", sourceJson.get("id"));
json.put("title", baseMap.getTitle());
json.put("url", baseMap.getUrl());
json.put("time", new Date(baseMap.getTime()));
json.put("emotion", baseMap.getEmotion());
json.put("forward", baseMap.isForward());
resList.add(json);
});
return PageVO.createPageVoNew(articleIds.size(), page, size, resList);
} catch (IOException e) {
ExceptionCast.cast(CommonCodeEnum.FAIL.message("查询异常"));
}
return null;
}
@Override
public PageVO<JSONObject> findEventList(int page, int size, String channelId) {
Channel channel = channelDao.findOneById(channelId);
LinkedHashSet<String> eventIds = channel.getEventIds();
Query query = Query.query(Criteria.where("_id").in(eventIds));
long total = eventDao.count(query);
mongoUtil.start(page, size, query);
List<Event> list = eventDao.findList(query);
List<JSONObject> resList = list.stream().map(event -> {
JSONObject json = new JSONObject();
json.put("id", event.getId());
json.put("title", event.getTitle());
json.put("startTime", event.getStartTime());
json.put("emotion", event.getEmotion());
Query query1 = new Query();
query1.addCriteria(Criteria.where("eventId").is(event.getId()));
json.put("total", eventDataDao.count(query1, event.getCollectionName()));
query1.addCriteria(channelDao.addChannelIndex(channel.getChannelIndex()));
json.put("channelTotal", eventDataDao.count(query1, event.getCollectionName()));
return json;
}).collect(Collectors.toList());
MongoUtil.PageHelper<JSONObject> pageHelper = mongoUtil.pageHelper(total, resList);
return PageVO.createPageVo(pageHelper, resList);
}
@Override
public void switchChannelShow(String channelId) {
Channel channel = channelDao.findOneById(channelId);
if (Objects.isNull(channel)) {
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM.message("渠道不存在"));
}
Update update = new Update();
update.set("show", !channel.isShow());
channelDao.updateOneByIdWithField(channelId, update);
}
@Override
public void updateExperience(String channelId, String experience) {
Update update = new Update();
update.set("experienceLevel", ExperienceEnum.getDatabaseNameFromValue(experience));
channelDao.updateOneByIdWithField(channelId, update);
}
@Override
public JSONObject getChannel(String channelId) {
Channel channel = channelDao.findOneById(channelId);
if (Objects.isNull(channel)) {
//抛出未查询到相关ID的渠道信息异常
ExceptionCast.cast(CommonCodeEnum.FAIL.message("渠道不存在"));
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", channel.getId());
jsonObject.put("platform", channel.getPlatform());
jsonObject.put("realSource", channel.getRealSource());
jsonObject.put("source", channel.getSource());
jsonObject.put("imgUrl", channel.getImgUrl());
jsonObject.put("tag", channel.getTag());
return jsonObject;
}
@Override
public void updateChannel(ChannelDTO channelDTO) {
Update update = Update.update("tag", channelDTO.getTag());
if (null != channelDTO.getImgUrl()) {
update.set("imgUrl", channelDTO.getImgUrl());
}
channelDao.updateOneByIdWithField(channelDTO.getId(), update);
}
@Override
public List<ExportChannelDTO> findDownloadChannelList(String linkedGroupId, String emotion, String platform, Boolean show, String keyword) {
Query query = channelListQuery(linkedGroupId, show, emotion, platform, keyword, null);
List<Channel> list = channelDao.findList(query);
return list.stream().map(ExportChannelDTO::createFromChannel).collect(Collectors.toList());
}
@Override
public List<ExportAdminChannelArticleDTO> findDownloadChannelArticleList(String channelId) {
List<ExportAdminChannelArticleDTO> resList = new ArrayList<>();
try {
Channel channel = channelDao.findOneById(channelId);
LinkedHashSet<String> articleIds = channel.getArticleIds();
Map<String, JSONObject> resultMap = esClientDao.searchByIds(articleIds);
resultMap.values().forEach(json -> {
// url,title,platform,forward,emotion 未配置
BaseMap baseMap = Tools.getBaseFromEsMap(json);
ExportAdminChannelArticleDTO dto = Tools.convertMap(baseMap, ExportAdminChannelArticleDTO.class);
dto.setFirst(baseMap.isForward() ? "否" : "是");
resList.add(dto);
});
} catch (IOException e) {
ExceptionCast.cast(CommonCodeEnum.FAIL.message("查询异常"));
}
return resList;
}
@Override
public List<ExportAdminChannelEventDTO> findDownloadChannelEventList(String channelId) {
List<ExportAdminChannelEventDTO> resList = new ArrayList<>();
Channel channel = channelDao.findOneById(channelId);
LinkedHashSet<String> eventIds = channel.getEventIds();
if (CollectionUtils.isEmpty(eventIds)) {
return resList;
}
List<Event> events = eventDao.findList(Query.query(Criteria.where("_id").in(eventIds)));
return events.stream().map(event -> {
ExportAdminChannelEventDTO dto = Tools.convertMap(event, ExportAdminChannelEventDTO.class);
// 首发信息
EventData firstData = eventDataDao.findFirstData(event.getId(), event.getCollectionName());
if (null != firstData) {
dto.setFirstPlatform(firstData.getPlatform());
dto.setFirstRealSource(firstData.getRealSource());
dto.setFirstSource(firstData.getSource());
}
dto.setEventArticleCount(eventDataDao.getEventArticleCount(event));
dto.setChannelArticleCount(eventDataDao.getEventArticleWithChannelCount(event, Tools.convertMap(channel, ChannelIndex.class)));
dto.setEventType(event.getEventTag().getString(EventTagEnum.EVENT_TYPE.getName()));
return dto;
}).collect(Collectors.toList());
}
@Override
public List<String> getChannelTypes() {
return channelLabelDao.getChannelLabelType();
}
@Override
public List<String> getChannelLabels(String type) {
return channelLabelDao.findList(Query.query(Criteria.where("type").is(type))).stream().map(ChannelLabel::getLabel).collect(Collectors.toList());
}
private Query channelListQuery(String linkedGroupId, Boolean show, String emotion, String platform, String keyword, String sorter) {
Query query = new Query();
query.addCriteria(Criteria.where("linkedGroupId").is(linkedGroupId));
if (null != show) {
query.addCriteria(Criteria.where("show").is(show));
}
if (StringUtils.isNotEmpty(emotion)) {
query.addCriteria(Criteria.where("emotion").is(emotion));
}
if (StringUtils.isNotEmpty(platform)) {
query.addCriteria(Criteria.where("platform").is(platform));
}
// 添加模糊匹配
channelDao.addKeywordFuzz(query, keyword, "source");
// 添加排序
channelDao.addSort(query, sorter);
return query;
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.zhiwei.brandkbs2.service.ICommonService;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.middleware.mark.pojo.enums.TagField;
import com.zhiwei.middleware.mark.service.MarkerClient;
import com.zhiwei.middleware.mark.vo.MarkerTag;
import com.zhiwei.middleware.mark.vo.TagSearch;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
* @ClassName: CommonServiceImpl
* @Description 基础服务实现类
* @author: sjj
* @date: 2022-06-02 11:23
*/
@Service("commonServiceImpl")
public class CommonServiceImpl implements ICommonService {
@Autowired
private MarkerClient markClient;
@Resource(name = "projectServiceImpl")
private IProjectService projectService;
@Override
public List<MarkerTag> getQbjcTags(String linkedGroupId, TagSearch... tagSearches) {
Objects.requireNonNull(linkedGroupId);
String group = projectService.getProjectByLinkedGroupId(linkedGroupId).getBrandLinkedGroup();
TagSearch defaultSearch = TagField.PROJECT.is(group);
if (null == tagSearches || tagSearches.length == 0) {
return markClient.getTagsByQuery(defaultSearch);
}
List<TagSearch> res = new ArrayList<>();
res.add(defaultSearch);
Collections.addAll(res, tagSearches);
return markClient.getTagsByQuery(res.toArray(new TagSearch[0]));
}
@Override
public List<MarkerTag> getQbjcTagsByGroupName(String groupName, TagSearch... tagSearches) {
Objects.requireNonNull(groupName);
TagSearch defaultSearch = TagField.PROJECT.is(groupName);
if (null == tagSearches || tagSearches.length == 0) {
return markClient.getTagsByQuery(defaultSearch);
}
List<TagSearch> res = new ArrayList<>();
res.add(defaultSearch);
Collections.addAll(res, tagSearches);
return markClient.getTagsByQuery(res.toArray(new TagSearch[0]));
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.zhiwei.brandkbs2.dao.IEventDao;
import com.zhiwei.brandkbs2.dao.IEventDataDao;
import com.zhiwei.brandkbs2.es.EsClientDao;
import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.pojo.EventData;
import com.zhiwei.brandkbs2.service.IEventDataService;
import com.zhiwei.brandkbs2.util.Tools;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName: EventDataServiceImpl
* @Description 事件数据业务接口实现类
* @author: sjj
* @date: 2022-05-23 17:49
*/
@Service("eventDataServiceImpl")
public class EventDataServiceImpl implements IEventDataService {
public static final Logger log = LogManager.getLogger(EventDataServiceImpl.class);
@Resource(name = "eventDao")
private IEventDao eventDao;
@Resource(name = "eventDataDao")
private IEventDataDao eventDataDao;
@Resource(name = "esClientDao")
private EsClientDao esClientDao;
@Resource(name = "eventServiceImpl")
private EventServiceImpl eventServiceImpl;
@Override
public void analysisEvent(Event event) {
Date startTime = event.getStartTime();
Date endTime = event.isEndStatus() ? event.getEndTime() : new Date();
Period periodDay = new Period(startTime.getTime(), endTime.getTime(), PeriodType.days());
//时间区间大于40天 就不更新
if (periodDay.getDays() >= 40 || startTime.after(new Date())) {
event.setEndTime(endTime);
event.setEndStatus(true);
eventDao.updateOne(event);
log.info("analysisEvent-eventId:{},时间区间大于40天,不做更新", event.getId());
return;
}
//查询可能符合该事件时间段内的所有数据
List<EventData> eventDataList = esClientDao.searchByEvent(event).stream().map(map -> EventData.createFromEsMap(map, event)).collect(Collectors.toList());
log.info("analysisEvent-eventId:{},查询可能符合该事件时间段内的所有数据:{}条", event.getId(), eventDataList.size());
//更新事件稿件信息
this.updateEventData(event, eventDataList);
//更新聚合标题(历史)
}
@Override
public String deleteOneByIdAndEventId(String id, String eventId) {
Event event = eventServiceImpl.getEventById(eventId);
eventDataDao.deleteOneById(id, event.getCollectionName());
return event.getTitle();
}
private void updateEventData(Event event, List<EventData> eventDataList) {
long update = 0;
String keyword = event.getKeyword();
// 删除历史数据
eventDataDao.deleteByEventId(event.getId(), event.getCollectionName());
for (EventData data : eventDataList) {
// 关键词筛选
if (Tools.containsKeyword(Arrays.asList(keyword.split(keyword.contains(",") ? "," : "\\|")), (data.getTitle() + data.getContent()).toLowerCase())) {
eventDataDao.insertOne(data);
update++;
}
}
log.info("analysisEvent-eventId:{},更新事件数据完毕,实际更新:{}条", event.getId(), update);
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.RedisKeyPrefix;
import com.zhiwei.brandkbs2.dao.IEventDao;
import com.zhiwei.brandkbs2.dao.IEventDataDao;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
import com.zhiwei.brandkbs2.easyexcel.config.ReadExcelDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportEventDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportEventDataDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.UploadEventDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.UploadEventDataDTO;
import com.zhiwei.brandkbs2.easyexcel.listener.EventDataListener;
import com.zhiwei.brandkbs2.easyexcel.listener.EventFileListener;
import com.zhiwei.brandkbs2.enmus.EventTagEnum;
import com.zhiwei.brandkbs2.exception.ExceptionCast;
import com.zhiwei.brandkbs2.listener.ApplicationProjectListener;
import com.zhiwei.brandkbs2.model.CommonCodeEnum;
import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.pojo.EventData;
import com.zhiwei.brandkbs2.pojo.dto.EventDataDTO;
import com.zhiwei.brandkbs2.pojo.dto.YqEventDTO;
import com.zhiwei.brandkbs2.pojo.vo.EventVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.pojo.vo.YqEventSearchVO;
import com.zhiwei.brandkbs2.service.IEventDataService;
import com.zhiwei.brandkbs2.service.IEventService;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.brandkbs2.util.MongoUtil;
import com.zhiwei.brandkbs2.util.Tools;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* @ClassName: EventServiceImpl
* @Description 事件管理业务实现
* @author: sjj
* @date: 2022-05-17 16:36
*/
@Service("eventServiceImpl")
public class EventServiceImpl implements IEventService {
private static final Logger log = LogManager.getLogger(EventServiceImpl.class);
@Value("${qbjc.event.tag.url}")
private String qbjcEventTagUrl;
@Value("${qbjc.event.url}")
private String qbjcEventUrl;
@Value("${brandkbs.file.url}")
private String brandkbsFileUrl;
@Resource(name = "eventDao")
private IEventDao eventDao;
@Resource(name = "eventDataDao")
private IEventDataDao eventDataDao;
@Resource(name = "eventDataServiceImpl")
private IEventDataService eventDataService;
@Resource(name = "projectServiceImpl")
private IProjectService projectService;
@Resource(name = "mongoUtil")
private com.zhiwei.brandkbs2.util.MongoUtil mongoUtil;
@Autowired
private RestTemplate restTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
// private static final Pattern PATTERN = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]");
@Override
public Event getEventById(String eventId) {
Event event = eventDao.findOneById(eventId);
if (Objects.isNull(event)) {
// 抛出事件不存在异常
ExceptionCast.cast(CommonCodeEnum.FAIL.message("该事件不存在"));
}
return event;
}
@Override
public void addYqEvents(String linkedGroupId, List<YqEventDTO> yqEventList) {
String projectId = UserThreadLocal.getProjectId();
String redisKey = RedisKeyPrefix.yuqingProgressKey(linkedGroupId);
if (CollectionUtils.isEmpty(yqEventList)) {
stringRedisTemplate.opsForValue().set(redisKey, String.valueOf(100), 1, TimeUnit.MINUTES);
}
String oldProgress = stringRedisTemplate.opsForValue().get(redisKey);
if (null != oldProgress) {
ExceptionCast.cast(CommonCodeEnum.FAIL.message("当前项目品牌已有进行任务"));
}
stringRedisTemplate.opsForValue().set(redisKey, "0");
String collectionName = eventDataDao.generateCollectionName();
AtomicInteger count = new AtomicInteger();
//事件太多塞满队列了
ApplicationProjectListener.getThreadPool().execute(() -> {
yqEventList.forEach(yqEventDTO -> {
Event existEvent = eventDao.getEventByUniqueIds(yqEventDTO.getYqEventId(), projectId, linkedGroupId);
Event event = Event.createFromYqEventDTO(yqEventDTO, collectionName, projectId, linkedGroupId);
if (null != existEvent) {
event.setId(existEvent.getId());
event.setCTime(existEvent.getCTime());
eventDao.updateOne(event);
} else {
event.setCTime(new Date());
eventDao.insertOne(event);
}
if (count.incrementAndGet() == yqEventList.size()) {
stringRedisTemplate.opsForValue().set(redisKey, String.valueOf(100), 1, TimeUnit.MINUTES);
} else {
stringRedisTemplate.opsForValue().set(redisKey, String.valueOf((count.get()) * 100 / yqEventList.size()));
}
});
});
}
@Override
public void addYqEventAll(YqEventSearchVO yqEventSearchVO) {
// 按照100条分页搜索
yqEventSearchVO.setPageSize(100);
// 返回结果累计
List<JSONObject> resList = new ArrayList<>();
int page = 1;
boolean hasNext = true;
while (hasNext) {
yqEventSearchVO.setPage(page);
JSONObject result = getYqResponse(yqEventSearchVO).getJSONObject("data");
JSONArray array = result.getJSONArray("events");
for (int i = 0; i < array.size(); i++) {
resList.add(array.getJSONObject(i));
}
if (++page > result.getLongValue("total")) {
hasNext = false;
}
}
log.info("开始导入" + resList.size() + "个事件...");
List<YqEventDTO> list = resList.stream().map(YqEventDTO::createFromUrlJson).collect(Collectors.toList());
addYqEvents(yqEventSearchVO.getLinkedGroupId(), list);
}
@Override
public PageVO<JSONObject> findEventList(int page, int size, String linkedGroupId, String keyword, String sorter) {
Query query = new Query(Criteria.where("linkedGroupId").is(linkedGroupId).and("projectId").is(UserThreadLocal.getProjectId()));
// 添加模糊匹配
eventDao.addKeywordFuzz(query, keyword, "title");
// 添加排序
eventDao.addSort(query, sorter);
long count = eventDao.count(query);
mongoUtil.start(page, size, query);
List<Event> projectList = eventDao.findList(query);
List<JSONObject> resList = projectList.stream().map(event -> {
JSONObject result = new JSONObject();
result.put("id", event.getId());
result.put("title", event.getTitle());
result.put("startTime", event.getStartTime());
result.put("keyword", event.getKeyword());
result.put("eventTag", event.getEventTag());
//根据事件ID获取总传播量
result.put("total", eventDataDao.count(new Query(Criteria.where("eventId").is(event.getId())), event.getCollectionName()));
//根据事件ID获取首发稿件信息
EventData eventData = eventDataDao.findFirstData(event.getId(), event.getCollectionName());
//有则显示首发渠道和平台,无则返回空字符串
if (null != eventData) {
//如果存在,展示首发信息
result.put("firstEventData", EventDataDTO.createFromEventData(eventData));
}
result.put("startTime", event.getStartTime());
result.put("endTime", event.getEndTime());
result.put("emotion", event.getEmotion());
return result;
}).collect(Collectors.toList());
MongoUtil.PageHelper<JSONObject> pageHelper = mongoUtil.pageHelper(count, resList);
return PageVO.createPageVo(pageHelper, resList);
}
@Override
public PageVO<JSONObject> findYqEventList(YqEventSearchVO yqEventSearchVO) {
int page = yqEventSearchVO.getPage();
int size = yqEventSearchVO.getPageSize();
if (page < 1) {
yqEventSearchVO.setPage(1);
}
if (size < 0 || size > 50) {
yqEventSearchVO.setPageSize(10);
}
Pair<Long, List<JSONObject>> totalAndResult = searchYqEvent(yqEventSearchVO);
//封装结果
PageVO<JSONObject> pageVO = new PageVO<>();
//总页数
pageVO.setList(totalAndResult.getRight());
pageVO.setPageNum(page);
pageVO.setPageSize(size);
pageVO.setPages(totalAndResult.getLeft());
return pageVO;
}
@Override
public JSONObject uploadEventDatas(String linkedGroupId, MultipartFile file) {
String uuid = UUID.randomUUID().toString().replace("-", "");
String redisKey = RedisKeyPrefix.eventDataProgressKey(uuid);
stringRedisTemplate.opsForValue().set(redisKey, "0");
ApplicationProjectListener.getThreadPool().execute(() -> {
ReadExcelDTO<UploadEventDataDTO> readExcel = new ReadExcelDTO<>();
readExcel.setClazz(UploadEventDataDTO.class);
readExcel.setAnalysisEventListener(new EventDataListener(eventDao, eventDataDao, stringRedisTemplate, linkedGroupId, redisKey));
EasyExcelUtil.read(file, readExcel);
stringRedisTemplate.delete(redisKey);
});
Tools.sleep(500L);
JSONObject result = new JSONObject();
result.put("ticket", uuid);
return result;
}
@Override
public int getEventDataUploadProgress(String ticket) {
String redisKey = RedisKeyPrefix.eventDataProgressKey(ticket);
String progress = stringRedisTemplate.opsForValue().get(redisKey);
if (StringUtils.isEmpty(progress)) {
ExceptionCast.cast(CommonCodeEnum.FAIL.message("文件解析进度获取失败"));
}
return Integer.parseInt(progress);
}
@Override
public JSONObject getEventAnalyzeProgress(List<String> eventIds) {
if (CollectionUtils.isEmpty(eventIds)) {
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM);
}
JSONObject res = new JSONObject();
List<JSONObject> infos = new ArrayList<>();
boolean finish = true;
for (String eventId : eventIds) {
String redisKey = RedisKeyPrefix.eventAnalysisProgress(eventId);
String progress = stringRedisTemplate.opsForValue().get(redisKey);
if (null == progress) {
progress = "100";
}
JSONObject info = new JSONObject();
info.put("progress", progress);
info.put("eventId", eventId);
infos.add(info);
if (!progress.equals("100")) {
finish = false;
}
}
res.put("infos", infos);
res.put("finish", finish);
return res;
}
@Override
public JSONObject getEventJSONByEventId(String eventId) {
Event event = getEventById(eventId);
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", eventId);
jsonObject.put("title", event.getTitle());
jsonObject.put("startTime", event.getStartTime());
jsonObject.put("keyword", event.getKeyword());
jsonObject.put("eventType", event.getEventTag().getString(EventTagEnum.EVENT_TYPE.getName()));
//查询事件首发稿件信息
EventData firstData = eventDataDao.findFirstData(event.getId(), event.getCollectionName());
if (null != firstData) {
//如果存在,展示首发信息
jsonObject.put("firstEventData", EventDataDTO.createFromEventData(firstData));
}
return jsonObject;
}
@Override
public void updateEvent(EventVO eventVO) {
Event event = getEventById(eventVO.getId());
event.setTitle(eventVO.getTitle());
event.setStartTime(eventVO.getStartTime());
event.setKeyword(eventVO.getKeyword());
// event.setEventTag(EventTagEnum.eventType(eventVO.getEventType()));
//对事件信息进行更新
eventDao.updateOne(event);
}
@Override
public void updateEventFirst(EventDataDTO eventDataDTO) {
Event event = getEventById(eventDataDTO.getEventId());
eventDataDao.updateOne(EventData.createFromEventDataDTO(eventDataDTO), event.getCollectionName());
}
@Override
public void endEvent(String eventId) {
Event event = getEventById(eventId);
if (event.isEndStatus()) {
return;
}
Update update = new Update();
update.set("endStatus", true);
update.set("endTime", new Date());
eventDao.updateOneByIdWithField(eventId, update);
}
@Override
public String deleteEvent(String eventId) {
Event event = getEventById(eventId);
//根据事件ID删除事件数据
eventDataDao.deleteByEventId(eventId, event.getCollectionName());
//删除事件
eventDao.deleteOneById(eventId);
return event.getTitle();
}
@Override
public PageVO<JSONObject> getEventDatas(int page, int size, String eventId) {
Event event = getEventById(eventId);
Query query = new Query(Criteria.where("eventId").is(eventId));
long count = eventDataDao.count(query, event.getCollectionName());
mongoUtil.start(page, size, query);
//根据事件ID获取所有稿件信息
List<EventData> eventDataList = eventDataDao.findList(query, event.getCollectionName());
List<JSONObject> resList = eventDataList.stream().map(eventData -> {
JSONObject result = new JSONObject();
result.put("id", eventData.getId());
result.put("title", eventData.getTitle());
result.put("url", eventData.getUrl());
result.put("platform", eventData.getPlatform());
result.put("realSource", eventData.getRealSource());
result.put("source", eventData.getSource());
//根据事件ID和稿件ID判断是否首发
result.put("first", isFirstData(event, eventData.getId()));
result.put("time", eventData.getTime());
result.put("emotion", eventData.getEmotion());
return result;
}).collect(Collectors.toList());
MongoUtil.PageHelper<JSONObject> pageHelper = mongoUtil.pageHelper(count, resList);
return PageVO.createPageVo(pageHelper, resList);
}
@Override
public String deleteEventData(String id, String eventId) {
return eventDataService.deleteOneByIdAndEventId(id, eventId);
}
@Override
public Pair<String, List<ExportEventDataDTO>> downloadEventDatas(String eventId) {
Event event = getEventById(eventId);
String fileName = getEventById(eventId).getTitle();
//根据事件ID获取所有事件数据
List<EventData> eventDataList = eventDataDao.findList(Query.query(Criteria.where("eventId").is(eventId)), event.getCollectionName());
if (eventDataList.isEmpty()) {
return Pair.of(fileName, Collections.emptyList());
}
List<ExportEventDataDTO> resList = Collections.synchronizedList(new ArrayList<>(eventDataList.size()));
int size = eventDataList.size() <= 100 ? eventDataList.size() : eventDataList.size() / 19;
List<List<EventData>> partition = ListUtils.partition(eventDataList, size);
List<CompletableFuture<Void>> futureList = new ArrayList<>(partition.size());
for (List<EventData> eventDatas : partition) {
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
resList.addAll(eventDataChange2ExportEventDataDTO(event, eventDatas));
}, ApplicationProjectListener.getThreadPool());
futureList.add(future);
}
CompletableFuture<Void> allFuture = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]));
allFuture.join();
return Pair.of(fileName, resList);
}
@Override
public Pair<String, List<ExportEventDTO>> downloadEvents(String linkedGroupId) {
String fileName = projectService.getProjectByLinkedGroupId(linkedGroupId).getBrandName();
String projectId = UserThreadLocal.getProjectId();
List<Event> eventList = eventDao.findList(Query.query(Criteria.where("projectId").is(projectId).and("linkedGroupId").is(linkedGroupId)));
if (eventList.isEmpty()) {
return Pair.of(fileName, Collections.emptyList());
}
List<ExportEventDTO> resList = Collections.synchronizedList(new ArrayList<>(eventList.size()));
int size = eventList.size() <= 100 ? eventList.size() : eventList.size() / 19;
List<List<Event>> partition = ListUtils.partition(eventList, size);
List<CompletableFuture<Void>> futureList = new ArrayList<>(partition.size());
for (List<Event> events : partition) {
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
List<ExportEventDTO> maps = this.getEventResult(events);
resList.addAll(maps);
}, ApplicationProjectListener.getThreadPool());
futureList.add(future);
}
CompletableFuture<Void> allFuture = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]));
allFuture.join();
return Pair.of(fileName, resList);
}
@Override
public void addFileEvents(String linkedGroupId, String fileUrl) {
//获取事件信息
ApplicationProjectListener.getThreadPool().execute(() -> {
ReadExcelDTO<UploadEventDTO> readExcelDTO = new ReadExcelDTO<>();
readExcelDTO.setClazz(UploadEventDTO.class);
EventFileListener eventFileListener = new EventFileListener(this, UserThreadLocal.getProjectId(), linkedGroupId);
readExcelDTO.setAnalysisEventListener(eventFileListener);
EasyExcelUtil.read(brandkbsFileUrl + fileUrl, readExcelDTO);
});
}
@Override
public void addFileEvent(String projectId, String linkedGroupId, UploadEventDTO eventDTO) {
if (StringUtils.isEmpty(eventDTO.getTitle()) || StringUtils.isEmpty(eventDTO.getKeyword())) {
return;
}
Event event = Event.createFromUploadEventDTO(eventDTO, eventDataDao.generateCollectionName(), projectId, linkedGroupId);
event.setCTime(new Date());
eventDao.insertOne(event);
}
@Override
public void analysisEvents(List<String> eventIds) {
ApplicationProjectListener.getThreadPool().execute(() -> eventIds.forEach(eventId -> {
String redisKey = RedisKeyPrefix.eventAnalysisProgress(eventId);
try {
Event event = getEventById(eventId);
stringRedisTemplate.opsForValue().set(redisKey, "0");
//更新事件信息
eventDataService.analysisEvent(event);
stringRedisTemplate.opsForValue().set(redisKey, "100");
} catch (Exception e) {
log.error("事件id:{}更新失败", eventId, e);
stringRedisTemplate.opsForValue().set(redisKey, "-1");
}
}));
}
@Override
public JSONObject findEventTagListAll(String linkedGroupId) {
String linkedGroup = projectService.getProjectByLinkedGroupId(linkedGroupId).getBrandLinkedGroup();
ResponseEntity<JSONObject> entity = restTemplate.getForEntity(qbjcEventTagUrl, JSONObject.class, linkedGroup);
return Objects.requireNonNull(entity.getBody()).getJSONObject("data");
}
@Override
public PageVO<JSONObject> findEventTagList(int page, int size, String linkedGroupId, String tagGroupName) {
if (page < 1) {
page = 1;
}
if (size < 0 || size > 50) {
size = 10;
}
String group = projectService.getProjectByLinkedGroupId(linkedGroupId).getBrandLinkedGroup();
ResponseEntity<JSONObject> entity = restTemplate.getForEntity(qbjcEventTagUrl, JSONObject.class, group);
List<JSONObject> tagGroupList =
Objects.requireNonNull(entity.getBody()).getJSONObject("data").getJSONObject("tagList").getJSONArray(tagGroupName).toJavaList(JSONObject.class);
List<List<JSONObject>> partition = Lists.partition(tagGroupList, size);
List<JSONObject> resultList = partition.get(page - 1);
resultList = resultList.stream().peek(json -> {
String name = json.getString("name");
json.put("eventCount", eventDao.count(Query.query(Criteria.where("eventTag." + tagGroupName).is(name))));
}).collect(Collectors.toList());
return PageVO.createPageVo(tagGroupList.size(), page, partition.size(), size, resultList);
}
@Override
public List<String> findEventTagGroupName(String linkedGroupId) {
String group = projectService.getProjectByLinkedGroupId(linkedGroupId).getBrandLinkedGroup();
ResponseEntity<JSONObject> entity = restTemplate.getForEntity(qbjcEventTagUrl, JSONObject.class, group);
return Objects.requireNonNull(entity.getBody()).getJSONObject("data").getJSONArray("tagNameList").toJavaList(String.class);
}
private boolean isFirstData(Event event, String eventDataId) {
EventData firstData = eventDataDao.findFirstData(event.getId(), event.getCollectionName());
if (null == firstData) {
return false;
}
return firstData.getId().equals(eventDataId);
}
/**
* 获取事件数据列表下载信息
*
* @param event 事件
* @param eventDataList 事件数据信息集合
* @return 事件数据列表下载信息
*/
private List<ExportEventDataDTO> eventDataChange2ExportEventDataDTO(Event event, List<EventData> eventDataList) {
return eventDataList.stream().map(eventData -> {
ExportEventDataDTO eventDataDTO = new ExportEventDataDTO();
eventDataDTO.setTime(eventData.getTime());
eventDataDTO.setUrl(eventData.getUrl());
eventDataDTO.setTitle(eventData.getTitle());
eventDataDTO.setPlatform(eventData.getPlatform());
eventDataDTO.setRealSource(eventData.getRealSource());
eventDataDTO.setSource(eventData.getSource());
eventDataDTO.setEmotion(eventData.getEmotion());
eventDataDTO.setFirst(isFirstData(event, eventData.getId()) ? "是" : "否");
return eventDataDTO;
}).collect(Collectors.toList());
}
/**
* 获取事件列表下载信息
*
* @param eventList 事件集合
* @return 事件列表下载信息
*/
private List<ExportEventDTO> getEventResult(List<Event> eventList) {
return eventList.stream().map(event -> {
ExportEventDTO eventDTO = new ExportEventDTO();
eventDTO.setStartTime(event.getStartTime());
eventDTO.setEndTime(event.getEndTime());
eventDTO.setTitle(event.getTitle());
//根据事件ID获取首发稿件信息
EventData eventData = eventDataDao.findFirstData(event.getId(), event.getCollectionName());
//有则显示首发渠道和平台
if (null != eventData) {
eventDTO.setFirstPlatform(eventData.getPlatform());
eventDTO.setFirstRealSource(eventData.getRealSource());
eventDTO.setFirstPlatform(eventData.getPlatform());
eventDTO.setFirstSource(eventData.getSource());
}
eventDTO.setEmotion(event.getEmotion());
eventDTO.setEventType(event.getEventTag().getString(EventTagEnum.EVENT_TYPE.getName()));
//根据事件ID获取总传播量
eventDTO.setArticleCount(eventDataDao.findEventDataCount(event.getId(), event.getCollectionName()));
eventDTO.setInfluence(event.getInfluence());
eventDTO.setKeyword(event.getKeyword());
return eventDTO;
}).collect(Collectors.toList());
}
private Pair<Long, List<JSONObject>> searchYqEvent(YqEventSearchVO yqEventSearchVO) {
JSONObject result = getYqResponse(yqEventSearchVO).getJSONObject("data");
JSONArray array = result.getJSONArray("events");
List<JSONObject> resList = new ArrayList<>(array.size());
for (int i = 0; i < array.size(); i++) {
JSONObject jsonObject = array.getJSONObject(i);
jsonObject.put("exists", eventDao.existEventByUniqueIds(jsonObject.getString("id"), UserThreadLocal.getProjectId(), yqEventSearchVO.getLinkedGroupId()));
resList.add(jsonObject);
}
return Pair.of(result.getLongValue("total"), resList);
}
private JSONObject getYqResponse(YqEventSearchVO yqEventSearchVO) {
JSONObject param = new JSONObject();
param.put("tags", yqEventSearchVO.getTags());
param.put("searchInfo", yqEventSearchVO.getKeyword());
param.put("page", yqEventSearchVO.getPage());
param.put("pageSize", yqEventSearchVO.getPageSize());
param.put("startTime", yqEventSearchVO.getStartTime());
param.put("endTime", yqEventSearchVO.getEndTime());
param.put("timeType", "startTime");
String linkedGroup = projectService.getProjectByLinkedGroupId(yqEventSearchVO.getLinkedGroupId()).getBrandLinkedGroup();
param.put("project", linkedGroup);
ResponseEntity<JSONObject> entity = restTemplate.postForEntity(qbjcEventUrl, param, JSONObject.class);
if (null == entity.getBody()) {
ExceptionCast.cast(CommonCodeEnum.FAIL);
}
return entity.getBody();
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.dao.IHighWordDao;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportHighWordDTO;
import com.zhiwei.brandkbs2.pojo.HighWord;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.IHighWordService;
import com.zhiwei.brandkbs2.util.MongoUtil;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName: HighWordServiceImpl
* @Description 高频词服务接口实现类
* @author: sjj
* @date: 2022-06-06 10:02
*/
@Service("highWordServiceImpl")
public class HighWordServiceImpl implements IHighWordService {
@Resource(name = "highWordDao")
IHighWordDao highWordDao;
@Resource(name = "mongoUtil")
private com.zhiwei.brandkbs2.util.MongoUtil mongoUtil;
@Override
public PageVO<JSONObject> findHighWord(int page, int size, String keyword) {
String projectId = UserThreadLocal.getProjectId();
Query query = Query.query(Criteria.where("projectId").is(projectId));
long count = highWordDao.count(query);
mongoUtil.start(page, size, query);
List<HighWord> highWordList = highWordDao.findListByKeywordFuzz(query, keyword, new String[]{"keyword"});
List<JSONObject> resList = highWordList.stream().map(highWord -> {
JSONObject result = new JSONObject();
result.put("id", highWord.getId());
result.put("keyword", highWord.getKeyword());
result.put("cTime", highWord.getCTime());
result.put("submitter", highWord.getSubmitter());
return result;
}).collect(Collectors.toList());
MongoUtil.PageHelper<JSONObject> pageHelper = mongoUtil.pageHelper(count, resList);
return PageVO.createPageVo(pageHelper, resList);
}
@Override
public void addHighWordList(List<String> highWords) {
List<String> existList = highWordDao.findList(null).stream().map(HighWord::getKeyword).collect(Collectors.toList());
// 去除重复数据
List<String> newList = highWords.stream().filter(word -> !existList.contains(word)).collect(Collectors.toList());
highWordDao.insertMany(HighWord.createFromList(newList, UserThreadLocal.getProjectId(), UserThreadLocal.getNickname()));
}
@Override
public void deleteHighWord(String id) {
highWordDao.deleteOneById(id);
}
@Override
public List<ExportHighWordDTO> downloadHighWord() {
return highWordDao.findList(null).stream().map(ExportHighWordDTO::createFromHighWord).collect(Collectors.toList());
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.dao.IProjectDao;
import com.zhiwei.brandkbs2.dao.IUserDao;
import com.zhiwei.brandkbs2.enmus.response.ProjectCodeEnum;
import com.zhiwei.brandkbs2.exception.ExceptionCast;
import com.zhiwei.brandkbs2.model.CommonCodeEnum;
import com.zhiwei.brandkbs2.pojo.AbstractProject;
import com.zhiwei.brandkbs2.pojo.Contend;
import com.zhiwei.brandkbs2.pojo.Project;
import com.zhiwei.brandkbs2.pojo.User;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.pojo.vo.ProjectVO;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.brandkbs2.util.MongoUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author sjj
* @version 1.0
* @description 项目业务实现
* @date 2022年4月18日16:49:10
*/
@Service("projectServiceImpl")
public class ProjectServiceImpl implements IProjectService {
@Resource(name = "userDao")
private IUserDao userDao;
@Resource(name = "projectDao")
private IProjectDao projectDao;
@Resource(name = "mongoUtil")
private com.zhiwei.brandkbs2.util.MongoUtil mongoUtil;
@Value("${brandkbs.file.url}")
private String brandkbsFileUrl;
@Value("${brandkbs.image.url}")
private String brandkbsImageUrl;
@Override
public void addProject(ProjectVO projectVO) {
if (Objects.isNull(projectVO)) {
//抛出非法参数异常
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM);
}
Project existsProject = projectDao.findOne("projectName", projectVO.getProjectName());
if (Objects.nonNull(existsProject)) {
//抛出项目名称已存在异常
ExceptionCast.cast(ProjectCodeEnum.PROJECT_EXISTSNAME_ERROR);
}
//给超管添加该项目权限,并且初始化预警推送 TODO
// for (Integer SUPER_ADMINUid : userMapper.getAllSUPER_ADMINUids()) {
// iUserService.insertAdminRoleAndWarn(SUPER_ADMINUid, project.getId());
// }
projectDao.insertOneWithoutId(projectVO.creatProject(new Date()));
}
@Override
public PageVO<JSONObject> findProjectList(int page, int size, String keyword) {
Query query = new Query();
long count = projectDao.count(query);
mongoUtil.start(page, size, query);
List<Project> projectList = projectDao.findListByKeywordFuzz(query, keyword, new String[]{"projectName"});
List<JSONObject> resList = projectList.stream().map(project -> {
JSONObject result = new JSONObject();
result.put("id", project.getId());
result.put("importTime", project.getImportTime());
result.put("cTime", project.getCTime());
result.put("projectName", project.getProjectName());
result.put("brandName", project.getBrandName());
result.put("isStart", project.isStart());
result.put("isShow", project.isShow());
return result;
}).collect(Collectors.toList());
MongoUtil.PageHelper<JSONObject> pageHelper = mongoUtil.pageHelper(count, resList);
return PageVO.createPageVo(pageHelper, resList);
}
@Override
public ProjectVO getProjectVOById(String id) {
Project project = projectDao.findOneById(id);
if (Objects.isNull(project)) {
//如果项目不存在,抛出非法参数异常
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM.message("该项目不存在"));
}
return project.creatProjectVo();
}
@Override
public void updateProject(ProjectVO projectVO) {
Project existsProject = projectDao.findOneById(projectVO.getId());
if (Objects.isNull(existsProject)) {
//抛出非法参数异常
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM);
}
Project existsNameProject = projectDao.findOne("projectName", projectVO.getProjectName());
//如果该项目的名字已存在且不是本身
if (Objects.nonNull(existsNameProject) && !projectVO.getId().equals(existsNameProject.getId())) {
//抛出项目名已存在异常
ExceptionCast.cast(ProjectCodeEnum.PROJECT_EXISTSNAME_ERROR);
}
Project project = packageProject(projectVO, existsProject);
projectDao.updateOne(project);
}
@Override
public void deleteProject(String pid, String loginPid) {
if (loginPid.equals(pid)) {
//抛出无法删除正在登录的项目
ExceptionCast.cast(ProjectCodeEnum.PROJECT_DELETE_ERROR);
}
Project project = projectDao.findOneById(pid);
if (Objects.isNull(project)) {
//如果项目不存在,抛出非法参数异常
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM);
}
// ApplicationProjectListener.getThreadPool().execute(() -> {
// //删除所有关联关系 TODO
// });
//删除项目
projectDao.deleteOneById(pid);
}
@Override
public boolean switchProjectShow(String pid) {
Project project = projectDao.findOneById(pid);
if (project.isStart()) {
return false;
} else {
Update update = new Update();
update.set("uTime", new Date());
update.set("isShow", !project.isShow());
projectDao.updateOneByIdWithField(pid, update);
return true;
}
}
@Override
public void switchProjectStart(String pid) {
Project project = projectDao.findOneById(pid);
if (Objects.isNull(project)) {
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM.message("项目不存在"));
}
Update update = new Update();
update.set("uTime", new Date());
update.set("isStart", !project.isStart());
projectDao.updateOneByIdWithField(pid, update);
}
@Override
public List<JSONObject> getUserAllProjects() {
User user = userDao.findOneById(UserThreadLocal.getUserId());
if (null == user) {
return Collections.emptyList();
}
return getProjectListByUser(user, false);
}
@Override
public List<JSONObject> getLoginUserAllProjects() {
User user = userDao.findOneById(UserThreadLocal.getUserId());
if (null == user) {
return Collections.emptyList();
}
return getProjectListByUser(user, true);
}
@Override
public List<JSONObject> getBrands(String projectId, boolean hasPrimary) {
Project project = projectDao.findOneById(projectId);
List<JSONObject> resultList = new ArrayList<>();
if (hasPrimary) {
JSONObject json = new JSONObject();
json.put("brandName", project.getBrandName());
json.put("linkedGroupId", project.getBrandLinkedGroupId());
resultList.add(json);
}
List<Contend> contendList = project.getContendList();
if (CollectionUtils.isNotEmpty(contendList)) {
for (Contend contend : contendList) {
JSONObject json = new JSONObject();
json.put("brandName", contend.getBrandName());
json.put("linkedGroupId", contend.getBrandLinkedGroupId());
resultList.add(json);
}
}
return resultList;
}
@Override
public AbstractProject getProjectByLinkedGroupId(String linkedGroupId) {
String projectId = UserThreadLocal.getProjectId();
Project project = projectDao.findOneById(projectId);
if (project.getBrandLinkedGroupId().equals(linkedGroupId)) {
return project;
}
List<Contend> contendList = project.getContendList();
if (CollectionUtils.isEmpty(contendList)) {
return null;
}
for (Contend contend : contendList) {
if (contend.getBrandLinkedGroupId().equals(linkedGroupId)) {
return contend;
}
}
return null;
}
// public JSONObject getUserInfoAndProjectConfig(User user) {
// long start = System.currentTimeMillis();
// JSONObject result = new JSONObject();
// JSONObject userJson = new JSONObject();
// userJson.put("id", user.getId());
// userJson.put("nick", user.getNickname());
// userJson.put("username", user.getUsername());
// userJson.put("projectId", UserThreadLocal.getProjectId());
// userJson.put("roleId", UserThreadLocal.getRoleId());
// userJson.put("expiredTime",userProject.getExpiredTime());
// //userJson.put("exportAmount",userProject.getExportAmount());
// Project project = projectMapper.selectByPrimaryKey(userProject.getProjectId());
// userJson.put("projectName", project.getProjectName());
// userJson.put("endTime", project.getLastTime());
// userJson.put("isBackUp", project.getIsBackup());
// result.put("user", userJson);
// result.put("config", this.getConfig(userProject.getProjectId()));
// log.info("获取项目配置信息时间:{}", System.currentTimeMillis() - start);
// return result;
// }
protected List<JSONObject> getProjectListByUser(User user, boolean retainExpired) {
List<Project> lists;
Map<String, Date> roleExpired = new HashMap<>();
if (user.isSuperAdmin()) {
lists = projectDao.findListByKeywordFuzz(null, null);
} else {
lists = new ArrayList<>();
user.getRoles().forEach(userRole -> {
lists.add(projectDao.findOneById(userRole.getProjectId()));
roleExpired.put(userRole.getProjectId(), userRole.getExpiredTime());
});
}
return lists.stream().filter(Project::isShow).map(project -> {
JSONObject json = new JSONObject();
json.put("id", project.getId());
json.put("brands", getBrands(project.getId(), true));
json.put("name", project.getProjectName());
json.put("group", project.getBrandLinkedGroup());
json.put("avatarUrl", project.getAvatarUrl());
if (retainExpired) {
Date expiredTime = roleExpired.get(project.getId());
if (null == expiredTime || expiredTime.after(new Date())) {
json.put("expired", false);
} else {
json.put("expired", true);
}
}
return json;
}).collect(Collectors.toList());
}
/**
* 封装项目信息
*
* @param projectVO 项目展示对象
* @param existsProject 项目对象
* @return 项目信息
*/
private Project packageProject(ProjectVO projectVO, Project existsProject) {
Project project = projectVO.creatProject(new Date());
project.setCTime(existsProject.getCTime());
project.setStart(existsProject.isStart());
return project;
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.google.common.collect.Maps;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.dao.IReportDao;
import com.zhiwei.brandkbs2.dao.IReportSettingsDao;
import com.zhiwei.brandkbs2.exception.ExceptionCast;
import com.zhiwei.brandkbs2.model.CommonCodeEnum;
import com.zhiwei.brandkbs2.pojo.ReportSettings;
import com.zhiwei.brandkbs2.pojo.dto.ReportSettingsDTO;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.brandkbs2.service.IReportService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @ClassName: ReportServiceImpl
* @Description 报告业务接口实现类
* @author: sjj
* @date: 2022-05-31 18:01
*/
@Service("reportServiceImpl")
public class ReportServiceImpl implements IReportService {
public static final Logger log = LogManager.getLogger(ReportServiceImpl.class);
@Resource(name = "reportDao")
IReportDao reportDao;
@Resource(name = "reportSettingsDao")
IReportSettingsDao reportSettingsDao;
@Resource(name = "projectServiceImpl")
IProjectService projectService;
@Override
public Map<String, ReportSettingsDTO> getReportSettings() {
Map<String, ReportSettingsDTO> res = new HashMap<>();
for (ReportSettings settings : getReportSettingsList()) {
String key = "week";
if ("月报".equals(settings.getType())) {
key = "month";
}
ReportSettingsDTO reportSettingsDTO = ReportSettingsDTO.createFromReportSettings(settings);
if (!CollectionUtils.isEmpty(reportSettingsDTO.getContendIds())) {
reportSettingsDTO.setContendBrandNames(reportSettingsDTO.getContendIds().stream().map(contendId -> projectService.getProjectByLinkedGroupId(contendId).getBrandName()).collect(Collectors.toList()));
}
res.put(key, reportSettingsDTO);
}
return res;
}
@Override
public void upsertReportSettings(ReportSettingsDTO reportSettingsDTO) {
ReportSettings reportSettings = ReportSettings.createFromReportSettingsDTO(reportSettingsDTO, UserThreadLocal.getProjectId());
String type = reportSettings.getType();
Map<String, ReportSettings> originSettings = Maps.uniqueIndex(getReportSettingsList(), ReportSettings::getType);
// 已存在类型
if (originSettings.containsKey(type)) {
if (null == reportSettings.getId() || !originSettings.get(type).getId().equals(reportSettings.getId())) {
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM);
}
reportSettingsDao.updateOne(reportSettings);
return;
}
// 新增类型
reportSettingsDao.insertOneWithoutId(reportSettings);
}
private List<ReportSettings> getReportSettingsList() {
String projectId = UserThreadLocal.getProjectId();
List<ReportSettings> reports = reportSettingsDao.findList(Query.query(Criteria.where("projectId").is(projectId)));
if (reports.size() > 2) {
ExceptionCast.cast(CommonCodeEnum.FAIL.message("获取报告配置信息异常"));
}
return reports;
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.zhiwei.brandkbs2.dao.IQbjcPojoDao;
import com.zhiwei.brandkbs2.service.ISystemInfoService;
import com.zhiwei.qbjc.bean.pojo.common.MessagePlatform;
import com.zhiwei.qbjc.bean.pojo.common.Tag;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @ClassName: ISystemInfoServiceImpl
* @Description ISystemInfoServiceImpl
* @author: sjj
* @date: 2022-06-16 14:21
*/
@Service("systemInfoServiceImpl")
public class SystemInfoServiceImpl implements ISystemInfoService {
@Resource(name = "qbjcPojoDao")
private IQbjcPojoDao qbjcPojoDao;
@Override
public List<MessagePlatform> getPlatforms() {
return qbjcPojoDao.findMessagePlatformAll();
}
@Override
public List<Tag> getTags() {
return qbjcPojoDao.findTagAll();
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.dao.ITagFilterDao;
import com.zhiwei.brandkbs2.pojo.TagFilter;
import com.zhiwei.brandkbs2.pojo.dto.TagFilterDTO;
import com.zhiwei.brandkbs2.service.ICommonService;
import com.zhiwei.brandkbs2.service.IProjectService;
import com.zhiwei.brandkbs2.service.ITagFilterService;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName: TagFilterServiceImpl
* @Description 筛选器服务接口实现类
* @author: sjj
* @date: 2022-06-01 13:40
*/
@Service("tagFilterServiceImpl")
public class TagFilterServiceImpl implements ITagFilterService {
@Resource(name = "tagFilterDao")
private ITagFilterDao tagFilterDao;
@Resource(name = "commonServiceImpl")
private ICommonService commonService;
@Resource(name = "projectServiceImpl")
private IProjectService projectService;
@Override
public List<TagFilterDTO> getTagFilter() {
Query query = Query.query(Criteria.where("projectId").is(UserThreadLocal.getProjectId()).and("linkedGroupId").is(getLinkedGroupId()));
List<TagFilter> list = tagFilterDao.findList(query);
// 根据排序字段排序
return list.stream().sorted(Comparator.comparingInt(TagFilter::getGroupNameSequence)).map(TagFilterDTO::createFromTagFilter).collect(Collectors.toList());
}
@Override
public List<TagFilterDTO> getTagFilterAll() {
String linkedGroupId = getLinkedGroupId();
// 获取可用标签
List<TagFilterDTO> fromQbjcTags = TagFilterDTO.createFromQbjcTags(commonService.getQbjcTags(linkedGroupId));
Query query = Query.query(Criteria.where("projectId").is(UserThreadLocal.getProjectId()).and("linkedGroupId").is(linkedGroupId));
List<TagFilterDTO> fromTagFilters = TagFilterDTO.createFromTagFilters(tagFilterDao.findList(query));
// 优先以tagFilter排序为准
return TagFilterDTO.mergeLists(fromTagFilters, fromQbjcTags);
}
@Override
public void updateTagFilter(List<TagFilterDTO> tagFilterDTOs) {
String linkedGroupId = getLinkedGroupId();
// 删除历史筛选器
deleteTagFilter(linkedGroupId);
List<TagFilter> tagFilters = TagFilter.createFromTagFilterDTO(tagFilterDTOs, UserThreadLocal.getProjectId(), linkedGroupId);
tagFilterDao.insertMany(tagFilters);
}
@Override
public void deleteTagFilter(String linkedGroupId) {
String projectId = UserThreadLocal.getProjectId();
List<TagFilter> deleteList = tagFilterDao.findList(Query.query(Criteria.where("projectId").is(projectId).and("linkedGroupId").is(linkedGroupId)));
for (TagFilter tagFilter : deleteList) {
tagFilterDao.deleteOneById(tagFilter.getId());
}
}
private String getLinkedGroupId() {
return projectService.getProjectVOById(UserThreadLocal.getProjectId()).getBrandLinkedGroupId();
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.zhiwei.brandkbs2.dao.IChannelDao;
import com.zhiwei.brandkbs2.dao.IEventDataDao;
import com.zhiwei.brandkbs2.es.EsClientDao;
import com.zhiwei.brandkbs2.es.ITaskService;
import com.zhiwei.brandkbs2.pojo.Channel;
import com.zhiwei.brandkbs2.pojo.ChannelIndex;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.LinkedHashSet;
import java.util.Map;
/**
* @ClassName: TaskServiceImpl
* @Description 定时服务实现类
* @author: sjj
* @date: 2022-06-16 15:28
*/
@Service("taskServiceImpl")
public class TaskServiceImpl implements ITaskService {
public static final Logger log = LogManager.getLogger(TaskServiceImpl.class);
@Resource(name = "esClientDao")
EsClientDao esClientDao;
@Resource(name = "channelDao")
IChannelDao channelDao;
@Resource(name = "eventDataDao")
IEventDataDao eventDataDao;
@Override
public void channelRecordFromEs(int day) {
Map<ChannelIndex, ChannelIndex.ChannelRecord> channelIndexChannelRecordMap = esClientDao.searchChannelRecordRecentDay(day);
log.info("渠道信息记录-搜索到近{}天的记录条数{}条", day, channelIndexChannelRecordMap.size());
int insertCount = 0;
for (Map.Entry<ChannelIndex, ChannelIndex.ChannelRecord> entry : channelIndexChannelRecordMap.entrySet()) {
// 是否已存在
Channel channel = channelDao.queryUnique(entry.getKey());
if (null == channel) {
channel = Channel.createFromChannelIndexRecord(entry.getKey(), entry.getValue());
channel.setEventIds(new LinkedHashSet<>(eventDataDao.getEventCount(entry.getKey())));
channelDao.insertOne(channel);
insertCount++;
} else {
channel.setEventIds(new LinkedHashSet<>(eventDataDao.getEventCount(entry.getKey())));
channel.setChannelRecord(entry.getValue());
channelDao.updateOne(channel);
}
}
log.info("渠道信息记录-录入完毕,新增渠道{}条,更新渠道{}条", insertCount, channelIndexChannelRecordMap.size() - insertCount);
}
}
package com.zhiwei.brandkbs2.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.dao.IProjectDao;
import com.zhiwei.brandkbs2.dao.IUserDao;
import com.zhiwei.brandkbs2.dao.impl.UserOldDaoImpl;
import com.zhiwei.brandkbs2.dao.impl.UserProjectOldDaoImpl;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.exception.ExceptionCast;
import com.zhiwei.brandkbs2.model.CommonCodeEnum;
import com.zhiwei.brandkbs2.pojo.User;
import com.zhiwei.brandkbs2.pojo.UserInfo;
import com.zhiwei.brandkbs2.pojo.UserRole;
import com.zhiwei.brandkbs2.pojo.dto.UserDTO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.IUserService;
import com.zhiwei.brandkbs2.util.MongoUtil;
import com.zhiwei.middleware.auth.pojo.CenterUser;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
* @ClassName: UserServiceImpl
* @Description 用户管理服务实现类
* @author: sjj
* @date: 2022-04-28 17:34
*/
@Service("userServiceImpl")
public class UserServiceImpl implements IUserService {
@Resource(name = "userDao")
private IUserDao userDao;
@Resource(name = "userProjectOldDao")
private UserProjectOldDaoImpl userProjectOldDao;
@Resource(name = "userOldDao")
private UserOldDaoImpl userOldDao;
@Resource(name = "projectDao")
private IProjectDao projectDao;
@Resource(name = "mongoUtil")
private com.zhiwei.brandkbs2.util.MongoUtil mongoUtil;
@Resource(name = "projectServiceImpl")
private ProjectServiceImpl projectServiceImpl;
@Autowired
private com.zhiwei.middleware.auth.core.UserInfoClient userInfoClient;
@Override
public UserInfo login() {
String uid = UserThreadLocal.getUserId();
String pid = UserThreadLocal.getProjectId();
if (null == uid || null == pid) {
ExceptionCast.cast(CommonCodeEnum.FAIL);
}
UserInfo userInfo = queryUserInfo(uid, pid);
if (null == userInfo) {
ExceptionCast.cast(CommonCodeEnum.FAIL);
}
return userInfo;
}
public UserInfo queryUserInfo(String userId, String pid) {
User user = userDao.findOneById(userId);
if (null == user) {
return null;
}
UserInfo userInfo = new UserInfo();
// 超管
if (user.isSuperAdmin()) {
userInfo.setNickname(user.getNickname());
userInfo.setProjectId(pid);
userInfo.setUserId(userId);
userInfo.setRoleId(RoleEnum.SUPER_ADMIN.getState());
userInfo.setAvatarUrl(user.getAvatarUrl());
return userInfo;
}
AtomicBoolean hit = new AtomicBoolean(false);
Optional.ofNullable(user.getRoles()).flatMap(userRoles -> userRoles.stream().filter(userRole -> userRole.getProjectId().equals(pid)).findAny()).ifPresent(userRole -> {
hit.set(true);
userInfo.setNickname(user.getNickname());
userInfo.setProjectId(pid);
userInfo.setUserId(userId);
userInfo.setRoleId(userRole.getRoleId());
userInfo.setAvatarUrl(user.getAvatarUrl());
});
if (!hit.get()) {
return null;
}
return userInfo;
}
@Override
public PageVO<JSONObject> findUserList(int page, int size, String keyword, String pid, int role) {
Criteria criteria = Criteria.where("roles.projectId").is(pid);
if (-1 != role) {
criteria = criteria.andOperator(Criteria.where("roles.roleId").is(role).andOperator(Criteria.where("superAdmin").is(false)));
}
return findList(page, size, keyword, pid, new Query(criteria));
}
@Override
public void addUser(UserDTO userDTO) {
if (Objects.isNull(userDTO.getRoleId()) || userDTO.getRoleId() < RoleEnum.ADMIN.getState()) {
// 抛出用户权限设置错误异常
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM.message("用户权限设置异常"));
}
int roleId = UserThreadLocal.getRoleId();
// 只有超管能设置管理员
if (roleId != RoleEnum.SUPER_ADMIN.getState() && userDTO.getRoleId() <= RoleEnum.ADMIN.getState()) {
ExceptionCast.cast(CommonCodeEnum.UN_AUTHORISE);
}
User user = userDao.findOneById(userDTO.getId());
// 新用户
if (null == user) {
userDao.insertOne(createNewUser(userDTO));
return;
}
List<UserRole> roles = user.getRoles();
// 无任何角色
if (null == roles) {
roles = new ArrayList<>();
} else {
if (roles.stream().map(UserRole::getProjectId).collect(Collectors.toList()).contains(userDTO.getProjectId())) {
// 抛出用户权限设置错误异常
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM.message("用户权限设置重复"));
}
}
roles.add(UserRole.createFromUserDto(userDTO));
Update update = new Update();
update.set("roles", roles);
userDao.updateOneByIdWithField(userDTO.getId(), update);
}
@Override
public void deleteUser(String userId, String pid) {
User user = userDao.findOneById(userId);
if (null == user || null == user.getRoles()) {
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM);
}
List<UserRole> roles = user.getRoles().stream().filter(userRole -> !userRole.getProjectId().equals(pid)).collect(Collectors.toList());
Update update = new Update();
update.set("roles", roles);
userDao.updateOneByIdWithField(userId, update);
}
@Override
public void updateUser(UserDTO userDTO) {
User user = userDao.findOneById(userDTO.getId());
if (null == user) {
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM);
}
List<UserRole> roles = user.getRoles();
user.getRoles().stream().filter(userRoles -> userRoles.getProjectId().equals(userDTO.getProjectId())).findAny().ifPresent(userRole -> {
// 更新原userRole
userRole.setRoleId(userDTO.getRoleId());
OptionalLong.of(userDTO.getExpiredTime()).ifPresent(expiredTime -> {
userRole.setExpiredTime(new Date(expiredTime));
});
OptionalInt.of(userDTO.getExportAmount()).ifPresent(userRole::setExportAmount);
userDao.updateOneByIdWithField(userDTO.getId(), new Update().set("roles", roles));
});
}
@Override
public PageVO<JSONObject> findSuperAdminList(int page, int size, String keyword) {
Query query = new Query().addCriteria(Criteria.where("superAdmin").is(true));
return findList(page, size, keyword, null, query);
}
@Override
public void addSuperAdmin(UserDTO userDTO) {
User user = userDao.findOneById(userDTO.getId());
// 老用户
if (null != user) {
if (!user.isSuperAdmin()) {
Update update = new Update();
update.set("superAdmin", true);
update.set("roles", null);
userDao.updateOneByIdWithField(user.getId(), update);
return;
}
}
// 新用户
userDTO.setRoleId(RoleEnum.SUPER_ADMIN.getState());
userDao.insertOne(createNewUser(userDTO));
}
@Override
public void deleteSuperAdmin(String userId) {
userDao.deleteOneById(userId);
}
@Override
public List<JSONObject> bindUser(String username, String password) {
UserOldDaoImpl.UserOld userOld = userOldDao.findOneByUsernameAndPassword(username, password);
if (null == userOld) {
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM.message("账号密码错误"));
}
if (userOld.isBindUser()) {
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM.message("该账号已被绑定"));
}
List<UserProjectOldDaoImpl.UserProjectOld> userProjects = userProjectOldDao.findListByKeywordFuzz(new Query(Criteria.where("userId").is(userOld.getId())), null, null);
if (null == userProjects) {
ExceptionCast.cast(CommonCodeEnum.FAIL);
}
User user = userDao.findOneById(UserThreadLocal.getUserId());
if (null == user) {
// 通过用户中心查询
CenterUser centerUser = userInfoClient.getUserById(Integer.parseInt(UserThreadLocal.getUserId()));
user = User.createFromCenterUser(centerUser);
}
// 超级管理员
if (userOld.isSuperAdmin()) {
user.setSuperAdmin(true);
userDao.updateOne(user);
userOldDao.updateOneByIdWithField(userOld.getId(), Update.update("bindUser", true));
return projectServiceImpl.getProjectListByUser(user, true);
}
List<UserRole> userRoles = user.getRoles();
AtomicBoolean hit = new AtomicBoolean(false);
// 遍历旧关系表
userProjects.forEach(userProject -> {
// 根据projectName找到对应Project
Optional.ofNullable(projectDao.findOne("projectName", userProject.getProjectName())).ifPresent(project -> {
// 排除已经有权限的Project
if (userRoles.stream().noneMatch(userRole -> userRole.getProjectId().equals(project.getId()))) {
userRoles.add(new UserRole(project.getId(), userProject.getRoleId(), userProject.getExpiredTime(), userProject.getExportAmount()));
hit.set(true);
}
});
});
// 发生变化更新
if (hit.get()) {
user.setSuperAdmin(false);
user.setRoles(userRoles);
userDao.updateOne(user);
userOldDao.updateOneByIdWithField(userOld.getId(), Update.update("bindUser", true));
}
return projectServiceImpl.getProjectListByUser(user, true);
}
@Override
public List<JSONObject> skipBindUser() {
CenterUser centerUser = userInfoClient.getUserById(Integer.parseInt(UserThreadLocal.getUserId()));
User user = User.createFromCenterUser(centerUser).defaultRoleUser();
userDao.insertOne(user);
return projectServiceImpl.getProjectListByUser(user, true);
}
@Override
public boolean checkUserRoles() {
User user = userDao.findOneById(UserThreadLocal.getUserId());
if (null == user) {
return false;
}
return user.isSuperAdmin() || !CollectionUtils.isEmpty(user.getRoles());
}
@Override
public void resetBind(String username) {
String uid = UserThreadLocal.getUserId();
userDao.deleteOneById(uid);
UserOldDaoImpl.UserOld userOld = userOldDao.findOne("username", username);
userOldDao.updateOneByIdWithField(userOld.getId(), Update.update("bindUser", false));
}
private User createNewUser(UserDTO userDTO) {
User user = new User();
user.setId(userDTO.getId());
user.setNickname(userDTO.getNickname());
user.setCTime(new Date());
user.setUsername(userDTO.getUsername());
user.setPhoneNumber(userDTO.getPhoneNumber());
if (RoleEnum.SUPER_ADMIN.getState() == userDTO.getRoleId()) {
user.setSuperAdmin(true);
} else {
user.setRoles(Collections.singletonList(UserRole.createFromUserDto(userDTO)));
user.setSuperAdmin(false);
}
return user;
}
private PageVO<JSONObject> findList(int page, int size, String keyword, String pid, Query query) {
long count = userDao.count(query);
mongoUtil.start(page, size, query);
List<User> userList = userDao.findListByKeywordFuzz(query, keyword, new String[]{"nickname"});
List<JSONObject> resList = userList.stream().map(user -> {
JSONObject result = new JSONObject();
result.put("id", user.getId());
result.put("nickname", user.getNickname());
result.put("username", user.getUsername());
result.put("cTime", user.getCTime());
result.put("phoneNumber", user.getPhoneNumber());
Optional.ofNullable(user.getRoles()).flatMap(roles -> roles.stream().filter(ur -> {
if (null == pid) {
return true;
}
return pid.equals(ur.getProjectId());
}).findAny()).ifPresent(userRole -> {
result.put("roleId", userRole.getRoleId());
result.put("expiredTime", userRole.getExpiredTime());
result.put("exportAmount", userRole.getExportAmount());
});
return result;
}).collect(Collectors.toList());
MongoUtil.PageHelper<JSONObject> pageHelper = mongoUtil.pageHelper(count, resList);
return PageVO.createPageVo(pageHelper, resList);
}
}
package com.zhiwei.brandkbs2.util;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.commons.lang3.time.FastDateFormat;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName: IndexUtil
* @Description 索引工具类
* @author: sjj
* @date: 2022-06-01 18:04
*/
public class IndexUtil {
/**
* 分表开始时间点 2022-01-01 00:00:01
*/
private static final Date TIME_COLL_START = new Date(1640966400000L);
private static final FastDateFormat DF_yyyy = FastDateFormat.getInstance("yyyy");
private static final FastDateFormat DF_yyyyMM = FastDateFormat.getInstance("yyyyMM");
public static String getIndex(String index, String pattern) {
switch (pattern) {
case "yyyy": {
return index + "_" + DF_yyyy.format(new Date());
}
case "yyyyMM": {
return index + "_" + DF_yyyyMM.format(new Date());
}
}
throw new NullPointerException("index is Empty!");
}
/**
* 获取索引 按起始时间结束时间 匹配索引格式 xxx_yyyyMM
*
* @param index 主索引名
* @param start 开始时间
* @param end 结束时间
* @return List
*/
public static List<String> getIndexes(String index, String pattern, Date start, Date end) {
if (start.getTime() > end.getTime()) {
throw new IllegalArgumentException("start must less than end");
}
if (start.before(TIME_COLL_START)) {
start = TIME_COLL_START;
}
start = truncDate(start, pattern);
end = truncDate(end, pattern);
List<String> list = Lists.newArrayList();
Period period = new Period(start.getTime(), end.getTime(), PeriodType.months());
switch (pattern) {
case "yyyy": {
for (int i = 0; i <= period.getYears(); i++) {
list.add(index + "_" + DF_yyyy.format(DateUtils.addYears(start, i)));
}
break;
}
case "yyyyMM": {
for (int i = 0; i <= period.getMonths(); i++) {
list.add(index + "_" + DF_yyyyMM.format(DateUtils.addMonths(start, i)));
}
break;
}
}
if (list.isEmpty()) {
throw new NullPointerException("indexes is Empty!");
}
return list.stream().distinct().collect(Collectors.toList());
}
/**
* 日期取整,去掉时分秒
*
* @param date
* @return Date
* @Title: truncDate
*/
public static Date truncDate(Date date, String pattern) {
Date result = null;
if (date != null) {
Calendar c = Calendar.getInstance();
c.setTime(date);
if (pattern.indexOf("yyyy") == -1) {
c.set(Calendar.YEAR, 1970);
}
if (pattern.indexOf("MM") == -1) {
c.set(Calendar.MONTH, 0);
}
if (pattern.indexOf("dd") == -1) {
c.set(Calendar.DAY_OF_MONTH, 1);
}
if (pattern.indexOf("HH") == -1) {
c.set(Calendar.HOUR_OF_DAY, 0);
}
if (pattern.indexOf("mm") == -1) {
c.set(Calendar.MINUTE, 0);
}
if (pattern.indexOf("ss") == -1) {
c.set(Calendar.SECOND, 0);
}
if (pattern.indexOf("SSS") == -1) {
c.set(Calendar.MILLISECOND, 0);
}
result = c.getTime();
}
return result;
}
}
package com.zhiwei.brandkbs2.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author lxj
* @version V1.0
* @description md5加密
* @date 2019-8-6 15:53
**/
public final class Md5Util {
private Md5Util() {
}
/**
* 将明文密码转成MD5密码
*
* @param password 密码
* @return MD5密码
*/
public static String encodeByMd5(String password) {
byte[] byteArray = null;
try {
//Java中MessageDigest类封装了MD5和SHA算法,调用MD5算法,即返回16个byte类型的值
byteArray = MessageDigest.getInstance("MD5").digest(password.getBytes());
} catch (NoSuchAlgorithmException e) {
byteArray = password.getBytes();
}
//注意:MessageDigest只能将String转成byte[],接下来的事情,由程序员来完成
return bytesToHexString(byteArray);
}
/**
* 字节数组转换成十六进制字符串
*
* @param bytes 字节数组
* @return 十六进制字符串
*/
private static String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte aByte : bytes) {
String hex = Integer.toHexString(aByte & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex);
}
return sb.toString().toLowerCase();
}
}
package com.zhiwei.brandkbs2.util;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @ClassName: MongoUtil
* @Description mongo工具类
* @author: sjj
* @date: 2022-05-06 10:55
*/
@Component("mongoUtil")
public class MongoUtil {
private Integer pageSize;
private Integer pageNum;
public void start(Integer pageNum, Integer pageSize, Query query) {
if (pageNum < 1) {
pageNum = 1;
}
if (pageSize < 0 || pageSize > 50) {
pageSize = 10;
}
query.limit(pageSize);
query.skip((long) (pageNum - 1) * pageSize);
this.pageSize = pageSize;
this.pageNum = pageNum;
}
public <T> PageHelper<T> pageHelperT(long total, List<T> list) {
return new PageHelper<>(this.pageNum, this.pageSize, total, list);
}
public PageHelper<JSONObject> pageHelper(long total, List<JSONObject> list) {
return new PageHelper<>(this.pageNum, this.pageSize, total, list);
}
@Data
public static class PageHelper<T> {
private final Integer pageNum;
private final Integer pageSize;
private final Long total;
private final List<T> list;
private final Integer size;
private final Long pages;
private final Boolean hasNext;
public PageHelper(int pageNum, int pageSize, long total, List<T> list) {
this.pageNum = pageNum;
this.pageSize = pageSize;
this.total = total;
this.list = list;
this.size = list.size();
this.pages = (total + pageSize - 1) / pageSize;
this.hasNext = pageNum < pages;
}
}
}
package com.zhiwei.brandkbs2.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.base.category.ClassB;
import com.zhiwei.base.entity.subclass.CompleteText;
import com.zhiwei.base.entity.subclass.IncompleteText;
import com.zhiwei.base.entity.subclass.QAText;
import com.zhiwei.base.entity.subclass.Video;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.common.GlobalPojo;
import com.zhiwei.brandkbs2.easyexcel.dto.UploadKeywordDTO;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.BaseMap;
import com.zhiwei.qbjc.bean.pojo.common.Tag;
import com.zhiwei.qbjc.bean.tools.BeanTools;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.FastDateFormat;
import org.dozer.DozerBeanMapper;
import org.springframework.data.mapping.MappingException;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static com.zhiwei.brandkbs2.common.GenericAttribute.ES_MARK_CACHE_MAPS;
/**
* @ClassName: Tools
* @Description 一些工具类
* @author: sjj
* @date: 2022-04-21 13:45
*/
public class Tools {
private Tools() {
}
private static final FastDateFormat DF = FastDateFormat.getInstance("yyyyMMddHHmmss");
private static final Pattern PATTERN = Pattern.compile("[^a-zA-Z0-9\\u4E00-\\u9FA5]");
private static final DozerBeanMapper DOZER_BEAN_MAPPER = new DozerBeanMapper();
/**
* 上传文件
*
* @param multipartFile 上传文件
* @param prefixPath 文件存放路径
* @param url 映射url前缀
* @return 响应结果
*/
public static ResponseResult uploadFile(MultipartFile multipartFile, String prefixPath, String url) {
String relativePath = uploadFileUrl(multipartFile, prefixPath, url);
if (null == relativePath) {
return ResponseResult.failure("文件是空的");
}
Map<String, String> map = new HashMap<>(4);
//相对路径
map.put("url", relativePath);
return ResponseResult.success(map);
}
/**
* 上传文件
*
* @param multipartFile 上传文件
* @param prefixPath 文件存放路径
* @param url 映射url前缀
* @return 响应结果
*/
public static String uploadFileUrl(MultipartFile multipartFile, String prefixPath, String url) {
if (multipartFile != null && !multipartFile.isEmpty()) {
try {
String relativePath = dropDisk(multipartFile, prefixPath);
if (StringUtils.isNotEmpty(url)) {
relativePath = url + relativePath;
}
//相对路径
return relativePath;
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 上传文件
*
* @param multipartFile 上传文件
* @param prefixPath 文件存放路径
* @return 上传后的文件名
* @throws IOException IO异常
*/
private static String dropDisk(MultipartFile multipartFile, String prefixPath) throws IOException {
String relativePath = DF.format(new Date()) + multipartFile.getOriginalFilename();
String path = prefixPath + relativePath;
File file = new File(path);
multipartFile.transferTo(file);
return relativePath;
}
public static ResponseResult parseExcelInfo(MultipartFile file) {
if (file == null || file.isEmpty()) {
return ResponseResult.failure("文件是空的");
}
Map<String, Object> result = new HashMap<>(4);
List<String> keywords = new ArrayList<>();
try {
EasyExcel.read(file.getInputStream(), UploadKeywordDTO.class, new PageReadListener<UploadKeywordDTO>(dataList -> {
for (UploadKeywordDTO keywordDTO : dataList) {
String keyword = keywordDTO.getKeyword();
if (StringUtils.isNotEmpty(keyword)) {
keywords.add(keyword);
}
}
})).sheet().doReadSync();
result.put("keywordList", keywords);
} catch (IOException e) {
return ResponseResult.failure(e.getMessage());
}
return ResponseResult.success(result);
}
public static void download(InputStream input, OutputStream output, String fileName, HttpServletResponse response) throws IOException {
try (ReadableByteChannel inputChannel = Channels.newChannel(input); WritableByteChannel outputChannel = Channels.newChannel(output)) {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
ByteBuffer buffer = ByteBuffer.allocateDirect(10240);
long size = 0;
while (inputChannel.read(buffer) != -1) {
buffer.flip();
size += outputChannel.write(buffer);
buffer.clear();
}
}
}
/**
* 过滤特殊字符
*
* @param str 原声字符串
* @return 过滤特殊字符后的字符串
*/
public static String filterSpecialCharacter(String str) {
return PATTERN.matcher(str).replaceAll("");
}
/**
* 分页
*
* @param page
* @param size
* @param list
* @param <T>
* @return
*/
public static <T> List<T> pageList(int page, int size, Collection<T> list) {
List<T> resList = new ArrayList<>();
int i = 0;
int limit = 0;
long skip = (long) (page - 1) * size;
for (T t : list) {
if (++i > skip) {
resList.add(t);
if (++limit == size) {
break;
}
}
}
return resList;
}
public static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 是否包含关键字
*
* @param keywordsList 关键词数据
* @param content 字符串标题+内容
* @return 是否包含关键字
*/
public static boolean containsKeyword(List<String> keywordsList, String content) {
//按空格分割必须全部命中
for (String keywords : keywordsList) {
for (String keyword : keywords.split(" ")) {
if (!content.contains(keyword.toLowerCase())) {
//一个不命中,直接返回false
return false;
}
}
}
return true;
}
public static <T> T convertMap(Object source, Class<T> destinationClass) throws MappingException {
return DOZER_BEAN_MAPPER.map(source, destinationClass);
}
/**
* 下载文件
*
* @param filePath 文件路径
* @param response 响应
*/
public static void downloadFile(String filePath, HttpServletResponse response) {
BufferedInputStream bis = null;
OutputStream bos = null;
try {
File file = new File(filePath);
if (!file.exists()) {
file.createNewFile();
}
bis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024];
response.reset();
response.setCharacterEncoding("utf-8");
bos = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
//加上设置大小 下载下来的excel文件才不会在打开前提示修复
response.addHeader("Content-Length", String.valueOf(file.length()));
while (bis.read(buffer) > 0) {
bos.write(buffer);
}
bos.flush();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static String getIpAddress(HttpServletRequest request) {
/* RFC 7239标准中 HTTP 请求端真实 IP */
String ip = request.getHeader("X-Forwarded-For");
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("x-forwarded-for");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
/* 获取运维放置信息 */
ip = request.getHeader("X-Real-IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
/* apache http做代理时 */
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
/* weblogic插件 */
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
/* nginx与客户端进行TCP连接过程中,获得的客户端真实地址.有反向代理时无法获取真实地址 */
ip = request.getRemoteAddr();
}
return ip.split(",")[0];
}
public static List<Long[]> cutTimeRange(long startTime, long endTime, long range) {
List<Long[]> res = new ArrayList<>();
while (startTime < endTime) {
long rangeEnd = Math.min(startTime + range, endTime);
res.add(new Long[]{startTime, rangeEnd});
startTime = rangeEnd;
}
return res;
}
public static BaseMap getBaseFromEsMap(Map<String, Object> map) {
// 设置source,forward,time
BaseMap res = Tools.convertMap(map, BaseMap.class);
// 统一设置属性:realSource,platform,emotion
res.setRealSource(String.valueOf(map.get(GenericAttribute.ES_REAL_SOURCE)));
res.setPlatform(getPlatform(map));
res.setEmotion(getEmotion(map));
int c2 = Integer.parseInt(String.valueOf(map.get(GenericAttribute.ES_C2)));
// 单独设置属性title,content 部分url
switch (ClassB.TypeB.fromEncode(c2)) {
case COMPLETE:
CompleteText completeText = CompleteText.restoreFromEs(map);
res.setTitle(completeText.getTitle());
res.setContent(completeText.getContent());
break;
case INCOMPLETE:
IncompleteText incompleteText = IncompleteText.restoreFromEs(map);
// 短文本使用content做title展示
res.setTitle(incompleteText.getContent());
res.setContent(incompleteText.getContent());
break;
case QA:
QAText qaText = QAText.restoreFromEs(map);
if (qaText.question()) {
res.setTitle(qaText.getQuestionTitle());
res.setContent(qaText.getQuestionContent());
res.setUrl(qaText.getQuestionUrl());
} else {
res.setTitle(qaText.getQuestionTitle());
res.setContent(qaText.getAnswerContent());
res.setUrl(qaText.getAnswerUrl());
}
break;
case VIDEO:
Video video = Video.restoreFromEs(map);
res.setTitle(video.getTitle());
res.setContent(video.getContent());
break;
}
return res;
}
public static String getPlatform(Map<String, Object> map) {
Integer c5 = Integer.parseInt(String.valueOf(map.get(GenericAttribute.ES_C5)));
Integer foreign = Integer.parseInt(String.valueOf(map.get(GenericAttribute.ES_FOREIGN)));
return BeanTools.filterPlatform(GlobalPojo.PLATFORMS, c5, foreign).getName();
}
public static String getEmotion(Map<String, Object> map) {
List<Map<String, Object>> cacheMaps = (List<Map<String, Object>>) map.get(ES_MARK_CACHE_MAPS);
for (Map<String, Object> cacheMap : cacheMaps) {
if ("情感倾向".equals(String.valueOf(cacheMap.get("group_name")))) {
return String.valueOf(cacheMap.get("name"));
}
}
return null;
}
public static JSONObject change2TagInfoByMtag(String mtag){
JSONObject res = new JSONObject();
if(StringUtils.isEmpty(mtag)){
return res;
}
for(Map.Entry<String, List<Tag>> entry :GlobalPojo.TAGS.entrySet()){
for (Tag tag : entry.getValue()) {
if (mtag.contains(tag.getUniqueId())) {
res.put(tag.getGroupName(), tag.getName());
break;
}
}
}
return res;
}
// public static String getEmotionByMtag(String mtag, String group) {
// if (StringUtils.isEmpty(mtag)) {
// return null;
// }
// List<Tag> tags = GlobalPojo.TAGS.get(group);
// for (Tag tag : tags) {
// if ("情感倾向".equals(tag.getGroupName()) && mtag.contains(tag.getUniqueId())) {
// return tag.getName();
// }
// }
// return null;
// }
}
application.name = brandkbs2
test = false
#jwt
jwt.key=Token
jwt.hour=120
#\u8DEF\u5F84\u5B58\u653E
brandkbs.file.url=/usr/local/sources/brandkbs2/files/
brandkbs.img.url=/usr/local/sources/brandkbs2/images/
brandkbs.head.url=/usr/local/sources/brandkbs2/head/
brandkbs.image.url=https://brandkbs2.zhiweidata.com/brandkbs2/images/
#redis
spring.redis.host=192.168.0.39
spring.redis.database=7
spring.redis.port=7373
#mongo\u914D\u7F6E
mongo.connectionsPerHost=200
mongo.threadsAllowedToBlockForConnectionMultiplier=10
mongo.connectTimeout=30000
mongo.maxWaitTime=50000
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=120000
mongo.slaveOk=true
primary.uri=mongodb://qbjcuser:qbjc1q2w3e4r@202.107.192.94:30000/qbjc?authSource=admin
secondary.uri=mongodb://qbjcuser:qbjc1q2w3e4r@202.107.192.94:30000/qbjc?authSource=admin
#es
es.clusterNodes=192.168.0.130:9200
es.clusterName=zhiweidata-new-es
es.httpClusterNodes=192.168.0.130:9200:qbjc-back:yuqing.zhiweidata.com,192.168.0.51:9400:elastic:qWxZRW42OHkuOhmF5AXX
es.username=
es.password=
#channel-index
channel.index.registry=zookeeper://192.168.0.203:2182?backup=192.168.0.104:2182,192.168.0.105:2182
channel.index.consumer.group=channel-index-release
channel.index.application.name=brandkbs2
#\u5916\u90E8\u63A5\u53E3
#qbjc.project.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/aplan/project
hqd.groupAll.url= https://sensitive.zhiweidata.com/sensitive/planA/groupAll
#\u6807\u6CE8\u4E2D\u95F4\u4EF6
mark.registry.address=zookeeper://192.168.0.203:2182?backup=192.168.0.104:2182,192.168.0.105:2182
mark.provider.group=zhiwei-mark
#\u7528\u6237\u4E2D\u5FC3
auth.center.client.consumer.group=zhiwei-auth
auth.center.client.registry.address=zookeeper://192.168.0.203:2182?backup=192.168.0.104:2182,192.168.0.105:2182
auth.center.client.application.name=brandkbs2
#\u8206\u60C5\u7CFB\u7EDF\u5916\u90E8\u63A5\u53E3
qbjc.interface.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/
qbjc.interface.upload.token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXlsb2FkIjoiXCLlk4Hop4FcIiIsImV4cCI6NDc2MjgyMjEzMiwiaWF0IjoxNjUyNDIyMDcyfQ.DXQ8yKgfsCMjhT0xniZeWCMv4syqIoDvztU4QWsd-Fg
qbjc.project.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/project/resource
qbjc.event.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/aplan/event
qbjc.event.tag.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/tag/event?project={1}
qbjc.platform.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/platform/resource
\ No newline at end of file
application.name = brandkbs2
test = true
#jwt
jwt.key=Token
jwt.hour=120
#\u8DEF\u5F84\u5B58\u653E
brandkbs.file.url=E:\\work\\brandkbs2\\
brandkbs.img.url=E:\\work\\brandkbs2\\img\\
brandkbs.head.url=E:\\work\\brandkbs2\\head\\
brandkbs.image.url=\\\\DESKTOP-8CEJAD9\\brandkbs2\\img\\
#redis
spring.redis.host=192.168.0.24
spring.redis.database=2
spring.redis.port=6379
#mongo\u914D\u7F6E
mongo.connectionsPerHost=200
mongo.threadsAllowedToBlockForConnectionMultiplier=10
mongo.connectTimeout=30000
mongo.maxWaitTime=50000
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=120000
mongo.slaveOk=true
primary.uri=mongodb://rsync:rsync1q2w3e4r@115.236.59.88:30001/brandkbs2?authSource=admin
secondary.uri=mongodb://qbjcuser:qbjc1q2w3e4r@202.107.192.94:17152/qbjc?authSource=admin
#es
es.clusterNodes=127.0.0.1:9200
es.clusterName=my-application
es.httpClusterNodes=127.0.0.1:9300
es.username=
es.password=
#channel-index
channel.index.registry=zookeeper://192.168.0.11:2182?backup=192.168.0.30:2182,192.168.0.35:2182&timeout=60000
channel.index.consumer.group=channel-index-nb
channel.index.application.name=brandkbs2
#\u5916\u90E8\u63A5\u53E3
#qbjc.project.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/aplan/project
hqd.groupAll.url= https://sensitive.zhiweidata.com/sensitive/planA/groupAll
#\u6807\u6CE8\u4E2D\u95F4\u4EF6
mark.registry.address=zookeeper://192.168.0.11:2181?backup=192.168.0.30:2181,192.168.0.35:2181
mark.provider.group=zhiwei-mark-local-liuyu
#\u7528\u6237\u4E2D\u5FC3
auth.center.client.consumer.group=zhiwei-auth-dev-liuyu
auth.center.client.registry.address=zookeeper://192.168.0.11:2181?backup=192.168.0.30:2181,192.168.0.35:2181
auth.center.client.application.name=brandkbs2
#\u8206\u60C5\u7CFB\u7EDF\u5916\u90E8\u63A5\u53E3
qbjc.interface.url=http://192.168.0.79:11000/qbjcbackPhoenix/interface/
qbjc.interface.upload.token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXlsb2FkIjoiXCLlk4Hop4FcIiIsImV4cCI6NDc2MjgyMjEzMiwiaWF0IjoxNjUyNDIyMDcyfQ.DXQ8yKgfsCMjhT0xniZeWCMv4syqIoDvztU4QWsd-Fg
qbjc.project.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/project/resource
qbjc.event.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/aplan/event
qbjc.event.tag.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/tag/event?project={1}
qbjc.platform.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/platform/resource
\ No newline at end of file
application.name = brandkbs2
test = false
#jwt
jwt.key=Token
jwt.hour=120
#\u8DEF\u5F84\u5B58\u653E
brandkbs.file.url=/usr/local/sources/brandkbs2/files/
brandkbs.img.url=/usr/local/sources/brandkbs2/images/
brandkbs.head.url=/usr/local/sources/brandkbs2/head/
brandkbs.image.url=https://brandkbs2.zhiweidata.com/brandkbs2/images/
#redis
spring.redis.host=192.168.0.39
spring.redis.database=7
spring.redis.port=7373
#mongo\u914D\u7F6E
mongo.connectionsPerHost=200
mongo.threadsAllowedToBlockForConnectionMultiplier=10
mongo.connectTimeout=30000
mongo.maxWaitTime=50000
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=120000
mongo.slaveOk=true
primary.uri=mongodb://qbjcuser:qbjc1q2w3e4r@202.107.192.94:30000/qbjc?authSource=admin
secondary.uri=mongodb://qbjcuser:qbjc1q2w3e4r@202.107.192.94:30000/qbjc?authSource=admin
#es
es.clusterNodes=192.168.0.130:9200
es.clusterName=zhiweidata-new-es
es.httpClusterNodes=192.168.0.130:9200:qbjc-back:yuqing.zhiweidata.com,192.168.0.51:9400:elastic:qWxZRW42OHkuOhmF5AXX
es.username=
es.password=
#channel-index
channel.index.registry=zookeeper://192.168.0.203:2182?backup=192.168.0.104:2182,192.168.0.105:2182
channel.index.consumer.group=channel-index-release
channel.index.application.name=brandkbs2
#\u5916\u90E8\u63A5\u53E3
#qbjc.project.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/aplan/project
hqd.groupAll.url= https://sensitive.zhiweidata.com/sensitive/planA/groupAll
#\u6807\u6CE8\u4E2D\u95F4\u4EF6
mark.registry.address=zookeeper://192.168.0.203:2182?backup=192.168.0.104:2182,192.168.0.105:2182
mark.provider.group=zhiwei-mark
#\u7528\u6237\u4E2D\u5FC3
auth.center.client.consumer.group=zhiwei-auth
auth.center.client.registry.address=zookeeper://192.168.0.203:2182?backup=192.168.0.104:2182,192.168.0.105:2182
auth.center.client.application.name=brandkbs2
#\u8206\u60C5\u7CFB\u7EDF\u5916\u90E8\u63A5\u53E3
qbjc.interface.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/
qbjc.interface.upload.token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXlsb2FkIjoiXCLlk4Hop4FcIiIsImV4cCI6NDc2MjgyMjEzMiwiaWF0IjoxNjUyNDIyMDcyfQ.DXQ8yKgfsCMjhT0xniZeWCMv4syqIoDvztU4QWsd-Fg
qbjc.project.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/project/resource
qbjc.event.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/aplan/event
qbjc.event.tag.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/tag/event?project={1}
qbjc.platform.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/platform/resource
\ No newline at end of file
server.port=8888
spring.profiles.active=local
spring.flyway.encoding=UTF-8
\ No newline at end of file
local.robot.push.address=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=e2218c6e-af6a-4296-9d75-7178b941a3b5
local.robot.push.enable=false
local.robot.push.filterclass=org.apache.dubbo.common.Version,com.alibaba.dubbo.common.Version,org.apache.dubbo.monitor.dubbo.DubboMonitor,com.alibaba.dubbo.monitor.dubbo.DubboMonitor
local.robot.push.level=error
local.robot.push.app.name=brandkbs2
dev.robot.push.address=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=e2218c6e-af6a-4296-9d75-7178b941a3b5
dev.robot.push.enable=false
dev.robot.push.filterclass=org.apache.dubbo.common.Version,com.alibaba.dubbo.common.Version,org.apache.dubbo.monitor.dubbo.DubboMonitor,com.alibaba.dubbo.monitor.dubbo.DubboMonitor
dev.robot.push.level=error
dev.robot.push.app.name=brandkbs2
pro.robot.push.address=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=e2218c6e-af6a-4296-9d75-7178b941a3b5
pro.robot.push.enable=false
pro.robot.push.filterclass=org.apache.dubbo.common.Version,com.alibaba.dubbo.common.Version,org.apache.dubbo.monitor.dubbo.DubboMonitor,com.alibaba.dubbo.monitor.dubbo.DubboMonitor
pro.robot.push.level=error
pro.robot.push.app.name=brandkbs2
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- @version $Id: applicationContext.xml 561608 2007-08-01 00:33:12Z vgritsenko $ -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:configurator="http://cocoon.apache.org/schema/configurator"
xmlns:avalon="http://cocoon.apache.org/schema/avalon"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://cocoon.apache.org/schema/configurator http://cocoon.apache.org/schema/configurator/cocoon-configurator-1.0.1.xsd
http://cocoon.apache.org/schema/avalon http://cocoon.apache.org/schema/avalon/cocoon-avalon-1.0.xsd">
<!-- Activate Cocoon Spring Configurator -->
<configurator:settings/>
<!-- Configure Log4j -->
<bean name="org.apache.cocoon.spring.configurator.log4j"
class="org.apache.cocoon.spring.configurator.log4j.Log4JConfigurator"
scope="singleton">
<property name="settings" ref="org.apache.cocoon.configuration.Settings"/>
<property name="resource" value="/WEB-INF/log4j.xml"/>
</bean>
<!-- Activate Avalon Bridge -->
<avalon:bridge/>
</beans>
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!--
- This is a sample configuration for log4j.
- It simply just logs everything into a single log file.
- Note, that you can use properties for value substitution.
-->
<appender name="CORE" class="org.apache.log4j.FileAppender">
<param name="File" value="${org.apache.cocoon.work.directory}/cocoon-logs/log4j.log" />
<param name="Append" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %t %c - %m%n"/>
</layout>
</appender>
<root>
<priority value="${org.apache.cocoon.log4j.loglevel}"/>
<appender-ref ref="CORE"/>
</root>
</log4j:configuration>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
- This is the Cocoon web-app configurations file
-
- $Id$
-->
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- Servlet Filters ================================================ -->
<!--
- Declare a filter for multipart MIME handling
-->
<filter>
<description>Multipart MIME handling filter for Cocoon</description>
<display-name>Cocoon multipart filter</display-name>
<filter-name>CocoonMultipartFilter</filter-name>
<filter-class>org.apache.cocoon.servlet.multipart.MultipartFilter</filter-class>
</filter>
<!--
- Declare a filter for debugging incoming request
-->
<filter>
<description>Log debug information about each request</description>
<display-name>Cocoon debug filter</display-name>
<filter-name>CocoonDebugFilter</filter-name>
<filter-class>org.apache.cocoon.servlet.DebugFilter</filter-class>
</filter>
<!-- Filter mappings ================================================ -->
<!--
- Use the Cocoon multipart filter together with the Cocoon demo webapp
-->
<filter-mapping>
<filter-name>CocoonMultipartFilter</filter-name>
<servlet-name>Cocoon</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>CocoonMultipartFilter</filter-name>
<servlet-name>DispatcherServlet</servlet-name>
</filter-mapping>
<!--
- Use the Cocoon debug filter together with the Cocoon demo webapp
<filter-mapping>
<filter-name>CocoonDebugFilter</filter-name>
<servlet-name>Cocoon</servlet-name>
</filter-mapping>
-->
<!-- Servlet Context Listener ======================================= -->
<!--
- Declare Spring context listener which sets up the Spring Application Context
- containing all Cocoon components (and user defined beans as well).
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--
- Declare Spring request listener which sets up the required RequestAttributes
- to support Springs and Cocoon custom bean scopes like the request scope or the
- session scope.
-->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!-- Servlet Configuration ========================================== -->
<!--
- Servlet that dispatches requests to the Spring managed block servlets
-->
<servlet>
<description>Cocoon blocks dispatcher</description>
<display-name>DispatcherServlet</display-name>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.apache.cocoon.servletservice.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- URL space mappings ============================================= -->
<!--
- Cocoon handles all the URL space assigned to the webapp using its sitemap.
- It is recommended to leave it unchanged. Under some circumstances though
- (like integration with proprietary webapps or servlets) you might have
- to change this parameter.
-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
\ No newline at end of file
package com.zhiwei.brandkbs2;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
/**
* @ClassName: Test
* @Description TODO
* @author: sjj
* @date: 2022-04-29 18:11
*/
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
// String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXlsb2FkIjoie1widXNlcklkXCI6XCIyMFwiLFwia2V5XCI6XCIyMFwiLFwibmlja05hbWVcIjpcIuayiOWQm-adsFwiLFwic2VydmljZVwiOlwiXCJ9IiwiZXhwIjoxNjUzMDExNjcwLCJpYXQiOjE2NTI0MDY4MTB9.jcVXxeZkayc6-Aiq8cyYc1uyq4ugji6FdWQXCCp4M2o";
// String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXlsb2FkIjoiXCLlk4Hop4FcIiIsImV4cCI6NDc2MjgyMjEzMiwiaWF0IjoxNjUyNDIyMDcyfQ.DXQ8yKgfsCMjhT0xniZeWCMv4syqIoDvztU4QWsd-Fg";
// String t = JwtUtil.unsign(token, String.class);
// System.out.println(JSONObject.toJSONString(t));
String test = URLEncoder.encode("测试", "utf-8");
System.out.println(test);
// String projectId = "1";
// List<UserRole> list = new ArrayList<>();
// UserDTO userDto = new UserDTO();
// userDto.setProjectId(projectId);
// userDto.setRoleId(1);
// list.add(UserRole.createFromUserDto(userDto));
//
// list.stream().filter(userRole -> userRole.getProjectId().equals(projectId)).findAny().ifPresent(role -> {
// role.setRoleId(2);
// });
// System.out.println(JSONObject.toJSONString(list));
}
}
package com.zhiwei.brandkbs2;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.dao.IChannelLabelDao;
import com.zhiwei.brandkbs2.dao.IEventDataDao;
import com.zhiwei.brandkbs2.es.ITaskService;
import com.zhiwei.brandkbs2.pojo.ChannelIndex;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @ClassName: TestRunWith
* @Description TODO
* @author: sjj
* @date: 2022-06-16 16:27
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@Slf4j
public class TestRunWith {
@Autowired
ITaskService iTaskService;
@Autowired
IEventDataDao eventDataDao;
@Autowired
IChannelLabelDao channelLabelDao;
@Test
public void test1(){
iTaskService.channelRecordFromEs(2);
}
@Test
public void test2(){
ChannelIndex channelIndex = new ChannelIndex();
channelIndex.setPlatform("微信");
channelIndex.setRealSource("微信公众号");
channelIndex.setSource("金陵晚报2");
channelIndex.setLinkedGroupId("41");
System.out.println(JSONObject.toJSONString(eventDataDao.getEventCount(channelIndex)));
}
@Test
public void test3(){
channelLabelDao.getChannelLabelType();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment