问题汇总逻辑
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user