10 Commits

Author SHA1 Message Date
ZLI263
5ae9330b1a 解决斜杆问题 2025-09-20 16:58:49 +08:00
ZLI263
5326a6f431 定位流程中断 2025-09-20 15:52:08 +08:00
ZLI263
887709db51 解决 sonar问题 2025-09-19 22:31:23 +08:00
ZLI263
77551cf0c8 解决 解析异常 2025-09-19 22:28:03 +08:00
ZLI263
7777da8d0e 解决 解析异常 2025-09-19 22:12:10 +08:00
ZLI263
3cbcbd5a54 解决 解析异常 2025-09-19 22:02:18 +08:00
ZLI263
7fc35dafa7 version赋值 2025-09-19 21:48:27 +08:00
ZLI263
519bd877e1 定位不推lto。加日志communicateDate 2025-09-19 21:40:03 +08:00
ZLI263
370acd0d29 定位不推lto。加日志getFlowId 2025-09-19 21:00:32 +08:00
ZLI263
a054245783 定位不推lto。加日志getFlowId 2025-09-19 20:57:35 +08:00
2 changed files with 119 additions and 125 deletions

View File

@@ -70,7 +70,7 @@ public class DiFyServiceImpl implements DiFyService{
} }
@Override @Override
public JSONObject executeDifyFlow(DiFyReq diFyReq, String businessType, String businessData, String oldAiAnalysisRequestId) { public JSONObject executeDifyFlow(DiFyReq diFyReq, String businessType, String businessData, String oldAiAnalysisRequestId) {
String aiAnalysisRequestId = StringUtils.isEmpty(oldAiAnalysisRequestId)? AiAnalysisUtils.getAiAnalysisRequestId(businessType):oldAiAnalysisRequestId; String aiAnalysisRequestId = StringUtils.isEmpty(oldAiAnalysisRequestId)? AiAnalysisUtils.getAiAnalysisRequestId(businessType):oldAiAnalysisRequestId;
try { try {
Map<String, String> inputMap = JSON.parseObject(JSONObject.toJSONString(diFyReq.getInputs()),Map.class); Map<String, String> inputMap = JSON.parseObject(JSONObject.toJSONString(diFyReq.getInputs()),Map.class);

View File

@@ -23,7 +23,6 @@ import com.volvo.ai.analytic.center.mq.CorpusQuestionProducer;
import com.volvo.ai.analytic.center.service.*; import com.volvo.ai.analytic.center.service.*;
import com.volvo.ai.analytic.center.utils.AiAnalysisUtils; import com.volvo.ai.analytic.center.utils.AiAnalysisUtils;
import com.volvo.ai.analytic.center.utils.ConstantStr; import com.volvo.ai.analytic.center.utils.ConstantStr;
import com.volvo.ai.analytic.center.utils.FlowResultSplitUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -107,151 +106,146 @@ public class TmTelephoneCorpusServiceImpl extends ServiceImpl<TmTelephoneCorpusM
public void saveTelephoneCorpus(TmTelephoneCorpus tmTelephoneCorpus) { public void saveTelephoneCorpus(TmTelephoneCorpus tmTelephoneCorpus) {
this.save(tmTelephoneCorpus); this.save(tmTelephoneCorpus);
} }
private String communicateDateStr = "communicateDate";
private String outputsStr="outputs";
private String aiAnalysisRequestIdStr = "aiAnalysisRequestId";
@Override @Override
public void runTelephoneCorpusDify(AicorpusTelephoneDTO aicorpusTelephone) { public void runTelephoneCorpusDify(AicorpusTelephoneDTO aicorpusTelephone) {
try {
if (null != aicorpusTelephone) {
if(null != aicorpusTelephone){ List<DataMaskingRule> maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(BusinessTypeEnum.SMART_ASSISTANT.getCode());
List<DataMaskingRule> maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(BusinessTypeEnum.SMART_ASSISTANT.getCode()); RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput();
runMaskingRuleInput.setDataMaskingRules(maskingRuleItems);
RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput(); Map<String, Object> inputMap = new HashMap();
runMaskingRuleInput.setDataMaskingRules(maskingRuleItems); DiFyReq diFyImageReq = new DiFyReq();
diFyImageReq.setUser(ConstantStr.corpus_user);
Map<String, Object> inputMap = new HashMap();
DiFyReq diFyImageReq = new DiFyReq();
diFyImageReq.setUser(ConstantStr.corpus_user);
JSONObject jsonObject = JSONObject.parseObject(aicorpusTelephone.getDisplay());
log.info("电话语料内容:{}", jsonObject.toString());
inputMap.put("chat", aicorpusTelephone.getDisplay());
JSONArray segments = jsonObject.getJSONArray("segments");
log.info("电话语料内容segments:{}", segments.toString());
// 遍历 segments
StringBuffer chatList = new StringBuffer();
segments.stream()
.map(segment -> (JSONObject) segment)
.forEach(segment -> {
JSONObject result = segment.getJSONObject("result");
String text = result.getString("text");
JSONObject analysisInfo = result.getJSONObject("analysis_info");
String role = analysisInfo.getString("role");
String title = "";
if (role.equals("AGENT")) {
title = "顾问";
} else {
title = "客户";
}
// 拼接 role 和 text
String chat = title + ": " + text;
runMaskingRuleInput.setOldStr(chat);
String corpusChat = dataMaskingRuleService.runMaskingRule(runMaskingRuleInput);
chatList.append(corpusChat).append("\n");
JSONObject jsonObject = JSONObject.parseObject( aicorpusTelephone.getDisplay()); });
inputMap.put("chat",aicorpusTelephone.getDisplay()); ZonedDateTime zonedDateTime = ZonedDateTime.parse(jsonObject.getString("start_time"));
JSONArray segments = jsonObject.getJSONArray("segments"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateStartTime = zonedDateTime.format(formatter);
// 遍历 segments inputMap.put("chat", chatList.toString());
StringBuffer chatList = new StringBuffer(); inputMap.put("model", getCarModelList());
segments.stream() inputMap.put("recordId", aicorpusTelephone.getSourceId());
.map(segment -> (JSONObject) segment) inputMap.put("version", 2);
.forEach(segment -> {
JSONObject result = segment.getJSONObject("result");
String text = result.getString("text");
JSONObject analysisInfo = result.getJSONObject("analysis_info");
String role = analysisInfo.getString("role");
String title="";
if(role.equals("AGENT")){
title="顾问";
}else{
title="客户";
}
// 拼接 role 和 text
String chat = title + ": " + text;
runMaskingRuleInput.setOldStr(chat);
String corpusChat = dataMaskingRuleService.runMaskingRule(runMaskingRuleInput);
chatList.append(corpusChat).append("\n");
}); diFyImageReq.setInputs(inputMap);
CorpusReportDTO corpusReportDTO = new CorpusReportDTO();
corpusReportDTO.setCorpusTime(formattedDateStartTime);
corpusReportDTO.setRecordId(aicorpusTelephone.getSourceId());
corpusReportDTO.setAnalysisScene(2l);
ZonedDateTime zonedDateTime = ZonedDateTime.parse(jsonObject.getString("start_time")); long startTime = System.currentTimeMillis();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); CompletableFuture.runAsync(() -> {
String formattedDateStartTime = zonedDateTime.format(formatter); try {
log.info("铭牌语料可用许可授权数,总结和分类场景={}", semaphore.availablePermits());
// 获取许可 - 如果没有可用许可会阻塞等待
semaphore.acquire();
diFyImageReq.setFlowId(telephoneToken);
log.info("铭牌语料telephoneToken:{}", telephoneToken);
JSONObject execDifyFlow = diFyService.executeDifyFlow(diFyImageReq, BusinessTypeEnum.SMART_ASSISTANT.getCode(),
JSONObject.toJSONString(corpusReportDTO), aicorpusTelephone.getAiAnalysisRequestId());
inputMap.put("chat",chatList.toString()); log.info("dcc总结场景,总结和分类 runDify execDifyFlow 返回 : {}", execDifyFlow);
inputMap.put("model",getCarModelList()); parseDfiyResult(execDifyFlow, aicorpusTelephone.getSourceId(), formattedDateStartTime, aicorpusTelephone.getAiAnalysisRequestId(),
diFyImageReq.setInputs(inputMap); BusinessTypeEnum.SMART_ASSISTANT.getCode());
CorpusReportDTO corpusReportDTO = new CorpusReportDTO(); } catch (Exception e) {
corpusReportDTO.setCorpusTime(formattedDateStartTime); log.error("runDify 异常", e);
corpusReportDTO.setRecordId(aicorpusTelephone.getSourceId()); } finally {
corpusReportDTO.setAnalysisScene(2l); // 释放许可
semaphore.release();
}
}, executor);
long endTime = System.currentTimeMillis();
log.info("第一个业务场景(dcc总结和分类)执行时间: {} ms", (endTime - startTime));
//第一个业务场景, 结束
long startTime = System.currentTimeMillis(); long startTime2 = System.currentTimeMillis();
CompletableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
try { try {
log.info("铭牌语料可用许可授权数,总结和分类场景={}", semaphore.availablePermits()); log.info("铭牌语料可用许可授权数,客户画像场景={}", semaphore.availablePermits());
// 获取许可 - 如果没有可用许可会阻塞等待 Thread.sleep(2000);
semaphore.acquire(); // 获取许可 - 如果没有可用许可会阻塞等待
diFyImageReq.setFlowId(telephoneToken); semaphore.acquire();
log.info("铭牌语料telephoneToken:{}", telephoneToken); // 创建新的DiFyReq对象以避免线程安全问题
JSONObject execDifyFlow = diFyService.executeDifyFlow(diFyImageReq, BusinessTypeEnum.SMART_ASSISTANT.getCode(), inputMap.put("businessId", aicorpusTelephone.getSourceId());
JSONObject.toJSONString(corpusReportDTO), aicorpusTelephone.getAiAnalysisRequestId()); inputMap.put(communicateDateStr, aicorpusTelephone.getTranscribeTime());
inputMap.put("analysisScene", "2");
diFyImageReq.setInputs(inputMap);
log.info("dcc总结场景,总结和分类 runDify execDifyFlow 返回 : {}", execDifyFlow); diFyImageReq.setFlowId(oneTokenPortrait);
parseDfiyResult(execDifyFlow, aicorpusTelephone.getSourceId(), formattedDateStartTime, aicorpusTelephone.getAiAnalysisRequestId(), log.info("dcc总结场景,客户画像runDify execDifyFlow 返回 : {}", oneTokenPortrait);
BusinessTypeEnum.SMART_ASSISTANT.getCode()); JSONObject execDifyFlowForPortrait = diFyService.executeDifyFlow(diFyImageReq, BusinessTypeEnum.CORPUS_PORTRAIT_DCC.getCode(),
} catch (Exception e) { JSONObject.toJSONString(corpusReportDTO), aicorpusTelephone.getAiAnalysisRequestId());
log.error("runDify 异常", e);
}finally {
// 释放许可
semaphore.release();
}
}, executor);
long endTime = System.currentTimeMillis();
log.info("第一个业务场景(dcc总结和分类)执行时间: {} ms", (endTime - startTime));
//第一个业务场景, 结束
long startTime2 = System.currentTimeMillis(); log.info("dcc客户画像场景 runDify execDifyFlow 返回 , dcc: {}", execDifyFlowForPortrait);
CompletableFuture.runAsync(() -> {
try {
log.info("铭牌语料可用许可授权数,总结和分类场景={}", semaphore.availablePermits());
// 获取许可 - 如果没有可用许可会阻塞等待
semaphore.acquire();
// 创建新的DiFyReq对象以避免线程安全问题
inputMap.put("businessId",aicorpusTelephone.getSourceId());
inputMap.put("communicateDate",aicorpusTelephone.getTranscribeTime());
inputMap.put("analysisScene", "2");
diFyImageReq.setInputs(inputMap);
diFyImageReq.setFlowId(oneTokenPortrait); parseDfiyResult(execDifyFlowForPortrait, aicorpusTelephone.getSourceId(), formattedDateStartTime,
log.info("dcc总结场景,客户画像runDify execDifyFlow 返回 : {}", oneTokenPortrait); aicorpusTelephone.getAiAnalysisRequestId(), BusinessTypeEnum.CORPUS_PORTRAIT_DCC.getCode());
JSONObject execDifyFlowForPortrait = diFyService.executeDifyFlow(diFyImageReq, BusinessTypeEnum.CORPUS_PORTRAIT_DCC.getCode(), } catch (Exception e) {
JSONObject.toJSONString(corpusReportDTO), aicorpusTelephone.getAiAnalysisRequestId()); log.error("runDify 异常", e);
} finally {
log.info("dcc客户画像场景 runDify execDifyFlow 返回 , dcc: {}", execDifyFlowForPortrait); // 释放许可
semaphore.release();
parseDfiyResult(execDifyFlowForPortrait, aicorpusTelephone.getSourceId(), formattedDateStartTime, }
aicorpusTelephone.getAiAnalysisRequestId(), BusinessTypeEnum.CORPUS_PORTRAIT_DCC.getCode()); }, executor);
} catch (Exception e) { long endTime2 = System.currentTimeMillis();
log.error("runDify 异常", e); log.info("第二个业务场景(dcc用户画像)执行时间: {} ms", (endTime2 - startTime2));
}finally { //第二个业务场景, 结束
// 释放许可
semaphore.release();
}
}, executor);
long endTime2 = System.currentTimeMillis();
log.info("第二个业务场景(dcc用户画像)执行时间: {} ms", (endTime2 - startTime2));
//第二个业务场景, 结束
}
} catch (Exception e) {
log.error("runTelephoneCorpusDify error:{}", e);
} }
} }
private void parseDfiyResult(JSONObject execDifyFlow,String recordId,String communicateDate, private void parseDfiyResult(JSONObject execDifyFlow,String recordId,String communicateDate,
String aiAnalysisRequestIdDB,String businessType) { String aiAnalysisRequestIdDB,String businessType) {
log.info("dcc语料 parseDfiyResult ,businessType: {} execDifyFlow: {}", businessType,execDifyFlow); log.info("dcc语料 parseDfiyResult ,businessType: {} execDifyFlow: {}, recordId: {},communicateDate: {}", businessType,execDifyFlow,recordId,communicateDate);
try { try {
if(null != execDifyFlow && execDifyFlow.get("status").equals("succeeded")){ if(null != execDifyFlow && execDifyFlow.get("status").equals("succeeded")){
String text = execDifyFlow.getJSONObject("outputs").getString("text"); JSONObject text = execDifyFlow.getJSONObject(outputsStr);
String resultStrOne = FlowResultSplitUtil.flowOutputTextSplit(text, "任务1", "任务2");
String resultStrTwo =FlowResultSplitUtil.flowOutputTextSplit(text, "任务2", null);
if (StringUtils.isBlank(resultStrOne) || StringUtils.isBlank(resultStrTwo)){
log.info("电话语料解析为空,text:{}", text);
return;
}
String aiAnalysisRequestId = execDifyFlow.getString("aiAnalysisRequestId");
Map<String, String> ltoMap = new HashMap();
ltoMap.put("analysisRecordId", aiAnalysisRequestId);
ltoMap.put("analysisScene", "2");
ltoMap.put("recordId",recordId);
ltoMap.put("communicateDate", communicateDate);
ltoMap.put("analysisResult", resultStrOne);
ltoMap.put("analysisDetail", resultStrTwo);
// 发送MQ // 发送MQ
if (BusinessTypeEnum.CORPUS_PORTRAIT_DCC.getCode().equals(businessType)){//DCC 客户画像 if (BusinessTypeEnum.CORPUS_PORTRAIT_DCC.getCode().equals(businessType)){//DCC 客户画像
log.info("send mq 电话语料场景,客户画像需求, {}",ltoMap); log.info("send mq 电话语料场景,客户画像需求, {}",text);
sendMq( CategoryEnum.PORTRAIT_ALLIN.getCode(), JSONObject.toJSONString(ltoMap)); sendMq( CategoryEnum.PORTRAIT_ALLIN.getCode(), text.toJSONString());
}else{ // dcc 总结 }else{ // dcc 总结
log.info("send mq 电话语料场景,总结需求, {}",ltoMap); log.info("send mq 电话语料场景,总结需求, {}",text);
sendMq( CategoryEnum.PHONE_VOICE.getCode(), JSONObject.toJSONString(ltoMap)); sendMq( CategoryEnum.PHONE_VOICE.getCode(), text.toJSONString());
} }
try { try {
if(StringUtils.isNotEmpty(aiAnalysisRequestIdDB)){ if(StringUtils.isNotEmpty(aiAnalysisRequestIdDB)){
@@ -260,10 +254,10 @@ public class TmTelephoneCorpusServiceImpl extends ServiceImpl<TmTelephoneCorpusM
aiAnalysisErrors.setAiAnalysisErrorHandlingStatus("1"); aiAnalysisErrors.setAiAnalysisErrorHandlingStatus("1");
aiAnalysisErrorsService.updateAiAnalysisErrors(aiAnalysisErrors); aiAnalysisErrorsService.updateAiAnalysisErrors(aiAnalysisErrors);
} }
aiAnalysisRequestLogsService.saveOrUpdateAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder().aiAnalysisRequestId(execDifyFlow.getString("aiAnalysisRequestId")).businessResponse(JSONObject.toJSONString(ltoMap)).build()); aiAnalysisRequestLogsService.saveOrUpdateAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder().aiAnalysisRequestId(execDifyFlow.getString(aiAnalysisRequestIdStr)).businessResponse(text.toJSONString()).build());
} catch (Exception e) { } catch (Exception e) {
log.info(" 电话语料处理保存报告异常processItem:{} ", e); log.info(" 电话语料处理保存报告异常processItem:{} ", e.getMessage());
} }
}else { }else {
log.info("dcc语料 parseDfiyResult 非正常状态"); log.info("dcc语料 parseDfiyResult 非正常状态");
@@ -346,7 +340,7 @@ public class TmTelephoneCorpusServiceImpl extends ServiceImpl<TmTelephoneCorpusM
String newAiAnalysisRequestId = StringUtils.isEmpty(oldAiAnalysisRequestId)? AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.SMART_ASSISTANT_4IN1.getCode()): String newAiAnalysisRequestId = StringUtils.isEmpty(oldAiAnalysisRequestId)? AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.SMART_ASSISTANT_4IN1.getCode()):
oldAiAnalysisRequestId; oldAiAnalysisRequestId;
inputMap.put("aiAnalysisRequestId",newAiAnalysisRequestId); inputMap.put(aiAnalysisRequestIdStr,newAiAnalysisRequestId);
diFyImageReq.setInputs(inputMap); diFyImageReq.setInputs(inputMap);
CorpusReportDTO corpusReportDTO = new CorpusReportDTO(); CorpusReportDTO corpusReportDTO = new CorpusReportDTO();
corpusReportDTO.setRecordId(aicorpusTelephone.getSourceId()); corpusReportDTO.setRecordId(aicorpusTelephone.getSourceId());
@@ -356,9 +350,9 @@ public class TmTelephoneCorpusServiceImpl extends ServiceImpl<TmTelephoneCorpusM
// 获取配置 // 获取配置
JSONObject execDifyFlow = diFyService.executeDifyFlow(diFyImageReq, BusinessTypeEnum.SMART_ASSISTANT_4IN1.getCode(), JSONObject.toJSONString(corpusReportDTO),newAiAnalysisRequestId ); JSONObject execDifyFlow = diFyService.executeDifyFlow(diFyImageReq, BusinessTypeEnum.SMART_ASSISTANT_4IN1.getCode(), JSONObject.toJSONString(corpusReportDTO),newAiAnalysisRequestId );
log.info("runDify智能客服4IN1 {}",execDifyFlow); log.info("runDify智能客服4IN1 {}",execDifyFlow);
String aiAnalysisRequestId = execDifyFlow.getString("aiAnalysisRequestId"); String aiAnalysisRequestId = execDifyFlow.getString(aiAnalysisRequestIdStr);
if(null != execDifyFlow && execDifyFlow.get("status").equals("succeeded")){ if(null != execDifyFlow && execDifyFlow.get("status").equals("succeeded")){
JSONObject outputsJson = execDifyFlow.getJSONObject("outputs"); JSONObject outputsJson = execDifyFlow.getJSONObject(outputsStr);
String message = JSONObject.toJSONString(outputsJson); String message = JSONObject.toJSONString(outputsJson);
log.info("send 4IN1mq {}",message); log.info("send 4IN1mq {}",message);
intelligentCustomerService.sendMq(message); intelligentCustomerService.sendMq(message);
@@ -368,7 +362,7 @@ public class TmTelephoneCorpusServiceImpl extends ServiceImpl<TmTelephoneCorpusM
aiAnalysisErrors.setAiAnalysisErrorHandlingStatus("1"); aiAnalysisErrors.setAiAnalysisErrorHandlingStatus("1");
aiAnalysisErrorsService.updateAiAnalysisErrors(aiAnalysisErrors); aiAnalysisErrorsService.updateAiAnalysisErrors(aiAnalysisErrors);
} }
aiAnalysisRequestLogsService.saveOrUpdateAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder().aiAnalysisRequestId(execDifyFlow.getString("aiAnalysisRequestId")).businessResponse(message).build()); aiAnalysisRequestLogsService.saveOrUpdateAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder().aiAnalysisRequestId(execDifyFlow.getString(aiAnalysisRequestIdStr)).businessResponse(message).build());
} }
@@ -402,7 +396,7 @@ public class TmTelephoneCorpusServiceImpl extends ServiceImpl<TmTelephoneCorpusM
@Override @Override
public void sendMq(String tag, String message) { public void sendMq(String tag, String message) {
log.info("RocketMQ主题和标签: "+topic+":"+ tag); log.info("RocketMQ主题和标签: "+topic+":"+ tag + message);
rocketMqTemplate.asyncSend(topic+":"+ tag, MessageBuilder.withPayload(message).build(), rocketMqTemplate.asyncSend(topic+":"+ tag, MessageBuilder.withPayload(message).build(),
new SendCallback() { new SendCallback() {
@Override @Override