Commit b8dea545 by shenjunjie

Merge branch 'feature' into 'dev'

Feature

See merge request !491
parents 6fe16ea2 a40bb649
...@@ -61,7 +61,7 @@ public class AopLogRecord { ...@@ -61,7 +61,7 @@ public class AopLogRecord {
private static final List<String> URL_PATTERNS = Arrays.asList("/getNewAll", "/getNew", "/schedule"); private static final List<String> URL_PATTERNS = Arrays.asList("/getNewAll", "/getNew", "/schedule");
@AfterReturning(value = "execution(public * com..controller..admin..*Controller.*(..)) || execution(* com..controller..app..*Controller.*(..)) || execution(* com..controller..LoginController.checkBind())", returning = "ResponseResult") @AfterReturning(value = "execution(public * com..controller..admin..*Controller.*(..)) || execution(* com..controller..app..*Controller.*(..)) || execution(* com..controller..LoginController.checkBind())", returning = "ResponseResult")
private void beforeLog(JoinPoint joinPoint, ResponseResult ResponseResult) { private void beforeLog(JoinPoint joinPoint, Object ResponseResult) {
try { try {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
// RequestContextHolder 顾名思义 持有 request 上下文的容器 // RequestContextHolder 顾名思义 持有 request 上下文的容器
...@@ -128,7 +128,7 @@ public class AopLogRecord { ...@@ -128,7 +128,7 @@ public class AopLogRecord {
} }
} }
private UserLogRecord userLogRecord(String projectId, UserInfo userInfo, JoinPoint joinPoint, MethodSignature methodSignature, ResponseResult responseResult) { private UserLogRecord userLogRecord(String projectId, UserInfo userInfo, JoinPoint joinPoint, MethodSignature methodSignature, Object responseResult) {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
Object[] args = joinPoint.getArgs(); Object[] args = joinPoint.getArgs();
Method method = methodSignature.getMethod(); Method method = methodSignature.getMethod();
...@@ -193,10 +193,11 @@ public class AopLogRecord { ...@@ -193,10 +193,11 @@ public class AopLogRecord {
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now); return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now);
} }
// 获取接口返回值(value为获取返回值的具体字段)并与操作描述description拼接返回,返回值为实体 // 获取接口返回值(value为获取返回值的具体字段)并与操作描述description拼接返回,返回值为实体
if (!method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity()) { if (!method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity() && Objects.nonNull(responseResult)) {
List<Object> res = new ArrayList<>(value.length); List<Object> res = new ArrayList<>(value.length);
for (String v : value) { for (String v : value) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(responseResult.getData()); ResponseResult result = (ResponseResult) responseResult;
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(result.getData());
String s = String.valueOf(jsonObject.get(v)); String s = String.valueOf(jsonObject.get(v));
if (Objects.nonNull(s)) { if (Objects.nonNull(s)) {
res.add(s); res.add(s);
......
...@@ -20,12 +20,14 @@ public class Constant { ...@@ -20,12 +20,14 @@ public class Constant {
public static final Long ONE_YEAR = ONE_MONTH * 12; public static final Long ONE_YEAR = ONE_MONTH * 12;
public static final String SPEC_MINUTE_PATTERN = "yyyy.MM.dd HH:mm"; public static final String SPEC_MINUTE_PATTERN = "yyyy.MM.dd HH:mm";
public static final String SPEC_DAY_PATTERN = "yyyy.MM.dd";
public static final String HOUR_PATTERN = "yyyy-MM-dd HH"; public static final String HOUR_PATTERN = "yyyy-MM-dd HH";
public static final String DAY_PATTERN = "yyyy-MM-dd"; public static final String DAY_PATTERN = "yyyy-MM-dd";
public static final String MONTH_PATTERN = "yyyy-MM"; public static final String MONTH_PATTERN = "yyyy-MM";
public static final String YEAR_PATTERN = "yyyy"; public static final String YEAR_PATTERN = "yyyy";
public static final FastDateFormat SPEC_MINUTE_FORMAT = FastDateFormat.getInstance(SPEC_MINUTE_PATTERN); public static final FastDateFormat SPEC_MINUTE_FORMAT = FastDateFormat.getInstance(SPEC_MINUTE_PATTERN);
public static final FastDateFormat SPEC_DAY_POINT_FORMAT = FastDateFormat.getInstance(SPEC_DAY_PATTERN);
public static final FastDateFormat HOUR_FORMAT = FastDateFormat.getInstance(HOUR_PATTERN); public static final FastDateFormat HOUR_FORMAT = FastDateFormat.getInstance(HOUR_PATTERN);
public static final FastDateFormat DAY_FORMAT = FastDateFormat.getInstance(DAY_PATTERN); public static final FastDateFormat DAY_FORMAT = FastDateFormat.getInstance(DAY_PATTERN);
public static final FastDateFormat SPEC_DAY_FORMAT = FastDateFormat.getInstance("yyyy/MM/dd"); public static final FastDateFormat SPEC_DAY_FORMAT = FastDateFormat.getInstance("yyyy/MM/dd");
......
...@@ -481,7 +481,7 @@ public class AppArticleController extends BaseController { ...@@ -481,7 +481,7 @@ public class AppArticleController extends BaseController {
@ApiOperation("新-舆情分析-活跃渠道") @ApiOperation("新-舆情分析-活跃渠道")
@PostMapping("/analyze/active-channel") @PostMapping("/analyze/active-channel")
public ResponseResult getActiveChannels(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult getActiveChannels(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getActiveChannels(markSearchDTO)); return ResponseResult.success(markDataService.getActiveChannels(markSearchDTO, 20));
} }
@ApiOperation("新-舆情分析-ip分布") @ApiOperation("新-舆情分析-ip分布")
...@@ -538,6 +538,20 @@ public class AppArticleController extends BaseController { ...@@ -538,6 +538,20 @@ public class AppArticleController extends BaseController {
return ResponseResult.success(markDataService.getSearchAnalyzeHighWord(markSearchDTO)); return ResponseResult.success(markDataService.getSearchAnalyzeHighWord(markSearchDTO));
} }
@ApiOperation("舆情简报-每日一报列表")
@GetMapping("/daily-report/list")
public ResponseResult getDailyReportList(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", defaultValue = "10")Integer pageSize) {
return ResponseResult.success(markDataService.getDailyReportList(page, pageSize));
}
@ApiOperation("舆情简报-每日一报详情")
@GetMapping("/daily-report/detail/{id}")
@Auth(role = RoleEnum.NO_AUTHORISE)
public ResponseResult getDailyReportDetail(@PathVariable String id) {
return ResponseResult.success(markDataService.getDailyReportDetail(id));
}
private boolean checkMTagIllegal(StringBuilder mtag) { private boolean checkMTagIllegal(StringBuilder mtag) {
List<MarkerTag> hitTags = projectService.getProjectById(UserThreadLocal.getProjectId()).getHitTags(); List<MarkerTag> hitTags = projectService.getProjectById(UserThreadLocal.getProjectId()).getHitTags();
if (!Tools.isEmpty(hitTags)) { if (!Tools.isEmpty(hitTags)) {
......
...@@ -174,6 +174,7 @@ public class AppHotController extends BaseController { ...@@ -174,6 +174,7 @@ public class AppHotController extends BaseController {
@ApiOperation("热点库-品牌热点-关键词调整") @ApiOperation("热点库-品牌热点-关键词调整")
@PutMapping("/keyword/update") @PutMapping("/keyword/update")
@LogRecord(description = "热点库-关键词调整", values = "list", entity = true, arguments = true)
public ResponseResult updateKeyword(@ApiParam(name = "json:{list:关键词数组,contendId:竞品id}") @RequestBody JSONObject json) { public ResponseResult updateKeyword(@ApiParam(name = "json:{list:关键词数组,contendId:竞品id}") @RequestBody JSONObject json) {
JSONArray list = json.getJSONArray("list"); JSONArray list = json.getJSONArray("list");
String contendId = json.getString("contendId"); String contendId = json.getString("contendId");
...@@ -183,6 +184,7 @@ public class AppHotController extends BaseController { ...@@ -183,6 +184,7 @@ public class AppHotController extends BaseController {
@ApiOperation("热点库-品牌热点-噪音词调整") @ApiOperation("热点库-品牌热点-噪音词调整")
@PutMapping("/filter-word/update") @PutMapping("/filter-word/update")
@LogRecord(description = "热点库-噪音词调整", values = "list", entity = true, arguments = true)
public ResponseResult updateFilterWord(@ApiParam(name = "json:{list:噪音词数组,contendId:竞品id}") @RequestBody JSONObject json) { public ResponseResult updateFilterWord(@ApiParam(name = "json:{list:噪音词数组,contendId:竞品id}") @RequestBody JSONObject json) {
JSONArray list = json.getJSONArray("list"); JSONArray list = json.getJSONArray("list");
String contendId = json.getString("contendId"); String contendId = json.getString("contendId");
......
...@@ -77,9 +77,8 @@ public class AppUserCenterController extends BaseController { ...@@ -77,9 +77,8 @@ public class AppUserCenterController extends BaseController {
@ApiOperation("任务中心-下载") @ApiOperation("任务中心-下载")
@ApiImplicitParam(name = "id", value = "任务id", required = true, paramType = "path", dataType = "string") @ApiImplicitParam(name = "id", value = "任务id", required = true, paramType = "path", dataType = "string")
@GetMapping("/download-task/download/{id}") @GetMapping("/download-task/download/{id}")
public ResponseResult download(@PathVariable String id) { public void download(@PathVariable String id) {
DownloadTask task = downloadTaskService.findTask(id); DownloadTask task = downloadTaskService.findTask(id);
Tools.downloadFile(task.getFileAddress(), response); Tools.downloadFile(task.getFileAddress(), response);
return ResponseResult.success();
} }
} }
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.DailyReport;
/**
* @ClassName: DailyReportDao
* @Description DailyReportDao
* @author: cjz
* @date: 2024-04-22 11:46
*/
public interface DailyReportDao extends BaseMongoDao<DailyReport>{
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.DailyReportDao;
import com.zhiwei.brandkbs2.pojo.DailyReport;
import org.springframework.stereotype.Component;
/**
* @ClassName: DailyReportDaoImpl
* @Description DailyReportDaoImpl
* @author: cjz
* @date: 2024-04-22 11:46
*/
@Component("dailyReportDao")
public class DailyReportDaoImpl extends BaseMongoDaoImpl<DailyReport> implements DailyReportDao {
private static final String COLLECTION_NAME = "brandkbs_daily_report";
public DailyReportDaoImpl() {
super(COLLECTION_NAME);
}
}
package com.zhiwei.brandkbs2.pojo;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* @author cjz
* @version 1.0
* @description 每日简报实体类
* @date 2024年4月22日10:06:46
*/
@Getter
@Setter
@AllArgsConstructor
public class DailyReport extends AbstractBaseMongo{
private String name;
/**
* 舆情概览
*/
private JSONObject summary;
/**
* 舆情总量
*/
private JSONObject yuqingAmount;
/**
* 情感分布
*/
private JSONObject yuqingEmotion;
/**
* 重点平台
*/
private JSONObject platformPercentage;
/**
* 高频标题
*/
private List<JSONObject> topTitle;
/**
* 发文渠道
*/
private List<JSONObject> topSource;
/**
* 项目id
*/
private String projectId;
/**
* 项目
*/
private String project;
/**
* 时间周期-开始时间
*/
private Long startTime;
/**
* 时间周期-结束时间
*/
private Long endTime;
/**
* 创建时间
*/
private Long cTime;
}
...@@ -3,6 +3,7 @@ package com.zhiwei.brandkbs2.service; ...@@ -3,6 +3,7 @@ package com.zhiwei.brandkbs2.service;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.model.ResponseResult; import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.BaseMap; import com.zhiwei.brandkbs2.pojo.BaseMap;
import com.zhiwei.brandkbs2.pojo.DailyReport;
import com.zhiwei.brandkbs2.pojo.Event; import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.pojo.MarkFlowEntity; import com.zhiwei.brandkbs2.pojo.MarkFlowEntity;
import com.zhiwei.brandkbs2.pojo.dto.*; import com.zhiwei.brandkbs2.pojo.dto.*;
...@@ -581,7 +582,7 @@ public interface MarkDataService { ...@@ -581,7 +582,7 @@ public interface MarkDataService {
* @param dto 标注数据搜索传输类 * @param dto 标注数据搜索传输类
* @return * @return
*/ */
List<JSONObject> getActiveChannels(MarkSearchDTO dto); List<JSONObject> getActiveChannels(MarkSearchDTO dto, int size);
/** /**
* 新-舆情分析-ip分布 * 新-舆情分析-ip分布
...@@ -673,4 +674,24 @@ public interface MarkDataService { ...@@ -673,4 +674,24 @@ public interface MarkDataService {
PageVO<JSONObject> getArticleList(String aggTitle, Long startTime, Long endTime, String planId, String platform, int page, int pageSize); PageVO<JSONObject> getArticleList(String aggTitle, Long startTime, Long endTime, String planId, String platform, int page, int pageSize);
PageVO<JSONObject> getArticleList(MarkSearchDTO dto); PageVO<JSONObject> getArticleList(MarkSearchDTO dto);
/**
* 生成每日一报
*/
void generateDailyReport(Long startTime, Long endTime);
/**
* 每日一报列表
* @param page
* @param pageSize
* @return
*/
PageVO<JSONObject> getDailyReportList(int page, int pageSize);
/**
* 获取每日一报详情
* @param id id
* @return
*/
DailyReport getDailyReportDetail(String id);
} }
...@@ -57,4 +57,9 @@ public interface TaskService{ ...@@ -57,4 +57,9 @@ public interface TaskService{
* 生成舆情分析词云缓存 * 生成舆情分析词云缓存
*/ */
void yuqingAnalyzeHighWordCache(); void yuqingAnalyzeHighWordCache();
/**
* 生成每日一报
*/
void generateDailyReport();
} }
...@@ -399,6 +399,25 @@ public class TaskServiceImpl implements TaskService { ...@@ -399,6 +399,25 @@ public class TaskServiceImpl implements TaskService {
CompletableFuture.allOf(projectFutures.toArray(new CompletableFuture[0])).join(); CompletableFuture.allOf(projectFutures.toArray(new CompletableFuture[0])).join();
} }
@Override
public void generateDailyReport() {
// 时间范围:当天早上八点-前一天早上八点
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long endTime = calendar.getTimeInMillis();
long startTime = endTime - Constant.ONE_DAY;
AtomicInteger total = new AtomicInteger();
CompletableFuture.allOf(GlobalPojo.PROJECT_MAP.values().stream().map(project -> CompletableFuture.supplyAsync(() -> {
UserThreadLocal.set(new UserInfo().setProjectId(project.getId()));
markDataService.generateDailyReport(startTime, endTime);
log.info("项目:{}-{}-每日一报生成已完成:{}个", project.getProjectName(), project.getId(), total.incrementAndGet());
return null;
}, cacheServiceExecutor)).toArray(CompletableFuture[]::new)).join();
}
private boolean reportSendByProject(Project project) { private boolean reportSendByProject(Project project) {
boolean flag = false; boolean flag = false;
// 扫描setting信息并生成对应报告 // 扫描setting信息并生成对应报告
......
...@@ -105,4 +105,17 @@ public class ControlCenter { ...@@ -105,4 +105,17 @@ public class ControlCenter {
log.info("定时按周计算项目均值-结束"); log.info("定时按周计算项目均值-结束");
} }
} }
@Async("scheduledExecutor")
@Scheduled(cron = "0 0 8 * * ?")
public void generateDailyReport() {
log.info("定时生成每日一报-启动");
try {
taskService.generateDailyReport();
} catch (Exception e) {
log.error("定时生成每日一报-出错", e);
} finally {
log.info("定时生成每日一报-结束");
}
}
} }
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