根据Mq消息解析并调用战败分析

This commit is contained in:
zhangfan
2024-12-16 17:34:21 +08:00
parent 91ef35ae9e
commit f0171e1597
22 changed files with 587 additions and 272 deletions

View File

@@ -3,4 +3,6 @@ package com.volvo.ai.analytic.center.constant;
public class Constant {
public static final String rabbitMqFormQueue = "Voc-Defeat-Dcc";
public static final String CHANNEL_DCC = "Channel_Dcc";
}

View File

@@ -0,0 +1,11 @@
package com.volvo.ai.analytic.center.dto.req;
import lombok.Data;
@Data
public class CallItem {
private String sessionId;
private String sourceId;
private String audioTime;
private int audioBillsec;
}

View File

@@ -0,0 +1,11 @@
package com.volvo.ai.analytic.center.dto.req;
import lombok.Data;
@Data
public class DiFyReq {
private String user;
private String flowId;
private Object inputs;
}

View File

@@ -0,0 +1,24 @@
package com.volvo.ai.analytic.center.dto.req;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class DiffDefeatanAlysis {
private String businessId;
private String vdqwUserId;
private String vdqwCustomerId;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date defeatTime;
private String approveCode;
private String approveResult;
private String approveOpinion;
private List<CallItem> callList;
}

View File

@@ -0,0 +1,12 @@
package com.volvo.ai.analytic.center.dto.req;
import lombok.Data;
@Data
public class DiffDefeatanApprove {
private String businessId;
private String approveCode;
private String approveResult;
private String approveOpinion;
}

View File

@@ -1,163 +1,14 @@
package com.volvo.ai.analytic.center.dto.req;
import java.util.List;
import lombok.Data;
/**
* mq消息体解析对象
*/
@Data
public class RabbitMqFormData {
private String formId;
private int sinceType;
private int subSinceType;
private Data data;
// Getters and Setters
public String getFormId() {
return formId;
}
public void setFormId(String formId) {
this.formId = formId;
}
public int getSinceType() {
return sinceType;
}
public void setSinceType(int sinceType) {
this.sinceType = sinceType;
}
public int getSubSinceType() {
return subSinceType;
}
public void setSubSinceType(int subSinceType) {
this.subSinceType = subSinceType;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
}
class Data {
private String businessId;
private String vdqwUserId;
private String vdqwCustomerId;
private String defeatTime;
private String approveCode;
private String approveResult;
private String approveOpinion;
private List<CallList> callList;
// Getters and Setters
public String getBusinessId() {
return businessId;
}
public void setBusinessId(String businessId) {
this.businessId = businessId;
}
public String getVdqwUserId() {
return vdqwUserId;
}
public void setVdqwUserId(String vdqwUserId) {
this.vdqwUserId = vdqwUserId;
}
public String getVdqwCustomerId() {
return vdqwCustomerId;
}
public void setVdqwCustomerId(String vdqwCustomerId) {
this.vdqwCustomerId = vdqwCustomerId;
}
public String getDefeatTime() {
return defeatTime;
}
public void setDefeatTime(String defeatTime) {
this.defeatTime = defeatTime;
}
public String getApproveCode() {
return approveCode;
}
public void setApproveCode(String approveCode) {
this.approveCode = approveCode;
}
public String getApproveResult() {
return approveResult;
}
public void setApproveResult(String approveResult) {
this.approveResult = approveResult;
}
public String getApproveOpinion() {
return approveOpinion;
}
public void setApproveOpinion(String approveOpinion) {
this.approveOpinion = approveOpinion;
}
public List<CallList> getCallList() {
return callList;
}
public void setCallList(List<CallList> callList) {
this.callList = callList;
}
}
class CallList {
private String sessionId;
private String sourceId;
private String audioTime;
private int audioBillsec;
// Getters and Setters
public String getSessionId() {
return sessionId;
}
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
public String getSourceId() {
return sourceId;
}
public void setSourceId(String sourceId) {
this.sourceId = sourceId;
}
public String getAudioTime() {
return audioTime;
}
public void setAudioTime(String audioTime) {
this.audioTime = audioTime;
}
public int getAudioBillsec() {
return audioBillsec;
}
public void setAudioBillsec(int audioBillsec) {
this.audioBillsec = audioBillsec;
}
private Object data;
}

View File

@@ -0,0 +1,13 @@
package com.volvo.ai.analytic.center.dto.resp;
import lombok.Data;
@Data
public class DiffDefeatAnalyseOutput {
private Integer handleStatus;
private String resultStr;
}

View File

@@ -0,0 +1,16 @@
package com.volvo.ai.analytic.center.dto.resp;
import lombok.Data;
@Data
public class DiffDefeatAnalyseOutputResult {
private DiffDefeatAnalyseOutput diffDefeatAnalyseOutput;
private String contentStr;
public DiffDefeatAnalyseOutputResult(DiffDefeatAnalyseOutput diffDefeatAnalyseOutput, String contentStr) {
this.diffDefeatAnalyseOutput = diffDefeatAnalyseOutput;
this.contentStr = contentStr;
}
}

View File

@@ -0,0 +1,11 @@
package com.volvo.ai.analytic.center.dto.resp;
import lombok.Data;
@Data
public class DiffDefeatResult {
private String userStatus;
private String appointmentResult;
}

View File

@@ -0,0 +1,19 @@
package com.volvo.ai.analytic.center.dto.resp;
import lombok.Data;
@Data
public class DiffDefeatanCallbak {
private String businessId;
private String responseCode;
private String responseMsg;
private String label;
private String describe;
}

View File

@@ -1,94 +1,15 @@
package com.volvo.ai.analytic.center.dto.resp;
import java.util.List;
import lombok.Data;
/**
* mq消息体解析对象
*/
@Data
public class RabbitMqToData {
private String formId;
private int sinceType;
private int subSinceType;
private Data data;
private DiffDefeatanCallbak data;
// Getters and Setters
public String getFormId() {
return formId;
}
public void setFormId(String formId) {
this.formId = formId;
}
public int getSinceType() {
return sinceType;
}
public void setSinceType(int sinceType) {
this.sinceType = sinceType;
}
public int getSubSinceType() {
return subSinceType;
}
public void setSubSinceType(int subSinceType) {
this.subSinceType = subSinceType;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
}
class Data {
private String businessId;
private String responseCode;
private String responseMsg;
private String label;
private String describe;
public String getBusinessId() {
return businessId;
}
public void setBusinessId(String businessId) {
this.businessId = businessId;
}
public String getResponseCode() {
return responseCode;
}
public void setResponseCode(String responseCode) {
this.responseCode = responseCode;
}
public String getResponseMsg() {
return responseMsg;
}
public void setResponseMsg(String responseMsg) {
this.responseMsg = responseMsg;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
}

View File

@@ -29,18 +29,6 @@ public class DataMaskingRule extends BaseEntity {
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 创建人
*/

View File

@@ -26,18 +26,6 @@ public class DiffdefeatApprove extends BaseEntity {
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 创建人
*/

View File

@@ -100,18 +100,6 @@ public class MqMessageRecord extends BaseEntity {
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 创建人
*/

View File

@@ -0,0 +1,20 @@
package com.volvo.ai.analytic.center.enums;
public enum MqTaskStatusEnum {
Analysis_Wait(0, "待分析"),
Analysis_Underway(1, "分析中"),
Analysis_Completion(2, "分析完成"),
Analysis_Failure(3, "分析失败"),
;
private int code;
private String name;
MqTaskStatusEnum(int code, String name) {
this.code = code;
this.name = name;
}
public int getCode() {
return this.code;
}
}

View File

@@ -0,0 +1,20 @@
package com.volvo.ai.analytic.center.enums;
public enum SubSinceTypeEnum {
SinceType51(51, "真假战败分析请求"),
SinceType52(52, "真假战败审批结果"),
SinceType53(53, "真假战败分析结果"),
;
private int code;
private String name;
SubSinceTypeEnum(int code, String name) {
this.code = code;
this.name = name;
}
public int getCode() {
return this.code;
}
}

View File

@@ -1,5 +1,6 @@
package com.volvo.ai.analytic.center.feign;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@@ -12,6 +13,6 @@ public interface DiFyFeign {
@PostMapping(value = "v1/workflows/run"
, consumes = MediaType.APPLICATION_JSON_VALUE
, produces = MediaType.APPLICATION_JSON_VALUE)
Object runWorkflows(@RequestHeader(value = "Authorization") String authorization, @RequestBody Map<String, Object> map);
JSONObject runWorkflows(@RequestHeader(value = "Authorization") String authorization, @RequestBody Map<String, Object> map);
}

View File

@@ -0,0 +1,9 @@
package com.volvo.ai.analytic.center.service;
import com.volvo.ai.analytic.center.dto.req.DiFyReq;
public interface DiFyService {
public Object getDiFyObject(DiFyReq diFyReq);
}

View File

@@ -1,7 +1,19 @@
package com.volvo.ai.analytic.center.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.volvo.ai.analytic.center.dto.req.DiffDefeatanAlysis;
import com.volvo.ai.analytic.center.dto.resp.DiffDefeatAnalyseOutputResult;
import com.volvo.ai.analytic.center.entity.MqMessageRecord;
public interface MqMessageRecordService extends IService<MqMessageRecord> {
//mq消息处理方法
boolean processMessageByMQ(String message);
//处理聊天和语音记录
DiffDefeatAnalyseOutputResult processChatRecord(DiffDefeatanAlysis input);
//定时任务补偿处理消息
void processMessageByTask();
}

View File

@@ -10,12 +10,15 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j
@Service
public class DataMaskingRuleServiceImpl extends ServiceImpl<DataMaskingRuleMapper, DataMaskingRule> implements DataMaskingRuleService {
@Override
public List<DataMaskingRule> getDataMaskingRuleListByApplicationChannel(String applicationChannel) {
log.info("getDataMaskingRuleListByApplicationChannel {}", applicationChannel);
//根据适用渠道applicationChannel获取数据脱敏规则List
log.info("getDataMaskingRuleListByApplicationChannel applicationChannel:{}", applicationChannel);
List<DataMaskingRule> dataMaskingRuleList = this.lambdaQuery()
@@ -28,6 +31,26 @@ public class DataMaskingRuleServiceImpl extends ServiceImpl<DataMaskingRuleMappe
@Override
public String runMaskingRule(RunMaskingRuleInput input) {
return "";
String output = input.getOldStr();
if (input.getDataMaskingRules() != null && !input.getDataMaskingRules().isEmpty()) {
for (DataMaskingRule ruleItem : input.getDataMaskingRules()) {
try {
if ("文本".equals(ruleItem.getCategoryName())) {
output = output.replace(ruleItem.getRuleText(), ruleItem.getRuleMappingText());
} else if ("正则".equals(ruleItem.getCategoryName())) {
Pattern pattern = Pattern.compile(ruleItem.getRuleText(), Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(output);
while (matcher.find()) {
String matchedValue = matcher.group();
output = output.replace(matchedValue, ruleItem.getRuleMappingText());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
log.info("runMaskingRule input:{},output:{}", input, output);
return output;
}
}

View File

@@ -0,0 +1,36 @@
package com.volvo.ai.analytic.center.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.volvo.ai.analytic.center.dto.req.DiFyReq;
import com.volvo.ai.analytic.center.feign.DiFyFeign;
import com.volvo.ai.analytic.center.service.DiFyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Service
public class DiFyServiceImpl implements DiFyService{
@Autowired
private DiFyFeign diFyFeign;
@Override
public Object getDiFyObject(DiFyReq diFyReq) {
Map<String, Object> map = new HashMap<>();
map.put("inputs",diFyReq.getInputs());
map.put("response_mode","blocking");
map.put("user",diFyReq.getUser());
JSONObject difyResult = diFyFeign.runWorkflows("Bearer "+diFyReq.getFlowId(),map);
JSONObject data = difyResult.getJSONObject("data");
if (data != null && "succeeded".equals(data.get("status"))){
JSONObject outputs = data.getJSONObject("outputs");
return outputs;
}
return "";
}
}

View File

@@ -1,13 +1,352 @@
package com.volvo.ai.analytic.center.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.volvo.ai.analytic.center.constant.Constant;
import com.volvo.ai.analytic.center.dto.req.*;
import com.volvo.ai.analytic.center.dto.resp.*;
import com.volvo.ai.analytic.center.entity.DataMaskingRule;
import com.volvo.ai.analytic.center.entity.DiffdefeatApprove;
import com.volvo.ai.analytic.center.entity.MqMessageRecord;
import com.volvo.ai.analytic.center.enums.MqTaskStatusEnum;
import com.volvo.ai.analytic.center.enums.SubSinceTypeEnum;
import com.volvo.ai.analytic.center.mapper.MqMessageRecordMapper;
import com.volvo.ai.analytic.center.service.DataMaskingRuleService;
import com.volvo.ai.analytic.center.service.DiFyService;
import com.volvo.ai.analytic.center.service.DiffdefeatApproveService;
import com.volvo.ai.analytic.center.service.MqMessageRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
public class MqMessageRecordServiceImpl extends ServiceImpl<MqMessageRecordMapper, MqMessageRecord> implements MqMessageRecordService {
@Autowired
private DataMaskingRuleService dataMaskingRuleService;
@Autowired
private DiffdefeatApproveService diffdefeatApproveService;
@Autowired
private DiFyService diFyService;
/**
* 处理Mq消息
* @param message
* @return
*/
@Override
public boolean processMessageByMQ(String message) {
log.info("message: {}", message);
RabbitMqFormData oldItem = JSONObject.parseObject(message, RabbitMqFormData.class);
log.info("真假战败数据已获取 {}",oldItem.getFormId());
MqMessageRecord curMQMessageRecord = new MqMessageRecord();
try {
curMQMessageRecord.setSinceType(oldItem.getSinceType());
curMQMessageRecord.setSubSinceType(oldItem.getSubSinceType());
curMQMessageRecord.setBizNo(oldItem.getFormId());
curMQMessageRecord.setSubBizNo(oldItem.getFormId());
curMQMessageRecord.setMessageContent(message);
curMQMessageRecord.setRetryCount(0);
curMQMessageRecord.setLastRetryTime(new Date());
curMQMessageRecord.setTaskStatus(0);
this.save(curMQMessageRecord);
log.info("数据入库成功(MQMessageRecord)");
} catch (Exception ex) {
log.error("数据入库失败(MQMessageRecord)", ex.getMessage());
return false;
}
if (oldItem.getSinceType() == 2 && oldItem.getSubSinceType() == SubSinceTypeEnum.SinceType51.getCode() ) {
log.info("辨别数据为分析请求");
DiffDefeatResult diffDefeatResult = null;
DiffDefeatanAlysis diffDefeatanAlysis = JSON.parseObject(JSON.toJSONString(oldItem.getData()), DiffDefeatanAlysis.class);
DiffDefeatAnalyseOutputResult response = this.processChatRecord(diffDefeatanAlysis);
DiffDefeatAnalyseOutput output = response.getDiffDefeatAnalyseOutput();
log.info("数据分析完成");
if(output.getHandleStatus() == 200){
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Completion.getCode());
diffDefeatResult = JSONObject.parseObject(output.getResultStr(), DiffDefeatResult.class);
} else if (output.getHandleStatus() == 400) {
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Completion.getCode());
diffDefeatResult = new DiffDefeatResult();
diffDefeatResult.setUserStatus("无效通话");
diffDefeatResult.setAppointmentResult("因为通话时间太短没有ASR转义文本因此判断为无效通话");
} else {
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Failure.getCode());
}
curMQMessageRecord.setRespCode(output.getHandleStatus()+"");
curMQMessageRecord.setRespContent(output.getResultStr());
this.updateById(curMQMessageRecord);
log.info("数据更改分析状态完成");
if (curMQMessageRecord.getTaskStatus() == MqTaskStatusEnum.Analysis_Completion.getCode()){
log.info("数据分析结果正常");
DiffdefeatApprove curDiffdefeatApprove = new DiffdefeatApprove();
String userStatus = getUserStatus(diffDefeatResult.getUserStatus());
curDiffdefeatApprove.setFormId(oldItem.getFormId());
curDiffdefeatApprove.setBusinessId(diffDefeatanAlysis.getBusinessId());
curDiffdefeatApprove.setUserStatus(userStatus);
curDiffdefeatApprove.setAppointmentResult(diffDefeatResult.getAppointmentResult());
curDiffdefeatApprove.setInputStr(response.getContentStr());
curDiffdefeatApprove.setDefeatTime(diffDefeatanAlysis.getDefeatTime());
diffdefeatApproveService.save(curDiffdefeatApprove);
log.info("插入数据记录完成");
DiffDefeatanCallbak curDiffDefeatanCallbak = new DiffDefeatanCallbak();
curDiffDefeatanCallbak.setBusinessId(diffDefeatanAlysis.getBusinessId());
curDiffDefeatanCallbak.setResponseCode("200");
curDiffDefeatanCallbak.setLabel(userStatus);
curDiffDefeatanCallbak.setDescribe(diffDefeatResult.getAppointmentResult());
RabbitMqToData rabbitMqToData = new RabbitMqToData();
rabbitMqToData.setFormId(oldItem.getFormId());
rabbitMqToData.setSinceType(2);
rabbitMqToData.setSubSinceType(SubSinceTypeEnum.SinceType53.getCode());
rabbitMqToData.setData(curDiffDefeatanCallbak);
String callbakInput = JSONObject.toJSONString(rabbitMqToData);
//todo 发Mq给LTO
log.info("发送回调MQ完成: {}", callbakInput);
} else {
log.info("数据分析结果不正常,等待重试");
return false;
}
}
if (oldItem.getSinceType() == 2 && oldItem.getSubSinceType() == SubSinceTypeEnum.SinceType52.getCode()) {
log.info("辨别数据为审批结果");
com.volvo.ai.analytic.center.dto.req.DiffDefeatanApprove curDiffDefeatanApprove = JSON.parseObject(JSON.toJSONString(oldItem.getData()), com.volvo.ai.analytic.center.dto.req.DiffDefeatanApprove.class);
DiffdefeatApprove approveEntity = diffdefeatApproveService.lambdaQuery().eq(DiffdefeatApprove::getFormId, oldItem.getFormId()).last("limit 1").one();
if (approveEntity != null) {
try {
approveEntity.setApproveCode(curDiffDefeatanApprove.getApproveCode());
approveEntity.setApproveResult(curDiffDefeatanApprove.getApproveResult());
approveEntity.setApproveOpinion(curDiffDefeatanApprove.getApproveOpinion());
diffdefeatApproveService.updateById(approveEntity);
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Completion.getCode());
curMQMessageRecord.setRespCode("200");
this.updateById(curMQMessageRecord);
log.info("审批结果更新完成");
} catch (Exception e) {
log.error("审批结果更新失败",e.getMessage());
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Failure.getCode());
curMQMessageRecord.setRespContent(e.getMessage());
curMQMessageRecord.setRespCode("500");
this.updateById(curMQMessageRecord);
}
}
}
return true;
}
/**
* 处理聊天和语音数据
* @return
*/
@Override
public DiffDefeatAnalyseOutputResult processChatRecord(DiffDefeatanAlysis input) {
DiffDefeatAnalyseOutput output = new DiffDefeatAnalyseOutput();
String contentStr = "";
//获取脱敏配置信息
List<DataMaskingRule> maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(Constant.CHANNEL_DCC);
// 根据SourceId查询通话信息
List<String> sourceIds = input.getCallList().stream().map(CallItem::getSourceId).collect(Collectors.toList());
if (!sourceIds.isEmpty()) {
int asrCount = 0;
//todo 查询未完成解析的通话信息
if (asrCount > 0) {
output.setHandleStatus(500);
output.setResultStr("存在未完成解析的通话信息");
return new DiffDefeatAnalyseOutputResult(output, contentStr);
}
//todo 查询到的通话数据
}
// 查询企微的数据
if (input.getVdqwUserId() == null || input.getVdqwCustomerId() == null) {
log.info("企微用户信息为空,不附加企微数据");
}else {
//todo 查询到的企微数据
}
//todo 组装数据
if (StringUtils.isEmpty(contentStr)) {
output.setHandleStatus(400);
output.setResultStr("语料信息为空");
return new DiffDefeatAnalyseOutputResult(output, contentStr);
}
log.info("开始脱敏 {}", contentStr);
RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput();
runMaskingRuleInput.setOpinionId(input.getBusinessId());
runMaskingRuleInput.setOldStr(contentStr);
runMaskingRuleInput.setDataMaskingRules(maskingRuleItems);
String summaryText = dataMaskingRuleService.runMaskingRule(runMaskingRuleInput);
log.info("脱敏结果 {}", summaryText);
Map<String, Object> record = new HashMap<>();
record.put("record",summaryText);
DiFyReq diFyReq = new DiFyReq();
diFyReq.setUser("voc");
diFyReq.setFlowId("app-MVGxogM08CDCg7jMo7GNF6eS");
diFyReq.setInputs(record);
JSONObject difyResult = (JSONObject) diFyService.getDiFyObject(diFyReq);
output.setHandleStatus(200);
output.setResultStr(difyResult.getString("result"));
log.info("DiFy平台处理结果:{}", output.getResultStr());
return new DiffDefeatAnalyseOutputResult(output, contentStr);
}
@Override
public void processMessageByTask() {
log.info("开始处理任务");
Date currTime = new Date();
Date startTime = DateUtil.offsetDay(currTime, -3);
Date stopTime = DateUtil.offsetMinute(currTime, -5);
List<MqMessageRecord> mqMessageRecords = this.lambdaQuery()
.eq(MqMessageRecord::getTaskStatus, MqTaskStatusEnum.Analysis_Failure.getCode())
.eq(MqMessageRecord::getSinceType, 2)
.le(MqMessageRecord::getRetryCount, 3)
.ge(MqMessageRecord::getCreateTime, startTime)
.lt(MqMessageRecord::getLastRetryTime, stopTime)
.list();
if (CollectionUtils.isEmpty(mqMessageRecords)){
return ;
}
for (MqMessageRecord curMQMessageRecord : mqMessageRecords){
log.info("辨别数据为分析请求");
RabbitMqFormData oldItem = JSONObject.parseObject(curMQMessageRecord.getMessageContent(), RabbitMqFormData.class);
if (curMQMessageRecord.getSinceType() == 2 && curMQMessageRecord.getSubSinceType() == SubSinceTypeEnum.SinceType51.getCode() ) {
try {
DiffDefeatResult diffDefeatResult = null;
DiffDefeatanAlysis diffDefeatanAlysis = JSON.parseObject(JSON.toJSONString(oldItem.getData()), DiffDefeatanAlysis.class);
DiffDefeatAnalyseOutputResult response = this.processChatRecord(diffDefeatanAlysis);
DiffDefeatAnalyseOutput output = response.getDiffDefeatAnalyseOutput();
log.info("数据分析完成");
if(output.getHandleStatus() == 200){
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Completion.getCode());
diffDefeatResult = JSONObject.parseObject(output.getResultStr(), DiffDefeatResult.class);
} else if (output.getHandleStatus() == 400) {
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Completion.getCode());
diffDefeatResult = new DiffDefeatResult();
diffDefeatResult.setUserStatus("无效通话");
diffDefeatResult.setAppointmentResult("因为通话时间太短没有ASR转义文本因此判断为无效通话");
} else {
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Failure.getCode());
}
if (curMQMessageRecord.getTaskStatus() == MqTaskStatusEnum.Analysis_Completion.getCode()){
String userStatus = getUserStatus(diffDefeatResult.getUserStatus());
DiffdefeatApprove curDiffdefeatApprove = diffdefeatApproveService.lambdaQuery()
.eq(DiffdefeatApprove::getFormId, oldItem.getFormId())
.eq(DiffdefeatApprove::getBusinessId, curMQMessageRecord.getSubBizNo())
.orderByDesc(DiffdefeatApprove::getId)
.last("limit 1").one();
if(curDiffdefeatApprove!=null){
curDiffdefeatApprove.setAppointmentResult(diffDefeatResult.getAppointmentResult());
curDiffdefeatApprove.setUserStatus(userStatus);
curDiffdefeatApprove.setInputStr(response.getContentStr());
} else {
log.info("数据分析结果正常");
curDiffdefeatApprove = new DiffdefeatApprove();
curDiffdefeatApprove.setFormId(oldItem.getFormId());
curDiffdefeatApprove.setBusinessId(diffDefeatanAlysis.getBusinessId());
curDiffdefeatApprove.setUserStatus(userStatus);
curDiffdefeatApprove.setAppointmentResult(diffDefeatResult.getAppointmentResult());
curDiffdefeatApprove.setInputStr(response.getContentStr());
curDiffdefeatApprove.setDefeatTime(diffDefeatanAlysis.getDefeatTime());
diffdefeatApproveService.save(curDiffdefeatApprove);
log.info("插入数据记录完成");
}
DiffDefeatanCallbak curDiffDefeatanCallbak = new DiffDefeatanCallbak();
curDiffDefeatanCallbak.setBusinessId(diffDefeatanAlysis.getBusinessId());
curDiffDefeatanCallbak.setResponseCode("200");
curDiffDefeatanCallbak.setLabel(userStatus);
curDiffDefeatanCallbak.setDescribe(diffDefeatResult.getAppointmentResult());
RabbitMqToData rabbitMqToData = new RabbitMqToData();
rabbitMqToData.setFormId(oldItem.getFormId());
rabbitMqToData.setSinceType(2);
rabbitMqToData.setSubSinceType(SubSinceTypeEnum.SinceType53.getCode());
rabbitMqToData.setData(curDiffDefeatanCallbak);
String callbakInput = JSONObject.toJSONString(rabbitMqToData);
//todo 发Mq给LTO
log.info("发送回调MQ完成: {}", callbakInput);
}
curMQMessageRecord.setRespCode(output.getHandleStatus()+"");
curMQMessageRecord.setRespContent(output.getResultStr());
curMQMessageRecord.setLastRetryTime(new Date());
curMQMessageRecord.setRetryCount(curMQMessageRecord.getRetryCount()+1);
this.updateById(curMQMessageRecord);
log.info("数据更改分析状态完成");
} catch (Exception e) {
log.error("数据解析异常: {}", e.getMessage());
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Failure.getCode());
curMQMessageRecord.setRespCode("500");
curMQMessageRecord.setRespContent(e.getMessage());
curMQMessageRecord.setLastRetryTime(new Date());
curMQMessageRecord.setRetryCount(curMQMessageRecord.getRetryCount()+1);
this.updateById(curMQMessageRecord);
}
}
if (curMQMessageRecord.getSinceType() == 2 && curMQMessageRecord.getSubSinceType() == SubSinceTypeEnum.SinceType52.getCode()) {
try {
DiffdefeatApprove approveEntity = diffdefeatApproveService.lambdaQuery()
.eq(DiffdefeatApprove::getFormId, oldItem.getFormId())
.eq(DiffdefeatApprove::getBusinessId, curMQMessageRecord.getSubBizNo())
.orderByDesc(DiffdefeatApprove::getId)
.last("limit 1").one();
DiffDefeatanApprove curDiffDefeatanApprove = JSON.parseObject(JSON.toJSONString(oldItem.getData()), DiffDefeatanApprove.class);
if (approveEntity != null){
approveEntity.setApproveCode(curDiffDefeatanApprove.getApproveCode());
approveEntity.setApproveResult(curDiffDefeatanApprove.getApproveResult());
approveEntity.setApproveOpinion(curDiffDefeatanApprove.getApproveOpinion());
diffdefeatApproveService.updateById(approveEntity);
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Completion.getCode());
curMQMessageRecord.setRespCode("200");
curMQMessageRecord.setRespContent("");
curMQMessageRecord.setLastRetryTime(new Date());
curMQMessageRecord.setRetryCount(curMQMessageRecord.getRetryCount()+1);
this.updateById(curMQMessageRecord);
}
} catch (Exception e) {
log.error("数据解析异常: {}", e.getMessage());
curMQMessageRecord.setTaskStatus(MqTaskStatusEnum.Analysis_Failure.getCode());
curMQMessageRecord.setRespCode("500");
curMQMessageRecord.setRespContent(e.getMessage());
curMQMessageRecord.setLastRetryTime(new Date());
curMQMessageRecord.setRetryCount(curMQMessageRecord.getRetryCount()+1);
this.updateById(curMQMessageRecord);
}
}
}
}
private String getUserStatus(String oldStr)
{
if (oldStr == "确认到店"){
return "客户确认将到店";
}else if (oldStr == "继续观望"){
return "客户继续观望中";
}else if (oldStr == "放弃购车"){
return "客户放弃购车";
}else if (oldStr == "无效通话"){
return "近三天无有效通话记录";
}
return oldStr;
}
}