问题汇总逻辑

This commit is contained in:
jie.lu
2025-07-24 11:03:34 +08:00
parent bf9fac4f0d
commit 7c341657e1
8 changed files with 270 additions and 0 deletions

View File

@@ -0,0 +1,44 @@
package com.volvo.ai.analytic.center.job;
import com.volvo.ai.analytic.center.service.UserQuestionSummaryService;
import com.volvo.common.core.util.ResultMsg;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Component
@RestController
public class UserQuestionSummaryJob {
@Autowired
private UserQuestionSummaryService userQuestionSummaryService;
/**
* 企微语料处理
*/
@XxlJob("userQuestionSummaryTask")
public ResultMsg userQuestionSummaryTask(@RequestBody String paramJson) {
try {
// 获取任务参数
String param = XxlJobHelper.getJobParam();
if(StringUtils.isEmpty(param)){
param = paramJson;
}
// 执行业务逻辑
XxlJobHelper.log("任务参数: {}", param);
log.info("userQuestionSummaryTask 用户问题总结处理:{}",param);
userQuestionSummaryService.runUserQuestionSummary(param);
} catch (Exception e) {
log.error("userQuestionSummaryTask 定时任务处理消息异常",e.getMessage());
throw new RuntimeException(e);
}
return ResultMsg.ok();
}
}

View File

@@ -1,13 +1,21 @@
package com.volvo.ai.analytic.center.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.volvo.ai.analytic.center.dto.corpus.ImCurMessageDTO;
import com.volvo.ai.analytic.center.entity.TmCorpusQuestionReport;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 单条语料分析结论
*/
@Mapper
public interface TmCorpusQuestionReportMapper extends BaseMapper<TmCorpusQuestionReport> {
List<ImCurMessageDTO> queryQuestionReportList(@Param("statTime") Date statTime, @Param("endTime") Date endTime, @Param("mainCategory") String mainCategory);
}

View File

@@ -0,0 +1,15 @@
package com.volvo.ai.analytic.center.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.volvo.ai.analytic.center.entity.TmCorpusQuestionSummaryReport;
/**
* @description 用户问题总结
* @author lujie
* @date 2025-07-23
*/
public interface UserQuestionSummaryService extends IService<TmCorpusQuestionSummaryReport> {
void runUserQuestionSummary(String paramJson);
}

View File

@@ -0,0 +1,141 @@
package com.volvo.ai.analytic.center.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.volvo.ai.analytic.center.dto.corpus.ImCurMessageDTO;
import com.volvo.ai.analytic.center.dto.req.DiFyReq;
import com.volvo.ai.analytic.center.entity.*;
import com.volvo.ai.analytic.center.enums.QuestionMainCategoryEnum;
import com.volvo.ai.analytic.center.mapper.TmCorpusQuestionReportMapper;
import com.volvo.ai.analytic.center.mapper.TmCorpusQuestionSummaryReportMapper;
import com.volvo.ai.analytic.center.service.*;
import com.volvo.ai.analytic.center.utils.ConstantStr;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @description 用户问题汇总
* @author jlu
* @date 2025-07-17
*/
@RefreshScope
@Slf4j
@Service
public class UserQuestionSummaryServiceImpl extends ServiceImpl<TmCorpusQuestionSummaryReportMapper, TmCorpusQuestionSummaryReport> implements UserQuestionSummaryService {
@Autowired
private TmCorpusQuestionSummaryReportMapper tmCorpusQuestionSummaryReportMapper;
@Autowired
private TmCorpusQuestionReportMapper tmCorpusQuestionReportMapper;
@Autowired
private DiFyService diFyService;
@Value("${dify.corpus.reportSummaryToken}")
private String reportSummaryToken;
@Override
public void runUserQuestionSummary(String paramJson) {
long startTime = System.currentTimeMillis();
log.info("runUserQuestionSummary paramJson {}", paramJson);
// 获取当前日期
LocalDate today = LocalDate.now();
// 获取前一天日期
LocalDate yesterday = today.minusDays(1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 格式化输出
String formattedDate = yesterday.toString(); // 默认格式为 yyyy-MM-dd
String statTimeString = formattedDate.concat(" 00:00:00");
String endTimeString = formattedDate.concat(" 23:59:59");
if (StringUtils.isNotBlank(paramJson)) {
JSONObject paramJsonObj = JSONObject.parseObject(paramJson);
if (null != paramJsonObj && paramJsonObj.containsKey("statTime") && paramJsonObj.containsKey("endTime")) {
statTimeString = paramJsonObj.getString("statTime");
endTimeString = paramJsonObj.getString("endTime");
}
}
Date statTime = stringTimeToDate(statTimeString, formatter);
Date endTime = stringTimeToDate(endTimeString, formatter);
for (QuestionMainCategoryEnum enumValue : QuestionMainCategoryEnum.values()) {
String mainCategoryString = enumValue.getMessage();
try {
processItem(statTime, endTime, mainCategoryString);
} catch (Exception e) {
log.error("处理问题汇总失败: 异常: {}", e.getMessage(), e);
}
}
log.info("处理问题结束 耗时:{}",System.currentTimeMillis()-startTime);
}
private void processItem(Date statTime, Date endTime, String mainCategoryString) {
log.info("用户问题总结处理mainCategory{}", mainCategoryString);
// 获取分析结果信息
List<ImCurMessageDTO> resultList = tmCorpusQuestionReportMapper.queryQuestionReportList(statTime, endTime, mainCategoryString);
if (resultList == null || resultList.isEmpty()) {
return;
}
// 组装语料信息
StringBuffer demandList = new StringBuffer();
resultList.forEach(contentItem -> {
if (StringUtils.isNotBlank(contentItem.getUserDemand())) {
demandList.append(contentItem.getUserDemand()).append("\n");
}
});
Map<String, Object> inputMap = new HashMap<>();
inputMap.put("chat", demandList.toString());
DiFyReq diFyImageReq = new DiFyReq();
diFyImageReq.setUser(ConstantStr.corpus_user);
diFyImageReq.setFlowId(reportSummaryToken);
diFyImageReq.setInputs(inputMap);
// 调用dify
JSONObject resultJsonObject = (JSONObject) diFyService.getDiFyObject(diFyImageReq);
log.info("runDify userQuestionSummary difyflow {}", resultJsonObject);
// 保存结果
if (resultJsonObject != null) {
TmCorpusQuestionSummaryReport summaryReport = new TmCorpusQuestionSummaryReport();
summaryReport.setPreliminarySummaryResults(resultJsonObject.getString("preliminarySummaryResults"));
summaryReport.setMainCategory(mainCategoryString);
summaryReport.setSourceTime(statTime);
tmCorpusQuestionSummaryReportMapper.insert(summaryReport);
}
}
/**
* 时间字符串转时间戳秒级
* @param stringTime
* @param formatter
* @return
*/
private Date stringTimeToDate(String stringTime, DateTimeFormatter formatter) {
if (StringUtils.isBlank(stringTime)) {
return null;
}
LocalDateTime localDateTime = LocalDateTime.parse(stringTime, formatter);
// 转换为秒级时间戳
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
}

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.volvo.ai.analytic.center.mapper.TmCorpusQuestionReportMapper">
<select id="queryQuestionReportList" resultType="com.volvo.ai.analytic.center.dto.corpus.ImCurMessageDTO" >
SELECT
tcqr.user_demand as userDemand
FROM
`tm_corpus_question_report` tcqr
WHERE tcqr.is_deleted = 0
AND tcqr.msg_timestamp between #{statTime} and #{endTime}
AND tcqr.main_category = #{mainCategory}
</select>
</mapper>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.volvo.ai.analytic.center.mapper.TmCorpusQuestionReportMapper">
<select id="queryQuestionReportList" resultType="com.volvo.ai.analytic.center.dto.corpus.ImCurMessageDTO" >
SELECT
tcqr.user_demand as userDemand
FROM
`tm_corpus_question_report` tcqr
WHERE tcqr.is_deleted = 0
AND tcqr.msg_timestamp between #{statTime} and #{endTime}
AND tcqr.main_category = #{mainCategory}
</select>
</mapper>