提交 c8199db9 作者: 925993793@qq.com

事件分析优化

上级 81fc0bfa
......@@ -7,7 +7,6 @@ import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.aspose.words.SaveFormat;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
......@@ -35,7 +34,10 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
......@@ -168,10 +170,6 @@ public class EventAnalysisController {
@GetMapping("/eventContext")
public Result<?> eventContext(@RequestParam String eventId,
@RequestParam(required = false) String versionId) {
//if (StringUtils.isNotEmpty(versionId)) {
// String versionData = eventAnalysisVersionRecordService.getVersionData(versionId, AnalysisColumnEnum.EVENT_CONTEXT.getCode());
// return Result.OK(JSON.parseArray(versionData,JSONObject.class));
//}
List<Map<String, Object>> versionData = eventContextService.eventContext(eventId);
return Result.OK(versionData);
}
......@@ -259,10 +257,6 @@ public class EventAnalysisController {
@RequestParam(required = false) String startTime,
@RequestParam(required = false) String endTime,
@RequestParam(required = false) String versionId) {
//if (StringUtils.isNotEmpty(versionId)) {
// String versionData = eventAnalysisVersionRecordService.getVersionData(versionId, AnalysisColumnEnum.KEYWORD_TREND.getCode());
// return Result.OK(JSON.parseArray(versionData,JSONObject.class));
//}
List<CountVO> versionData = analysisService.wordTrend(eventId, startTime, endTime);
return Result.OK(versionData);
}
......@@ -283,10 +277,6 @@ public class EventAnalysisController {
@RequestParam(required = false) String startTime,
@RequestParam(required = false) String endTime,
@RequestParam(required = false) String versionId) {
//if (StringUtils.isNotEmpty(versionId)) {
// String versionData = eventAnalysisVersionRecordService.getVersionData(versionId, AnalysisColumnEnum.CO_OCCURRENCE.getCode());
// return Result.OK(JSON.parseArray(versionData,JSONObject.class));
//}
//增加缓存逻辑,提升查询效率
String key = Constants.SUBJECT_ANALYSIS_PRE + Constants.CO_OCCURRENCE + eventId;
Object cacheObject = redisUtil.get(key);
......@@ -457,7 +447,6 @@ public class EventAnalysisController {
}
}
String versionData = eventAnalysisVersionRecordService.getVersionData(versionId, AnalysisColumnEnum.IMPACT_ASSESSMENT.getCode());
//String result = analysisService.llmResult(eventId, startTime, endTime, AnalysisColumnEnum.IMPACT_ASSESSMENT.getCode());
List<JSONObject> data = null;
try {
data = JSON.parseArray(versionData, JSONObject.class);
......@@ -488,7 +477,6 @@ public class EventAnalysisController {
}
}
String versionData = eventAnalysisVersionRecordService.getVersionData(versionId, AnalysisColumnEnum.DRIVING_FACTORS.getCode());
//String result = analysisService.llmResult(eventId, startTime, endTime, AnalysisColumnEnum.DRIVING_FACTORS.getCode());
JSONObject data = null;
try {
data = JSON.parseObject(versionData, JSONObject.class);
......@@ -519,7 +507,6 @@ public class EventAnalysisController {
}
}
String versionData = eventAnalysisVersionRecordService.getVersionData(versionId, AnalysisColumnEnum.RELATED_INDICATOR.getCode());
//String result = analysisService.llmResult(eventId, startTime, endTime, AnalysisColumnEnum.RELATED_INDICATOR.getCode());
List<JSONObject> data = null;
try {
data = JSON.parseArray(versionData, JSONObject.class);
......@@ -530,7 +517,7 @@ public class EventAnalysisController {
}
/**
* 举措建议
* 应对建议
*
* @param eventId 事件id
* @param startTime 开始时间
......@@ -550,7 +537,6 @@ public class EventAnalysisController {
}
}
String versionData = eventAnalysisVersionRecordService.getVersionData(versionId, AnalysisColumnEnum.MEASURE_SUGGEST.getCode());
//String result = analysisService.llmResult(eventId, startTime, endTime, AnalysisColumnEnum.MEASURE_SUGGEST.getCode());
List<JSONObject> data = null;
try {
data = JSON.parseArray(versionData, JSONObject.class);
......@@ -581,7 +567,6 @@ public class EventAnalysisController {
}
}
String versionData = eventAnalysisVersionRecordService.getVersionData(versionId, AnalysisColumnEnum.KNOWLEDGE_ENTRY.getCode());
//String result = analysisService.llmResult(eventId, startTime, endTime, AnalysisColumnEnum.KNOWLEDGE_ENTRY.getCode());
List<JSONObject> data = null;
try {
data = JSON.parseArray(versionData, JSONObject.class);
......@@ -600,6 +585,7 @@ public class EventAnalysisController {
* @author lkg
* @date 2024/4/12
*/
@Deprecated
@GetMapping("/enterpriseCase")
public Result<?> enterpriseCase(@RequestParam String eventId,
@RequestParam(required = false) String startTime,
......@@ -647,6 +633,57 @@ public class EventAnalysisController {
return Result.OK(JSON.parseArray(versionData,JSONObject.class));
}*/
/**
* 企业案例和类似事件
*
* @param eventId 事件id
* @param startTime 开始时间
* @param endTime 结束时间
* @param versionId 版本id
* @author lkg
* @date 2025/9/18
*/
@GetMapping("/caseAndSimilar")
public Result<?> caseAndSimilar(@RequestParam String eventId,
@RequestParam(required = false) String startTime,
@RequestParam(required = false) String endTime,
@RequestParam(required = false) String versionId) {
if (StringUtils.isEmpty(versionId)) {
EventAnalysisVersion eventAnalysisVersion = eventAnalysisVersionService.latestVersion(eventId);
if (eventAnalysisVersion != null) {
versionId = eventAnalysisVersion.getId();
}
}
List<Map<String, Object>> dataList = new ArrayList<>();
//企业案例
Map<String, Object> enterprise = new HashMap<>();
String enterpriseCase = eventAnalysisVersionRecordService.getVersionData(versionId, AnalysisColumnEnum.ENTERPRISE_CASE.getCode());
enterprise.put("type", AnalysisColumnEnum.ENTERPRISE_CASE.getName());
List<JSONObject> enterpriseCaseList = new ArrayList<>();
try {
enterpriseCaseList = JSON.parseArray(enterpriseCase, JSONObject.class);
} catch (Exception e) {
log.info("{}-事件分析【{}】返回结果数据解析异常", eventId, AnalysisColumnEnum.FOREIGN_SIMILAR_EVENT.getName());
}
enterprise.put("data", enterpriseCaseList);
dataList.add(enterprise);
//类似事件
Map<String, Object> foreign = new HashMap<>();
String foreignSimilarEvent = eventAnalysisVersionRecordService.getVersionData(versionId, AnalysisColumnEnum.FOREIGN_SIMILAR_EVENT.getCode());
foreign.put("type", AnalysisColumnEnum.FOREIGN_SIMILAR_EVENT.getName());
List<JSONObject> foreignSimilarEventList = new ArrayList<>();
try {
foreignSimilarEventList = JSON.parseArray(foreignSimilarEvent, JSONObject.class);
} catch (Exception e) {
log.info("{}-事件分析【{}】返回结果数据解析异常", eventId, AnalysisColumnEnum.FOREIGN_SIMILAR_EVENT.getName());
}
foreign.put("data", foreignSimilarEventList);
dataList.add(foreign);
return Result.OK(dataList);
}
/**
* 类似事件
*
......@@ -800,25 +837,16 @@ public class EventAnalysisController {
public void new_exportPdf(MultipartFile file, HttpServletResponse response) {
try {
InputStream inputStream = file.getInputStream();
BufferedOutputStream bos = null;
OutputStream outs = response.getOutputStream();
DocUtil.convertWordToPdf(inputStream, outs);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
OutputStream outs = response.getOutputStream();
bos = new BufferedOutputStream(outs);
DocUtil.convertWordToPdf(inputStream, bos);
response.flushBuffer();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bos != null) {
bos.flush();
bos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
......
package com.zzsn.event.controller.common;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.zzsn.event.constant.Result;
import com.zzsn.event.entity.Event;
import com.zzsn.event.entity.EventAnalysisVersionRecord;
import com.zzsn.event.entity.EventLlmConfig;
import com.zzsn.event.enums.AnalysisColumnEnum;
import com.zzsn.event.service.AnalysisService;
......@@ -10,12 +13,14 @@ import com.zzsn.event.service.EventLlmConfigService;
import com.zzsn.event.service.IEventService;
import com.zzsn.event.vo.EventLlmConfigModifyVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
* 大模型配置
......@@ -62,6 +67,7 @@ public class LLmConfigController {
llmConfigService.modifyBatch(eventLlmConfigList);
return Result.OK();
}
/**
* 编辑事件栏目的大模型配置信息,同时触发大模型更新结果
*
......@@ -79,20 +85,101 @@ public class LLmConfigController {
EventLlmConfig eventLlmConfig = new EventLlmConfig();
BeanUtils.copyProperties(eventLlmConfigModifyVO, eventLlmConfig);
llmConfigService.modifySingle(eventLlmConfig);
AnalysisColumnEnum analysisColumnEnum = AnalysisColumnEnum.getByCode(eventLlmConfig.getColumnCode());
Integer columnCode = eventLlmConfig.getColumnCode();
AnalysisColumnEnum analysisColumnEnum = AnalysisColumnEnum.getByCode(columnCode);
if (analysisColumnEnum != null) {
String eventId = eventLlmConfig.getEventId();
Event event = eventService.getById(eventId);
String eventName = event.getEventName();
String content = "事件标题;" + eventName + "\n事件摘要:" + event.getEventDescribe();
StringBuilder content = new StringBuilder("事件标题;" + eventName + "\n事件摘要:" + event.getEventDescribe());
if (StringUtils.isNotEmpty(event.getKeyIssue())) {
content.append("\n关心问题:").append(event.getKeyIssue());
}
//调用大模型更细结果
llmResult = analysisService.llmResult(eventId,content, null, null, eventLlmConfig.getColumnCode());
//应对建议需要把 驱动因素和影响评估作为输入
specialProcess(content, versionId, columnCode);
llmResult = analysisService.llmResult(eventId, content.toString(), null, null, columnCode);
log.info("{}-事件分析【{}】重新生成逻辑完成。", eventName, analysisColumnEnum.getName());
} else {
log.info("未找到对应的事件栏目【{}】", eventLlmConfig.getColumnCode());
log.info("未找到对应的事件栏目【{}】", columnCode);
}
//更新返回结果
eventAnalysisVersionRecordService.modify(versionId, analysisColumnEnum, llmResult);
return Result.OK(llmResult);
}
/**
* 特殊处理流程
* 应对建议需要把 驱动因素和影响评估作为输入
*
* @param content 输入内同
* @param versionId 版本id
* @param columnCode 栏目编码
* @author lkg
* @date 2025/9/17
*/
private void specialProcess(StringBuilder content, String versionId, Integer columnCode) {
if (!Objects.equals(columnCode, AnalysisColumnEnum.MEASURE_SUGGEST.getCode())) {
return;
}
List<EventAnalysisVersionRecord> versionDataList = eventAnalysisVersionRecordService.getVersionDataList(versionId, AnalysisColumnEnum.IMPACT_ASSESSMENT.getCode(), AnalysisColumnEnum.DRIVING_FACTORS.getCode());
if (CollectionUtils.isEmpty(versionDataList)) {
return;
}
for (EventAnalysisVersionRecord record : versionDataList) {
if (record.getColumnCode().equals(AnalysisColumnEnum.IMPACT_ASSESSMENT.getCode())) {
String str = parseImpactAssessment(record.getReturnData());
if (StringUtils.isEmpty(str)) {
continue;
}
content.append("\n影响评估:").append(str);
} else if (record.getColumnCode().equals(AnalysisColumnEnum.DRIVING_FACTORS.getCode())) {
String str = parseDrivingFactors(record.getReturnData());
if (StringUtils.isEmpty(str)) {
continue;
}
content.append("\n驱动因素:").append(str);
}
}
}
/**
* 作为应对建议的输入时,解析影响评估数据
*
* @param impactAssessment 影响评估数据
* @author lkg
* @date 2025/9/17
*/
private String parseImpactAssessment(String impactAssessment) {
String result = null;
try {
List<JSONObject> jsonObjects = JSON.parseArray(impactAssessment, JSONObject.class);
for (JSONObject jsonObject : jsonObjects) {
jsonObject.remove("impactDetail");
}
result = jsonObjects.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 作为应对建议的输入时,解析驱动因素数据
*
* @param drivingFactors 驱动因素数据
* @author lkg
* @date 2025/9/17
*/
private String parseDrivingFactors(String drivingFactors) {
String result = null;
try {
JSONObject jsonObject = JSONObject.parseObject(drivingFactors);
result = jsonObject.get("drivingFactor").toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
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.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 人物基本信息表
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("character_basic_info")
public class CharacterBasicInfo extends Model<CharacterBasicInfo> {
private static final long serialVersionUID = 1L;
//主键
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
//人物id
private String uid;
//人物名称
private String name;
//性别
private String sex;
//出生地
private String birthplace;
//出生日期
private String birthday;
//民族
private String nation;
//籍贯
private String nativePlace;
//毕业院校
private String school;
//专业
private String speciality;
//学历
private String education;
//职业
private String expertOccupation;
//头像
private String headSculpture;
//个人简历 简介
private String biographicalNotes;
//分类类型(1-领导人、2-专家、3-企业高管)
private String category;
//类别id 和左侧树进行关联
private String typeId;
//部门 单位 企业
private String department;
//职务
private String duty;
//部门 单位 企业(原)
private String departmentOriginal;
//职务(原)
private String dutyOriginal;
//任职时间
private String takeOfficeTime;
//任职结束时间
private String takeOfficeTimeEnd;
//任职状态 历任 现任
private String takeOfficeStatus;
//变更描述
private String updateDesc;
//关联资讯索引名称
private String articleIndex;
//关联资讯id
private String articleId;
//资讯标题
private String articleTitle;
//资讯来源
private String articleOrigin;
//关联资讯抽取表id
private String extractId;
//标签id
private String tagId;
//标签名称
private String tagName;
//统一社会信用代码
private String socialCreditCode;
//排序
private Integer sort;
//是否主条目(1-主条目;0-非主条目)
private Integer mainEntry;
//顶尖专家/领军专家
private String expertType;
//研究领域
private String researchField;
//已选入的人才计划
private String talentPlanning;
//专业技术职称
private String technicalTitles;
//专业技术职称取得时间
private String technicalDate;
//参加工作时间
private String workDate;
//毕业专业
private String schoolSpeciality;
//所在部门
private String depart;
//创建人
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;
//启停状态 1启 0停
private Long status;
}
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_expert_map
*/
@Data
@TableName("event_expert_map")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EventExpertMap implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.ASSIGN_ID)
private String id;
/**
* 专家id
*/
private String expertId;
/**
* 事件id
*/
private String eventId;
/**
* 资讯id
*/
private String articleId;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
}
......@@ -56,10 +56,18 @@ public class EventLlmConfig implements Serializable {
*/
private String articleCondition;
/**
* 状态(1-启用;0-禁用)
*/
private Integer status;
/**
* 是否默认(1-是;0-否)
*/
private Integer ynDefault;
/**
* 排序号
*/
private Integer sortNum;
/**
* 创建人
*/
private String createBy;
......
......@@ -25,15 +25,15 @@ public enum AnalysisColumnEnum {
KNOWLEDGE_ENTRY(7, "知识词条", "array", 1),
ENTERPRISE_CASE(8, "企业措施", "array", 1),
ENTERPRISE_CASE(8, "企业案例", "array", 1),
//COUNTRY_POLICY(9, "各国政策", "array", 1),
COUNTRY_POLICY(9, "各国政策", "array", 1),
DOMESTIC_SIMILAR_EVENT(10, "中国类似事件", "array", 1),
FOREIGN_SIMILAR_EVENT(11, "各国类似事件", "array", 1),
FOREIGN_SIMILAR_EVENT(11, "类似事件", "array", 1),
DRIVING_FACTORS(12, "事件核心驱动因素", "object", 1),
DRIVING_FACTORS(12, "驱动因素分析", "object", 1),
RELATED_INDICATOR(13, "事件相关指标", "array", 1),
......
......@@ -2193,6 +2193,7 @@ public class EsService {
dateHistogramAggregationBuilder.calendarInterval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
break;
case "week":
//分组后,key为当前周周一的日期
dateHistogramAggregationBuilder.calendarInterval(DateHistogramInterval.WEEK).format("yyyy-MM-dd");
break;
case "month":
......
package com.zzsn.event.kafka;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.zzsn.event.entity.CharacterBasicInfo;
import com.zzsn.event.entity.EventContext;
import com.zzsn.event.entity.EventExpertMap;
import com.zzsn.event.service.CharacterBasicInfoService;
import com.zzsn.event.service.EventContextService;
import com.zzsn.event.service.EventExpertMapService;
import com.zzsn.event.util.CodeGenerateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
......@@ -27,6 +33,12 @@ import java.util.List;
public class KafkaConsumer {
@Autowired
private EventContextService eventContextService;
@Autowired
private CharacterBasicInfoService charBasicInfoService;
@Autowired
private CodeGenerateUtil codeGenerateUtil;
@Autowired
private EventExpertMapService eventExpertMapService;
/**
* 获取-事件脉络-分析结果数据,并入库
......@@ -84,6 +96,57 @@ public class KafkaConsumer {
eventContextService.saveBatch(saveList);
}
}
log.info("事件-{},本次事件脉络更新完成",eventContextKafkaList.get(0).getEventId());
log.info("事件-{},本次事件脉络更新完成", eventContextKafkaList.get(0).getEventId());
}
/**
* 事件-专家数据
*
* @param record 接收的kafka数据
* @author lkg
* @date 2025/9/16
*/
@KafkaListener(topics = {"${kafka.topic.eventExpert}"})
public void eventExpert(ConsumerRecord<String, String> record) {
String value = record.value();
if (StringUtils.isEmpty(value)) {
return;
}
JSONObject jsonObject = JSONObject.parseObject(value);
List<CharacterBasicInfo> eventExpertList = JSON.parseArray(jsonObject.getString("expertList"), CharacterBasicInfo.class);
if (CollectionUtils.isEmpty(eventExpertList)) {
return;
}
for (CharacterBasicInfo characterBasicInfo : eventExpertList) {
if (StringUtils.isNotEmpty(characterBasicInfo.getId())) {
characterBasicInfo = charBasicInfoService.getById(characterBasicInfo.getId());
characterBasicInfo.setId(null);
characterBasicInfo.setCreateTime(null);
characterBasicInfo.setUpdateTime(null);
} else {
characterBasicInfo = new CharacterBasicInfo();
characterBasicInfo.setUid(codeGenerateUtil.geneCharacterUid());
}
characterBasicInfo.setCategory("2");
characterBasicInfo.setTypeId("1966316982441611266");
LambdaQueryWrapper<CharacterBasicInfo> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(CharacterBasicInfo::getName, characterBasicInfo.getName())
.eq(CharacterBasicInfo::getDepartment, characterBasicInfo.getDepartment())
.eq(CharacterBasicInfo::getCategory, "2")
.eq(CharacterBasicInfo::getTypeId, "1966316982441611266");
CharacterBasicInfo one = charBasicInfoService.getOne(queryWrapper);
String expertId;
if (one == null) {
charBasicInfoService.save(characterBasicInfo);
expertId = characterBasicInfo.getId();
} else {
expertId = one.getId();
}
EventExpertMap eventExpertMap = new EventExpertMap();
eventExpertMap.setExpertId(expertId);
eventExpertMap.setEventId(jsonObject.getString("eventId"));
eventExpertMap.setArticleId(jsonObject.getString("articleId"));
eventExpertMapService.save(eventExpertMap);
}
}
}
package com.zzsn.event.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zzsn.event.entity.CharacterBasicInfo;
import org.apache.ibatis.annotations.Mapper;
/**
* @Version 1.0
* @Author: ZhangJingKun
* @Date: 2024/2/29 10:36
* @Content:
*/
@Mapper
public interface CharacterBasicInfoMapper extends BaseMapper<CharacterBasicInfo> {
}
package com.zzsn.event.mapper;
import com.zzsn.event.entity.EventExpertMap;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author lenovo
* @description 针对表【event_expert_map(事件-专家关系表)】的数据库操作Mapper
* @createDate 2025-09-15 18:08:37
* @Entity com.zzsn.event.entity.EventExpertMap
*/
@Mapper
public interface EventExpertMapMapper extends BaseMapper<EventExpertMap> {
}
......@@ -83,14 +83,15 @@ public interface AnalysisService {
/**
* 利用大模型生成的结果
*
* @param event 事件信息
* @param startTime 开始时间
* @param endTime 结束时间
* @param llmConfig 模型配置信息
* @param event 事件信息
* @param startTime 开始时间
* @param endTime 结束时间
* @param llmConfig 模型配置信息
* @param extraContentParams 额外输入参数(重新生成且为应对建议栏目时,会用到)
* @author lkg
* @date 2025/7/17
*/
String llmResult(EventVO event, String content, String startTime, String endTime, EventLlmConfig llmConfig);
String llmResult(EventVO event, String content, String startTime, String endTime, EventLlmConfig llmConfig, Map<Integer, String> extraContentParams);
String llmResult(String eventId, String content, String startTime, String endTime, Integer columnCode);
......@@ -101,16 +102,16 @@ public interface AnalysisService {
* @author lkg
* @date 2025/7/7
*/
void regenerate(String eventId,String versionId);
void regenerate(String eventId, String versionId);
/**
* 导出ppt
*
* @param eventId 事件id
* @param eventId 事件id
* @param versionId 版本id
* @param content 导出内容
* @param content 导出内容
* @author lkg
* @date 2025/7/19
*/
String exportPPT(String eventId,String versionId, JSONArray content);
String exportPPT(String eventId, String versionId, JSONArray content);
}
package com.zzsn.event.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zzsn.event.entity.CharacterBasicInfo;
/**
* @Version 1.0
* @Author: ZhangJingKun
* @Date: 2024/2/29 10:35
* @Content:
*/
public interface CharacterBasicInfoService extends IService<CharacterBasicInfo> {
}
......@@ -4,6 +4,8 @@ import com.zzsn.event.entity.EventAnalysisVersionRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zzsn.event.enums.AnalysisColumnEnum;
import java.util.List;
/**
* @author lenovo
* @description 针对表【event_analysis_version_record(事件分析版本记录表)】的数据库操作Service
......@@ -12,7 +14,7 @@ import com.zzsn.event.enums.AnalysisColumnEnum;
public interface EventAnalysisVersionRecordService extends IService<EventAnalysisVersionRecord> {
/**
* 获取版本下的数据
* 获取版本下某栏目的数据
*
* @param versionId 版本id
* @param columnCode 栏目编码
......@@ -32,4 +34,13 @@ public interface EventAnalysisVersionRecordService extends IService<EventAnalysi
*/
void modify(String versionId, AnalysisColumnEnum analysisColumnEnum, String data);
/**
* 获取版本下某些栏目的数据集合
*
* @param versionId 版本id
* @param columnCodes 栏目编码
* @author lkg
* @date 2025/8/19
*/
List<EventAnalysisVersionRecord> getVersionDataList(String versionId, Integer... columnCodes);
}
package com.zzsn.event.service;
import com.zzsn.event.entity.EventExpertMap;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author lenovo
* @description 针对表【event_expert_map(事件-专家关系表)】的数据库操作Service
* @createDate 2025-09-15 18:08:37
*/
public interface EventExpertMapService extends IService<EventExpertMap> {
}
......@@ -29,6 +29,7 @@ public interface SubjectService extends IService<Subject> {
* @author lkg
* @date 2024/12/18
*/
@Deprecated
Page<SubjectPage> pageList(SubjectCondition subjectCondition, Integer pageNo, Integer pageSize);
/**
......
......@@ -308,7 +308,7 @@ public class AnalysisServiceImpl implements AnalysisService {
}
@Override
public String llmResult(EventVO event,String content, String startTime, String endTime, EventLlmConfig llmConfig) {
public String llmResult(EventVO event,String content, String startTime, String endTime, EventLlmConfig llmConfig,Map<Integer,String> extraContentParams) {
if (llmConfig == null) {
return null;
}
......@@ -333,6 +333,11 @@ public class AnalysisServiceImpl implements AnalysisService {
}
}
result = result.replaceAll("```json", "").replaceAll("```","");
if (extraContentParams != null
&& (llmConfig.getColumnCode().equals(AnalysisColumnEnum.IMPACT_ASSESSMENT.getCode())
|| llmConfig.getColumnCode().equals(AnalysisColumnEnum.DRIVING_FACTORS.getCode()))) {
extraContentParams.put(llmConfig.getColumnCode(),result);
}
if (llmConfig.getColumnCode().equals(AnalysisColumnEnum.IMPACT_ASSESSMENT.getCode())) {
EventLlmConfig detailConfig = eventLlmConfigService.getConfig(event.getId(), AnalysisColumnEnum.IMPACT_ASSESSMENT_DETAIL.getCode());
List<JSONObject> impactList = JSON.parseArray(result, JSONObject.class);
......@@ -341,6 +346,9 @@ public class AnalysisServiceImpl implements AnalysisService {
JSONObject params = new JSONObject();
params.put("eventName", event.getEventName());
params.put("eventSummary", event.getEventDescribe());
if (StringUtils.isNotEmpty(event.getKeyIssue())) {
params.put("keyIssue", event.getKeyIssue());
}
params.put("impactOutline", impact);
String impactDetail = llmService.model(detailConfig.getLlmName(),null, detailConfig.getLlmPrompt(), params.toJSONString());
impact.put("impactDetail", impactDetail);
......@@ -362,7 +370,7 @@ public class AnalysisServiceImpl implements AnalysisService {
public String llmResult(String eventId,String content, String startTime, String endTime, Integer columnCode) {
EventVO event = eventService.queryInfo(eventId);
EventLlmConfig llmConfig = eventLlmConfigService.getConfig(eventId, columnCode);
return llmResult(event,content, startTime, endTime, llmConfig);
return llmResult(event,content, startTime, endTime, llmConfig,null);
}
@Override
......@@ -379,9 +387,7 @@ public class AnalysisServiceImpl implements AnalysisService {
int attempts = 0;
do {
String finalVersionId = versionId;
Thread thread = new Thread(() -> {
generate(event, finalVersionId, configList);
});
Thread thread = new Thread(() -> generate(event, finalVersionId, configList));
thread.start();
try {
Thread.sleep(1000 * 30);
......@@ -416,11 +422,17 @@ public class AnalysisServiceImpl implements AnalysisService {
} else {
contentTimePart += endTime;
}
String content = "事件标题;" + eventName + "\n采集关键词:" + event.getKeywordsVO().getKeyword() + contentTimePart;
String content = "事件标题;" + eventName + "\n采集关键词:" + event.getKeywordsVO().getKeyword();
if (StringUtils.isEmpty(event.getKeyIssue())) {
content += contentTimePart;
} else {
content += "\n关心问题:" + event.getKeyIssue() + contentTimePart;
}
//历史核心摘要是否为空
boolean empty = StringUtils.isEmpty(eventDescribe);
EventLlmConfig config = configList.stream().filter(e -> e.getColumnCode().equals(AnalysisColumnEnum.CORE_SUMMARY.getCode())).findFirst().orElse(new EventLlmConfig());
eventDescribe = this.llmResult(event,content, null, null, config);
eventDescribe = this.llmResult(event,content, null, null, config,null);
if (empty) {
event.setEventDescribe(eventDescribe);
LambdaUpdateWrapper<Event> update = Wrappers.lambdaUpdate();
......@@ -436,13 +448,29 @@ public class AnalysisServiceImpl implements AnalysisService {
&& !e.getColumnCode().equals(AnalysisColumnEnum.IMPACT_ASSESSMENT_DETAIL.getCode()))
.collect(Collectors.toList());
String content = "事件标题;" + eventName + "\n事件摘要:" + event.getEventDescribe();
if (StringUtils.isNotEmpty(event.getKeyIssue())) {
content += "\n关心问题:" + event.getKeyIssue();
}
//额外的输入参数
Map<Integer,String> extraContentParams = new HashMap<>();
for (EventLlmConfig config : collect) {
try {
AnalysisColumnEnum analysisColumnEnum = AnalysisColumnEnum.getByCode(config.getColumnCode());
if (analysisColumnEnum != null) {
String llmResult = this.llmResult(event,content, null, null, config);
eventAnalysisVersionRecordService.modify(versionId, analysisColumnEnum, llmResult);
Integer columnCode = config.getColumnCode();
AnalysisColumnEnum analysisColumnEnum = AnalysisColumnEnum.getByCode(columnCode);
if (analysisColumnEnum == null) {
continue;
}
//应对建议需要把 驱动因素和影响评估作为输入
if (Objects.equals(columnCode, AnalysisColumnEnum.MEASURE_SUGGEST.getCode())) {
if (extraContentParams.containsKey(AnalysisColumnEnum.IMPACT_ASSESSMENT.getCode())) {
content += "\n影响评估:" + extraContentParams.get(AnalysisColumnEnum.IMPACT_ASSESSMENT.getCode());
}
if (extraContentParams.containsKey(AnalysisColumnEnum.DRIVING_FACTORS.getCode())) {
content += "\n驱动因素:" + extraContentParams.get(AnalysisColumnEnum.DRIVING_FACTORS.getCode());
}
}
String llmResult = this.llmResult(event,content, null, null, config,extraContentParams);
eventAnalysisVersionRecordService.modify(versionId, analysisColumnEnum, llmResult);
log.info("{}-事件分析【{}】重新生成逻辑完成。", eventName, config.getColumnName());
} catch (Exception e) {
e.printStackTrace();
......
package com.zzsn.event.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzsn.event.entity.CharacterBasicInfo;
import com.zzsn.event.mapper.CharacterBasicInfoMapper;
import com.zzsn.event.service.CharacterBasicInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @Version 1.0
* @Author: ZhangJingKun
* @Date: 2024/2/29 10:35
* @Content: 人物基本信息
*/
@Slf4j
@Service
public class CharacterBasicInfoServiceImpl extends ServiceImpl<CharacterBasicInfoMapper, CharacterBasicInfo> implements CharacterBasicInfoService {
}
......@@ -7,16 +7,22 @@ import com.zzsn.event.entity.EventAnalysisVersionRecord;
import com.zzsn.event.enums.AnalysisColumnEnum;
import com.zzsn.event.service.EventAnalysisVersionRecordService;
import com.zzsn.event.mapper.EventAnalysisVersionRecordMapper;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author lenovo
* @description 针对表【event_analysis_version_record(事件分析版本记录表)】的数据库操作Service实现
* @createDate 2025-07-16 16:34:46
*/
* @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{
implements EventAnalysisVersionRecordService {
@Override
public String getVersionData(String versionId, Integer columnCode) {
......@@ -44,6 +50,14 @@ public class EventAnalysisVersionRecordServiceImpl extends ServiceImpl<EventAnal
this.save(versionRecord);
}
}
@Override
public List<EventAnalysisVersionRecord> getVersionDataList(String versionId, Integer... columnCodes) {
LambdaQueryWrapper<EventAnalysisVersionRecord> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(EventAnalysisVersionRecord::getVersionId, versionId)
.in(EventAnalysisVersionRecord::getColumnCode, (Object) columnCodes);
return this.list(queryWrapper);
}
}
......
package com.zzsn.event.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzsn.event.entity.EventExpertMap;
import com.zzsn.event.service.EventExpertMapService;
import com.zzsn.event.mapper.EventExpertMapMapper;
import org.springframework.stereotype.Service;
/**
* @author lenovo
* @description 针对表【event_expert_map(事件-专家关系表)】的数据库操作Service实现
* @createDate 2025-09-15 18:08:37
*/
@Service
public class EventExpertMapServiceImpl extends ServiceImpl<EventExpertMapMapper, EventExpertMap> implements EventExpertMapService{
}
......@@ -12,8 +12,10 @@ import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
......@@ -27,11 +29,13 @@ public class EventLlmConfigServiceImpl extends ServiceImpl<EventLlmConfigMapper,
@Override
public List<EventLlmConfig> getConfigList(String eventId) {
LambdaQueryWrapper<EventLlmConfig> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(EventLlmConfig::getEventId, eventId).orderByAsc(EventLlmConfig::getColumnCode);
queryWrapper.eq(EventLlmConfig::getEventId, eventId).eq(EventLlmConfig::getStatus, 1)
.orderByAsc(EventLlmConfig::getSortNum);
List<EventLlmConfig> configList = this.list(queryWrapper);
if (CollectionUtils.isEmpty(configList)) {
LambdaQueryWrapper<EventLlmConfig> query = Wrappers.lambdaQuery();
query.eq(EventLlmConfig::getYnDefault, 1).orderByAsc(EventLlmConfig::getColumnCode);
query.eq(EventLlmConfig::getYnDefault, 1).eq(EventLlmConfig::getStatus, 1)
.orderByAsc(EventLlmConfig::getSortNum);
configList = this.list(query);
}
return configList;
......@@ -40,11 +44,13 @@ public class EventLlmConfigServiceImpl extends ServiceImpl<EventLlmConfigMapper,
@Override
public EventLlmConfig getConfig(String eventId, Integer columnCode) {
LambdaQueryWrapper<EventLlmConfig> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(EventLlmConfig::getEventId, eventId).eq(EventLlmConfig::getColumnCode, columnCode);
queryWrapper.eq(EventLlmConfig::getEventId, eventId).eq(EventLlmConfig::getColumnCode, columnCode)
.eq(EventLlmConfig::getStatus, 1);
EventLlmConfig config = this.getOne(queryWrapper);
if (ObjectUtils.isNull(config)) {
LambdaQueryWrapper<EventLlmConfig> query = Wrappers.lambdaQuery();
query.eq(EventLlmConfig::getYnDefault, 1).eq(EventLlmConfig::getColumnCode, columnCode);
query.eq(EventLlmConfig::getYnDefault, 1).eq(EventLlmConfig::getColumnCode, columnCode)
.eq(EventLlmConfig::getStatus, 1);
config = this.getOne(query);
}
return config;
......@@ -58,15 +64,16 @@ public class EventLlmConfigServiceImpl extends ServiceImpl<EventLlmConfigMapper,
}
String eventId = eventLlmConfigList.get(0).getEventId();
LambdaQueryWrapper<EventLlmConfig> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(EventLlmConfig::getEventId, eventId);
queryWrapper.eq(EventLlmConfig::getEventId, eventId).eq(EventLlmConfig::getStatus, 1);
List<EventLlmConfig> configList = this.list(queryWrapper);
if (CollectionUtils.isEmpty(configList)) {
List<Integer> configCodeList = eventLlmConfigList.stream().map(EventLlmConfig::getColumnCode).collect(Collectors.toList());
LambdaQueryWrapper<EventLlmConfig> query = Wrappers.lambdaQuery();
query.eq(EventLlmConfig::getYnDefault, 1).orderByAsc(EventLlmConfig::getColumnCode);
query.eq(EventLlmConfig::getYnDefault, 1).eq(EventLlmConfig::getStatus, 1).orderByAsc(EventLlmConfig::getSortNum);
List<EventLlmConfig> defaultConfigList = this.list(query);
if (defaultConfigList.size() > eventLlmConfigList.size()) {
List<EventLlmConfig> collect = defaultConfigList.stream().filter(config -> !configCodeList.contains(config.getColumnCode())).collect(Collectors.toList());
List<EventLlmConfig> collect = defaultConfigList.stream()
.filter(config -> !configCodeList.contains(config.getColumnCode())).collect(Collectors.toList());
for (EventLlmConfig config : collect) {
config.setId(null);
config.setEventId(eventId);
......@@ -87,14 +94,17 @@ public class EventLlmConfigServiceImpl extends ServiceImpl<EventLlmConfigMapper,
@Override
public void modifySingle(EventLlmConfig eventLlmConfig) {
String eventId = eventLlmConfig.getEventId();
//事件自定义的配置
LambdaQueryWrapper<EventLlmConfig> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(EventLlmConfig::getEventId, eventId);
queryWrapper.eq(EventLlmConfig::getEventId, eventId).eq(EventLlmConfig::getStatus, 1);
List<EventLlmConfig> configList = this.list(queryWrapper);
if (CollectionUtils.isEmpty(configList)) {
//默认配置
LambdaQueryWrapper<EventLlmConfig> query = Wrappers.lambdaQuery();
query.eq(EventLlmConfig::getYnDefault, 1).orderByAsc(EventLlmConfig::getColumnCode);
query.eq(EventLlmConfig::getYnDefault, 1).eq(EventLlmConfig::getStatus, 1).orderByAsc(EventLlmConfig::getSortNum);
List<EventLlmConfig> defaultConfigList = this.list(query);
List<EventLlmConfig> collect = defaultConfigList.stream().filter(config -> !eventLlmConfig.getColumnCode().equals(config.getColumnCode())).collect(Collectors.toList());
List<EventLlmConfig> collect = defaultConfigList.stream()
.filter(config -> !eventLlmConfig.getColumnCode().equals(config.getColumnCode())).collect(Collectors.toList());
for (EventLlmConfig config : collect) {
config.setId(null);
config.setEventId(eventId);
......@@ -102,7 +112,7 @@ public class EventLlmConfigServiceImpl extends ServiceImpl<EventLlmConfigMapper,
}
eventLlmConfig.setYnDefault(0);
collect.add(eventLlmConfig);
collect.sort(Comparator.comparingInt(EventLlmConfig::getColumnCode));
collect.sort(Comparator.comparingInt(EventLlmConfig::getSortNum));
this.saveBatch(collect);
} else {
LambdaUpdateWrapper<EventLlmConfig> update = Wrappers.lambdaUpdate();
......
......@@ -41,6 +41,25 @@ public class CodeGenerateUtil {
}
/**
* 生成人物唯一编码
*
* @author lkg
* @date 2025/9/15
*/
public String geneCharacterUid(){
String redisKey = getRedisKey("LEADER_UID:");
Date expireDate = getExpireDate();
//返回当前redis中的key的最大值
long seq = generate(stringRedisTemplate, redisKey, expireDate);
//获取当天的日期,格式为yyyyMMdd
String date = new SimpleDateFormat("yyyyMMdd").format(expireDate);
//生成八位的序列号,如果seq不够四位,seq前面补0,
//如果seq位数超过了八位,那么无需补0直接返回当前的seq
String sequence = StringUtils.leftPad(Long.toString(seq), 8, "0");
return "U"+date.substring(2)+sequence;
}
/**
* 生成统一社会信用代码
* @param prefix 前缀
* @return java.lang.String
......
......@@ -3,12 +3,14 @@ package com.zzsn.event.util;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.zzsn.event.vo.es.SpecialInformation;
import com.zzsn.event.vo.log.Source;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
......@@ -30,6 +32,8 @@ public class PythonUtil {
private String judgeDuplicateUrl;
@Value("${python.clearDuplicateHistoryUrl:}")
private String clearDuplicateHistoryUrl;
@Value("${python.enterpriseCaseFilterUrl:}")
private String enterpriseCaseFilterUrl;
/**
* 提取关键词
......@@ -126,4 +130,40 @@ public class PythonUtil {
e.printStackTrace();
}
}
/**
* 企业案例资讯过滤
*
* @param infoList 企业资讯
* @author lkg
* @date 2025/9/18
*/
public List<SpecialInformation> enterpriseCaseFilter(List<SpecialInformation> infoList) {
List<SpecialInformation> resultList = new ArrayList<>();
JSONObject params = new JSONObject();
Map<String,Object> dataMap = new HashMap<>();
List<JSONObject> dataList = new ArrayList<>();
for (SpecialInformation specialInformation : infoList) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("id",specialInformation.getId());
jsonObject.put("title",specialInformation.getTitle());
jsonObject.put("content",specialInformation.getContent());
jsonObject.put("origin",specialInformation.getOrigin());
dataList.add(jsonObject);
}
dataMap.put("data_list",dataList);
params.put("data",dataMap);
try {
String response = HttpUtil.doPost(enterpriseCaseFilterUrl, params, 300000);
JSONObject jsonObject = JSONObject.parseObject(response);
String isHandleSuccess = jsonObject.getString("isHandleSuccess");
if (isHandleSuccess.equals("true")) {
String resultData = jsonObject.getString("resultData");
resultList = JSON.parseArray(resultData, SpecialInformation.class);
}
} catch (IOException e) {
e.printStackTrace();
}
return resultList;
}
}
......@@ -150,6 +150,8 @@ python:
keyWordsExtractUrl: http://1.95.91.200:7006/get_phrase/
#清空去重服务历史数据
clearDuplicateHistoryUrl: http://1.95.13.40:8080/subject/delete_history_data
#企业案例资讯过滤
enterpriseCaseFilterUrl: http://1.95.86.189:4014/predict_case
jeecg:
shiro:
excludeUrls: /info/subjectPageListGroupByLabel,/subject/simple/queryInfoNoSign,/subject/manage/visiblePageListNoSign
......@@ -159,6 +161,7 @@ kafka:
subject:
run: subjectModelTest
eventContext: eventContexTopic
eventExpert: eventExpertTopic
clb:
subject:
default:
......
......@@ -152,6 +152,8 @@ python:
keyWordsExtractUrl: http://1.95.91.200:7006/get_phrase/
#清空去重服务历史数据
clearDuplicateHistoryUrl: http://1.95.13.40:8080/subject/delete_history_data
#企业案例资讯过滤
enterpriseCaseFilterUrl: http://1.95.86.189:4014/predict_case
hot-crawler: http://139.9.144.106:5000/data?option=OPTION
jeecg:
shiro:
......@@ -163,6 +165,7 @@ kafka:
event:
run: eventSubjectModelTest
eventContext: eventContexTopicTest
eventExpert: eventExpertTopicTest
clb:
subject:
default:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论