提交 2b32b387 作者: 925993793@qq.com

事件分析功能迭代

上级 0a39c974
package com.zzsn.event.controller.yjzx;
package com.zzsn.event.controller;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zzsn.event.constant.Result;
import com.zzsn.event.entity.SubjectAnalysis;
import com.zzsn.event.service.AnalysisService;
import com.zzsn.event.service.SubjectAnalysisService;
import com.zzsn.event.entity.Event;
import com.zzsn.event.entity.EventContext;
import com.zzsn.event.service.EventContextService;
import com.zzsn.event.service.IEventService;
import com.zzsn.event.vo.EventContextModifyVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -23,46 +26,54 @@ import java.util.List;
public class EventMaintenanceController {
@Autowired
private SubjectAnalysisService subjectAnalysisService;
private IEventService eventService;
@Autowired
private AnalysisService analysisService;
private EventContextService eventContextService;
/**
* 专题事件脉络列表
* 编辑核心摘要
*
* @param subjectId 专题id
* @param event 事件信息
* @author lkg
* @date 2024/5/27
* @date 2025/7/15
*/
@GetMapping("/eventContextList")
public Result<?> eventContextList(@RequestParam String subjectId){
List<JSONObject> eventContextList = analysisService.eventContext(subjectId);
return Result.OK(eventContextList);
@PostMapping("/event/description/update")
public Result<?> eventContextList(@RequestBody Event event) {
LambdaUpdateWrapper<Event> update = Wrappers.lambdaUpdate();
update.set(Event::getEventDescribe, event.getEventDescribe())
.set(Event::getYnManualEdit,1)
.eq(Event::getId, event.getId());
eventService.update(update);
return Result.OK();
}
/**
* 事件脉络新增/编辑
*
* @param subjectAnalysis 事件脉络信息
* @param eventContextModifyVO 事件脉络信息
* @author lkg
* @date 2024/5/11
* @date 2025/7/15
*/
@PostMapping("/eventContextModify")
public Result<?> eventContextModify(@RequestBody SubjectAnalysis subjectAnalysis){
subjectAnalysisService.eventContextModify(subjectAnalysis);
@PostMapping("/eventContext/modify")
public Result<?> eventContextModify(@RequestBody EventContextModifyVO eventContextModifyVO){
eventContextService.eventContextModify(eventContextModifyVO);
return Result.OK();
}
/**
* 删除事件脉络
*
* @param id 主键id
* @param keyNodeId 脉络关健节点id
* @author lkg
* @date 2024/5/27
* @date 2025/7/15
*/
@GetMapping("/eventContextRemove")
public Result<?> eventContextRemove(String id){
subjectAnalysisService.removeById(id);
@GetMapping("/eventContext/remove")
public Result<?> eventContextRemove(@RequestParam String keyNodeId){
LambdaQueryWrapper<EventContext> queryWrapper = Wrappers.lambdaQuery();
eventContextService.remove(queryWrapper.eq(EventContext::getId, keyNodeId).or().eq(EventContext::getParentId, keyNodeId));
return Result.OK();
}
}
package com.zzsn.event.controller;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
......@@ -10,12 +11,11 @@ import com.zzsn.clb.common.model.task.dto.titr.KeyWordsDTO;
import com.zzsn.event.constant.Constants;
import com.zzsn.event.constant.Result;
import com.zzsn.event.entity.Event;
import com.zzsn.event.entity.EventAnalysisVersionRecord;
import com.zzsn.event.entity.KeyWords;
import com.zzsn.event.entity.SubjectInfoSourceMap;
import com.zzsn.event.service.IEventService;
import com.zzsn.event.service.IKeyWordsService;
import com.zzsn.event.service.ISubjectInfoSourceMapService;
import com.zzsn.event.service.LabelEntityService;
import com.zzsn.event.enums.AnalysisColumnEnum;
import com.zzsn.event.service.*;
import com.zzsn.event.service.impl.ConfigurationMessageService;
import com.zzsn.event.util.HttpUtil;
import com.zzsn.event.util.ObjectUtil;
......@@ -35,6 +35,7 @@ import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.concurrent.CompletableFuture;
......@@ -66,6 +67,8 @@ public class EventManageController {
private RedisUtil redisUtil;
@Resource
private KafkaTemplate<String, String> kafkaTemplate;
@Autowired
private EventAnalysisVersionRecordService eventAnalysisVersionRecordService;
@Value(("${serviceProject.url:}"))
private String SERVICE_PROJECT_URL;
......@@ -125,8 +128,18 @@ public class EventManageController {
* @return
*/
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name = "id") String id) {
public Result<?> queryById(@RequestParam(name = "id") String id,
@RequestParam(required = false) String versionId) {
EventVO eventVO = eventService.queryInfo(id);
if (StringUtils.isNotEmpty(versionId)) {
LambdaQueryWrapper<EventAnalysisVersionRecord> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(EventAnalysisVersionRecord::getVersionId, versionId)
.eq(EventAnalysisVersionRecord::getColumnCode, AnalysisColumnEnum.CORE_SUMMARY.getCode());
EventAnalysisVersionRecord eventAnalysisVersionRecord = eventAnalysisVersionRecordService.getOne(queryWrapper);
if (eventAnalysisVersionRecord != null) {
eventVO.setEventDescribe(eventAnalysisVersionRecord.getReturnData());
}
}
return Result.OK(eventVO);
}
......
......@@ -167,10 +167,10 @@ public class EventDataController {
IPage<EventFrontVO> pageList = new Page<>();
if (category == 1){
pageList = eventService.frontAllPageList(projectId, eventId,eventName, eventType, labelField, labelName, order, orderType, pageNo, pageSize);
} else if (category == 2) {
pageList = eventService.frontCollectPageList(projectId,eventName, eventType, labelField, labelName, order, orderType, pageNo, pageSize);
} else if (category == 3) {
pageList = eventService.frontOwnerPageList(projectId, eventName, eventType, labelField, labelName, order, orderType, pageNo, pageSize);
} else if (category == 4) {
pageList = eventService.frontCollectPageList(projectId,eventName, eventType, labelField, labelName, order, orderType, pageNo, pageSize);
}
return Result.OK(pageList);
}
......
......@@ -91,6 +91,12 @@ public class Event {
@ApiModelProperty(value = "事件描述")
private String eventDescribe;
/**
* 事件描述是否人工编辑(1-是;0-否)
*/
@Excel(name = "事件描述是否人工编辑(1-是;0-否)", width = 15)
@ApiModelProperty(value = "事件描述是否人工编辑(1-是;0-否)")
private Integer ynManualEdit;
/**
* 创建人id
*/
@Excel(name = "创建人id", width = 15)
......
package com.zzsn.event.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 事件分析版本表
* @TableName event_analysis_version
*/
@Data
@TableName("event_analysis_version")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EventAnalysisVersion implements Serializable {
/**
* 版本id
*/
@TableId(type = IdType.ASSIGN_ID)
private String id;
/**
* 事件id
*/
private String eventId;
/**
* 版本名称
*/
private String versionName;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新人
*/
private String updateBy;
/**
* 更新时间
*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package com.zzsn.event.entity;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zzsn.event.enums.AnalysisColumnEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 事件分析版本记录表
*
* @TableName event_analysis_version_record
*/
@Data
@TableName("event_analysis_version_record")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EventAnalysisVersionRecord implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.ASSIGN_ID)
private String id;
/**
* 版本id
*/
private String versionId;
/**
* 栏目编码
*/
private Integer columnCode;
/**
* 参数
*/
private String params;
/**
* 返回数据
*/
private String returnData;
/**
* 返回数据类型(object、array)
*/
private String resType;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新人
*/
private String updateBy;
/**
* 更新时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
public static EventAnalysisVersionRecord of(String versionId, AnalysisColumnEnum analysisColumnEnum, String returnData) {
EventAnalysisVersionRecord record = new EventAnalysisVersionRecord();
record.setVersionId(versionId);
record.setColumnCode(analysisColumnEnum.getCode());
record.setReturnData(returnData);
record.setResType(analysisColumnEnum.getResType());
return record;
}
}
package com.zzsn.event.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 用户关注事件关系表
* @TableName event_collect_map
*/
@Data
@TableName("event_collect_map")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EventCollectMap implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.ASSIGN_ID)
private String id;
/**
* 事件id
*/
private String eventId;
/**
* 用户id
*/
private String userId;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
}
package com.zzsn.event.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 事件脉络表
* @TableName event_context
*/
@Data
@TableName("event_context")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EventContext implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.ASSIGN_ID)
private String id;
/**
* 专题id
*/
private String eventId;
/**
* 资讯id
*/
private String articleId;
/**
* 标题
*/
private String title;
/**
* 来源
*/
private String origin;
/**
* 发布时间
*/
private String publishDate;
/**
* 链接
*/
private String sourceAddress;
/**
* 排序
*/
private Integer sortNumber;
/**
* 是否关键节点(1-是;0-否)
*/
private Integer ynKeyNode;
/**
* 关键节点唯一编码
*/
private String uniqueCode;
/**
* 上级id(所属关键节点id)
*/
private String parentId;
/**
* es索引名称
*/
private String esIndex;
/**
* 生成方式(1-自动;2-人工)
*/
private Integer createWay;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新人
*/
private String updateBy;
/**
* 更新时间
*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**关键节点下资讯数量*/
@TableField(exist = false)
private Integer articleCount;
}
package com.zzsn.event.enums;
import java.util.ArrayList;
import java.util.List;
/**
* @author zs
* @Description 事件分析栏目(支持版本逻辑) 枚举
* @since 2021/12/9
*/
public enum AnalysisColumnEnum {
CORE_SUMMARY(1,"核心摘要","string", 1),
EVENT_CONTEXT(2,"事件脉络","array", 0),
KEYWORD_TREND(3,"关键词趋势分析","array", 0),
CO_OCCURRENCE(4,"关键词共现","array", 0),
IMPACT_ASSESSMENT(5,"影响评估","array", 1),
MEASURE_SUGGEST(6,"举措建议","array", 1),
KNOWLEDGE_ENTRY(7,"知识词条","array", 1),
ENTERPRISE_CASE(8,"企业案例","array", 1),
COUNTRY_POLICY(9,"各国政策","array", 1),
DOMESTIC_SIMILAR_EVENT(10,"本国类似事件","array", 1),
FOREIGN_SIMILAR_EVENT(11,"各国类似事件","array", 1),
;
//栏目编码
private final Integer code;
//栏目名称
private final String name;
//返回数据类型
private final String resType;
//是否需要大模型(1-是;0-否)
private final Integer ynNeedLlm;
AnalysisColumnEnum(int code, String name, String resType, Integer ynNeedLlm) {
this.code = code;
this.name = name;
this.resType = resType;
this.ynNeedLlm = ynNeedLlm;
}
public Integer getCode() {
return code;
}
public String getName() {
return name;
}
public String getResType() {
return resType;
}
public Integer getYnNeedLlm() {
return ynNeedLlm;
}
public static List<AnalysisColumnEnum> llmList() {
List<AnalysisColumnEnum> list = new ArrayList<>();
for (AnalysisColumnEnum value : AnalysisColumnEnum.values()) {
if (value.ynNeedLlm == 1) {
list.add(value);
}
}
return list;
}
}
......@@ -1056,10 +1056,12 @@ public class EsService {
* @author lkg
* @date 2024/10/10
*/
public List<EventViewVO> viewpointList(String eventId, String relationId) {
public List<EventViewVO> viewpointList(String eventId, String relationId, Integer pageNo, Integer pageSize) {
List<EventViewVO> dataList = new ArrayList<>();
SearchRequest searchRequest = new SearchRequest(Constants.SUBJECT_INDEX);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.from((pageNo - 1) * pageSize);
searchSourceBuilder.size(pageSize);
//排序方式 按发布时间升序
searchSourceBuilder.sort("publishDate", SortOrder.DESC);
searchSourceBuilder.trackTotalHits(true);
......@@ -2028,7 +2030,7 @@ public class EsService {
if (!Objects.isNull(searchCondition.getIncludeValues()) || !Objects.isNull(searchCondition.getExcludeValues())) {
if (!Objects.isNull(searchCondition.getIncludeValues())) {
aggregationBuilder.size(searchCondition.getIncludeValues().length);
} else {
} else {
aggregationBuilder.size(size);
}
aggregationBuilder.includeExclude(new IncludeExclude(searchCondition.getIncludeValues(), searchCondition.getExcludeValues()));
......@@ -2142,7 +2144,7 @@ public class EsService {
BoolQueryBuilder boolQuery = buildQuery(searchCondition, subjectIds);
searchSourceBuilder.query(boolQuery);
//按热词分组
TermsAggregationBuilder subAggregationBuilder = AggregationBuilders.terms("groupId")
TermsAggregationBuilder subAggregationBuilder = AggregationBuilders.terms("groupId")
.field("id").size(10000);
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("groupKeyword")
.field("keyWordsList.keyword")
......@@ -2161,10 +2163,10 @@ public class EsService {
Terms groupId = bucket.getAggregations().get("groupId");
List<? extends Terms.Bucket> idBuckets = groupId.getBuckets();
for (Terms.Bucket idBucket : idBuckets) {
Map<String,String> map = new HashMap<>();
map.put("keyword",keyword);
Map<String, String> map = new HashMap<>();
map.put("keyword", keyword);
map.put("num", String.valueOf(count));
map.put("id",idBucket.getKeyAsString());
map.put("id", idBucket.getKeyAsString());
list.add(map);
}
}
......
......@@ -6,10 +6,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.zzsn.event.constant.Constants;
import com.zzsn.event.entity.EventAnalysisReport;
import com.zzsn.event.entity.EventContext;
import com.zzsn.event.entity.SubjectAnalysis;
import com.zzsn.event.service.EventAnalysisReportService;
import com.zzsn.event.service.EventContextService;
import com.zzsn.event.service.SubjectAnalysisService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -31,6 +34,61 @@ public class KafkaConsumer {
private SubjectAnalysisService subjectAnalysisService;
@Autowired
private EventAnalysisReportService eventAnalysisReportService;
@Autowired
private EventContextService eventContextService;
/**
* 获取-事件脉络-分析结果数据,并入库
*
* @param record 接收的kafka数据
*/
@KafkaListener(topics = {"eventContextTopic"})
public void eventContext_new(ConsumerRecord<String, String> record) {
String value = record.value();
if (StringUtils.isEmpty(value)) {
return;
}
List<eventContextKafkaVO> eventContextKafkaList = JSON.parseArray(value, eventContextKafkaVO.class);
for (eventContextKafkaVO contextKafkaVO : eventContextKafkaList) {
String uniqueCode = contextKafkaVO.getUniqueCode();
String eventId = contextKafkaVO.getEventId();
LambdaQueryWrapper<EventContext> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(EventContext::getEventId, eventId).eq(EventContext::getUniqueCode, uniqueCode);
EventContext one = eventContextService.getOne(queryWrapper);
Integer maxSortNumber = eventContextService.getMaxSortNumber(eventId);
String keyNodeId;
if (one == null) {
EventContext keyNode = new EventContext();
keyNode.setEventId(eventId);
keyNode.setTitle(contextKafkaVO.getTitle());
keyNode.setPublishDate(contextKafkaVO.getPublishDate());
keyNode.setUniqueCode(uniqueCode);
keyNode.setYnKeyNode(1);
keyNode.setParentId("0");
maxSortNumber = maxSortNumber + 1;
keyNode.setSortNumber(maxSortNumber);
eventContextService.save(keyNode);
keyNodeId = keyNode.getId();
} else {
keyNodeId = one.getId();
}
List<EventContext> eventContextList = contextKafkaVO.getRelatedArticles();
if (CollectionUtils.isNotEmpty(eventContextList)) {
for (int i = 1; i <= eventContextList.size(); i++) {
EventContext eventContext = eventContextList.get(i);
eventContext.setEventId(eventId);
eventContext.setParentId(keyNodeId);
eventContext.setSortNumber(maxSortNumber + i);
eventContext.setCreateWay(2);
}
eventContextService.saveBatch(eventContextList);
}
}
}
/**
* 获取-事件脉络-分析结果数据,并入库
......
package com.zzsn.event.kafka;
import com.zzsn.event.entity.EventContext;
import lombok.Data;
import java.util.List;
/**
* kafka 事件脉络实体
*
* @author lkg
* @date 2025/7/15
*/
@Data
public class eventContextKafkaVO {
/**事件id*/
private String eventId;
/**关键节点唯一编码*/
private String uniqueCode;
/**关键节点标题*/
private String title;
/**关键节点时间*/
private String publishDate;
/**关键节点-关联资讯列表*/
private List<EventContext> relatedArticles;
}
package com.zzsn.event.mapper;
import com.zzsn.event.entity.EventAnalysisVersion;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author lenovo
* @description 针对表【event_analysis_version(事件分析版本表)】的数据库操作Mapper
* @createDate 2025-07-16 16:34:46
* @Entity com.zzsn.event.entity.EventAnalysisVersion
*/
@Mapper
public interface EventAnalysisVersionMapper extends BaseMapper<EventAnalysisVersion> {
}
package com.zzsn.event.mapper;
import com.zzsn.event.entity.EventAnalysisVersionRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author lenovo
* @description 针对表【event_analysis_version_record(事件分析版本记录表)】的数据库操作Mapper
* @createDate 2025-07-16 16:34:46
* @Entity com.zzsn.event.entity.EventAnalysisVersionRecord
*/
@Mapper
public interface EventAnalysisVersionRecordMapper extends BaseMapper<EventAnalysisVersionRecord> {
}
package com.zzsn.event.mapper;
import com.zzsn.event.entity.EventCollectMap;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author lenovo
* @description 针对表【event_collect_map(用户关注事件关系表)】的数据库操作Mapper
* @createDate 2025-07-15 10:07:01
* @Entity com.zzsn.event.entity.EventCollectMap
*/
@Mapper
public interface EventCollectMapMapper extends BaseMapper<EventCollectMap> {
}
package com.zzsn.event.mapper;
import com.zzsn.event.entity.EventContext;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* @author lenovo
* @description 针对表【event_context(事件脉络表)】的数据库操作Mapper
* @createDate 2025-07-14 18:05:06
* @Entity com.zzsn.event.entity.EventContext
*/
@Mapper
public interface EventContextMapper extends BaseMapper<EventContext> {
/**
* 获取事件下最大的排序号
*
* @param eventId 事件id
* @author lkg
* @date 2025/7/14
*/
@Select("SELECT IFNULL(MAX(sort_number), 1) FROM event_context WHERE event_id = #{eventId}")
Integer getMaxSortNumber(@Param("eventId") String eventId);
}
......@@ -24,6 +24,7 @@
t.end_time,
t.publish_date,
t.event_describe,
t.yn_manual_edit,
t.event_label,
t.library,
t.unit,
......
......@@ -23,7 +23,7 @@ public interface AnalysisService {
/**
* 事件脉络
*
* @param eventId 专题id
* @param eventId 事件id
* @param fakeNum 专题事件脉络展示 伪事件脉络 的资讯数量阈值
* @return java.util.List<com.zzsn.subjectAnalysis.entity.SubjectAnalysis>
*/
......@@ -32,7 +32,7 @@ public interface AnalysisService {
/**
* 事件脉络-新版
*
* @param eventId 专题id
* @param eventId 事件id
* @author lkg
* @date 2025/7/7
*/
......@@ -41,38 +41,128 @@ public interface AnalysisService {
/**
* 词云
*
* @param eventId 专题id
* @param size 返回热词个数
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @param size 返回热词个数
* @author lkg
* @date 2025/7/7
*/
List<CountVO> wordCloud(String eventId, Integer size);
List<CountVO> wordCloud(String eventId, String startTime, String endTime, Integer size);
/**
* 关键词时间趋势
*
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @author lkg
* @date 2025/7/9
*/
List<CountVO> wordTrend(String eventId, String endTime);
List<CountVO> wordTrend(String eventId, String startTime, String endTime);
/**
* 关键词共现
*
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @author lkg
* @date 2025/7/9
*/
List<CoOccurrenceVO> coOccurrence(String eventId, String endTime);
List<CoOccurrenceVO> coOccurrence(String eventId, String startTime, String endTime);
/**
* 传播路径
*
* @param eventId 专题id
* @param eventId 事件id
* @return com.zzsn.subjectAnalysis.vo.PropagationPathVo
*/
PropagationPathVo propagationPath(String eventId);
/**
* 影响评估
*
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @author lkg
* @date 2025/7/17
*/
Object impactAssessment(String eventId,String startTime,String endTime);
/**
* 决策建议
*
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @author lkg
* @date 2025/7/17
*/
Object measureSuggest(String eventId,String startTime,String endTime);
/**
* 知识词条
*
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @author lkg
* @date 2025/7/17
*/
Object knowledgeEntry(String eventId,String startTime,String endTime);
/**
* 企业案例
*
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @author lkg
* @date 2025/7/17
*/
Object enterpriseCase(String eventId,String startTime,String endTime);
/**
* 各国政策
*
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @author lkg
* @date 2025/7/17
*/
Object countryPolicy(String eventId,String startTime,String endTime);
/**
* 本国类似事件
*
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @author lkg
* @date 2025/7/17
*/
Object domesticSimilarEvent(String eventId,String startTime,String endTime);
/**
* 各国类似事件
*
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @author lkg
* @date 2025/7/17
*/
Object foreignSimilarEvent(String eventId,String startTime,String endTime);
/**
* 重新生成
*
* @param eventId 事件id
* @author lkg
* @date 2025/7/7
*/
void regenerate(String eventId);
}
package com.zzsn.event.service;
import com.zzsn.event.entity.EventAnalysisVersionRecord;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author lenovo
* @description 针对表【event_analysis_version_record(事件分析版本记录表)】的数据库操作Service
* @createDate 2025-07-16 16:34:46
*/
public interface EventAnalysisVersionRecordService extends IService<EventAnalysisVersionRecord> {
}
package com.zzsn.event.service;
import com.zzsn.event.entity.EventAnalysisVersion;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author lenovo
* @description 针对表【event_analysis_version(事件分析版本表)】的数据库操作Service
* @createDate 2025-07-16 16:34:46
*/
public interface EventAnalysisVersionService extends IService<EventAnalysisVersion> {
}
package com.zzsn.event.service;
import com.zzsn.event.entity.EventCollectMap;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author lenovo
* @description 针对表【event_collect_map(用户关注事件关系表)】的数据库操作Service
* @createDate 2025-07-15 10:07:01
*/
public interface EventCollectMapService extends IService<EventCollectMap> {
}
package com.zzsn.event.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zzsn.event.entity.EventContext;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zzsn.event.vo.EventContextModifyVO;
import java.util.List;
import java.util.Map;
/**
* @author lenovo
* @description 针对表【event_context(事件脉络表)】的数据库操作Service
* @createDate 2025-07-14 18:05:06
*/
public interface EventContextService extends IService<EventContext> {
List<Map<String,Object>> eventContext(String eventId);
/**
* 事件脉络维护(新增/编辑)
*
* @param eventContextModifyVO 事件脉络维护参数
* @author lkg
* @date 2025/7/15
*/
void eventContextModify(EventContextModifyVO eventContextModifyVO);
/**
* 事件脉络关键节点列表
*
* @param eventId 事件id
* @author lkg
* @date 2025/7/15
*/
List<EventContext> keNodeList(String eventId);
/**
* 关键节点下的资讯列表
*
* @param eventId 事件id
* @param keyNodeId 关键节点id
* @param pageNo 页码
* @param pageSize 每页返回数量
* @author lkg
* @date 2025/7/15
*/
Page<EventContext> contextArticleList(String eventId, String keyNodeId, Integer pageNo, Integer pageSize);
/**
* 获取最大排序序号
*
* @param eventId 事件id
* @author lkg
* @date 2025/7/15
*/
Integer getMaxSortNumber(String eventId);
}
package com.zzsn.event.service.impl;
import cn.hutool.core.date.DateUnit;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.zzsn.event.constant.Constants;
import com.zzsn.event.entity.Event;
import com.zzsn.event.entity.EventAnalysisVersion;
import com.zzsn.event.entity.EventAnalysisVersionRecord;
import com.zzsn.event.entity.SubjectAnalysis;
import com.zzsn.event.enums.AnalysisColumnEnum;
import com.zzsn.event.es.EsService;
import com.zzsn.event.service.AnalysisService;
import com.zzsn.event.service.CommonService;
import com.zzsn.event.service.IEventService;
import com.zzsn.event.service.SubjectAnalysisService;
import com.zzsn.event.llm.LlmService;
import com.zzsn.event.service.*;
import com.zzsn.event.util.DateUtil;
import com.zzsn.event.util.HotWordUtil;
import com.zzsn.event.util.SimilarityUtil;
import com.zzsn.event.vo.*;
import com.zzsn.event.vo.es.SpecialInformation;
import org.apache.commons.lang3.StringUtils;
......@@ -42,6 +42,14 @@ public class AnalysisServiceImpl implements AnalysisService {
private EsService esService;
@Autowired
private CommonService commonService;
@Autowired
private LlmService llmService;
@Autowired
private EventAnalysisVersionService eventAnalysisVersionService;
@Autowired
private EventAnalysisVersionRecordService eventAnalysisVersionRecordService;
@Autowired
private EventContextService eventContextService;
/*
* 优先级:事件脉络 > 伪事件脉络 > 资讯
......@@ -101,10 +109,12 @@ public class AnalysisServiceImpl implements AnalysisService {
}
@Override
public List<CountVO> wordCloud(String eventId, Integer size) {
public List<CountVO> wordCloud(String eventId, String startTime, String endTime, Integer size) {
InfoDataSearchCondition searchCondition = new InfoDataSearchCondition();
searchCondition.setCategory(2);
searchCondition.setSubjectId(eventId);
searchCondition.setStartTime(startTime);
searchCondition.setEndTime(endTime);
//排除词
Set<String> excludeKeywords = commonService.getExcludeKeywords(eventId);
searchCondition.setExcludeValues(excludeKeywords.toArray(new String[0]));
......@@ -112,9 +122,12 @@ public class AnalysisServiceImpl implements AnalysisService {
}
@Override
public List<CountVO> wordTrend(String eventId, String endTime) {
public List<CountVO> wordTrend(String eventId, String startTime, String endTime) {
Event event = eventService.getById(eventId);
Date startTime = event.getStartTime();
Date beginTime = event.getStartTime();
if (StringUtils.isNotEmpty(startTime)) {
beginTime = DateUtil.stringToDate(startTime, "yyyy-mm-dd HH:mm:ss");
}
Date finishTime;
if (StringUtils.isEmpty(endTime)) {
finishTime = event.getEndTime();
......@@ -124,7 +137,7 @@ public class AnalysisServiceImpl implements AnalysisService {
} else {
finishTime = DateUtil.stringToDate(endTime, "yyyy-mm-dd HH:mm:ss");
}
long between = DateUtil.betweenTwoDate(startTime, finishTime);
long between = DateUtil.betweenTwoDate(beginTime, finishTime);
String groupType;
if (between <= 30) {
groupType = "day";
......@@ -136,7 +149,7 @@ public class AnalysisServiceImpl implements AnalysisService {
InfoDataSearchCondition searchCondition = new InfoDataSearchCondition();
searchCondition.setCategory(2);
searchCondition.setSubjectId(eventId);
searchCondition.setStartTime(DateUtil.dateToString(startTime));
searchCondition.setStartTime(DateUtil.dateToString(beginTime));
searchCondition.setEndTime(DateUtil.dateToString(finishTime));
//排除词
Set<String> excludeKeywords = commonService.getExcludeKeywords(eventId);
......@@ -145,11 +158,13 @@ public class AnalysisServiceImpl implements AnalysisService {
}
@Override
public List<CoOccurrenceVO> coOccurrence(String eventId, String endTime) {
public List<CoOccurrenceVO> coOccurrence(String eventId, String startTime, String endTime) {
List<CoOccurrenceVO> list = new ArrayList<>();
InfoDataSearchCondition searchCondition = new InfoDataSearchCondition();
searchCondition.setCategory(2);
searchCondition.setSubjectId(eventId);
searchCondition.setStartTime(startTime);
searchCondition.setEndTime(endTime);
String[] fetchFields = new String[]{"id", "keyWordsList"};
searchCondition.setFetchFields(fetchFields);
int pageNo = 1;
......@@ -260,6 +275,106 @@ public class AnalysisServiceImpl implements AnalysisService {
return top;
}
@Override
public Object impactAssessment(String eventId, String startTime, String endTime) {
return null;
}
@Override
public Object measureSuggest(String eventId, String startTime, String endTime) {
return null;
}
@Override
public Object knowledgeEntry(String eventId, String startTime, String endTime) {
return null;
}
@Override
public Object enterpriseCase(String eventId, String startTime, String endTime) {
return null;
}
@Override
public Object countryPolicy(String eventId, String startTime, String endTime) {
return null;
}
@Override
public Object domesticSimilarEvent(String eventId, String startTime, String endTime) {
return null;
}
@Override
public Object foreignSimilarEvent(String eventId, String startTime, String endTime) {
return null;
}
@Override
public void regenerate(String eventId) {
//todo 获取模型配置信息(包含模型、提示词、角色等条件)
List<EventAnalysisVersionRecord> records = new ArrayList<>();
String today = DateUtil.dateToString(new Date());
//保存版本信息
String versionId = saveVersion(eventId, today);
EventVO eventVO = eventService.queryInfo(eventId);
//核心摘要
Integer ynManualEdit = eventVO.getYnManualEdit();
if (ynManualEdit == 0) {
String prompt = "根据提供的事件名称【name】和对应的关键词【keyword】,关键词【keyword】中'|'表示或;'+'表示与;括号表示优先计算,再结合网络上的相关资讯,生成一段200字左右的核心摘要";
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", eventVO.getEventName());
jsonObject.put("keyword", eventVO.getKeywordsVO().getKeyword());
String eventDescribe = llmService.model(null, prompt, jsonObject.toJSONString());
EventAnalysisVersionRecord record = EventAnalysisVersionRecord.of(versionId, AnalysisColumnEnum.CORE_SUMMARY, eventDescribe);
records.add(record);
}
//事件脉络
List<Map<String, Object>> eventContext = eventContextService.eventContext(eventId);
if (CollectionUtils.isNotEmpty(eventContext)) {
EventAnalysisVersionRecord record = EventAnalysisVersionRecord.of(versionId, AnalysisColumnEnum.EVENT_CONTEXT, JSON.toJSONString(eventContext));
records.add(record);
}
//关键词趋势分析
List<CountVO> wordTrend = this.wordTrend(eventId, null, null);
if (CollectionUtils.isNotEmpty(wordTrend)) {
EventAnalysisVersionRecord record = EventAnalysisVersionRecord.of(versionId, AnalysisColumnEnum.KEYWORD_TREND, JSON.toJSONString(wordTrend));
records.add(record);
}
//关键词共现关系
List<CoOccurrenceVO> coOccurrenceVOS = this.coOccurrence(eventId, null, null);
if (CollectionUtils.isNotEmpty(coOccurrenceVOS)) {
EventAnalysisVersionRecord record = EventAnalysisVersionRecord.of(versionId, AnalysisColumnEnum.CO_OCCURRENCE, JSON.toJSONString(coOccurrenceVOS));
records.add(record);
}
//todo 大模型相关逻辑
//影响评估
this.impactAssessment(eventId, null, null);
//举措建议
this.measureSuggest(eventId, null, null);
//知识词条
this.knowledgeEntry(eventId, null, null);
//企业案例
this.enterpriseCase(eventId, null, null);
//各国政策
this.countryPolicy(eventId, null, null);
//本国类似事件
this.domesticSimilarEvent(eventId, null, null);
//各国类似事件
this.foreignSimilarEvent(eventId, null, null);
//保存版本记录信息
eventAnalysisVersionRecordService.saveBatch(records);
}
private String saveVersion(String eventId, String time) {
EventAnalysisVersion version = new EventAnalysisVersion();
version.setEventId(eventId);
version.setVersionName("版本" + time);
eventAnalysisVersionService.save(version);
return version.getId();
}
//获取发布时间最早的前N条资讯(来源不重复)
private List<SubjectDataVo> topN(List<SubjectDataVo> list, Integer num) {
List<SubjectDataVo> collect = list.stream().filter(e -> StringUtils.isNotEmpty(e.getOrigin())).
......
package com.zzsn.event.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzsn.event.entity.EventAnalysisVersionRecord;
import com.zzsn.event.service.EventAnalysisVersionRecordService;
import com.zzsn.event.mapper.EventAnalysisVersionRecordMapper;
import org.springframework.stereotype.Service;
/**
* @author lenovo
* @description 针对表【event_analysis_version_record(事件分析版本记录表)】的数据库操作Service实现
* @createDate 2025-07-16 16:34:46
*/
@Service
public class EventAnalysisVersionRecordServiceImpl extends ServiceImpl<EventAnalysisVersionRecordMapper, EventAnalysisVersionRecord>
implements EventAnalysisVersionRecordService{
}
package com.zzsn.event.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzsn.event.entity.EventAnalysisVersion;
import com.zzsn.event.service.EventAnalysisVersionService;
import com.zzsn.event.mapper.EventAnalysisVersionMapper;
import org.springframework.stereotype.Service;
/**
* @author lenovo
* @description 针对表【event_analysis_version(事件分析版本表)】的数据库操作Service实现
* @createDate 2025-07-16 16:34:46
*/
@Service
public class EventAnalysisVersionServiceImpl extends ServiceImpl<EventAnalysisVersionMapper, EventAnalysisVersion>
implements EventAnalysisVersionService{
}
package com.zzsn.event.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzsn.event.entity.EventCollectMap;
import com.zzsn.event.service.EventCollectMapService;
import com.zzsn.event.mapper.EventCollectMapMapper;
import org.springframework.stereotype.Service;
/**
* @author lenovo
* @description 针对表【event_collect_map(用户关注事件关系表)】的数据库操作Service实现
* @createDate 2025-07-15 10:07:01
*/
@Service
public class EventCollectMapServiceImpl extends ServiceImpl<EventCollectMapMapper, EventCollectMap>
implements EventCollectMapService{
}
package com.zzsn.event.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzsn.event.entity.EventContext;
import com.zzsn.event.mapper.EventContextMapper;
import com.zzsn.event.service.EventContextService;
import com.zzsn.event.vo.EventContextModifyVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author lenovo
* @description 针对表【event_context(事件脉络表)】的数据库操作Service实现
* @createDate 2025-07-14 18:05:06
*/
@Service
public class EventContextServiceImpl extends ServiceImpl<EventContextMapper, EventContext> implements EventContextService{
@Override
public List<Map<String, Object>> eventContext(String eventId) {
List<Map<String, Object>> dataList = new ArrayList<>();
LambdaQueryWrapper<EventContext> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.orderByDesc(EventContext::getSortNumber);
List<EventContext> eventContexts = baseMapper.selectList(queryWrapper);
if (CollectionUtils.isNotEmpty(eventContexts)) {
List<EventContext> keyNodeList = eventContexts.stream().filter(eventContext -> eventContext.getYnKeyNode() == 1).collect(Collectors.toList());
for (EventContext eventContext : keyNodeList) {
Map<String,Object> map = new HashMap<>();
List<EventContext> childList = eventContexts.stream().filter(e -> e.getParentId().equals(eventContext.getId())).collect(Collectors.toList());
map.put("keyNode",eventContext);
map.put("dataList",childList);
map.put("count",childList.size());
dataList.add(map);
}
}
return dataList;
}
@Override
@Transactional
public void eventContextModify(EventContextModifyVO eventContextModifyVO) {
EventContext keyNode = eventContextModifyVO.getKeyNode();
String parentId = null;
String eventId = eventContextModifyVO.getEventId();
Integer maxSortNumber = this.getMaxSortNumber(eventId);
if (keyNode != null) {
String id = keyNode.getId();
if (StringUtils.isEmpty(id)) {
maxSortNumber = maxSortNumber + 1;
keyNode.setSortNumber(maxSortNumber);
keyNode.setParentId("0");
keyNode.setEventId(eventId);
baseMapper.insert(keyNode);
parentId = keyNode.getId();
} else {
baseMapper.updateById(keyNode);
}
}
List<EventContext> saveList = eventContextModifyVO.getSaveList();
if (CollectionUtils.isNotEmpty(saveList)) {
for (int i = 1; i <= saveList.size(); i++) {
EventContext eventContext = saveList.get(i);
if (parentId != null) {
eventContext.setParentId(parentId);
}
eventContext.setEventId(eventId);
eventContext.setSortNumber(maxSortNumber + i);
}
this.saveBatch(saveList);
}
List<EventContext> updateList = eventContextModifyVO.getUpdateList();
if (CollectionUtils.isNotEmpty(updateList)) {
this.updateBatchById(updateList);
}
}
@Override
public List<EventContext> keNodeList(String eventId) {
LambdaQueryWrapper<EventContext> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(EventContext::getEventId, eventId)
.eq(EventContext::getYnKeyNode, 1)
.orderByDesc(EventContext::getSortNumber);
return baseMapper.selectList(queryWrapper);
}
@Override
public Page<EventContext> contextArticleList(String eventId, String keyNodeId, Integer pageNo, Integer pageSize) {
Page<EventContext> page = new Page<>(pageNo, pageSize);
LambdaQueryWrapper<EventContext> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(EventContext::getEventId, eventId)
.eq(EventContext::getParentId, keyNodeId)
.orderByDesc(EventContext::getSortNumber);
return baseMapper.selectPage(page,queryWrapper);
}
@Override
public Integer getMaxSortNumber(String eventId) {
return baseMapper.getMaxSortNumber(eventId);
}
}
......@@ -294,7 +294,7 @@ public class ExcelExportUtil {
for (int i = 0; i < colData.size(); i++) {
cell = row.createCell(i, CellType.STRING);
cell.setCellStyle(titleStyle);
cell.setCellValue(new XSSFRichTextString(colData.get(i)));
cell.setCellValue(new HSSFRichTextString(colData.get(i)));
}
// 数据行
for (int m = 0; m < rows.size(); m++) {
......
package com.zzsn.event.vo;
import com.zzsn.event.entity.EventContext;
import lombok.Data;
import java.util.List;
/**
* 事件脉络编辑对象
*
* @author lkg
* @date 2025/7/15
*/
@Data
public class EventContextModifyVO {
//事件id
private String eventId;
//关键节点
private EventContext keyNode;
//新增集合
private List<EventContext> saveList;
//更换集合
private List<EventContext> updateList;
}
......@@ -33,6 +33,8 @@ public class EventVO {
private String publishDate;
/**事件描述*/
private String eventDescribe;
/**事件描述是否人工编辑(1-是;0-否)*/
private Integer ynManualEdit;
/**事件标签*/
private String eventLabel;
/**关联事件*/
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论