特邀发言官代码编写

This commit is contained in:
lxu75
2025-06-05 19:00:18 +08:00
parent 4d2d538125
commit bf43b9647f
5 changed files with 237 additions and 1 deletions

View File

@@ -0,0 +1,27 @@
package com.volvo.ai.analytic.center.dto.req;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SpokesManDTO {
private List<String> files;
private String platform;
private String theme;
private String communityRequestId;
private String redNoteType;
private String userId;
private String postUrl;
}

View File

@@ -0,0 +1,13 @@
package com.volvo.ai.analytic.center.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DifySpokesManDTO {
private String channel;
}

View File

@@ -23,7 +23,15 @@ public enum BusinessTypeEnum {
CASE("case", "舆情事件"),
SMART_ASSISTANT_NAMEPLATE("SMART_ASSISTANT_NAMEPLATE", "智能助手-铭牌")
SMART_ASSISTANT_NAMEPLATE("SMART_ASSISTANT_NAMEPLATE", "智能助手-铭牌"),
//特邀发言官
SPOKESMAN("SPOKESMAN", "特邀发言官"),
//特邀发言官敏感词
SPOKESMAN_SENSITIVE_WORD("SPOKESMAN_SENSITIVE_WORD", "特邀发言官敏感词"),
//特邀发言官审核规则
SPOKESMAN_AUDIT_RULE("SPOKESMAN_AUDIT_RULE", "特邀发言官审核规则"),
;
private String code;

View File

@@ -0,0 +1,27 @@
package com.volvo.ai.analytic.center.controller;
import com.alibaba.fastjson.JSON;
import com.volvo.ai.analytic.center.service.SpokesManService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/community/event")
@Slf4j
public class CommunityEGEventController {
@Autowired
private SpokesManService spokesmanService;
@PostMapping("/spokesmanCallBack")
public void spokesmanCallBack(@RequestBody Object req){
log.info("社区特邀发言官入参", JSON.toJSONString(req));
spokesmanService.spokesManCallBack(req);
}
}

View File

@@ -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));
}
}