Merge remote-tracking branch 'origin/feature_20250424_4in1' into feature-20250424-release

# 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/TestController.java
#	ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DataMaskingRuleServiceImpl.java
This commit is contained in:
lxu75
2025-04-21 14:20:53 +08:00
26 changed files with 637 additions and 43 deletions

View File

@@ -5,4 +5,6 @@ public class Constant {
public static final String CHANNEL_DCC = "Channel_Dcc";
public static final String DISPLAY_STATUS = "FINISHED";
public static final String INTELLIGENT_CUSTOMER_4IN1 = "INTELLIGENT_CUSTOMER_4IN1";
}

View File

@@ -0,0 +1,32 @@
package com.volvo.ai.analytic.center.dto.req;
import lombok.Data;
/**
*
* @ClassName: FourRequestDTO
* @author: renzhen
* @Description: 四合一请求参数
* @date: 2025-04-02 10:36
*/
@Data
public class FourInOneRequestDTO {
// 语料唯一Id
private String workOrderId;
//【语料内容】不可为空"
private String workOrderContent;
// 消息来源
private String workOrderSource;
// 关联语料内容
private String relationCorpusContent;
private String aiAnalysisRequestId;
}

View File

@@ -0,0 +1,22 @@
package com.volvo.ai.analytic.center.dto.resp;
import lombok.Data;
/**
* @ClassName ComplainDTO
* @Description 四合一 投诉
* @Author renzhen
* @Date 2025-04-02 11:20
* @Version 1.0
**/
@Data
public class ComplainDTO {
private String orderType;
private String complainType;
private String complainTitle;
private String problemDescription;
private String contactTelephone;
private String contactName;
private String contactSex;
}

View File

@@ -0,0 +1,20 @@
package com.volvo.ai.analytic.center.dto.resp;
import lombok.Data;
/**
* @ClassName ComplainDTO
* @Description 四合一 咨询
* @Author renzhen
* @Date 2025-04-02 11:20
* @Version 1.0
**/
@Data
public class ConsultDTO {
private String orderType;
private String problemDescription;
private String contactTelephone;
private String contactName;
private String contactSex;
}

View File

@@ -0,0 +1,29 @@
package com.volvo.ai.analytic.center.dto.resp;
import lombok.Data;
/**
*
* @ClassName: FourRequestDTO
* @author: renzhen
* @Description: 四合一请求参数
* @date: 2025-04-02 10:36
*/
@Data
public class FourInOneResponseDTO {
// 语料唯一Id
private String workOrderId;
//投诉
private ComplainDTO complain;
// 咨询
private ConsultDTO consult;
private String aiAnalysisRequestId;
}

View File

@@ -0,0 +1,66 @@
package com.volvo.ai.analytic.center.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("tc_intelligent_customer")
public class TcIntelligentCustomer {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
// 咨询类【201】/投诉类【202】/投诉类型【203】
@TableField("intelligent_customer_type")
private String intelligentCustomerType;
@TableField("type_one")
private String typeOne;
@TableField("type_two")
private String typeTwo; // JSON 字符串
@TableField("type_three")
private String typeThree;
@TableField("is_deleted")
@TableLogic
private Integer isDeleted;
@TableField("versions")
@Version
private Integer versions;
/**
* 创建者
*/
@TableField("create_by")
private String createBy;
/**
* 创建时间
*/
@TableField("create_time")
private Date createTime;
/**
* 更新者
*/
@TableField("update_by")
private String updateBy;
/**
* 更新时间
*/
@TableField("update_time")
private Date updateTime;
}

View File

@@ -6,7 +6,9 @@ import lombok.Getter;
public enum BusinessTypeEnum {
COMMUNITYTARGET("CommunityTarget", "社区舆情分析"),
SMART_ASSISTANT("SMART_ASSISTANT", "智能助手"),
SMART_ASSISTANT("SMART_ASSISTANT", "智能助手-DCC"),
SMART_ASSISTANT_QIWEI("SMART_ASSISTANT_QIWEI", "智能助手-企微"),
INTELLIGENT_CUSTOMER("INTELLIGENT_CUSTOMER_4IN1", "智能客服-4合一"),
//索赔检核
CLAIM_VERIFICATION("CLAIM_VERIFICATION", "索赔检核流程"),

View File

@@ -0,0 +1,19 @@
package com.volvo.ai.analytic.center.enums;
import lombok.Getter;
@Getter
public enum IntelligentCustomerTypeEnum {
CONSULT("201", "咨询类"),
COMPLAIN("202", "投诉类"),
CONSULT_TYPE("203", "投诉类型")
;
private String code;
private String message;
IntelligentCustomerTypeEnum(String code, String message) {
this.code = code;
this.message = message;
}
}

View File

@@ -233,6 +233,12 @@
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version> <!-- 请根据需要选择合适的版本 -->
</dependency>
</dependencies>
<build>

View File

@@ -0,0 +1,48 @@
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.volvo.common.core.util.ResultMsg;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
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
@Api(tags = "AiDifyResult")
@RequestMapping("")
@Slf4j
@RefreshScope
public class AiDifyResultController {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Autowired
private AiAnalysisRequestLogsService aiAnalysisRequestLogsService;
@PostMapping("/updateByAiId")
@ApiOperation(value = "更新dify结果")
public ResultMsg<Object> updateByAiId(@RequestBody String message) {
JSONObject messageJson = JSONObject.parseObject(message);
AiAnalysisRequestLogs aiAnalysisRequestLogs = new AiAnalysisRequestLogs();
aiAnalysisRequestLogs.setAiAnalysisRequestId(messageJson.getString("aiAnalysisRequestId"));
aiAnalysisRequestLogs.setDifyResponse(messageJson.getString("difyResponse"));
aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(aiAnalysisRequestLogs);
return ResultMsg.ok("ok");
}
}

View File

@@ -1,6 +1,9 @@
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;
@@ -25,6 +28,9 @@ public class TestController {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Autowired
private AiAnalysisRequestLogsService aiAnalysisRequestLogsService;
@PostMapping("/mockMq")

View File

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

View File

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

View File

@@ -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> {
}

View File

@@ -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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -63,7 +63,6 @@ public class DiFyServiceImpl implements DiFyService{
.businessRequest(businessData)
.difyAgentKey(diFyReq.getFlowId())
.difyRequest(JSON.toJSONString(diFyReq))
.difyResponse(JSON.toJSONString(""))
.aiAnalysisRequestType(businessType)
.build());
@@ -75,7 +74,6 @@ public class DiFyServiceImpl implements DiFyService{
aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder()
.aiAnalysisRequestId(aiAnalysisRequestId)
.businessRequest(JSONObject.toJSONString(""))
.difyResponse(data.toJSONString())
.build());

View File

@@ -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;
}
**/
}

View File

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

View File

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

View File

@@ -13,4 +13,8 @@ public class ConstantStr {
public static final String corpus_user = "corpush_user";
public static final String CARMODELLIST_CACHEKEY = "ai_carmodellist";
public static final String INTELLIGENT_CUSTOMER_4IN1 = "INTELLIGENT_CUSTOMER_4IN1";
}

View File

@@ -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 &lt;= max_retry_count
AND retry_count &lt; 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 &lt;= max_retry_count
AND retry_count &lt; max_retry_count
LIMIT #{offset}, #{pageSize}
</select>