Merge remote-tracking branch 'origin/master' into dev_20250409_difyResult
# Conflicts: # ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/BusinessTypeEnum.java # ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java # ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/ConstantStr.java
This commit is contained in:
@@ -19,6 +19,12 @@
|
||||
</properties>
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-text</artifactId>
|
||||
<version>1.9</version> <!-- 请根据需要选择合适的版本 -->
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-all</artifactId>
|
||||
@@ -232,6 +238,12 @@
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-text</artifactId>
|
||||
<version>1.9</version> <!-- 请根据需要选择合适的版本 -->
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
package com.volvo.ai.analytic.center.controller;
|
||||
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs;
|
||||
import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.volvo.common.core.util.ResultMsg;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
@@ -24,12 +28,16 @@ public class TestController {
|
||||
@Autowired
|
||||
private RocketMQTemplate rocketMQTemplate;
|
||||
|
||||
@Autowired
|
||||
private AiAnalysisRequestLogsService aiAnalysisRequestLogsService;
|
||||
|
||||
|
||||
|
||||
@PostMapping("/mockMq")
|
||||
@ApiOperation(value = "补偿处理消息")
|
||||
public ResultMsg<Object> mockMq(@RequestBody String message) {
|
||||
rocketMQTemplate.syncSend("COMMUNITY_POST_TO_AI_TOPIC", message);
|
||||
JSONObject messageJson = JSONObject.parseObject(message);
|
||||
rocketMQTemplate.syncSend(messageJson.getString("topic"), messageJson.getString("message"));
|
||||
return ResultMsg.ok("ok");
|
||||
}
|
||||
|
||||
|
||||
@@ -67,7 +67,8 @@ public class CorpusFailJob {
|
||||
|
||||
@Value("${rocketmq.producer.corpus.dcctopic}")
|
||||
private String dccMqTipic;
|
||||
|
||||
@Value("${rocketmq.consumer.intelligentCustomer.topic}")
|
||||
private String intelligentCustomerTipic;
|
||||
@Autowired
|
||||
private TmTelephoneCorpusMapper tmTelephoneCorpusMapper;
|
||||
|
||||
@@ -79,17 +80,17 @@ public class CorpusFailJob {
|
||||
@PostMapping("corpusFailTask")
|
||||
public void corpusFailTask() {
|
||||
|
||||
log.info(" 解析失败重试处理");
|
||||
Integer total = aiAnalysisErrorsService.queryCountAnalysisErrorList(BusinessTypeEnum.SMART_ASSISTANT.getCode());
|
||||
log.info("语料解析失败重试处理数据量:{}", total);
|
||||
log.info(" corpusFailTask解析失败重试处理");
|
||||
Integer total = aiAnalysisErrorsService.queryCountAnalysisErrorList(Arrays.asList(BusinessTypeEnum.SMART_ASSISTANT.getCode(),BusinessTypeEnum.SMART_ASSISTANT_QIWEI.getCode()));
|
||||
log.info("corpusFailTask语料解析失败重试处理数据量:{}", total);
|
||||
int totalPages = PageDto.getTotalPages(total, pageSize);
|
||||
log.info("语料解析失败重试处理数据量:{},总页数:{}", total, totalPages);
|
||||
log.info("corpusFailTask 语料解析失败重试处理数据量:{},总页数:{}", total, totalPages);
|
||||
for (int i = 1; i <= totalPages; i++) {
|
||||
int offset = (i - 1) * pageSize;
|
||||
|
||||
List<AiAnalysisErrors> aiAnalysisErrorsListlist = aiAnalysisErrorsService.queryAnalysisErrorList(BusinessTypeEnum.SMART_ASSISTANT.getCode(),offset, pageSize);
|
||||
List<AiAnalysisErrors> aiAnalysisErrorsListlist = aiAnalysisErrorsService.queryAnalysisErrorList(Arrays.asList(BusinessTypeEnum.SMART_ASSISTANT.getCode(),BusinessTypeEnum.SMART_ASSISTANT_QIWEI.getCode()),offset, pageSize);
|
||||
if(CollectionUtils.isNotEmpty(aiAnalysisErrorsListlist)) {
|
||||
log.info("语料解析失败重试处理 size:{}", aiAnalysisErrorsListlist.size());
|
||||
log.info("corpusFailTask语料解析失败重试处理 size:{}", aiAnalysisErrorsListlist.size());
|
||||
aiAnalysisErrorsListlist.stream().forEach(aiAnalysisErrors -> {
|
||||
|
||||
|
||||
@@ -169,9 +170,6 @@ public class CorpusFailJob {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -183,4 +181,58 @@ public class CorpusFailJob {
|
||||
aiAnalysisErrorsService.update(aiAnalysisErrors,
|
||||
new LambdaQueryWrapper<AiAnalysisErrors>().eq(AiAnalysisErrors::getAiAnalysisRequestId, aiAnalysisRequestId));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 智能客服-四合一
|
||||
*/
|
||||
@XxlJob("intelligentCustomer4in1FailTask")
|
||||
@PostMapping("intelligentCustomer4in1FailTask")
|
||||
public void intelligentCustomer4in1() {
|
||||
|
||||
log.info(" intelligentCustomer4in1FailTask 解析失败重试处理");
|
||||
Integer total = aiAnalysisErrorsService.queryCountAnalysisErrorList(Arrays.asList(BusinessTypeEnum.INTELLIGENT_CUSTOMER.getCode()));
|
||||
log.info("intelligentCustomer4in1FailTask 语料解析失败重试处理数据量:{}", total);
|
||||
int totalPages = PageDto.getTotalPages(total, pageSize);
|
||||
log.info("intelligentCustomer4in1FailTask 语料解析失败重试处理数据量:{},总页数:{}", total, totalPages);
|
||||
for (int i = 1; i <= totalPages; i++) {
|
||||
int offset = (i - 1) * pageSize;
|
||||
|
||||
List<AiAnalysisErrors> aiAnalysisErrorsListlist = aiAnalysisErrorsService.queryAnalysisErrorList(Arrays.asList(BusinessTypeEnum.INTELLIGENT_CUSTOMER.getCode()),offset, pageSize);
|
||||
if(CollectionUtils.isNotEmpty(aiAnalysisErrorsListlist)) {
|
||||
log.info("intelligentCustomer4in1FailTask语料解析失败重试处理 size:{}", aiAnalysisErrorsListlist.size());
|
||||
aiAnalysisErrorsListlist.stream().forEach(aiAnalysisErrors -> {
|
||||
try {
|
||||
LambdaQueryWrapper<AiAnalysisRequestLogs> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(AiAnalysisRequestLogs::getAiAnalysisRequestId, aiAnalysisErrors.getAiAnalysisRequestId());
|
||||
AiAnalysisRequestLogs oldAiAnalysisRequestLogs = aiAnalysisRequestLogsMapper.selectOne(queryWrapper);
|
||||
|
||||
if (null != oldAiAnalysisRequestLogs) {
|
||||
JSONObject businessRequest = JSONObject.parseObject(oldAiAnalysisRequestLogs.getBusinessRequest());
|
||||
businessRequest.put("aiAnalysisRequestId", oldAiAnalysisRequestLogs.getAiAnalysisRequestId());
|
||||
String message = businessRequest.toJSONString();
|
||||
rocketMqTemplate.asyncSend(intelligentCustomerTipic, MessageBuilder.withPayload(message).build(),
|
||||
new SendCallback() {
|
||||
@Override
|
||||
public void onSuccess(SendResult sendResult) {
|
||||
log.info(" intelligentCustomer4in1FailTask 失败补偿 发送MQ成功 消息体:{}", message);
|
||||
}
|
||||
@Override
|
||||
public void onException(Throwable e) {
|
||||
log.error("intelligentCustomer4in1FailTask 失败补偿 送MQ异常 消息体:{}, 异常:", message, e);
|
||||
}
|
||||
}, 10000);
|
||||
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.info("INTELLIGENT_CUSTOMER_4IN1 语料解析失败补偿异常:{}", e);
|
||||
aiAnalysisErrors.setAiAnalysisErrorHandlingStatus("0");
|
||||
aiAnalysisErrors.setRetryCount(aiAnalysisErrors.getRetryCount() + 1);
|
||||
updateAiAnalysisErrors(aiAnalysisErrors, aiAnalysisErrors.getAiAnalysisRequestId());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,6 @@ import java.util.List;
|
||||
public interface AiAnalysisErrorsMapper extends BaseMapper<AiAnalysisErrors> {
|
||||
|
||||
|
||||
int queryCountAnalysisErrorList(@Param("businessType") String businessType);
|
||||
List<AiAnalysisErrors> queryAnalysisErrorList( @Param("businessType") String businessType, @Param("offset") int offset, @Param("pageSize") int pageSize);
|
||||
int queryCountAnalysisErrorList(@Param("businessType") List<String> businessType);
|
||||
List<AiAnalysisErrors> queryAnalysisErrorList( @Param("businessType") List<String> businessType, @Param("offset") int offset, @Param("pageSize") int pageSize);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.volvo.ai.analytic.center.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.volvo.ai.analytic.center.entity.AiAnalyticBusinessConfig;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface AiAnalyticBusinessConfigMapper extends BaseMapper<AiAnalyticBusinessConfig> {
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.volvo.ai.analytic.center.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.volvo.ai.analytic.center.entity.AiAnalyticWarrantyAudit;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface AiAnalyticWarrantyAuditMapper extends BaseMapper<AiAnalyticWarrantyAudit> {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.volvo.ai.analytic.center.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.volvo.ai.analytic.center.entity.TcIntelligentCustomer;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface TcIntelligentCustomerMapper extends BaseMapper<TcIntelligentCustomer> {
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.volvo.ai.analytic.center.mq;
|
||||
|
||||
import com.volvo.ai.analytic.center.service.ClaimVerificationService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.rocketmq.common.message.MessageExt;
|
||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||
import org.apache.rocketmq.spring.core.RocketMQListener;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@RocketMQMessageListener(consumerGroup = "${rocketmq.consumer.claimVerification.group}",
|
||||
topic = "${rocketmq.consumer.claimVerification.topic}",
|
||||
enableMsgTrace = true)
|
||||
public class ClaimVerificationConsumer implements RocketMQListener<MessageExt>{
|
||||
|
||||
@Autowired
|
||||
private ClaimVerificationService claimVerificationService;
|
||||
|
||||
@Override
|
||||
public void onMessage(MessageExt messageExt) {
|
||||
log.info("Received 索赔检核 message: " + messageExt);
|
||||
claimVerificationService.consumerMessageByMQ(new String(messageExt.getBody()));
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,6 @@ import org.apache.rocketmq.common.message.MessageExt;
|
||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||
import org.apache.rocketmq.spring.core.RocketMQListener;
|
||||
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.Component;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
@@ -41,10 +40,6 @@ public class CorpusDccMqConsumer implements RocketMQListener<MessageExt> {
|
||||
@Autowired
|
||||
private AiAnalysisRequestLogsService aiAnalysisRequestLogsService;
|
||||
|
||||
@Value("${dify.corpus.checkDccRepeat}")
|
||||
private String checkDccRepeat;
|
||||
|
||||
|
||||
private final ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
@Override
|
||||
|
||||
@@ -2,7 +2,7 @@ package com.volvo.ai.analytic.center.mq;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.volvo.ai.analytic.center.entity.TmAnalysisResult;
|
||||
import com.volvo.ai.analytic.center.enums.BusinessTypeEnum;
|
||||
import com.volvo.ai.analytic.center.mapper.AiAnalysisRequestLogsMapper;
|
||||
import com.volvo.ai.analytic.center.service.TmAnalysisResultService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@@ -23,6 +23,9 @@ public class CorpushIsLikeConsumer implements RocketMQListener<MessageExt>{
|
||||
|
||||
@Autowired
|
||||
private TmAnalysisResultService tmAnalysisResultService;
|
||||
|
||||
@Autowired
|
||||
private AiAnalysisRequestLogsMapper aiAnalysisRequestLogsMapper;
|
||||
@Override
|
||||
public void onMessage(MessageExt messageExt) {
|
||||
|
||||
@@ -36,16 +39,22 @@ public class CorpushIsLikeConsumer implements RocketMQListener<MessageExt>{
|
||||
log.info(" 回调的aiAnalysisRequestId 为空:{} ", execDifyFlow);
|
||||
return;
|
||||
}
|
||||
String aiAnalysisRequestType = analysisRecordId.substring(0,analysisRecordId.indexOf("-"));
|
||||
if(StringUtils.isEmpty(aiAnalysisRequestType) ){
|
||||
log.info(" 回调的aiAnalysisRequestType为空:{} ", aiAnalysisRequestType);
|
||||
return;
|
||||
}
|
||||
// "isLike": "1" // 1:点赞,2:点踩
|
||||
tmAnalysisResultService.saveTmCorpusReport(TmAnalysisResult.builder()
|
||||
.aiAnalysisRequestId(execDifyFlow.getString("analysisRecordId"))
|
||||
.analysisResult(execDifyFlow.toJSONString())
|
||||
.analysisType(BusinessTypeEnum.SMART_ASSISTANT.getCode())
|
||||
.updateBy("LTO")
|
||||
.analysisType(aiAnalysisRequestType)
|
||||
.updateTime(new Date())
|
||||
.build());
|
||||
} catch (Exception e) {
|
||||
log.info(" 电话语料处理保存报告异常processItem:{} ", e);
|
||||
log.info(" corpushIsLikeConsumer AI结果回传处理异常:{} ", e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
|
||||
package com.volvo.ai.analytic.center.mq;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.volvo.ai.analytic.center.dto.req.FourInOneRequestDTO;
|
||||
import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService;
|
||||
import com.volvo.ai.analytic.center.service.IntelligentCustomerService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.rocketmq.common.message.MessageExt;
|
||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||
import org.apache.rocketmq.spring.core.RocketMQListener;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* @ClassName CorpusProcessKafkaConsumer
|
||||
* @Description 智能客服 语料解析 四合一
|
||||
* @Author renzhen
|
||||
* @Date 2025-03-04 10:18
|
||||
* @Version 1.0
|
||||
**/
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@RefreshScope
|
||||
@RestController
|
||||
@RocketMQMessageListener(consumerGroup = "${rocketmq.consumer.intelligentCustomer.group}",
|
||||
topic = "${rocketmq.consumer.intelligentCustomer.topic}",
|
||||
instanceName = "intelligentCustomerMq",
|
||||
consumeThreadNumber = 5,
|
||||
enableMsgTrace = true)
|
||||
public class IntelligentCustomerMqConsumer implements RocketMQListener<MessageExt> {
|
||||
|
||||
@Autowired
|
||||
private IntelligentCustomerService intelligentCustomerService;
|
||||
|
||||
@Autowired
|
||||
private AiAnalysisRequestLogsService aiAnalysisRequestLogsService;
|
||||
private final ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
@Override
|
||||
public void onMessage(MessageExt messageExt) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
try {
|
||||
log.info("intelligentCustomerMqConsumer 当前线程: {}, 线程ID: {}", Thread.currentThread().getName(), Thread.currentThread().getId());
|
||||
String message = new String(messageExt.getBody());
|
||||
log.info("IntelligentCustomerMqConsumer message: " + message);
|
||||
FourInOneRequestDTO fourRequestDTO = objectMapper.readValue(message, FourInOneRequestDTO.class);
|
||||
intelligentCustomerService.fourInOneMqService(fourRequestDTO);
|
||||
log.info("FourInOneRequestDTO处理完成,耗时:{}", System.currentTimeMillis() - startTime);
|
||||
} catch (JsonProcessingException e) {
|
||||
log.info("intelligentCustomerMqConsumer mq 处理失败:{}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -9,6 +9,6 @@ public interface AiAnalysisErrorsService extends IService<AiAnalysisErrors> {
|
||||
|
||||
boolean saveAiAnalysisErrors(AiAnalysisErrors entity);
|
||||
boolean updateAiAnalysisErrors(AiAnalysisErrors entity);
|
||||
int queryCountAnalysisErrorList(String businessType);
|
||||
List<AiAnalysisErrors> queryAnalysisErrorList( String businessType, int offset,int pageSize);
|
||||
int queryCountAnalysisErrorList(List<String> businessType);
|
||||
List<AiAnalysisErrors> queryAnalysisErrorList( List<String> businessType, int offset,int pageSize);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.volvo.ai.analytic.center.service;
|
||||
|
||||
public interface ClaimVerificationService {
|
||||
|
||||
|
||||
void consumerMessageByMQ(String message);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.volvo.ai.analytic.center.service;
|
||||
|
||||
import com.volvo.ai.analytic.center.dto.req.FourInOneRequestDTO;
|
||||
|
||||
/**
|
||||
* @description 电话语料表-同步表
|
||||
* @author BEJSON
|
||||
* @date 2025-03-04
|
||||
*/
|
||||
public interface IntelligentCustomerService{
|
||||
|
||||
|
||||
void fourInOneMqService(FourInOneRequestDTO fourInOneRequestDTO);
|
||||
|
||||
|
||||
void sendMq( Object message);
|
||||
|
||||
}
|
||||
@@ -26,7 +26,7 @@ public class AiAnalysisErrorsServiceImpl extends ServiceImpl<AiAnalysisErrorsMa
|
||||
if (oldAiAnalysisErrors == null) {
|
||||
return aiAnalysisErrorsMapper.insert(entity) > 0;
|
||||
} else {
|
||||
oldAiAnalysisErrors.setRetryCount(oldAiAnalysisErrors.getRetryCount() + 1);
|
||||
entity.setRetryCount(oldAiAnalysisErrors.getRetryCount() + 1);
|
||||
return aiAnalysisErrorsMapper.update(entity, queryWrapper) > 0;
|
||||
}
|
||||
}
|
||||
@@ -37,18 +37,18 @@ public class AiAnalysisErrorsServiceImpl extends ServiceImpl<AiAnalysisErrorsMa
|
||||
queryWrapper.eq(AiAnalysisErrors::getAiAnalysisRequestId, entity.getAiAnalysisRequestId());
|
||||
AiAnalysisErrors oldAiAnalysisErrors = aiAnalysisErrorsMapper.selectOne(queryWrapper);
|
||||
if (oldAiAnalysisErrors != null) {
|
||||
oldAiAnalysisErrors.setRetryCount(oldAiAnalysisErrors.getRetryCount() + 1);
|
||||
entity.setRetryCount(oldAiAnalysisErrors.getRetryCount() + 1);
|
||||
return aiAnalysisErrorsMapper.update(entity, queryWrapper) > 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int queryCountAnalysisErrorList(String businessType) {
|
||||
public int queryCountAnalysisErrorList(List<String> businessType) {
|
||||
return aiAnalysisErrorsMapper.queryCountAnalysisErrorList(businessType);
|
||||
}
|
||||
|
||||
public List<AiAnalysisErrors> queryAnalysisErrorList( String businessType, int offset,int pageSize) {
|
||||
public List<AiAnalysisErrors> queryAnalysisErrorList( List<String> businessType, int offset,int pageSize) {
|
||||
//捞取异常表中属于社区的异常数据
|
||||
return aiAnalysisErrorsMapper.queryAnalysisErrorList(businessType, offset, pageSize);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,374 @@
|
||||
package com.volvo.ai.analytic.center.service.impl;
|
||||
|
||||
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.obs.services.model.ObsObject;
|
||||
import com.volvo.ai.analytic.center.constant.ClaimVerificationConstant;
|
||||
import com.volvo.ai.analytic.center.constant.Constant;
|
||||
import com.volvo.ai.analytic.center.dto.req.ClaimVerificationFileDTO;
|
||||
import com.volvo.ai.analytic.center.dto.req.DiFyReq;
|
||||
import com.volvo.ai.analytic.center.dto.req.RunMaskingRuleInput;
|
||||
import com.volvo.ai.analytic.center.entity.*;
|
||||
import com.volvo.ai.analytic.center.enums.BusinessTypeEnum;
|
||||
import com.volvo.ai.analytic.center.enums.ClaimVerificationFileTypeEnums;
|
||||
import com.volvo.ai.analytic.center.mapper.AiAnalysisErrorsMapper;
|
||||
import com.volvo.ai.analytic.center.mapper.AiAnalyticWarrantyAuditMapper;
|
||||
import com.volvo.ai.analytic.center.service.DataMaskingRuleService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.text.StringEscapeUtils;
|
||||
import com.volvo.ai.analytic.center.feign.DiFyFeign;
|
||||
import com.volvo.ai.analytic.center.mapper.AiAnalysisRequestLogsMapper;
|
||||
import com.volvo.ai.analytic.center.mapper.AiAnalyticBusinessConfigMapper;
|
||||
import com.volvo.ai.analytic.center.service.ClaimVerificationService;
|
||||
import com.volvo.ai.analytic.center.service.DiFyService;
|
||||
import com.volvo.ai.analytic.center.utils.AiAnalysisUtils;
|
||||
import com.volvo.ai.analytic.center.utils.ObsUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
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 org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class ClaimVerificationServiceImpl implements ClaimVerificationService {
|
||||
|
||||
@Autowired
|
||||
private AiAnalysisRequestLogsMapper aiAnalysisRequestLogsMapper;
|
||||
|
||||
@Autowired
|
||||
private AiAnalyticBusinessConfigMapper aiAnalyticBusinessConfigMapper;
|
||||
|
||||
@Autowired
|
||||
private DiFyFeign diFyFeign;
|
||||
|
||||
@Autowired
|
||||
private DiFyService diFyService;
|
||||
|
||||
@Value("${dify.claimVerification.fileToken}")
|
||||
private String fileToken;
|
||||
|
||||
@Value("${dify.claimVerification.verificationToken}")
|
||||
private String verificationToken;
|
||||
|
||||
@Value("${rocketmq.producer.claimVerification}")
|
||||
private String topic;
|
||||
|
||||
@Value("${claimVerification.methodList}")
|
||||
private List<String> methodList;
|
||||
|
||||
@Autowired
|
||||
private RocketMQTemplate rocketMQTemplate;
|
||||
|
||||
@Autowired
|
||||
private DataMaskingRuleService dataMaskingRuleService;
|
||||
|
||||
@Autowired
|
||||
private AiAnalyticWarrantyAuditMapper aiAnalyticWarrantyAuditMapper;
|
||||
|
||||
@Autowired
|
||||
private AiAnalysisErrorsMapper aiAnalysisErrorsMapper;
|
||||
|
||||
@Override
|
||||
public void consumerMessageByMQ(String message) {
|
||||
// 生成ai分析请求id
|
||||
String aiAnalysisRequestId = AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.CLAIM_VERIFICATION.getCode());
|
||||
log.info("售后索赔检核MQ message: {}", message);
|
||||
ClaimVerificationFileDTO claimVerificationFileAnalysisDTO = JSON.parseObject(message, ClaimVerificationFileDTO.class);
|
||||
if (claimVerificationFileAnalysisDTO == null) {
|
||||
log.error("售后索赔检核文件入参为空: {}", claimVerificationFileAnalysisDTO.toString());
|
||||
saveException("售后索赔检核文件分析入参为空", aiAnalysisRequestId, null);
|
||||
}
|
||||
JSONObject diFyObject = new JSONObject();
|
||||
try {
|
||||
// 异步保存请求日志
|
||||
syncSaveRequestLogs(message, aiAnalysisRequestId);
|
||||
if (claimVerificationFileAnalysisDTO.getBusinessType().equals(BusinessTypeEnum.CLAIM_VERIFICATION_FILE_ANALYSIS.getCode())) {
|
||||
//文件分析
|
||||
List<String> fileObsPath = claimVerificationFileAnalysisDTO.getFileObsPath();
|
||||
List<HashMap<String, String>> fileIds = new ArrayList<>();
|
||||
log.info("文件分析文件ID:{}", fileObsPath);
|
||||
//上传所有文件到dify
|
||||
uploadFileToObs(fileObsPath, fileIds);
|
||||
//根据业务线标识和文件配置分类查询配置
|
||||
List<AiAnalyticBusinessConfig> aiAnalyticBusinessConfigs = aiAnalyticBusinessConfigMapper.selectList(
|
||||
Wrappers.<AiAnalyticBusinessConfig>lambdaQuery()
|
||||
.eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.CLAIM_VERIFICATION.getCode())
|
||||
.eq(AiAnalyticBusinessConfig::getFileConfigCategory, claimVerificationFileAnalysisDTO.getFileType())
|
||||
.eq(AiAnalyticBusinessConfig::getIsDeleted, 0)
|
||||
.eq(AiAnalyticBusinessConfig::getConfigVersion, 1)
|
||||
);
|
||||
|
||||
//组装文件分析workflow入参
|
||||
JSONArray files = new JSONArray();
|
||||
for (HashMap<String, String> fileToDifyDTO : fileIds) {
|
||||
JSONObject object = new JSONObject();
|
||||
object.put(ClaimVerificationConstant.UPLOAD_FILE_ID, fileToDifyDTO.get(ClaimVerificationConstant.ID));
|
||||
object.put(ClaimVerificationConstant.TYPE, fileToDifyDTO.get(ClaimVerificationConstant.TYPE));
|
||||
object.put(ClaimVerificationConstant.TRANSFER_METHOD, ClaimVerificationConstant.LOCAL_FILE);
|
||||
files.add(object);
|
||||
}
|
||||
//构建入参
|
||||
JSONObject fileToDifyDTO = buildFileToDifyParameter(files, claimVerificationFileAnalysisDTO, aiAnalyticBusinessConfigs);
|
||||
//根据aiAnalysisRequestId更新请求日志表的difyRequest字段
|
||||
syncUpdateDiFyRequest(fileToDifyDTO.toString(), aiAnalysisRequestId);
|
||||
DiFyReq diFyReq = new DiFyReq();
|
||||
diFyReq.setUser(BusinessTypeEnum.CLAIM_VERIFICATION.getCode());
|
||||
diFyReq.setFlowId(fileToken);
|
||||
diFyReq.setInputs(fileToDifyDTO);
|
||||
//调用dify 工作流
|
||||
diFyObject = (JSONObject) diFyService.getDiFyObject(diFyReq);
|
||||
//处理结果并推送MQ
|
||||
if (diFyObject == null) {
|
||||
log.error(" 售后索赔检核文件分析dify返回结果为空");
|
||||
saveException("售后索赔检核文件分析dify返回结果为空", aiAnalysisRequestId, null);
|
||||
} else {
|
||||
//解析dify返回结果
|
||||
JSONObject data = analyzeParameters(diFyObject, claimVerificationFileAnalysisDTO, aiAnalysisRequestId);
|
||||
//返回结果推送到Newbie的MQ
|
||||
rocketMQTemplate.syncSend(topic, data);
|
||||
log.info("索赔检核文件分析发送回调MQ完成: {}", data);
|
||||
}
|
||||
//异步更新请求日志表的difyResponse字段
|
||||
syncUpdateDiFyResponse(diFyObject, aiAnalysisRequestId);
|
||||
} else if (claimVerificationFileAnalysisDTO.getBusinessType().equals(BusinessTypeEnum.CLAIM_VERIFICATION_AUDIT.getCode())) {
|
||||
//审计报告
|
||||
//加载审计规则配置
|
||||
List<AiAnalyticBusinessConfig> aiAnalyticBusinessConfigs = aiAnalyticBusinessConfigMapper.selectList(
|
||||
Wrappers.<AiAnalyticBusinessConfig>lambdaQuery()
|
||||
.eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.CLAIM_VERIFICATION.getCode())
|
||||
.eq(AiAnalyticBusinessConfig::getConfigType, BusinessTypeEnum.AUDITRULES.getCode())
|
||||
.eq(AiAnalyticBusinessConfig::getIsDeleted, 0)
|
||||
.in(AiAnalyticBusinessConfig::getVerificationMethod, methodList)
|
||||
);
|
||||
String configDataString = aiAnalyticBusinessConfigs.stream()
|
||||
.map(AiAnalyticBusinessConfig::getConfigData)
|
||||
.collect(Collectors.joining(" "));
|
||||
//组装审计报告workflow入参
|
||||
JSONObject parsedAudit = buildAuditToDify(configDataString, claimVerificationFileAnalysisDTO);
|
||||
//根据aiAnalysisRequestId更新请求日志表的difyRequest字段
|
||||
syncUpdateDiFyRequest(parsedAudit.toString(), aiAnalysisRequestId);
|
||||
DiFyReq diFyReq = new DiFyReq();
|
||||
diFyReq.setUser(BusinessTypeEnum.CLAIM_VERIFICATION.getCode());
|
||||
diFyReq.setFlowId(verificationToken);
|
||||
diFyReq.setInputs(parsedAudit);
|
||||
//调用dify 工作流
|
||||
diFyObject = (JSONObject) diFyService.getDiFyObject(diFyReq);
|
||||
//处理结果并推送MQ
|
||||
if (diFyObject == null) {
|
||||
log.error("售后索赔检核审计报告dify返回结果为空");
|
||||
saveException("售后索赔检核审计报告dify返回结果为空", aiAnalysisRequestId, null);
|
||||
} else {
|
||||
JSONObject data = getJsonObjectToNewBie(diFyObject, claimVerificationFileAnalysisDTO, aiAnalysisRequestId);
|
||||
//返回结果推送到Newbie的MQ
|
||||
rocketMQTemplate.syncSend(topic, data);
|
||||
log.info("索赔检核审计报告发送回调MQ完成: {}", data);
|
||||
//异步更新请求日志表的difyResponse字段
|
||||
syncUpdateDiFyResponse(diFyObject, aiAnalysisRequestId);
|
||||
//审核次数记录
|
||||
saveAuditCount(claimVerificationFileAnalysisDTO);
|
||||
}
|
||||
} else {
|
||||
saveException("售后索赔检核业务类型错误", aiAnalysisRequestId, null);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("售后索赔检核异常:{}", e.getMessage());
|
||||
//推送空的回调MQ
|
||||
sendErrorCallBack(claimVerificationFileAnalysisDTO, aiAnalysisRequestId);
|
||||
//保存错误日志
|
||||
saveException(e.getMessage(), aiAnalysisRequestId, diFyObject);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendErrorCallBack(ClaimVerificationFileDTO claimVerificationFileAnalysisDTO, String aiAnalysisRequestId) {
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("newBieAfterSalesId", claimVerificationFileAnalysisDTO.getNewBieAfterSalesId());
|
||||
data.put("businessType", claimVerificationFileAnalysisDTO.getBusinessType());
|
||||
data.put("aiAnalysisRequestId", aiAnalysisRequestId);
|
||||
data.put("fileType", claimVerificationFileAnalysisDTO.getFileType());
|
||||
log.info("索赔检核发送异常空MQMQ: {}", data.toString());
|
||||
rocketMQTemplate.syncSend(topic, data);
|
||||
}
|
||||
|
||||
@Async
|
||||
protected void syncUpdateDiFyRequest(String difyQuery, String aiAnalysisRequestId) {
|
||||
aiAnalysisRequestLogsMapper.update(new AiAnalysisRequestLogs(),
|
||||
new UpdateWrapper<AiAnalysisRequestLogs>().set("dify_request", difyQuery)
|
||||
.eq("ai_analysis_request_id", aiAnalysisRequestId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存异常日志
|
||||
* @param errorMessage
|
||||
* @param aiAnalysisRequestId
|
||||
* @param diFyObject
|
||||
*/
|
||||
private void saveException(String errorMessage, String aiAnalysisRequestId, JSONObject diFyObject) {
|
||||
aiAnalysisErrorsMapper.insert(AiAnalysisErrors.builder()
|
||||
.aiAnalysisRequestId(aiAnalysisRequestId)
|
||||
.difyResponse(diFyObject == null ? null : diFyObject.toJSONString())
|
||||
.aiAnalysisErrorMessage(errorMessage)
|
||||
.aiAnalysisRequestType(BusinessTypeEnum.CLAIM_VERIFICATION.getCode())
|
||||
.build());
|
||||
}
|
||||
|
||||
private JSONObject buildAuditToDify(String configDataString, ClaimVerificationFileDTO claimVerificationFileAnalysisDTO) {
|
||||
JSONObject audit = new JSONObject();
|
||||
audit.put("analysisRules", configDataString);
|
||||
audit.put("diagnosticReport", claimVerificationFileAnalysisDTO.getDiagnosticReport() == null ? " " :claimVerificationFileAnalysisDTO.getDiagnosticReport().toString());
|
||||
audit.put("preCheckReport", claimVerificationFileAnalysisDTO.getPreCheckReport() == null ? " " :claimVerificationFileAnalysisDTO.getPreCheckReport().toString());
|
||||
audit.put("dtcReport", claimVerificationFileAnalysisDTO.getDtcReport() == null ? " " :claimVerificationFileAnalysisDTO.getDtcReport().toString());
|
||||
|
||||
//脱敏处理
|
||||
List<DataMaskingRule> maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(Constant.CHANNEL_DCC);
|
||||
RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput();
|
||||
runMaskingRuleInput.setDataMaskingRules(maskingRuleItems);
|
||||
runMaskingRuleInput.setOldStr(audit.toString());
|
||||
String corpusChat = dataMaskingRuleService.runMaskingRule(runMaskingRuleInput);
|
||||
JSONObject parsedAudit = JSON.parseObject(corpusChat);
|
||||
return parsedAudit;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static JSONObject getJsonObjectToNewBie(JSONObject diFyObject, ClaimVerificationFileDTO claimVerificationFileAnalysisDTO, String aiAnalysisRequestId) {
|
||||
if (diFyObject.containsKey("answer") && !diFyObject.getJSONObject("answer").isEmpty()) {
|
||||
diFyObject = diFyObject.getJSONObject("answer");
|
||||
}
|
||||
String warrantyAuditReport = diFyObject.getString("warrantyAuditReport");
|
||||
warrantyAuditReport = StringEscapeUtils.unescapeJava(warrantyAuditReport);
|
||||
JSONObject audiResToAfter = JSON.parseObject(warrantyAuditReport);
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("newBieAfterSalesId", claimVerificationFileAnalysisDTO.getNewBieAfterSalesId());
|
||||
data.put("businessType", claimVerificationFileAnalysisDTO.getBusinessType());
|
||||
data.put("warrantyAuditReport", audiResToAfter);
|
||||
data.put("aiAnalysisRequestId", aiAnalysisRequestId);
|
||||
return data;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static JSONObject analyzeParameters(JSONObject diFyObject, ClaimVerificationFileDTO claimVerificationFileAnalysisDTO, String aiAnalysisRequestId) {
|
||||
String toAfter = "";
|
||||
String textDoc = diFyObject.getString("textDoc");
|
||||
String textImage = diFyObject.getString("textImage");
|
||||
//判断字符串那个是不为空的然后进行处理
|
||||
if (StringUtils.isNotBlank(textDoc)) {
|
||||
toAfter = StringEscapeUtils.unescapeJava(textDoc);
|
||||
} else if (StringUtils.isNotBlank(textImage)) {
|
||||
toAfter = StringEscapeUtils.unescapeJava(textImage);
|
||||
} else {
|
||||
throw new RuntimeException(" 售后索赔检核文件分析dify返回结果为空");
|
||||
}
|
||||
JSONObject difyToAfter = JSONObject.parseObject(toAfter);
|
||||
if (difyToAfter.containsKey("answer") && !difyToAfter.getJSONObject("answer").isEmpty()) {
|
||||
difyToAfter = diFyObject.getJSONObject("answer");
|
||||
}
|
||||
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("newBieAfterSalesId", claimVerificationFileAnalysisDTO.getNewBieAfterSalesId());
|
||||
data.put("businessType", claimVerificationFileAnalysisDTO.getBusinessType());
|
||||
data.put("fileType", claimVerificationFileAnalysisDTO.getFileType());
|
||||
data.put("fileData", difyToAfter);
|
||||
data.put("aiAnalysisRequestId", aiAnalysisRequestId);
|
||||
return data;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static JSONObject buildFileToDifyParameter(JSONArray files, ClaimVerificationFileDTO claimVerificationFileAnalysisDTO, List<AiAnalyticBusinessConfig> aiAnalyticBusinessConfigs) {
|
||||
JSONObject fileToDifyDTO = new JSONObject();
|
||||
fileToDifyDTO.put("files", files);
|
||||
//根据类型获取配置内容
|
||||
fileToDifyDTO.put("FileBusinessType", claimVerificationFileAnalysisDTO.getFileType());
|
||||
fileToDifyDTO.put("FileDescription", aiAnalyticBusinessConfigs
|
||||
.stream()
|
||||
.filter(config -> config.getConfigType().equals("FileDescription"))
|
||||
.map(AiAnalyticBusinessConfig::getConfigData)
|
||||
.findFirst()
|
||||
.orElse(null));
|
||||
fileToDifyDTO.put("AnalysisRequirements", aiAnalyticBusinessConfigs
|
||||
.stream()
|
||||
.filter(config -> config.getConfigType().equals("AnalysisRequirements"))
|
||||
.map(AiAnalyticBusinessConfig::getConfigData)
|
||||
.findFirst()
|
||||
.orElse(null));
|
||||
fileToDifyDTO.put("ReportRequirements", aiAnalyticBusinessConfigs
|
||||
.stream()
|
||||
.filter(config -> config.getConfigType().equals("ReportRequirements"))
|
||||
.map(AiAnalyticBusinessConfig::getConfigData)
|
||||
.findFirst()
|
||||
.orElse(null));
|
||||
fileToDifyDTO.put("ReportTemplate", aiAnalyticBusinessConfigs
|
||||
.stream()
|
||||
.filter(config -> config.getConfigType().equals("ReportTemplate"))
|
||||
.map(AiAnalyticBusinessConfig::getConfigData)
|
||||
.findFirst()
|
||||
.orElse(null));
|
||||
return fileToDifyDTO;
|
||||
}
|
||||
|
||||
//异步保存审核次数
|
||||
@Async
|
||||
protected void saveAuditCount(ClaimVerificationFileDTO claimVerificationFileAnalysisDTO) {
|
||||
AiAnalyticWarrantyAudit warrantyAudit = aiAnalyticWarrantyAuditMapper.selectOne(
|
||||
Wrappers.<AiAnalyticWarrantyAudit>lambdaQuery()
|
||||
.eq(AiAnalyticWarrantyAudit::getNewBieAfterSalesId, claimVerificationFileAnalysisDTO.getNewBieAfterSalesId())
|
||||
.eq(AiAnalyticWarrantyAudit::getIsDeleted, 0)
|
||||
.last("for update") // 添加悲观锁
|
||||
);
|
||||
if (warrantyAudit != null) {
|
||||
//存在则auditCount+1
|
||||
warrantyAudit.setAuditCount(warrantyAudit.getAuditCount() + 1);
|
||||
aiAnalyticWarrantyAuditMapper.updateById(warrantyAudit);
|
||||
} else {
|
||||
//不存在则新增一条记录
|
||||
AiAnalyticWarrantyAudit warrantyAuditNew = new AiAnalyticWarrantyAudit();
|
||||
warrantyAuditNew.setNewBieAfterSalesId(claimVerificationFileAnalysisDTO.getNewBieAfterSalesId());
|
||||
warrantyAuditNew.setAuditCount(1);
|
||||
aiAnalyticWarrantyAuditMapper.insert(warrantyAuditNew);
|
||||
}
|
||||
}
|
||||
|
||||
private void uploadFileToObs(List<String> fileObsPath, List<HashMap<String, String>> fileIds) {
|
||||
if (fileObsPath != null && fileObsPath.size() > 0) {
|
||||
for (String filePath : fileObsPath) {
|
||||
HashMap<String, String> fileToDifyDTO = new HashMap<>();
|
||||
ObsObject obsObject = ObsUtil.downloadFile(filePath);
|
||||
InputStream inputStream = obsObject.getObjectContent();
|
||||
MultipartFile file = ObsUtil.getMultipartFile(inputStream, ObsUtil.getFilenameByUrl(filePath));
|
||||
log.info("索赔检核文件上传dify请求参数:{},token:{}", file, fileToken);
|
||||
JSONObject fileUploadRes = diFyFeign.fileUpload("Bearer " + fileToken, file);
|
||||
log.info("索赔检核文件上传dify响应结果:{}", fileUploadRes);
|
||||
String uploadFileId = fileUploadRes.getString(ClaimVerificationConstant.ID);
|
||||
String extension = fileUploadRes.getString(ClaimVerificationConstant.EXTENSION);
|
||||
fileToDifyDTO.put(ClaimVerificationConstant.ID, uploadFileId);
|
||||
fileToDifyDTO.put(ClaimVerificationConstant.TYPE, ClaimVerificationFileTypeEnums.getMessageByCode(extension));
|
||||
fileIds.add(fileToDifyDTO);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Async
|
||||
protected void syncUpdateDiFyResponse(JSONObject difResult, String aiAnalysisRequestId) {
|
||||
aiAnalysisRequestLogsMapper.update(new AiAnalysisRequestLogs(),
|
||||
new UpdateWrapper<AiAnalysisRequestLogs>().set("dify_response", difResult.toJSONString())
|
||||
.eq("ai_analysis_request_id", aiAnalysisRequestId));
|
||||
}
|
||||
|
||||
@Async
|
||||
protected void syncSaveRequestLogs(String message, String aiAnalysisRequestId) {
|
||||
aiAnalysisRequestLogsMapper.insert(AiAnalysisRequestLogs.builder()
|
||||
.aiAnalysisRequestId(aiAnalysisRequestId)
|
||||
.businessRequest(message)
|
||||
.aiAnalysisRequestType(BusinessTypeEnum.CLAIM_VERIFICATION.getCode())
|
||||
.build());
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,8 @@ public class DataMaskingRuleServiceImpl extends ServiceImpl<DataMaskingRuleMappe
|
||||
log.info("getDataMaskingRuleListByApplicationChannel {}", applicationChannel);
|
||||
//根据适用渠道applicationChannel获取数据脱敏规则List
|
||||
List<DataMaskingRule> dataMaskingRuleList = this.lambdaQuery()
|
||||
// .eq(DataMaskingRule::getApplicationChannel, applicationChannel)
|
||||
.like(DataMaskingRule::getApplicationChannel, applicationChannel)
|
||||
.eq(DataMaskingRule::getApplicationChannel, applicationChannel)
|
||||
.eq(DataMaskingRule::getRuleStatus, YesOrNoConstants.YES)
|
||||
.eq(DataMaskingRule::getIsDeleted, YesOrNoConstants.NO)
|
||||
.list();
|
||||
|
||||
@@ -64,7 +64,6 @@ public class DiFyServiceImpl implements DiFyService{
|
||||
.businessRequest(businessData)
|
||||
.difyAgentKey(diFyReq.getFlowId())
|
||||
.difyRequest(JSON.toJSONString(diFyReq))
|
||||
.difyResponse(JSON.toJSONString(""))
|
||||
.aiAnalysisRequestType(businessType)
|
||||
.build());
|
||||
|
||||
@@ -76,7 +75,6 @@ public class DiFyServiceImpl implements DiFyService{
|
||||
|
||||
aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder()
|
||||
.aiAnalysisRequestId(aiAnalysisRequestId)
|
||||
.businessRequest(JSONObject.toJSONString(""))
|
||||
.difyResponse(data.toJSONString())
|
||||
.build());
|
||||
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
package com.volvo.ai.analytic.center.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.volvo.ai.analytic.center.constant.Constant;
|
||||
import com.volvo.ai.analytic.center.dto.req.DiFyReq;
|
||||
import com.volvo.ai.analytic.center.dto.req.FourInOneRequestDTO;
|
||||
import com.volvo.ai.analytic.center.dto.req.RunMaskingRuleInput;
|
||||
import com.volvo.ai.analytic.center.entity.AiAnalysisErrors;
|
||||
import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs;
|
||||
import com.volvo.ai.analytic.center.entity.DataMaskingRule;
|
||||
import com.volvo.ai.analytic.center.enums.BusinessTypeEnum;
|
||||
import com.volvo.ai.analytic.center.feign.RemoteCarModelClient;
|
||||
import com.volvo.ai.analytic.center.mapper.AiAnalysisErrorsMapper;
|
||||
import com.volvo.ai.analytic.center.mapper.TcIntelligentCustomerMapper;
|
||||
import com.volvo.ai.analytic.center.service.*;
|
||||
import com.volvo.ai.analytic.center.utils.AiAnalysisUtils;
|
||||
import com.volvo.ai.analytic.center.utils.ConstantStr;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.rocketmq.client.producer.SendCallback;
|
||||
import org.apache.rocketmq.client.producer.SendResult;
|
||||
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
||||
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.messaging.support.MessageBuilder;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
/**
|
||||
* @description 智能助手
|
||||
* @author rz
|
||||
* @date 2025-03-04
|
||||
*/
|
||||
@RefreshScope
|
||||
@Slf4j
|
||||
@Service
|
||||
public class IntelligentCustomerServiceImpl implements IntelligentCustomerService {
|
||||
|
||||
|
||||
@Autowired
|
||||
private DiFyService diFyService;
|
||||
|
||||
@Resource
|
||||
private RocketMQTemplate rocketMqTemplate;
|
||||
|
||||
@Value("${rocketmq.producer.intelligentCustomer.topic}")
|
||||
private String topic;
|
||||
@Value("${dify.intelligentCustomer.fourInOneToken}")
|
||||
private String fourInOneToken;
|
||||
@Autowired
|
||||
private RemoteCarModelClient remoteCarModelClient;
|
||||
|
||||
@Autowired
|
||||
private DataMaskingRuleService dataMaskingRuleService;
|
||||
|
||||
@Autowired
|
||||
private AiAnalysisRequestLogsService aiAnalysisRequestLogsService;
|
||||
|
||||
@Autowired
|
||||
private AiAnalysisErrorsService aiAnalysisErrorsService;
|
||||
|
||||
@Autowired
|
||||
private AiAnalysisErrorsMapper aiAnalysisErrorsMapper;
|
||||
|
||||
@Autowired
|
||||
private TcIntelligentCustomerMapper tcIntelligentCustomerMapper;
|
||||
|
||||
private Map<String, List<String>> tcIntelligentCustomer = Collections.EMPTY_MAP;
|
||||
|
||||
@Override
|
||||
public void fourInOneMqService(FourInOneRequestDTO fourInOneRequestDTO) {
|
||||
|
||||
if(null != fourInOneRequestDTO){
|
||||
String aiAnalysisRequestId = StringUtils.isEmpty(fourInOneRequestDTO.getAiAnalysisRequestId())? AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.INTELLIGENT_CUSTOMER.getCode()):fourInOneRequestDTO.getAiAnalysisRequestId();
|
||||
if (StringUtils.isEmpty(fourInOneRequestDTO.getWorkOrderSource()) || StringUtils.isEmpty(fourInOneRequestDTO.getWorkOrderContent())){
|
||||
log.info("IntelligentCustomerMqConsumer WorkOrderSource or WorkOrderContent 为空不处理 ");
|
||||
return ;
|
||||
}
|
||||
List<DataMaskingRule> maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(Constant.INTELLIGENT_CUSTOMER_4IN1);
|
||||
|
||||
RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput();
|
||||
runMaskingRuleInput.setDataMaskingRules(maskingRuleItems);
|
||||
|
||||
|
||||
Map<String, Object> inputMap = new HashMap();
|
||||
DiFyReq diFyImageReq = new DiFyReq();
|
||||
diFyImageReq.setUser(ConstantStr.INTELLIGENT_CUSTOMER_4IN1);
|
||||
diFyImageReq.setFlowId(fourInOneToken);
|
||||
runMaskingRuleInput.setOldStr(fourInOneRequestDTO.getWorkOrderContent());
|
||||
String corkOrderContent = dataMaskingRuleService.runMaskingRule(runMaskingRuleInput);
|
||||
inputMap.put("workOrderContent", corkOrderContent);
|
||||
|
||||
runMaskingRuleInput.setOldStr(fourInOneRequestDTO.getRelationCorpusContent());
|
||||
String relationCorpusContent = dataMaskingRuleService.runMaskingRule(runMaskingRuleInput);
|
||||
inputMap.put("relationCorpusContent", relationCorpusContent);
|
||||
|
||||
inputMap.put("laiyuan",fourInOneRequestDTO.getWorkOrderSource());
|
||||
inputMap.put("workOrderId",fourInOneRequestDTO.getWorkOrderId());
|
||||
inputMap.put("aiAnalysisRequestId", aiAnalysisRequestId);
|
||||
diFyImageReq.setInputs(inputMap);
|
||||
|
||||
|
||||
// 获取配置
|
||||
JSONObject execDifyFlow = diFyService.executeDifyFlow(diFyImageReq, BusinessTypeEnum.INTELLIGENT_CUSTOMER.getCode(), JSONObject.toJSONString(fourInOneRequestDTO), aiAnalysisRequestId);
|
||||
log.info("runDify execDifyFlow {}",execDifyFlow);
|
||||
if(null != execDifyFlow && execDifyFlow.get("status").equals("succeeded")){
|
||||
try {
|
||||
JSONObject outputsJson = execDifyFlow.getJSONObject("outputs");
|
||||
String message = JSONObject.toJSONString(outputsJson);
|
||||
log.info("send mq {}",message);
|
||||
sendMq(message);
|
||||
if(StringUtils.isNotEmpty(fourInOneRequestDTO.getAiAnalysisRequestId())){
|
||||
AiAnalysisErrors aiAnalysisErrors = new AiAnalysisErrors();
|
||||
aiAnalysisErrors.setAiAnalysisRequestId(aiAnalysisRequestId);
|
||||
aiAnalysisErrors.setAiAnalysisErrorHandlingStatus("1");
|
||||
aiAnalysisErrorsService.updateAiAnalysisErrors(aiAnalysisErrors);
|
||||
}
|
||||
aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder().aiAnalysisRequestId(execDifyFlow.getString("aiAnalysisRequestId")).businessResponse(message).build());
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("四合一语料解析返回数据JSON格式化异常 {}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void sendMq(Object message) {
|
||||
rocketMqTemplate.asyncSend(topic, MessageBuilder.withPayload(message).build(),
|
||||
new SendCallback() {
|
||||
@Override
|
||||
public void onSuccess(SendResult sendResult) {
|
||||
log.info("发送MQ成功 消息体:{}", message);
|
||||
}
|
||||
@Override
|
||||
public void onException(Throwable e) {
|
||||
log.error("送MQ异常 消息体:{}, 异常:", message, e);
|
||||
}
|
||||
}, 10000);
|
||||
}
|
||||
|
||||
// 咨询类【201】/投诉类【202】/投诉类型【203】 过滤
|
||||
/** private String fourInOneMqServiceFilter(String customerType,String customerValue){
|
||||
if(tcIntelligentCustomer.isEmpty()){
|
||||
queryTcIntelligentCustomer();
|
||||
}
|
||||
List<String> typeValues = tcIntelligentCustomer.get(customerType);
|
||||
if(!typeValues.contains(customerValue)){
|
||||
return "";
|
||||
}
|
||||
return customerValue;
|
||||
}
|
||||
|
||||
|
||||
public Map<String, List<String>> queryTcIntelligentCustomer() {
|
||||
LambdaQueryWrapper<TcIntelligentCustomer> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(TcIntelligentCustomer::getIsDeleted, "0");
|
||||
List<TcIntelligentCustomer> tcIntelligentCustomerList =tcIntelligentCustomerMapper.selectList(queryWrapper);
|
||||
tcIntelligentCustomer = tcIntelligentCustomerList.stream()
|
||||
.collect(Collectors.groupingBy(
|
||||
TcIntelligentCustomer::getIntelligentCustomerType, // 按照 IntelligentCustomerType 分组
|
||||
Collectors.mapping(
|
||||
customer -> {
|
||||
if (customer.getIntelligentCustomerType().equals(IntelligentCustomerTypeEnum.CONSULT_TYPE.getCode())) {
|
||||
return customer.getTypeOne(); // 如果是咨询类型,返回 TypeOne
|
||||
} else {
|
||||
return customer.getTypeOne().concat("#").concat(customer.getTypeTwo()).concat("#").concat(customer.getTypeThree()); // 其他类型,拼接 TypeOne、TypeTwo、TypeThree
|
||||
}
|
||||
},
|
||||
Collectors.toList()
|
||||
)
|
||||
));
|
||||
return tcIntelligentCustomer;
|
||||
}
|
||||
**/
|
||||
|
||||
}
|
||||
@@ -5,7 +5,6 @@ import cn.hutool.core.date.DateUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.volvo.ai.analytic.center.constant.Constant;
|
||||
import com.volvo.ai.analytic.center.dto.PageDto;
|
||||
import com.volvo.ai.analytic.center.dto.corpus.CorpusReportDTO;
|
||||
import com.volvo.ai.analytic.center.dto.corpus.OdsVdqwMessageOTD;
|
||||
@@ -33,7 +32,10 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDate;
|
||||
import java.util.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
@@ -119,7 +121,7 @@ public class TmOdsVdqwMessagearchivingServiceImpl extends ServiceImpl<TmOdsVdqwM
|
||||
|
||||
// 获取消息列表
|
||||
int optimalThreadPoolSize = Runtime.getRuntime().availableProcessors() + 1;
|
||||
log.info("获取的线程数:{}",optimalThreadPoolSize);
|
||||
log.info("企微处理总数据量:{},总页数:{},获取的线程数:{}",totalPages,totalPages,optimalThreadPoolSize);
|
||||
// 创建线程池
|
||||
ExecutorService executor = Executors.newFixedThreadPool(optimalThreadPoolSize); // 根据需求调整线程池大小
|
||||
|
||||
@@ -168,7 +170,7 @@ public class TmOdsVdqwMessagearchivingServiceImpl extends ServiceImpl<TmOdsVdqwM
|
||||
DiFyReq diFyImageReq = new DiFyReq();
|
||||
diFyImageReq.setUser(ConstantStr.corpus_user);
|
||||
diFyImageReq.setFlowId(qiweiToken);
|
||||
List<DataMaskingRule> maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(Constant.CHANNEL_DCC);
|
||||
List<DataMaskingRule> maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(BusinessTypeEnum.SMART_ASSISTANT_QIWEI.getCode());
|
||||
RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput();
|
||||
runMaskingRuleInput.setDataMaskingRules(maskingRuleItems);
|
||||
StringBuffer chatList = new StringBuffer();
|
||||
@@ -203,7 +205,7 @@ public class TmOdsVdqwMessagearchivingServiceImpl extends ServiceImpl<TmOdsVdqwM
|
||||
corpusReportDTO.setUserId(userId);
|
||||
corpusReportDTO.setAnalysisScene(1l);
|
||||
// 获取配置
|
||||
JSONObject execDifyFlow = diFyService.executeDifyFlow(diFyImageReq, BusinessTypeEnum.SMART_ASSISTANT.getCode(), JSONObject.toJSONString(corpusReportDTO),null);
|
||||
JSONObject execDifyFlow = diFyService.executeDifyFlow(diFyImageReq, BusinessTypeEnum.SMART_ASSISTANT_QIWEI.getCode(), JSONObject.toJSONString(corpusReportDTO),null);
|
||||
log.info("runDify execDifyFlow {}", execDifyFlow);
|
||||
if (null != execDifyFlow && execDifyFlow.get("status").equals("succeeded")) {
|
||||
String text = execDifyFlow.getJSONObject("outputs").getString("text");
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
package com.volvo.ai.analytic.center.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.volvo.ai.analytic.center.constant.Constant;
|
||||
import com.volvo.ai.analytic.center.dto.corpus.AicorpusTelephoneDTO;
|
||||
import com.volvo.ai.analytic.center.dto.corpus.CorpusReportDTO;
|
||||
import com.volvo.ai.analytic.center.dto.req.CarModelReqDTO;
|
||||
@@ -95,7 +92,7 @@ public class TmTelephoneCorpusServiceImpl extends ServiceImpl<TmTelephoneCorpusM
|
||||
|
||||
if(null != aicorpusTelephone){
|
||||
|
||||
List<DataMaskingRule> maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(Constant.CHANNEL_DCC);
|
||||
List<DataMaskingRule> maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(BusinessTypeEnum.SMART_ASSISTANT.getCode());
|
||||
|
||||
RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput();
|
||||
runMaskingRuleInput.setDataMaskingRules(maskingRuleItems);
|
||||
|
||||
@@ -14,5 +14,9 @@ public class ConstantStr {
|
||||
|
||||
public static final String CARMODELLIST_CACHEKEY = "ai_carmodellist";
|
||||
|
||||
public static final String INTELLIGENT_CUSTOMER_4IN1 = "INTELLIGENT_CUSTOMER_4IN1";
|
||||
|
||||
|
||||
|
||||
public static final String DIFY_COUNTERRATELIMIT = "DIFY_COUNTERRATELIMIT";
|
||||
}
|
||||
|
||||
@@ -13,9 +13,13 @@
|
||||
tt_ai_analysis_errors
|
||||
WHERE
|
||||
is_deleted = 0
|
||||
AND ai_analysis_request_type=#{businessType}
|
||||
AND ai_analysis_request_type in (
|
||||
<foreach collection="businessType" item="businessType" separator=",">
|
||||
#{businessType}
|
||||
</foreach>
|
||||
)
|
||||
AND ai_analysis_error_handling_status = '0'
|
||||
AND retry_count <= max_retry_count
|
||||
AND retry_count < max_retry_count
|
||||
)tag
|
||||
</select>
|
||||
|
||||
@@ -31,9 +35,13 @@
|
||||
tt_ai_analysis_errors
|
||||
WHERE
|
||||
is_deleted = 0
|
||||
AND ai_analysis_request_type=#{businessType}
|
||||
AND ai_analysis_request_type in (
|
||||
<foreach collection="businessType" item="businessType" separator=",">
|
||||
#{businessType}
|
||||
</foreach>
|
||||
)
|
||||
AND ai_analysis_error_handling_status = '0'
|
||||
AND retry_count <= max_retry_count
|
||||
AND retry_count < max_retry_count
|
||||
LIMIT #{offset}, #{pageSize}
|
||||
</select>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user