|
|
|
|
@@ -0,0 +1,161 @@
|
|
|
|
|
package com.volvo.ai.analytic.center.service;
|
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
|
|
import com.huaweicloud.sdk.eg.v1.model.CloudEvents;
|
|
|
|
|
import com.volvo.ai.analytic.center.dto.req.DiFyReq;
|
|
|
|
|
import com.volvo.ai.analytic.center.dto.req.DifyCommunityTargetDTO;
|
|
|
|
|
import com.volvo.ai.analytic.center.dto.req.DifyImageWorkFlow;
|
|
|
|
|
import com.volvo.ai.analytic.center.dto.req.SpokesManDTO;
|
|
|
|
|
import com.volvo.ai.analytic.center.entity.AiAnalysisErrors;
|
|
|
|
|
import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs;
|
|
|
|
|
import com.volvo.ai.analytic.center.entity.AiAnalyticBusinessConfig;
|
|
|
|
|
import com.volvo.ai.analytic.center.enums.BusinessTypeEnum;
|
|
|
|
|
import com.volvo.ai.analytic.center.mapper.AiAnalysisErrorsMapper;
|
|
|
|
|
import com.volvo.ai.analytic.center.mapper.AiAnalysisRequestLogsMapper;
|
|
|
|
|
import com.volvo.ai.analytic.center.mapper.AiAnalyticBusinessConfigMapper;
|
|
|
|
|
import com.volvo.ai.analytic.center.utils.AiAnalysisUtils;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 社区特邀发言官服务
|
|
|
|
|
* 该服务用于处理社区特邀发言官相关的业务逻辑
|
|
|
|
|
*/
|
|
|
|
|
@Slf4j
|
|
|
|
|
@Service
|
|
|
|
|
public class SpokesManService {
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private AiAnalyticBusinessConfigMapper aiAnalyticBusinessConfigMapper;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private DiFyService diFyService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private HuaWeiEGService huaWeiEGService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private AiAnalysisRequestLogsMapper aiAnalysisRequestLogsMapper;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private AiAnalysisErrorsMapper aiAnalysisErrorsMapper;
|
|
|
|
|
|
|
|
|
|
@Value("${dify.spokesMan.token}")
|
|
|
|
|
private String spokesManToken;
|
|
|
|
|
|
|
|
|
|
@Value("${dify.spokesMan.channel}")
|
|
|
|
|
private String channel;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理社区特邀发言官回调请求
|
|
|
|
|
*
|
|
|
|
|
* @param req SpokesManDTO 请求对象
|
|
|
|
|
*/
|
|
|
|
|
public void spokesManCallBack(Object req) {
|
|
|
|
|
|
|
|
|
|
//把req转成SpokesManDTO对象
|
|
|
|
|
SpokesManDTO spokesManDTO = JSON.parseObject(JSON.toJSONString(req), SpokesManDTO.class);
|
|
|
|
|
if (spokesManDTO == null || spokesManDTO.getFiles() == null || spokesManDTO.getFiles().isEmpty()
|
|
|
|
|
|| spokesManDTO.getPlatform() == null || spokesManDTO.getTheme() == null) {
|
|
|
|
|
log.error("社区特邀发言官入参错误");
|
|
|
|
|
}
|
|
|
|
|
// 生成ai分析请求id
|
|
|
|
|
String aiAnalysisRequestId = AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.COMMUNITYTARGET.getCode());
|
|
|
|
|
try {
|
|
|
|
|
// 异步保存请求日志
|
|
|
|
|
syncSaveRequestLogs(JSON.toJSONString(req), aiAnalysisRequestId);
|
|
|
|
|
|
|
|
|
|
//获取特邀发言官敏感词配置
|
|
|
|
|
List<AiAnalyticBusinessConfig> sensiveWordLibraryList = aiAnalyticBusinessConfigMapper.selectList(
|
|
|
|
|
Wrappers.<AiAnalyticBusinessConfig>lambdaQuery()
|
|
|
|
|
.eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.SPOKESMAN.getCode())
|
|
|
|
|
.eq(AiAnalyticBusinessConfig::getConfigType, BusinessTypeEnum.SPOKESMAN_SENSITIVE_WORD.getCode())
|
|
|
|
|
.eq(AiAnalyticBusinessConfig::getIsDeleted, 0)
|
|
|
|
|
.eq(AiAnalyticBusinessConfig::getConfigVersion, 1)
|
|
|
|
|
);
|
|
|
|
|
log.info("社区特邀发言官敏感词配置:{}", sensiveWordLibraryList.toArray());
|
|
|
|
|
//获取审核规则配置
|
|
|
|
|
List<AiAnalyticBusinessConfig> auditRulesList = aiAnalyticBusinessConfigMapper.selectList(
|
|
|
|
|
Wrappers.<AiAnalyticBusinessConfig>lambdaQuery()
|
|
|
|
|
.eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.SPOKESMAN.getCode())
|
|
|
|
|
.eq(AiAnalyticBusinessConfig::getConfigType, BusinessTypeEnum.SPOKESMAN_AUDIT_RULE.getCode())
|
|
|
|
|
.eq(AiAnalyticBusinessConfig::getIsDeleted, 0)
|
|
|
|
|
.eq(AiAnalyticBusinessConfig::getConfigVersion, 1)
|
|
|
|
|
);
|
|
|
|
|
log.info("社区特邀发言官审核规则配置:{}", auditRulesList.toArray());
|
|
|
|
|
String sensiveWordLibrary = sensiveWordLibraryList.stream()
|
|
|
|
|
.map(AiAnalyticBusinessConfig::getConfigData)
|
|
|
|
|
.collect(Collectors.joining(" "));
|
|
|
|
|
String auditRules = auditRulesList.stream()
|
|
|
|
|
.map(AiAnalyticBusinessConfig::getConfigData)
|
|
|
|
|
.collect(Collectors.joining(" "));
|
|
|
|
|
JSONArray imageUrls = new JSONArray();
|
|
|
|
|
|
|
|
|
|
for (String url : spokesManDTO.getFiles()) {
|
|
|
|
|
DifyImageWorkFlow diFyImageWorkFlow = new DifyImageWorkFlow();
|
|
|
|
|
diFyImageWorkFlow.setUrl(url);
|
|
|
|
|
imageUrls.add(diFyImageWorkFlow);
|
|
|
|
|
}
|
|
|
|
|
DiFyReq diFyReq = new DiFyReq();
|
|
|
|
|
diFyReq.setUser(BusinessTypeEnum.SPOKESMAN.getCode());
|
|
|
|
|
diFyReq.setFlowId(spokesManToken);
|
|
|
|
|
JSONObject inputs = new JSONObject();
|
|
|
|
|
inputs.put("files", imageUrls);
|
|
|
|
|
inputs.put("platform", spokesManDTO.getPlatform());
|
|
|
|
|
inputs.put("theme", spokesManDTO.getTheme());
|
|
|
|
|
inputs.put("auditRule", auditRules);
|
|
|
|
|
inputs.put("sensitiveWordLibrary", sensiveWordLibrary);
|
|
|
|
|
diFyReq.setInputs(inputs);
|
|
|
|
|
//异步更新dify请求日志
|
|
|
|
|
syncUpdateDiFyRequest(diFyReq, aiAnalysisRequestId);
|
|
|
|
|
//调用workflow
|
|
|
|
|
JSONObject difSpokesManResult = (JSONObject) diFyService.getDiFyObject(diFyReq);
|
|
|
|
|
//发送事件网格
|
|
|
|
|
CloudEvents cloudEvents = new CloudEvents();
|
|
|
|
|
cloudEvents.setData(difSpokesManResult);
|
|
|
|
|
huaWeiEGService.sendEvent(cloudEvents, channel);
|
|
|
|
|
//异步更新dify响应日志
|
|
|
|
|
syncUpdateDiFyResponse(difSpokesManResult, aiAnalysisRequestId);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("舆情自动化异常:{}", e.getMessage());
|
|
|
|
|
//保存错误日志
|
|
|
|
|
aiAnalysisErrorsMapper.insert(AiAnalysisErrors.builder()
|
|
|
|
|
.aiAnalysisRequestId(aiAnalysisRequestId)
|
|
|
|
|
.aiAnalysisErrorMessage(e.getMessage())
|
|
|
|
|
.aiAnalysisRequestType(BusinessTypeEnum.SPOKESMAN.getCode())
|
|
|
|
|
.build());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Async
|
|
|
|
|
protected void syncSaveRequestLogs(String message, String aiAnalysisRequestId) {
|
|
|
|
|
aiAnalysisRequestLogsMapper.insert(AiAnalysisRequestLogs.builder()
|
|
|
|
|
.aiAnalysisRequestId(aiAnalysisRequestId)
|
|
|
|
|
.businessRequest(message)
|
|
|
|
|
.difyAgentKey(spokesManToken)
|
|
|
|
|
.aiAnalysisRequestType(BusinessTypeEnum.SPOKESMAN.getCode())
|
|
|
|
|
.build());
|
|
|
|
|
}
|
|
|
|
|
@Async
|
|
|
|
|
protected void syncUpdateDiFyRequest(Object obj, String aiAnalysisRequestId) {
|
|
|
|
|
aiAnalysisRequestLogsMapper.update(new AiAnalysisRequestLogs(),
|
|
|
|
|
new UpdateWrapper<AiAnalysisRequestLogs>().set("dify_request", JSON.toJSONString(obj))
|
|
|
|
|
.eq("ai_analysis_request_id", aiAnalysisRequestId));
|
|
|
|
|
}
|
|
|
|
|
@Async
|
|
|
|
|
protected void syncUpdateDiFyResponse(JSONObject result, String aiAnalysisRequestId) {
|
|
|
|
|
aiAnalysisRequestLogsMapper.update(new AiAnalysisRequestLogs(),
|
|
|
|
|
new UpdateWrapper<AiAnalysisRequestLogs>().set("dify_response", result.toJSONString())
|
|
|
|
|
.eq("ai_analysis_request_id", aiAnalysisRequestId));
|
|
|
|
|
}
|
|
|
|
|
}
|