From 3702cc873eb33a63e5f63800275155d78cb0948e Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 11 Apr 2025 16:00:35 +0800 Subject: [PATCH 01/28] =?UTF-8?q?=E7=BB=93=E6=9E=9C=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AiDifyResultController.java | 14 ++++-------- .../center/service/AiDifyResultService.java | 9 ++++++++ .../service/impl/AiDifyResultServiceImpl.java | 22 +++++++++++++++++++ 3 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiDifyResultService.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java index ab11a96..393ee94 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java @@ -1,9 +1,7 @@ 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.ai.analytic.center.service.AiDifyResultService; import com.volvo.common.core.util.ResultMsg; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -19,7 +17,6 @@ import org.springframework.web.bind.annotation.RestController; @RestController @Api(tags = "测试类API") -@RequestMapping("") @Slf4j @RefreshScope public class AiDifyResultController { @@ -28,18 +25,15 @@ public class AiDifyResultController { private RocketMQTemplate rocketMQTemplate; @Autowired - private AiAnalysisRequestLogsService aiAnalysisRequestLogsService; + private AiDifyResultService AiDifyResultService; @PostMapping("/updateByAiId") @ApiOperation(value = "更新dify结果") public ResultMsg 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); + log.info("updateByAiId message: {}",message); + AiDifyResultService.updateAiDifyResult(message); return ResultMsg.ok("ok"); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiDifyResultService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiDifyResultService.java new file mode 100644 index 0000000..677011e --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiDifyResultService.java @@ -0,0 +1,9 @@ +package com.volvo.ai.analytic.center.service; + +import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; + +public interface AiDifyResultService { + + public boolean updateAiDifyResult(String message); + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java new file mode 100644 index 0000000..aa669ff --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java @@ -0,0 +1,22 @@ +package com.volvo.ai.analytic.center.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; +import com.volvo.ai.analytic.center.service.AiDifyResultService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AiDifyResultServiceImpl implements AiDifyResultService { + + @Override + public boolean updateAiDifyResult(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 false; + } +} From 6fa800b97296bc71462b45a036a596983ce039d7 Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 11 Apr 2025 17:29:57 +0800 Subject: [PATCH 02/28] =?UTF-8?q?difyresult=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/enums/BusinessTypeEnum.java | 7 +- .../service/AiAnalysisRequestLogsService.java | 2 +- .../AiAnalysisRequestLogsServiceImpl.java | 7 ++ .../service/impl/AiDifyResultServiceImpl.java | 87 ++++++++++++++++++- 4 files changed, 98 insertions(+), 5 deletions(-) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/BusinessTypeEnum.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/BusinessTypeEnum.java index 4f19e9f..369e06c 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/BusinessTypeEnum.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/BusinessTypeEnum.java @@ -6,8 +6,11 @@ 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合一") + + ; private String code; private String message; diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisRequestLogsService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisRequestLogsService.java index d7bdef1..348739c 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisRequestLogsService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisRequestLogsService.java @@ -6,6 +6,6 @@ import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; public interface AiAnalysisRequestLogsService extends IService { boolean saveAiAnalysisRequestLogs(AiAnalysisRequestLogs aiAnalysisRequestLogs); - + AiAnalysisRequestLogs queryByAiAnalysisRequestId(String aiAnalysisRequestId); AiAnalysisRequestLogs queryAiAnalysisRequestLogsByBusinessReponse(String sourceId); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisRequestLogsServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisRequestLogsServiceImpl.java index 0c2c050..6fed055 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisRequestLogsServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisRequestLogsServiceImpl.java @@ -32,6 +32,13 @@ public class AiAnalysisRequestLogsServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AiAnalysisRequestLogs::getAiAnalysisRequestId, aiAnalysisRequestId); + return aiAnalysisRequestLogsMapper.selectOne(queryWrapper); + } + @Override public AiAnalysisRequestLogs queryAiAnalysisRequestLogsByBusinessReponse(String sourceId) { return aiAnalysisRequestLogsMapper.queryAiAnalysisRequestLogsByBusinessReponse(sourceId); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java index aa669ff..c4a0c8f 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java @@ -1,22 +1,105 @@ package com.volvo.ai.analytic.center.service.impl; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.volvo.ai.analytic.center.dto.corpus.AicorpusTelephoneDTO; +import com.volvo.ai.analytic.center.dto.corpus.CorpusReportDTO; +import com.volvo.ai.analytic.center.entity.AiAnalysisErrors; import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; +import com.volvo.ai.analytic.center.enums.BusinessTypeEnum; +import com.volvo.ai.analytic.center.enums.CategoryEnum; +import com.volvo.ai.analytic.center.mapper.TmTelephoneCorpusMapper; +import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.AiDifyResultService; +import com.volvo.ai.analytic.center.utils.FlowResultSplitUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + @Slf4j @Service public class AiDifyResultServiceImpl implements AiDifyResultService { + @Autowired + private AiAnalysisRequestLogsService aiAnalysisRequestLogsService; + + @Autowired + private TmTelephoneCorpusMapper tmTelephoneCorpusMapper; + @Override public boolean updateAiDifyResult(String message) { JSONObject messageJson = JSONObject.parseObject(message); + String aiAnalysisRequestId = messageJson.getString("aiAnalysisRequestId"); + + String difyResponse = messageJson.getString("difyResponse"); + AiAnalysisRequestLogs oldAiAnalysisRequestLogs = aiAnalysisRequestLogsService.queryByAiAnalysisRequestId(aiAnalysisRequestId); + + if (null == oldAiAnalysisRequestLogs) { + log.info("根据aiAnalysisRequestId查询的log为空"); + return false; + } + Map ltoMap = null; + // 特殊处理 + List analysisRequestTypeList = Arrays.asList(BusinessTypeEnum.SMART_ASSISTANT.getCode(), BusinessTypeEnum.SMART_ASSISTANT_QIWEI.getCode()); + if(analysisRequestTypeList.contains(oldAiAnalysisRequestLogs.getAiAnalysisRequestType())){ + // 结果特殊封装 + if(oldAiAnalysisRequestLogs.getAiAnalysisRequestType().equals(BusinessTypeEnum.SMART_ASSISTANT.getCode())){ + ltoMap = sendDccCorpus(oldAiAnalysisRequestLogs,difyResponse); + } + + if(oldAiAnalysisRequestLogs.getAiAnalysisRequestType().equals(BusinessTypeEnum.SMART_ASSISTANT_QIWEI.getCode())){ + + } + } + AiAnalysisRequestLogs aiAnalysisRequestLogs = new AiAnalysisRequestLogs(); - aiAnalysisRequestLogs.setAiAnalysisRequestId(messageJson.getString("aiAnalysisRequestId")); - aiAnalysisRequestLogs.setDifyResponse(messageJson.getString("difyResponse")); + aiAnalysisRequestLogs.setAiAnalysisRequestId(aiAnalysisRequestId); + aiAnalysisRequestLogs.setDifyResponse(difyResponse); + aiAnalysisRequestLogs.setBusinessResponse(JSONObject.toJSONString(ltoMap)); aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(aiAnalysisRequestLogs); + +// aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder().aiAnalysisRequestId(aiAnalysisRequestId).businessResponse(JSONObject.toJSONString(ltoMap)).build()); + return false; } + + Map sendDccCorpus(AiAnalysisRequestLogs oldAiAnalysisRequestLogs,String difyResponse ){ + CorpusReportDTO corpusReportDTO = JSONObject.parseObject(oldAiAnalysisRequestLogs.getBusinessRequest(), CorpusReportDTO.class); + String text = JSONObject.parseObject(difyResponse).getJSONObject("outputs").getString("text"); + String resultStrOne = FlowResultSplitUtil.flowOutputTextSplit(text, "任务1", "任务2"); + String resultStrTwo =FlowResultSplitUtil.flowOutputTextSplit(text, "任务2", null); + if (StringUtils.isBlank(resultStrOne) || StringUtils.isBlank(resultStrTwo)){ + log.info("电话语料解析为空,text:{}", text); + return null; + } + List dccDtoList = tmTelephoneCorpusMapper.queryTelephoneCorpusBySourceIds( Arrays.asList(corpusReportDTO.getRecordId())); + if(CollectionUtils.isNotEmpty(dccDtoList)){ + AicorpusTelephoneDTO dccDto = dccDtoList.get(0); + JSONObject jsonObject = JSONObject.parseObject( dccDto.getDisplay()); + ZonedDateTime zonedDateTime = ZonedDateTime.parse(jsonObject.getString("start_time")); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String formattedDateStartTime = zonedDateTime.format(formatter); + Map ltoMap = new HashMap(); + ltoMap.put("analysisRecordId", oldAiAnalysisRequestLogs.getAiAnalysisRequestId()); + ltoMap.put("analysisScene", "2"); + ltoMap.put("recordId", corpusReportDTO.getRecordId()); + ltoMap.put("communicateDate", formattedDateStartTime); + ltoMap.put("analysisResult", resultStrOne); + ltoMap.put("analysisDetail", resultStrTwo); + // 发送MQ + + log.info("send mq {}",ltoMap); + return ltoMap; + } + return null; + } } From 766a8729a4c71547d08fa1cf641fc3ac52829648 Mon Sep 17 00:00:00 2001 From: zren25 Date: Mon, 14 Apr 2025 17:43:52 +0800 Subject: [PATCH 03/28] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AiDifyResultServiceImpl.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java index c4a0c8f..acca000 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java @@ -1,21 +1,28 @@ package com.volvo.ai.analytic.center.service.impl; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.volvo.ai.analytic.center.dto.corpus.AicorpusTelephoneDTO; import com.volvo.ai.analytic.center.dto.corpus.CorpusReportDTO; import com.volvo.ai.analytic.center.entity.AiAnalysisErrors; import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; +import com.volvo.ai.analytic.center.entity.TtVdqwRecord; import com.volvo.ai.analytic.center.enums.BusinessTypeEnum; import com.volvo.ai.analytic.center.enums.CategoryEnum; import com.volvo.ai.analytic.center.mapper.TmTelephoneCorpusMapper; import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.AiDifyResultService; +import com.volvo.ai.analytic.center.service.TmTelephoneCorpusService; import com.volvo.ai.analytic.center.utils.FlowResultSplitUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.client.producer.SendCallback; +import org.apache.rocketmq.client.producer.SendResult; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Service; import java.time.ZonedDateTime; @@ -35,6 +42,9 @@ public class AiDifyResultServiceImpl implements AiDifyResultService { @Autowired private TmTelephoneCorpusMapper tmTelephoneCorpusMapper; + @Autowired + private TmTelephoneCorpusService tmTelephoneCorpusService; + @Override public boolean updateAiDifyResult(String message) { JSONObject messageJson = JSONObject.parseObject(message); @@ -57,7 +67,7 @@ public class AiDifyResultServiceImpl implements AiDifyResultService { } if(oldAiAnalysisRequestLogs.getAiAnalysisRequestType().equals(BusinessTypeEnum.SMART_ASSISTANT_QIWEI.getCode())){ - + ltoMap = sendQiweiCorpus(oldAiAnalysisRequestLogs,difyResponse); } } @@ -69,6 +79,7 @@ public class AiDifyResultServiceImpl implements AiDifyResultService { // aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder().aiAnalysisRequestId(aiAnalysisRequestId).businessResponse(JSONObject.toJSONString(ltoMap)).build()); + tmTelephoneCorpusService.sendMq( CategoryEnum.ENTERPRISE_WECHAT.getCode(), JSONObject.toJSONString(ltoMap)); return false; } @@ -102,4 +113,29 @@ public class AiDifyResultServiceImpl implements AiDifyResultService { } return null; } + + public Map sendQiweiCorpus(AiAnalysisRequestLogs aiAnalysisRequestLogs,String difyResponse) { + CorpusReportDTO corpusReportDTO = JSONObject.parseObject(aiAnalysisRequestLogs.getBusinessRequest(), CorpusReportDTO.class); + JSONObject execDifyFlow = JSONObject.parseObject(difyResponse); + String text = execDifyFlow.getJSONObject("outputs").getString("text"); + String resultStrOne = FlowResultSplitUtil.flowOutputTextSplit(text, "任务1", "任务2"); + String resultStrTwo = FlowResultSplitUtil.flowOutputTextSplit(text, "任务2", null); + if (StringUtils.isBlank(resultStrOne) || StringUtils.isBlank(resultStrTwo)){ + log.info("企微语料解析为空,text:{}", text); + return null; + } + Map ltoMap = new HashMap<>(); + ltoMap.put("analysisRecordId", execDifyFlow.getString("aiAnalysisRequestId")); + ltoMap.put("analysisScene", "1"); + ltoMap.put("unionId", corpusReportDTO.getUnionId()); + ltoMap.put("consultantId", corpusReportDTO.getUserId()); + ltoMap.put("communicateDate", corpusReportDTO.getCorpusTime()); + ltoMap.put("analysisResult", resultStrOne); + ltoMap.put("analysisDetail", resultStrTwo); + // 发送MQ + log.info("send mq {}", ltoMap); + return ltoMap; + } + + } From 0f9e21e86c9ff893bbd0442215f96fb030ab10b2 Mon Sep 17 00:00:00 2001 From: zren25 Date: Tue, 15 Apr 2025 18:06:27 +0800 Subject: [PATCH 04/28] =?UTF-8?q?=E8=AF=B7=E6=B1=82AI=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytic/center/dto/req/AnalysisReq.java | 33 +++ .../dto/resp/AnalysisDifyResultDTO.java | 24 ++ .../center/dto/resp/AnalysisResp.java | 57 +++++ .../center/entity/AiAnalysisRequestLogs.java | 12 + .../center/entity/TcBusinessType.java | 73 ++++++ ...ler.java => AiAnalysisDifyController.java} | 20 +- .../center/mapper/TcBusinessTypeMapper.java | 11 + .../mq/AnalysisDifyCallbackMqConsumer.java | 82 +++++++ .../center/mq/AnalysisDifyMqConsumer.java | 76 +++++++ .../center/service/AiAnalysisDifyService.java | 13 ++ .../center/service/AiDifyResultService.java | 9 - .../analytic/center/service/DiFyService.java | 4 + .../impl/AiAnalysisDifyServiceImpl.java | 212 ++++++++++++++++++ .../service/impl/AiDifyResultServiceImpl.java | 141 ------------ .../center/service/impl/DiFyServiceImpl.java | 10 + 15 files changed, 621 insertions(+), 156 deletions(-) create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/AnalysisDifyResultDTO.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/AnalysisResp.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TcBusinessType.java rename ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/{AiDifyResultController.java => AiAnalysisDifyController.java} (62%) create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TcBusinessTypeMapper.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java delete mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiDifyResultService.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java delete mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java new file mode 100644 index 0000000..0c0b811 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java @@ -0,0 +1,33 @@ +package com.volvo.ai.analytic.center.dto.req; + +import lombok.Data; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; + +/** + * + * @ClassName: AnalysisRequest + * @author: renzhen + * @Description: Ai解析请求参数 + * @date: 2025-04-15 13:39 + */ +@Data +public class AnalysisReq { + + // 请求的所有参数 + @NotNull(message = "请求语料不能为空") + private Object data; + + // 回调地址 + @NotNull(message = "回调地址不能为空") + private String callbackUrl; + + // aiId + private String aiAnalysisRequestId; + + // 业务类型 + @NotNull(message = "业务类型不能为空") + private String aiAnalysisRequestType; + +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/AnalysisDifyResultDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/AnalysisDifyResultDTO.java new file mode 100644 index 0000000..b47b7ea --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/AnalysisDifyResultDTO.java @@ -0,0 +1,24 @@ +package com.volvo.ai.analytic.center.dto.resp; + +import lombok.Data; + +/** + * + * @ClassName: AnalysisRequest + * @author: renzhen + * @Description: 工作流处理结果 + * @date: 2025-04-15 13:39 + */ +@Data +public class AnalysisDifyResultDTO{ + + // 响应 + private String workflowRunId; + private String workflowAppId; + private String workUserId; + // 分析中心唯一ID + private String aiAnalysisRequestId; + private String difyResponse; + + private String aiAnalysisRequestType; +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/AnalysisResp.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/AnalysisResp.java new file mode 100644 index 0000000..21a11ab --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/AnalysisResp.java @@ -0,0 +1,57 @@ +package com.volvo.ai.analytic.center.dto.resp; + +import com.volvo.common.core.constant.CommonConstants; +import com.volvo.common.core.util.ResultMsg; +import lombok.Data; + +/** + * + * @ClassName: AnalysisRequest + * @author: renzhen + * @Description: Ai解析响应 + * @date: 2025-04-15 13:39 + */ +@Data +public class AnalysisResp { + + // 响应 + private T data; + + // 分析中心唯一ID + private String aiAnalysisRequestId; + + private int code; + private String msg; + + public static AnalysisResp success(String message) { + return (AnalysisResp) analysisResp((Object)null, CommonConstants.SUCCESS, message); + } + public static AnalysisResp success(T data, String aiAnalysisRequestId) { + AnalysisResp analysisResp = new AnalysisResp(); + analysisResp.setAiAnalysisRequestId(aiAnalysisRequestId); + analysisResp.setData(data); + analysisResp.setMsg("ok"); + analysisResp.setCode(CommonConstants.SUCCESS); + return analysisResp; + } + public static AnalysisResp failed(String message) { + return (AnalysisResp) analysisResp((Object)null, CommonConstants.FAIL, message); + } + + private static AnalysisResp analysisResp(T data, int code, String msg) { + AnalysisResp analysisResp = new AnalysisResp(); + analysisResp.setCode(code); + analysisResp.setData(data); + analysisResp.setMsg(msg); + return analysisResp; + } + + private static AnalysisResp analysisResp(T data, String aiAnalysisRequestId) { + AnalysisResp analysisResp = new AnalysisResp(); + analysisResp.setAiAnalysisRequestId(aiAnalysisRequestId); + analysisResp.setData(data); + analysisResp.setMsg("ok"); + analysisResp.setCode(CommonConstants.SUCCESS); + return analysisResp; + } +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/AiAnalysisRequestLogs.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/AiAnalysisRequestLogs.java index 9ef50ac..69402b7 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/AiAnalysisRequestLogs.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/AiAnalysisRequestLogs.java @@ -43,6 +43,18 @@ public class AiAnalysisRequestLogs { @TableField("dify_agent_key") private String difyAgentKey; + @TableField("workflowRunId") + private String workflowRunId; + + @TableField("workflowAppId") + private String workflowAppId; + + @TableField("workUserId") + private String workUserId; + + @TableField("callback_url") + private String callbackUrl; + @TableField("is_deleted") @TableLogic private Integer isDeleted; diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TcBusinessType.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TcBusinessType.java new file mode 100644 index 0000000..fd36142 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TcBusinessType.java @@ -0,0 +1,73 @@ +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_business_type") +public class TcBusinessType { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("business_request_type") + private String businessRequestType; + + @TableField("business_request_desc") + private String businessRequestDesc; + + @TableField("business_type_topic") + private String businessTypeTopic; // JSON 字符串 + + @TableField("business_type_topic_tag") + private String businessTypeTopicTag; + + @TableField("workflow_api_key") + private String workflowApiKey; // JSON 字符串 + + @TableField("workflow_user") + private String workflowUser; + + @TableField("max_retry_count") + private Integer maxRetryCount; + + @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; +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java similarity index 62% rename from ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java rename to ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java index 393ee94..d2b908e 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java @@ -1,7 +1,9 @@ package com.volvo.ai.analytic.center.controller; -import com.volvo.ai.analytic.center.service.AiDifyResultService; +import com.volvo.ai.analytic.center.dto.req.AnalysisReq; +import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; +import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; import com.volvo.common.core.util.ResultMsg; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -11,21 +13,20 @@ 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 = "测试类API") +@RestController("analysis") +@Api(tags = "分析中心接口") @Slf4j @RefreshScope -public class AiDifyResultController { +public class AiAnalysisDifyController { @Autowired private RocketMQTemplate rocketMQTemplate; @Autowired - private AiDifyResultService AiDifyResultService; + private AiAnalysisDifyService AiDifyResultService; @@ -37,6 +38,13 @@ public class AiDifyResultController { return ResultMsg.ok("ok"); } + @PostMapping("/aiAnalyze") + @ApiOperation(value = "Ai解析接口") + public AnalysisResp aiAnalyze(@RequestBody AnalysisReq analysisReq) { + log.info("aiAnalyze data: {}",analysisReq); + return AnalysisResp.success("ok"); + } + } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TcBusinessTypeMapper.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TcBusinessTypeMapper.java new file mode 100644 index 0000000..d381fdd --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TcBusinessTypeMapper.java @@ -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.TcBusinessType; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface TcBusinessTypeMapper extends BaseMapper { + + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java new file mode 100644 index 0000000..35dbf3e --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java @@ -0,0 +1,82 @@ + +package com.volvo.ai.analytic.center.mq; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.volvo.ai.analytic.center.dto.req.DiFyReq; +import com.volvo.ai.analytic.center.dto.resp.AnalysisDifyResultDTO; +import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; +import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; +import com.volvo.ai.analytic.center.service.DiFyService; +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.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import java.util.concurrent.CompletableFuture; + +/** + * @ClassName AnalysisDifyMqConsumer + * @Description AI解析MQ-Callback处理 + * @Author renzhen + * @Date 2025-03-04 10:18 + * @Version 1.0 + **/ + +@Slf4j +@Component +@RefreshScope +@RestController +@RocketMQMessageListener(topic = "${rocketmq.consumer.analysisDify.callbackTopic}",consumerGroup = "${rocketmq.consumer.analysisDify.callbackGroup}", + instanceName = "analysisDifyCallbackMqConsumer", + consumeThreadNumber = 40, + enableMsgTrace = true) +public class AnalysisDifyCallbackMqConsumer implements RocketMQListener { + + + @Autowired + private AiAnalysisRequestLogsService aiAnalysisRequestLogsService; + + @Value("${dify.corpus.checkDccRepeat}") + private String checkDccRepeat; + + @Autowired + private DiFyService diFyService; + + @Autowired + private RestTemplate restTemplate; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public void onMessage(MessageExt messageExt) { + long startTime = System.currentTimeMillis(); + try { + log.info("analysisDifyCallbackMqConsumer 当前线程: {}, 线程ID: {}", Thread.currentThread().getName(), Thread.currentThread().getId()); + String message = new String(messageExt.getBody()); + log.info("analysisDifyCallbackMqConsumer message: " + message); + AnalysisDifyResultDTO analysisResp = JSONObject.parseObject(message, AnalysisDifyResultDTO.class); + AiAnalysisRequestLogs aiAnalysisRequestLogs = aiAnalysisRequestLogsService.queryByAiAnalysisRequestId(analysisResp.getAiAnalysisRequestId()); + + ResponseEntity response = restTemplate.getForEntity(aiAnalysisRequestLogs.getCallbackUrl(), String.class); + + if (response.getStatusCode().is2xxSuccessful()) { + log.info("analysisDifyCallbackMqConsumer aiAnalysisRequestId:{},回调请求成功,url:{}: " ,analysisResp.getAiAnalysisRequestId(), aiAnalysisRequestLogs.getCallbackUrl()); + } else { + log.info("analysisDifyCallbackMqConsumer aiAnalysisRequestId:{},回调请求失败,url:{}: " ,analysisResp.getAiAnalysisRequestId(), aiAnalysisRequestLogs.getCallbackUrl()); + } + log.info(" analysisDifyCallbackMqConsumer,耗时:{}", System.currentTimeMillis() - startTime); + } catch (Exception e) { + log.info(" analysisDifyCallbackMqConsumer mq 处理失败:{}", e.getMessage()); + } + } + +} + diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java new file mode 100644 index 0000000..74be96f --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -0,0 +1,76 @@ + +package com.volvo.ai.analytic.center.mq; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.volvo.ai.analytic.center.dto.corpus.AicorpusTelephoneDTO; +import com.volvo.ai.analytic.center.dto.req.DiFyReq; +import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; +import com.volvo.ai.analytic.center.service.DiFyService; +import com.volvo.ai.analytic.center.service.TmTelephoneCorpusService; +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.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.CompletableFuture; + +/** + * @ClassName AnalysisDifyMqConsumer + * @Description AI解析 MQ处理 + * @Author renzhen + * @Date 2025-03-04 10:18 + * @Version 1.0 + **/ + +@Slf4j +@Component +@RefreshScope +@RestController +@RocketMQMessageListener(topic = "${rocketmq.consumer.analysisDify.topic}",consumerGroup = "${rocketmq.consumer.analysisDify.group}", + instanceName = "analysisDifyMqConsumer", + consumeThreadNumber = 40, + enableMsgTrace = true) +public class AnalysisDifyMqConsumer implements RocketMQListener { + + + @Autowired + private AiAnalysisRequestLogsService aiAnalysisRequestLogsService; + + @Value("${dify.corpus.checkDccRepeat}") + private String checkDccRepeat; + + @Autowired + private DiFyService diFyService; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public void onMessage(MessageExt messageExt) { + long startTime = System.currentTimeMillis(); + try { + log.info("analysisDifyMqConsumer 当前线程: {}, 线程ID: {}", Thread.currentThread().getName(), Thread.currentThread().getId()); + String message = new String(messageExt.getBody()); + log.info("analysisDifyMqConsumer message: " + message); + DiFyReq difyReq = JSONObject.parseObject(message, DiFyReq.class); + CompletableFuture future = diFyService.asyncExecuteDifyFlow(difyReq); + future.thenAccept(result -> { + JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); + String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); + // 处理异步结果 + log.info("异步处理asyncExecuteDifyFlow完成aiAnalysisRequestId: {},处理结果:{}", aiAnalysisRequestId, result); + }); + log.info("analysisDifyMqConsumer处理完成,耗时:{}", System.currentTimeMillis() - startTime); + } catch (Exception e) { + log.info(" dcc mq 处理失败:{}", e.getMessage()); + } + } + +} + diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java new file mode 100644 index 0000000..2a12f06 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java @@ -0,0 +1,13 @@ +package com.volvo.ai.analytic.center.service; + +import com.volvo.ai.analytic.center.dto.req.AnalysisReq; +import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; + +public interface AiAnalysisDifyService { + + public boolean updateAiDifyResult(String message); + + + AnalysisResp aiAnalyze(AnalysisReq analysisReq); + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiDifyResultService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiDifyResultService.java deleted file mode 100644 index 677011e..0000000 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiDifyResultService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.volvo.ai.analytic.center.service; - -import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; - -public interface AiDifyResultService { - - public boolean updateAiDifyResult(String message); - -} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/DiFyService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/DiFyService.java index 7159e60..3bfba4a 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/DiFyService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/DiFyService.java @@ -3,6 +3,8 @@ package com.volvo.ai.analytic.center.service; import com.alibaba.fastjson.JSONObject; import com.volvo.ai.analytic.center.dto.req.DiFyReq; +import java.util.concurrent.CompletableFuture; + public interface DiFyService { @@ -11,4 +13,6 @@ public interface DiFyService { public JSONObject executeDifyFlow(DiFyReq diFyReq, String businessType, String businessData, String aiAnalysisRequestId); public JSONObject executeDifyFlow(DiFyReq diFyReq); + public CompletableFuture asyncExecuteDifyFlow(DiFyReq diFyReq); + } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java new file mode 100644 index 0000000..6a53fa2 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java @@ -0,0 +1,212 @@ +package com.volvo.ai.analytic.center.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.AnalysisReq; +import com.volvo.ai.analytic.center.dto.req.DiFyReq; +import com.volvo.ai.analytic.center.dto.resp.AnalysisDifyResultDTO; +import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; +import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; +import com.volvo.ai.analytic.center.entity.TcBusinessType; +import com.volvo.ai.analytic.center.enums.BusinessTypeEnum; +import com.volvo.ai.analytic.center.enums.CategoryEnum; +import com.volvo.ai.analytic.center.mapper.TcBusinessTypeMapper; +import com.volvo.ai.analytic.center.mapper.TmTelephoneCorpusMapper; +import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; +import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; +import com.volvo.ai.analytic.center.service.TmTelephoneCorpusService; +import com.volvo.ai.analytic.center.utils.AiAnalysisUtils; +import com.volvo.ai.analytic.center.utils.FlowResultSplitUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +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.messaging.support.MessageBuilder; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { + + @Autowired + private AiAnalysisRequestLogsService aiAnalysisRequestLogsService; + + @Autowired + private TmTelephoneCorpusMapper tmTelephoneCorpusMapper; + + @Autowired + private TmTelephoneCorpusService tmTelephoneCorpusService; + + @Autowired + private TcBusinessTypeMapper tcBusinessTypeMapper; + + @Value("${rocketmq.producer.analysisDify.topic}") + private String analysisDifyTopic; + + @Value("${rocketmq.producer.analysisDify.callbackTopic}") + private String callbackTopic; + @Resource + private RocketMQTemplate rocketMqTemplate; + @Override + public boolean updateAiDifyResult(String message) { + + if(StringUtils.isNotEmpty(message)){ + AnalysisDifyResultDTO analysisResp = JSONObject.parseObject(message, AnalysisDifyResultDTO.class); + + + AiAnalysisRequestLogs aiAnalysisRequestLogs = new AiAnalysisRequestLogs(); + aiAnalysisRequestLogs.setAiAnalysisRequestId(analysisResp.getAiAnalysisRequestId()); + aiAnalysisRequestLogs.setDifyResponse(analysisResp.getDifyResponse()); + aiAnalysisRequestLogs.setWorkflowRunId(analysisResp.getWorkflowRunId()); + aiAnalysisRequestLogs.setWorkflowAppId(analysisResp.getWorkflowRunId()); + aiAnalysisRequestLogs.setWorkUserId(analysisResp.getWorkUserId()); + aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(aiAnalysisRequestLogs); + + // 发送 mq + sendMq(callbackTopic, analysisResp); + return true; + } + + return false; + } + + @Override + public AnalysisResp aiAnalyze(AnalysisReq analysisReq) { + if(null == analysisReq){ + log.info("请求Ai解析对象为空!"); + return AnalysisResp.failed("请求Ai解析对象为空!"); + } + String aiAnalysisRequestId = StringUtils.isEmpty(analysisReq.getAiAnalysisRequestId())? AiAnalysisUtils.getAiAnalysisRequestId(analysisReq.getAiAnalysisRequestType()):analysisReq.getAiAnalysisRequestId(); + + Map queryTcBusinessType = queryTcBusinessType(); + TcBusinessType tcBusinessType = queryTcBusinessType.get(analysisReq.getAiAnalysisRequestType()); + if(null == tcBusinessType || StringUtils.isEmpty(tcBusinessType.getWorkflowApiKey())){ + log.info("接入业务类型未配置!"); + return AnalysisResp.failed("接入业务类型未配置!"); + } + + DiFyReq diFyReq = new DiFyReq(); + diFyReq.setUser(StringUtils.isEmpty(tcBusinessType.getWorkflowUser())?analysisReq.getAiAnalysisRequestType().concat("_USER"):tcBusinessType.getWorkflowUser()); + diFyReq.setFlowId(tcBusinessType.getWorkflowApiKey()); + // 发送mq消息 + JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(analysisReq.getData()), JSONObject.class); + difyRequest.put("aiAnalysisRequestId",aiAnalysisRequestId); + diFyReq.setInputs(difyRequest); + aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder() + .aiAnalysisRequestId(aiAnalysisRequestId) + .businessRequest(JSONObject.toJSONString(analysisReq.getData())) + .difyAgentKey(diFyReq.getFlowId()) + .difyRequest(JSON.toJSONString(diFyReq)) + .aiAnalysisRequestType(analysisReq.getAiAnalysisRequestType()) + .callbackUrl(analysisReq.getCallbackUrl()) + .build()); + sendMq(analysisDifyTopic, diFyReq); + return AnalysisResp.success(analysisReq.getData(),aiAnalysisRequestId); + } + + Map sendDccCorpus(AiAnalysisRequestLogs oldAiAnalysisRequestLogs,String difyResponse ){ + CorpusReportDTO corpusReportDTO = JSONObject.parseObject(oldAiAnalysisRequestLogs.getBusinessRequest(), CorpusReportDTO.class); + String text = JSONObject.parseObject(difyResponse).getJSONObject("outputs").getString("text"); + String resultStrOne = FlowResultSplitUtil.flowOutputTextSplit(text, "任务1", "任务2"); + String resultStrTwo =FlowResultSplitUtil.flowOutputTextSplit(text, "任务2", null); + if (StringUtils.isBlank(resultStrOne) || StringUtils.isBlank(resultStrTwo)){ + log.info("电话语料解析为空,text:{}", text); + return null; + } + List dccDtoList = tmTelephoneCorpusMapper.queryTelephoneCorpusBySourceIds( Arrays.asList(corpusReportDTO.getRecordId())); + if(CollectionUtils.isNotEmpty(dccDtoList)){ + AicorpusTelephoneDTO dccDto = dccDtoList.get(0); + JSONObject jsonObject = JSONObject.parseObject( dccDto.getDisplay()); + ZonedDateTime zonedDateTime = ZonedDateTime.parse(jsonObject.getString("start_time")); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String formattedDateStartTime = zonedDateTime.format(formatter); + Map ltoMap = new HashMap(); + ltoMap.put("analysisRecordId", oldAiAnalysisRequestLogs.getAiAnalysisRequestId()); + ltoMap.put("analysisScene", "2"); + ltoMap.put("recordId", corpusReportDTO.getRecordId()); + ltoMap.put("communicateDate", formattedDateStartTime); + ltoMap.put("analysisResult", resultStrOne); + ltoMap.put("analysisDetail", resultStrTwo); + // 发送MQ + + log.info("send mq {}",ltoMap); + return ltoMap; + } + return null; + } + + public Map sendQiweiCorpus(AiAnalysisRequestLogs aiAnalysisRequestLogs,String difyResponse) { + CorpusReportDTO corpusReportDTO = JSONObject.parseObject(aiAnalysisRequestLogs.getBusinessRequest(), CorpusReportDTO.class); + JSONObject execDifyFlow = JSONObject.parseObject(difyResponse); + String text = execDifyFlow.getJSONObject("outputs").getString("text"); + String resultStrOne = FlowResultSplitUtil.flowOutputTextSplit(text, "任务1", "任务2"); + String resultStrTwo = FlowResultSplitUtil.flowOutputTextSplit(text, "任务2", null); + if (StringUtils.isBlank(resultStrOne) || StringUtils.isBlank(resultStrTwo)){ + log.info("企微语料解析为空,text:{}", text); + return null; + } + Map ltoMap = new HashMap<>(); + ltoMap.put("analysisRecordId", execDifyFlow.getString("aiAnalysisRequestId")); + ltoMap.put("analysisScene", "1"); + ltoMap.put("unionId", corpusReportDTO.getUnionId()); + ltoMap.put("consultantId", corpusReportDTO.getUserId()); + ltoMap.put("communicateDate", corpusReportDTO.getCorpusTime()); + ltoMap.put("analysisResult", resultStrOne); + ltoMap.put("analysisDetail", resultStrTwo); + // 发送MQ + log.info("send mq {}", ltoMap); + return ltoMap; + } + + + public Map queryTcBusinessType() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TcBusinessType::getIsDeleted, "0"); + List tcBusinessTypeList =tcBusinessTypeMapper.selectList(queryWrapper); + return tcBusinessTypeList.stream() + .collect(Collectors.toMap( + TcBusinessType::getBusinessRequestType, + tcBusinessType -> tcBusinessType + )); + } + + public TcBusinessType queryTcBusinessType(String businessRequestType) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TcBusinessType::getBusinessRequestType, businessRequestType); + queryWrapper.eq(TcBusinessType::getIsDeleted, "0"); + TcBusinessType tcBusinessType =tcBusinessTypeMapper.selectOne(queryWrapper); + return tcBusinessType; + } + + private void sendMq(String topic, Object message){ + rocketMqTemplate.asyncSend(callbackTopic, MessageBuilder.withPayload(message).build(), + new SendCallback() { + @Override + public void onSuccess(SendResult sendResult) { + log.info("请求AI解析发送MQ成功消息体:{}", message); + } + @Override + public void onException(Throwable e) { + log.error("请求AI解析发送MQ异常消息体:{}, 异常:", message, e); + } + }, 10000); + } + + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java deleted file mode 100644 index acca000..0000000 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiDifyResultServiceImpl.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.volvo.ai.analytic.center.service.impl; - -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.volvo.ai.analytic.center.dto.corpus.AicorpusTelephoneDTO; -import com.volvo.ai.analytic.center.dto.corpus.CorpusReportDTO; -import com.volvo.ai.analytic.center.entity.AiAnalysisErrors; -import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; -import com.volvo.ai.analytic.center.entity.TtVdqwRecord; -import com.volvo.ai.analytic.center.enums.BusinessTypeEnum; -import com.volvo.ai.analytic.center.enums.CategoryEnum; -import com.volvo.ai.analytic.center.mapper.TmTelephoneCorpusMapper; -import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; -import com.volvo.ai.analytic.center.service.AiDifyResultService; -import com.volvo.ai.analytic.center.service.TmTelephoneCorpusService; -import com.volvo.ai.analytic.center.utils.FlowResultSplitUtil; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.rocketmq.client.producer.SendCallback; -import org.apache.rocketmq.client.producer.SendResult; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.messaging.support.MessageBuilder; -import org.springframework.stereotype.Service; - -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Slf4j -@Service -public class AiDifyResultServiceImpl implements AiDifyResultService { - - @Autowired - private AiAnalysisRequestLogsService aiAnalysisRequestLogsService; - - @Autowired - private TmTelephoneCorpusMapper tmTelephoneCorpusMapper; - - @Autowired - private TmTelephoneCorpusService tmTelephoneCorpusService; - - @Override - public boolean updateAiDifyResult(String message) { - JSONObject messageJson = JSONObject.parseObject(message); - String aiAnalysisRequestId = messageJson.getString("aiAnalysisRequestId"); - - String difyResponse = messageJson.getString("difyResponse"); - AiAnalysisRequestLogs oldAiAnalysisRequestLogs = aiAnalysisRequestLogsService.queryByAiAnalysisRequestId(aiAnalysisRequestId); - - if (null == oldAiAnalysisRequestLogs) { - log.info("根据aiAnalysisRequestId查询的log为空"); - return false; - } - Map ltoMap = null; - // 特殊处理 - List analysisRequestTypeList = Arrays.asList(BusinessTypeEnum.SMART_ASSISTANT.getCode(), BusinessTypeEnum.SMART_ASSISTANT_QIWEI.getCode()); - if(analysisRequestTypeList.contains(oldAiAnalysisRequestLogs.getAiAnalysisRequestType())){ - // 结果特殊封装 - if(oldAiAnalysisRequestLogs.getAiAnalysisRequestType().equals(BusinessTypeEnum.SMART_ASSISTANT.getCode())){ - ltoMap = sendDccCorpus(oldAiAnalysisRequestLogs,difyResponse); - } - - if(oldAiAnalysisRequestLogs.getAiAnalysisRequestType().equals(BusinessTypeEnum.SMART_ASSISTANT_QIWEI.getCode())){ - ltoMap = sendQiweiCorpus(oldAiAnalysisRequestLogs,difyResponse); - } - } - - AiAnalysisRequestLogs aiAnalysisRequestLogs = new AiAnalysisRequestLogs(); - aiAnalysisRequestLogs.setAiAnalysisRequestId(aiAnalysisRequestId); - aiAnalysisRequestLogs.setDifyResponse(difyResponse); - aiAnalysisRequestLogs.setBusinessResponse(JSONObject.toJSONString(ltoMap)); - aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(aiAnalysisRequestLogs); - -// aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder().aiAnalysisRequestId(aiAnalysisRequestId).businessResponse(JSONObject.toJSONString(ltoMap)).build()); - - tmTelephoneCorpusService.sendMq( CategoryEnum.ENTERPRISE_WECHAT.getCode(), JSONObject.toJSONString(ltoMap)); - return false; - } - - Map sendDccCorpus(AiAnalysisRequestLogs oldAiAnalysisRequestLogs,String difyResponse ){ - CorpusReportDTO corpusReportDTO = JSONObject.parseObject(oldAiAnalysisRequestLogs.getBusinessRequest(), CorpusReportDTO.class); - String text = JSONObject.parseObject(difyResponse).getJSONObject("outputs").getString("text"); - String resultStrOne = FlowResultSplitUtil.flowOutputTextSplit(text, "任务1", "任务2"); - String resultStrTwo =FlowResultSplitUtil.flowOutputTextSplit(text, "任务2", null); - if (StringUtils.isBlank(resultStrOne) || StringUtils.isBlank(resultStrTwo)){ - log.info("电话语料解析为空,text:{}", text); - return null; - } - List dccDtoList = tmTelephoneCorpusMapper.queryTelephoneCorpusBySourceIds( Arrays.asList(corpusReportDTO.getRecordId())); - if(CollectionUtils.isNotEmpty(dccDtoList)){ - AicorpusTelephoneDTO dccDto = dccDtoList.get(0); - JSONObject jsonObject = JSONObject.parseObject( dccDto.getDisplay()); - ZonedDateTime zonedDateTime = ZonedDateTime.parse(jsonObject.getString("start_time")); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - String formattedDateStartTime = zonedDateTime.format(formatter); - Map ltoMap = new HashMap(); - ltoMap.put("analysisRecordId", oldAiAnalysisRequestLogs.getAiAnalysisRequestId()); - ltoMap.put("analysisScene", "2"); - ltoMap.put("recordId", corpusReportDTO.getRecordId()); - ltoMap.put("communicateDate", formattedDateStartTime); - ltoMap.put("analysisResult", resultStrOne); - ltoMap.put("analysisDetail", resultStrTwo); - // 发送MQ - - log.info("send mq {}",ltoMap); - return ltoMap; - } - return null; - } - - public Map sendQiweiCorpus(AiAnalysisRequestLogs aiAnalysisRequestLogs,String difyResponse) { - CorpusReportDTO corpusReportDTO = JSONObject.parseObject(aiAnalysisRequestLogs.getBusinessRequest(), CorpusReportDTO.class); - JSONObject execDifyFlow = JSONObject.parseObject(difyResponse); - String text = execDifyFlow.getJSONObject("outputs").getString("text"); - String resultStrOne = FlowResultSplitUtil.flowOutputTextSplit(text, "任务1", "任务2"); - String resultStrTwo = FlowResultSplitUtil.flowOutputTextSplit(text, "任务2", null); - if (StringUtils.isBlank(resultStrOne) || StringUtils.isBlank(resultStrTwo)){ - log.info("企微语料解析为空,text:{}", text); - return null; - } - Map ltoMap = new HashMap<>(); - ltoMap.put("analysisRecordId", execDifyFlow.getString("aiAnalysisRequestId")); - ltoMap.put("analysisScene", "1"); - ltoMap.put("unionId", corpusReportDTO.getUnionId()); - ltoMap.put("consultantId", corpusReportDTO.getUserId()); - ltoMap.put("communicateDate", corpusReportDTO.getCorpusTime()); - ltoMap.put("analysisResult", resultStrOne); - ltoMap.put("analysisDetail", resultStrTwo); - // 发送MQ - log.info("send mq {}", ltoMap); - return ltoMap; - } - - -} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyServiceImpl.java index d5b49d2..661cfc5 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyServiceImpl.java @@ -17,6 +17,7 @@ import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.CompletableFuture; @Slf4j @Service @@ -105,4 +106,13 @@ public class DiFyServiceImpl implements DiFyService{ return data; } + @Override + public CompletableFuture asyncExecuteDifyFlow(DiFyReq diFyReq) { + Map map = new HashMap<>(); + map.put("inputs",diFyReq.getInputs()); + map.put("user",diFyReq.getUser()); + return CompletableFuture.supplyAsync(() -> diFyFeign.runWorkflows("Bearer "+diFyReq.getFlowId(),map)); + + } + } From c34149925d5fc5068ed00d98b3083a01fd5d46f8 Mon Sep 17 00:00:00 2001 From: zren25 Date: Wed, 16 Apr 2025 17:51:56 +0800 Subject: [PATCH 05/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9AI=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/dto/req/AnalysisQueryReq.java | 27 +++++++ .../analytic/center/dto/req/AnalysisReq.java | 16 +++- .../center/entity/AiAnalysisRequestLogs.java | 6 +- .../center/entity/TcBusinessType.java | 3 - .../ai/analytic/center/feign/DiFyFeign.java | 2 +- .../controller/AiAnalysisDifyController.java | 27 +++++-- .../center/job/AiAnalysisDifyJob.java | 74 +++++++++++++++++++ .../ai/analytic/center/job/DccCorpusJob.java | 56 -------------- .../center/mq/AnalysisDifyMqConsumer.java | 6 +- .../center/service/AiAnalysisDifyService.java | 5 ++ .../impl/AiAnalysisDifyServiceImpl.java | 74 ++++++++++++++----- 11 files changed, 201 insertions(+), 95 deletions(-) create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisQueryReq.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/AiAnalysisDifyJob.java delete mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/DccCorpusJob.java diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisQueryReq.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisQueryReq.java new file mode 100644 index 0000000..5f8bd7d --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisQueryReq.java @@ -0,0 +1,27 @@ +package com.volvo.ai.analytic.center.dto.req; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * + * @ClassName: AnalysisRequest + * @author: renzhen + * @Description: Ai查询请求参数 + * @date: 2025-04-15 13:39 + */ +@Data +public class AnalysisQueryReq { + + + private Object data; + + // aiId + @NotNull(message = "aiAnalysisRequestId不能为空") + private String aiAnalysisRequestId; + + // 是否重试:默认:否 + private String retryAnalyze; + +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java index 0c0b811..fe4d58d 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java @@ -1,8 +1,12 @@ package com.volvo.ai.analytic.center.dto.req; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; -import org.springframework.validation.annotation.Validated; +import lombok.NoArgsConstructor; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** @@ -13,21 +17,27 @@ import javax.validation.constraints.NotNull; * @date: 2025-04-15 13:39 */ @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class AnalysisReq { // 请求的所有参数 + @Valid @NotNull(message = "请求语料不能为空") private Object data; // 回调地址 - @NotNull(message = "回调地址不能为空") + @Valid + @NotBlank(message = "回调地址不能为空") private String callbackUrl; // aiId private String aiAnalysisRequestId; // 业务类型 - @NotNull(message = "业务类型不能为空") + @Valid + @NotBlank(message = "业务类型不能为空") private String aiAnalysisRequestType; } diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/AiAnalysisRequestLogs.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/AiAnalysisRequestLogs.java index 69402b7..5c4b493 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/AiAnalysisRequestLogs.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/AiAnalysisRequestLogs.java @@ -43,13 +43,13 @@ public class AiAnalysisRequestLogs { @TableField("dify_agent_key") private String difyAgentKey; - @TableField("workflowRunId") + @TableField("workflow_run_id") private String workflowRunId; - @TableField("workflowAppId") + @TableField("workflow_app_id") private String workflowAppId; - @TableField("workUserId") + @TableField("work_user_id") private String workUserId; @TableField("callback_url") diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TcBusinessType.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TcBusinessType.java index fd36142..30765f5 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TcBusinessType.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TcBusinessType.java @@ -36,9 +36,6 @@ public class TcBusinessType { @TableField("workflow_user") private String workflowUser; - @TableField("max_retry_count") - private Integer maxRetryCount; - @TableField("is_deleted") @TableLogic private Integer isDeleted; diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java index 46595e2..93a01cb 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java @@ -21,7 +21,7 @@ public interface DiFyFeign { @PostMapping(value = "/v1/files/upload" , consumes = MediaType.MULTIPART_FORM_DATA_VALUE) JSONObject fileUpload(@RequestHeader(value = "Authorization") String authorization, @RequestPart("file") MultipartFile file); - @PostMapping(value = "/v1/workflows/run/:{workflowRunId}" , consumes = MediaType.APPLICATION_JSON_VALUE + @GetMapping(value = "/v1/workflows/run/{workflowRunId}" , consumes = MediaType.APPLICATION_JSON_VALUE , produces = MediaType.APPLICATION_JSON_VALUE) JSONObject queryWorkFlowById(@RequestHeader(value = "Authorization") String authorization, @PathVariable("workflowRunId") String workflowRunId); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java index d2b908e..468b339 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java @@ -1,6 +1,7 @@ package com.volvo.ai.analytic.center.controller; +import com.volvo.ai.analytic.center.dto.req.AnalysisQueryReq; import com.volvo.ai.analytic.center.dto.req.AnalysisReq; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; @@ -11,22 +12,25 @@ 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.validation.annotation.Validated; 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("analysis") +@RestController() @Api(tags = "分析中心接口") @Slf4j @RefreshScope +@RequestMapping("analysis") public class AiAnalysisDifyController { @Autowired private RocketMQTemplate rocketMQTemplate; @Autowired - private AiAnalysisDifyService AiDifyResultService; + private AiAnalysisDifyService aiAnalysisDifyService; @@ -34,15 +38,28 @@ public class AiAnalysisDifyController { @ApiOperation(value = "更新dify结果") public ResultMsg updateByAiId(@RequestBody String message) { log.info("updateByAiId message: {}",message); - AiDifyResultService.updateAiDifyResult(message); + aiAnalysisDifyService.updateAiDifyResult(message); return ResultMsg.ok("ok"); } @PostMapping("/aiAnalyze") @ApiOperation(value = "Ai解析接口") - public AnalysisResp aiAnalyze(@RequestBody AnalysisReq analysisReq) { + public AnalysisResp aiAnalyze(@Validated @RequestBody AnalysisReq analysisReq) { log.info("aiAnalyze data: {}",analysisReq); - return AnalysisResp.success("ok"); + return aiAnalysisDifyService.aiAnalyze(analysisReq); + } + + @PostMapping("/query") + @ApiOperation(value = "Ai解析结果查询") + public AnalysisResp query(@RequestBody @Validated AnalysisQueryReq analysisQueryReq) { + log.info("aiAnalyze query data: {}",analysisQueryReq); + return aiAnalysisDifyService.query(analysisQueryReq); + } + @PostMapping("/callback") + @ApiOperation(value = "Ai解析结果查询") + public AnalysisResp testCallback(@RequestBody AnalysisResp analysisResp) { + log.info("aiAnalyze testCallback data: {}",analysisResp); + return AnalysisResp.success("ok"); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/AiAnalysisDifyJob.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/AiAnalysisDifyJob.java new file mode 100644 index 0000000..dad7e3e --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/AiAnalysisDifyJob.java @@ -0,0 +1,74 @@ +package com.volvo.ai.analytic.center.job; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; +import com.volvo.ai.analytic.center.feign.DiFyFeign; +import com.volvo.ai.analytic.center.mapper.AiAnalysisRequestLogsMapper; +import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; +import com.volvo.common.core.util.ResultMsg; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.List; + +/** + * + */ +@Slf4j +@Component +@RestController +public class AiAnalysisDifyJob { + + @Autowired + private AiAnalysisRequestLogsMapper aiAnalysisRequestLogsMapper; + + @Autowired + private DiFyFeign diFyFeign; + @Autowired + private AiAnalysisRequestLogsService aiAnalysisRequestLogsService; + + /** + * 失败的查询处理 + */ + @XxlJob("workflowRunIdFaile") + @PostMapping("workflowRunIdFaile") + public ResultMsg workflowRunIdFaile(@RequestBody String paramJson) { + try { + // 获取任务参数 + String param = XxlJobHelper.getJobParam(); + if(StringUtils.isEmpty(param)){ + param = paramJson; + } + List workflowRunIdList = Arrays.asList(param.split(",")); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(AiAnalysisRequestLogs::getWorkflowRunId, workflowRunIdList); + queryWrapper.eq(AiAnalysisRequestLogs::getIsDeleted, "0"); + List aiAnalysisRequestLogsList = aiAnalysisRequestLogsMapper.selectList(queryWrapper); + aiAnalysisRequestLogsList.stream().forEach(aiAnalysisRequestLogs -> { + JSONObject jsonResult = diFyFeign.queryWorkFlowById("Bearer "+aiAnalysisRequestLogs.getDifyAgentKey(),aiAnalysisRequestLogs.getWorkflowRunId()); + String outputs = jsonResult.getString("outputs"); + aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder() + .aiAnalysisRequestId(aiAnalysisRequestLogs.getAiAnalysisRequestId()) + .difyResponse(outputs) + .build()); + }); + + } catch (Exception e) { + log.error("processMessageByTask 定时任务补偿处理消息异常",e.getMessage()); + throw new RuntimeException(e); + } + return ResultMsg.ok(); + } + + + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/DccCorpusJob.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/DccCorpusJob.java deleted file mode 100644 index 1abfadd..0000000 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/DccCorpusJob.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.volvo.ai.analytic.center.job; - -import com.volvo.ai.analytic.center.mapper.TmTelephoneCorpusMapper; -import com.volvo.ai.analytic.center.service.TmOdsVdqwMessagearchivingService; -import com.volvo.ai.analytic.center.service.TmTelephoneCorpusService; -import com.volvo.common.core.util.ResultMsg; -import com.xxl.job.core.context.XxlJobHelper; -import com.xxl.job.core.handler.annotation.XxlJob; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - - -@Slf4j -@Component -@RestController -public class DccCorpusJob { - - @Autowired - private TmOdsVdqwMessagearchivingService tmOdsVdqwMessagearchivingService; - - @Autowired - private TmTelephoneCorpusService tmTelephoneCorpusService; - - @Autowired - private TmTelephoneCorpusMapper tmTelephoneCorpusMapper; - - /** - * dcc语料处理 - */ - @XxlJob("dccCorpusJob") - public ResultMsg dccCorpusJob(@RequestBody String paramJson) { - try { - // 获取任务参数 - String param = XxlJobHelper.getJobParam(); - if(StringUtils.isEmpty(param)){ - param = paramJson; - } - - // 分页查询 过滤已跑批并发送的 - - - tmOdsVdqwMessagearchivingService.runQiWeiCorpusDify(param); - } catch (Exception e) { - log.error("processMessageByTask 定时任务补偿处理消息异常",e.getMessage()); - throw new RuntimeException(e); - } - return ResultMsg.ok(); - } - - - -} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index 74be96f..7c01412 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -2,13 +2,10 @@ package com.volvo.ai.analytic.center.mq; import com.alibaba.fastjson.JSONObject; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.volvo.ai.analytic.center.dto.corpus.AicorpusTelephoneDTO; import com.volvo.ai.analytic.center.dto.req.DiFyReq; import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.DiFyService; -import com.volvo.ai.analytic.center.service.TmTelephoneCorpusService; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -60,6 +57,7 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { log.info("analysisDifyMqConsumer message: " + message); DiFyReq difyReq = JSONObject.parseObject(message, DiFyReq.class); CompletableFuture future = diFyService.asyncExecuteDifyFlow(difyReq); +// JSONObject json = future.get(); future.thenAccept(result -> { JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); @@ -68,7 +66,7 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { }); log.info("analysisDifyMqConsumer处理完成,耗时:{}", System.currentTimeMillis() - startTime); } catch (Exception e) { - log.info(" dcc mq 处理失败:{}", e.getMessage()); + log.info(" analysisDifyMqConsumer 处理失败:{}", e.getMessage()); } } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java index 2a12f06..08c5a22 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java @@ -1,5 +1,6 @@ package com.volvo.ai.analytic.center.service; +import com.volvo.ai.analytic.center.dto.req.AnalysisQueryReq; import com.volvo.ai.analytic.center.dto.req.AnalysisReq; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; @@ -10,4 +11,8 @@ public interface AiAnalysisDifyService { AnalysisResp aiAnalyze(AnalysisReq analysisReq); + AnalysisResp query(AnalysisQueryReq analysisQueryReq); + + + } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java index 6a53fa2..8d32758 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java @@ -5,14 +5,13 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.AnalysisQueryReq; import com.volvo.ai.analytic.center.dto.req.AnalysisReq; import com.volvo.ai.analytic.center.dto.req.DiFyReq; import com.volvo.ai.analytic.center.dto.resp.AnalysisDifyResultDTO; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; import com.volvo.ai.analytic.center.entity.TcBusinessType; -import com.volvo.ai.analytic.center.enums.BusinessTypeEnum; -import com.volvo.ai.analytic.center.enums.CategoryEnum; import com.volvo.ai.analytic.center.mapper.TcBusinessTypeMapper; import com.volvo.ai.analytic.center.mapper.TmTelephoneCorpusMapper; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; @@ -34,10 +33,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Slf4j @@ -88,26 +84,39 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { @Override public AnalysisResp aiAnalyze(AnalysisReq analysisReq) { - if(null == analysisReq){ + + Optional.ofNullable(analysisReq).orElseThrow(() -> { log.info("请求Ai解析对象为空!"); - return AnalysisResp.failed("请求Ai解析对象为空!"); - } + return new IllegalArgumentException("请求Ai解析对象为空!"); + }); + String aiAnalysisRequestId = StringUtils.isEmpty(analysisReq.getAiAnalysisRequestId())? AiAnalysisUtils.getAiAnalysisRequestId(analysisReq.getAiAnalysisRequestType()):analysisReq.getAiAnalysisRequestId(); Map queryTcBusinessType = queryTcBusinessType(); - TcBusinessType tcBusinessType = queryTcBusinessType.get(analysisReq.getAiAnalysisRequestType()); - if(null == tcBusinessType || StringUtils.isEmpty(tcBusinessType.getWorkflowApiKey())){ - log.info("接入业务类型未配置!"); - return AnalysisResp.failed("接入业务类型未配置!"); - } + TcBusinessType tcBusinessType = Optional.ofNullable(queryTcBusinessType.get(analysisReq.getAiAnalysisRequestType())) + .filter(businessType -> StringUtils.isNotEmpty(businessType.getWorkflowApiKey())) + .orElseThrow(() -> { + log.info("接入业务类型未配置!"); + return new IllegalArgumentException("接入业务类型未配置!"); + }); + DiFyReq diFyReq = createDiFyReq(analysisReq, tcBusinessType, aiAnalysisRequestId); + saveAiAnalysisRequestLogs(analysisReq, diFyReq, aiAnalysisRequestId); + sendMq(analysisDifyTopic, diFyReq); + return AnalysisResp.success(analysisReq.getData(),aiAnalysisRequestId); + } + + private DiFyReq createDiFyReq(AnalysisReq analysisReq, TcBusinessType tcBusinessType, String aiAnalysisRequestId) { DiFyReq diFyReq = new DiFyReq(); - diFyReq.setUser(StringUtils.isEmpty(tcBusinessType.getWorkflowUser())?analysisReq.getAiAnalysisRequestType().concat("_USER"):tcBusinessType.getWorkflowUser()); + diFyReq.setUser(StringUtils.isEmpty(tcBusinessType.getWorkflowUser()) ? analysisReq.getAiAnalysisRequestType().concat("_USER") : tcBusinessType.getWorkflowUser()); diFyReq.setFlowId(tcBusinessType.getWorkflowApiKey()); - // 发送mq消息 JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(analysisReq.getData()), JSONObject.class); - difyRequest.put("aiAnalysisRequestId",aiAnalysisRequestId); + difyRequest.put("aiAnalysisRequestId", aiAnalysisRequestId); diFyReq.setInputs(difyRequest); + return diFyReq; + } + + private void saveAiAnalysisRequestLogs(AnalysisReq analysisReq, DiFyReq diFyReq, String aiAnalysisRequestId) { aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder() .aiAnalysisRequestId(aiAnalysisRequestId) .businessRequest(JSONObject.toJSONString(analysisReq.getData())) @@ -116,8 +125,33 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { .aiAnalysisRequestType(analysisReq.getAiAnalysisRequestType()) .callbackUrl(analysisReq.getCallbackUrl()) .build()); - sendMq(analysisDifyTopic, diFyReq); - return AnalysisResp.success(analysisReq.getData(),aiAnalysisRequestId); + } + + @Override + public AnalysisResp query(AnalysisQueryReq analysisQueryReq) { + if(null == analysisQueryReq){ + log.info("请求Ai查询对象为空!"); + return AnalysisResp.failed("请求Ai查询对象为空!"); + } + + Optional aiAnalysisRequestLogsOpt = Optional.ofNullable( + aiAnalysisRequestLogsService.queryByAiAnalysisRequestId(analysisQueryReq.getAiAnalysisRequestId()) + ); + return aiAnalysisRequestLogsOpt.map(logs -> { + if ("true".equals(analysisQueryReq.getRetryAnalyze())) { + log.info("请求Ai查询 需要重新生成AI解析 aiAnalysisRequestId:{}, retryAnalyze:{}", analysisQueryReq.getAiAnalysisRequestId(), analysisQueryReq.getRetryAnalyze()); + return aiAnalyze(AnalysisReq.builder() + .data(logs.getBusinessRequest()) + .aiAnalysisRequestType(logs.getAiAnalysisRequestType()) + .callbackUrl(logs.getCallbackUrl()) + .build()); + } + return AnalysisResp.success(logs.getBusinessResponse(), logs.getAiAnalysisRequestId()); + }).orElseGet(() -> { + log.info("查询的AI解析不存在!aiAnalysisRequestId:{}", analysisQueryReq.getAiAnalysisRequestId()); + return AnalysisResp.failed("查询的AI解析不存在!"); + }); + } Map sendDccCorpus(AiAnalysisRequestLogs oldAiAnalysisRequestLogs,String difyResponse ){ @@ -195,7 +229,7 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { } private void sendMq(String topic, Object message){ - rocketMqTemplate.asyncSend(callbackTopic, MessageBuilder.withPayload(message).build(), + rocketMqTemplate.asyncSend(topic, MessageBuilder.withPayload(message).build(), new SendCallback() { @Override public void onSuccess(SendResult sendResult) { From 84780ecf3e3fe39c83a4f4d9382cbb555c8069cf Mon Sep 17 00:00:00 2001 From: zren25 Date: Wed, 16 Apr 2025 18:33:32 +0800 Subject: [PATCH 06/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mq/AnalysisDifyCallbackMqConsumer.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java index 35dbf3e..c5b55ba 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java @@ -3,8 +3,8 @@ package com.volvo.ai.analytic.center.mq; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; -import com.volvo.ai.analytic.center.dto.req.DiFyReq; import com.volvo.ai.analytic.center.dto.resp.AnalysisDifyResultDTO; +import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.DiFyService; @@ -15,13 +15,13 @@ 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.http.HttpEntity; +import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; -import java.util.concurrent.CompletableFuture; - /** * @ClassName AnalysisDifyMqConsumer * @Description AI解析MQ-Callback处理 @@ -62,11 +62,17 @@ public class AnalysisDifyCallbackMqConsumer implements RocketMQListener response = restTemplate.getForEntity(aiAnalysisRequestLogs.getCallbackUrl(), String.class); + AnalysisDifyResultDTO analysisRestDto = JSONObject.parseObject(message, AnalysisDifyResultDTO.class); + AiAnalysisRequestLogs aiAnalysisRequestLogs = aiAnalysisRequestLogsService.queryByAiAnalysisRequestId(analysisRestDto.getAiAnalysisRequestId()); + AnalysisResp analysisResp = new AnalysisResp(); + analysisResp.setAiAnalysisRequestId(analysisRestDto.getAiAnalysisRequestId()); + analysisResp.setData(analysisRestDto.getDifyResponse()); + HttpHeaders headers = new HttpHeaders(); + headers.set("Content-Type", "application/json"); + // 封装请求体和请求头 + HttpEntity requestEntity = new HttpEntity<>(analysisResp, headers); + ResponseEntity response = restTemplate.postForEntity(aiAnalysisRequestLogs.getCallbackUrl(), requestEntity, String.class); // 响应类型); if (response.getStatusCode().is2xxSuccessful()) { log.info("analysisDifyCallbackMqConsumer aiAnalysisRequestId:{},回调请求成功,url:{}: " ,analysisResp.getAiAnalysisRequestId(), aiAnalysisRequestLogs.getCallbackUrl()); } else { From ec2dfba6044e4154b70c26373063d83aadf587cc Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 18 Apr 2025 13:38:59 +0800 Subject: [PATCH 07/28] =?UTF-8?q?=E5=A2=9E=E5=8A=A0redis=E8=AE=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai-analytic-center-biz/pom.xml | 5 ++ .../center/mq/AnalysisDifyMqConsumer.java | 25 +++++- .../impl/AiAnalysisDifyServiceImpl.java | 8 ++ .../ai/analytic/center/utils/ConstantStr.java | 2 + .../center/utils/RedisCounterRateLimiter.java | 80 +++++++++++++++++++ 5 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisCounterRateLimiter.java diff --git a/ai-analytic-center-biz/pom.xml b/ai-analytic-center-biz/pom.xml index a4007da..2c34d50 100644 --- a/ai-analytic-center-biz/pom.xml +++ b/ai-analytic-center-biz/pom.xml @@ -226,6 +226,11 @@ 2.3.0 + + + org.springframework.boot + spring-boot-starter-data-redis + diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index 7c01412..fbea4cb 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -6,6 +6,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.volvo.ai.analytic.center.dto.req.DiFyReq; import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.DiFyService; +import com.volvo.ai.analytic.center.utils.ConstantStr; +import com.volvo.ai.analytic.center.utils.RedisCounterRateLimiter; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -43,26 +45,43 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { @Value("${dify.corpus.checkDccRepeat}") private String checkDccRepeat; + @Value("${rocketmq.consumer.analysisDify.difyLimit}") + private int difyLimit; + + @Value("${rocketmq.consumer.analysisDify.expire}") + private Long expire; @Autowired private DiFyService diFyService; + @Autowired + private RedisCounterRateLimiter redisCounterRateLimiter; + private final ObjectMapper objectMapper = new ObjectMapper(); @Override public void onMessage(MessageExt messageExt) { + log.info("analysisDifyMqConsumer 当前线程: {}, 线程ID: {}", Thread.currentThread().getName(), Thread.currentThread().getId()); long startTime = System.currentTimeMillis(); + log.info("redis计数数量: " + redisCounterRateLimiter.getCurrentCount(ConstantStr.DIFY_COUNTERRATELIMIT)); + boolean flag = redisCounterRateLimiter.incrementAndCheck(ConstantStr.DIFY_COUNTERRATELIMIT, difyLimit, expire); + if(!flag){ + log.info("analysisDifyMqConsumer 请求dify超过基数 :{},稍后请求: " + redisCounterRateLimiter.getCurrentCount(ConstantStr.DIFY_COUNTERRATELIMIT)); + throw new RuntimeException("请求dify超过基数 " ); + } try { - log.info("analysisDifyMqConsumer 当前线程: {}, 线程ID: {}", Thread.currentThread().getName(), Thread.currentThread().getId()); String message = new String(messageExt.getBody()); log.info("analysisDifyMqConsumer message: " + message); DiFyReq difyReq = JSONObject.parseObject(message, DiFyReq.class); CompletableFuture future = diFyService.asyncExecuteDifyFlow(difyReq); + JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); + String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); // JSONObject json = future.get(); future.thenAccept(result -> { - JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); - String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); // 处理异步结果 log.info("异步处理asyncExecuteDifyFlow完成aiAnalysisRequestId: {},处理结果:{}", aiAnalysisRequestId, result); + }).exceptionally(ex -> { + log.error("异步处理asyncExecuteDifyFlow 失败aiAnalysisRequestId: {} ,{}", aiAnalysisRequestId,ex.getMessage()); + return null; }); log.info("analysisDifyMqConsumer处理完成,耗时:{}", System.currentTimeMillis() - startTime); } catch (Exception e) { diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java index 8d32758..8848a81 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java @@ -18,7 +18,9 @@ import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.TmTelephoneCorpusService; import com.volvo.ai.analytic.center.utils.AiAnalysisUtils; +import com.volvo.ai.analytic.center.utils.ConstantStr; import com.volvo.ai.analytic.center.utils.FlowResultSplitUtil; +import com.volvo.ai.analytic.center.utils.RedisCounterRateLimiter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -59,9 +61,15 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { private String callbackTopic; @Resource private RocketMQTemplate rocketMqTemplate; + + @Autowired + private RedisCounterRateLimiter redisCounterRateLimiter; @Override public boolean updateAiDifyResult(String message) { + // 计数-1 + redisCounterRateLimiter.decrement(ConstantStr.DIFY_COUNTERRATELIMIT); + log.info("redisdecrement计数数量: " + redisCounterRateLimiter.getCurrentCount(ConstantStr.DIFY_COUNTERRATELIMIT)); if(StringUtils.isNotEmpty(message)){ AnalysisDifyResultDTO analysisResp = JSONObject.parseObject(message, AnalysisDifyResultDTO.class); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/ConstantStr.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/ConstantStr.java index a200176..4e0be67 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/ConstantStr.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/ConstantStr.java @@ -13,4 +13,6 @@ public class ConstantStr { public static final String corpus_user = "corpush_user"; public static final String CARMODELLIST_CACHEKEY = "ai_carmodellist"; + + public static final String DIFY_COUNTERRATELIMIT = "DIFY_COUNTERRATELIMIT"; } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisCounterRateLimiter.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisCounterRateLimiter.java new file mode 100644 index 0000000..6e9f906 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisCounterRateLimiter.java @@ -0,0 +1,80 @@ +package com.volvo.ai.analytic.center.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.stereotype.Service; + +import java.util.Collections; + +@Service +public class RedisCounterRateLimiter { + private final StringRedisTemplate redisTemplate; + + @Autowired + public RedisCounterRateLimiter(StringRedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + /** + * 增加计数并检查是否超过限制 + * @param key 限流key + * @param limit 最大限制数 + * @param expire 过期时间(秒) + * @return true-允许请求; false-超过限制 + */ + public boolean incrementAndCheck(String key, int limit, long expire) { + // 使用Lua脚本保证原子性 + String luaScript = + "local current = redis.call('GET', KEYS[1]) or '0'\n" + + "local num = tonumber(current)\n" + + "if num >= tonumber(ARGV[1]) then\n" + + " return 0\n" + + "else\n" + + " redis.call('INCR', KEYS[1])\n" + + " if num == 0 then\n" + + " redis.call('EXPIRE', KEYS[1], ARGV[2])\n" + + " end\n" + + " return 1\n" + + "end"; + + DefaultRedisScript script = new DefaultRedisScript<>(); + script.setScriptText(luaScript); + script.setResultType(Long.class); + + Long result = redisTemplate.execute(script, Collections.singletonList(key), + String.valueOf(limit), String.valueOf(expire)); + + return result != null && result == 1L; + } + + /** + * 减少计数 + * @param key 限流key + */ + public void decrement(String key) { + // 使用Lua脚本防止减到负数 + String luaScript = + "local current = redis.call('GET', KEYS[1]) or '0'\n" + + "if tonumber(current) > 0 then\n" + + " redis.call('DECR', KEYS[1])\n" + + "end\n" + + "return 1"; + + DefaultRedisScript script = new DefaultRedisScript<>(); + script.setScriptText(luaScript); + script.setResultType(Long.class); + + redisTemplate.execute(script, Collections.singletonList(key)); + } + + /** + * 获取当前计数 + * @param key 限流key + * @return 当前计数值 + */ + public int getCurrentCount(String key) { + String count = redisTemplate.opsForValue().get(key); + return count == null ? 0 : Integer.parseInt(count); + } +} \ No newline at end of file From bbcc00f547bd5b1e284995086c57f126bcedef5a Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 18 Apr 2025 15:39:56 +0800 Subject: [PATCH 08/28] sonar --- .../center/mq/AnalysisDifyMqConsumer.java | 7 +- .../impl/AiAnalysisDifyServiceImpl.java | 71 ++----------------- 2 files changed, 6 insertions(+), 72 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index fbea4cb..710a810 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -75,11 +75,8 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { CompletableFuture future = diFyService.asyncExecuteDifyFlow(difyReq); JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); -// JSONObject json = future.get(); - future.thenAccept(result -> { - // 处理异步结果 - log.info("异步处理asyncExecuteDifyFlow完成aiAnalysisRequestId: {},处理结果:{}", aiAnalysisRequestId, result); - }).exceptionally(ex -> { + // JSONObject json = future.get(); + future.thenAccept(result -> log.info("异步处理asyncExecuteDifyFlow完成aiAnalysisRequestId: {},处理结果:{}", aiAnalysisRequestId, result)).exceptionally(ex -> { log.error("异步处理asyncExecuteDifyFlow 失败aiAnalysisRequestId: {} ,{}", aiAnalysisRequestId,ex.getMessage()); return null; }); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java index 8848a81..d68a7fc 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java @@ -3,8 +3,6 @@ package com.volvo.ai.analytic.center.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -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.AnalysisQueryReq; import com.volvo.ai.analytic.center.dto.req.AnalysisReq; import com.volvo.ai.analytic.center.dto.req.DiFyReq; @@ -19,10 +17,8 @@ import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.TmTelephoneCorpusService; import com.volvo.ai.analytic.center.utils.AiAnalysisUtils; import com.volvo.ai.analytic.center.utils.ConstantStr; -import com.volvo.ai.analytic.center.utils.FlowResultSplitUtil; import com.volvo.ai.analytic.center.utils.RedisCounterRateLimiter; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.producer.SendCallback; import org.apache.rocketmq.client.producer.SendResult; @@ -33,9 +29,9 @@ import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; @Slf4j @@ -162,59 +158,6 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { } - Map sendDccCorpus(AiAnalysisRequestLogs oldAiAnalysisRequestLogs,String difyResponse ){ - CorpusReportDTO corpusReportDTO = JSONObject.parseObject(oldAiAnalysisRequestLogs.getBusinessRequest(), CorpusReportDTO.class); - String text = JSONObject.parseObject(difyResponse).getJSONObject("outputs").getString("text"); - String resultStrOne = FlowResultSplitUtil.flowOutputTextSplit(text, "任务1", "任务2"); - String resultStrTwo =FlowResultSplitUtil.flowOutputTextSplit(text, "任务2", null); - if (StringUtils.isBlank(resultStrOne) || StringUtils.isBlank(resultStrTwo)){ - log.info("电话语料解析为空,text:{}", text); - return null; - } - List dccDtoList = tmTelephoneCorpusMapper.queryTelephoneCorpusBySourceIds( Arrays.asList(corpusReportDTO.getRecordId())); - if(CollectionUtils.isNotEmpty(dccDtoList)){ - AicorpusTelephoneDTO dccDto = dccDtoList.get(0); - JSONObject jsonObject = JSONObject.parseObject( dccDto.getDisplay()); - ZonedDateTime zonedDateTime = ZonedDateTime.parse(jsonObject.getString("start_time")); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - String formattedDateStartTime = zonedDateTime.format(formatter); - Map ltoMap = new HashMap(); - ltoMap.put("analysisRecordId", oldAiAnalysisRequestLogs.getAiAnalysisRequestId()); - ltoMap.put("analysisScene", "2"); - ltoMap.put("recordId", corpusReportDTO.getRecordId()); - ltoMap.put("communicateDate", formattedDateStartTime); - ltoMap.put("analysisResult", resultStrOne); - ltoMap.put("analysisDetail", resultStrTwo); - // 发送MQ - - log.info("send mq {}",ltoMap); - return ltoMap; - } - return null; - } - - public Map sendQiweiCorpus(AiAnalysisRequestLogs aiAnalysisRequestLogs,String difyResponse) { - CorpusReportDTO corpusReportDTO = JSONObject.parseObject(aiAnalysisRequestLogs.getBusinessRequest(), CorpusReportDTO.class); - JSONObject execDifyFlow = JSONObject.parseObject(difyResponse); - String text = execDifyFlow.getJSONObject("outputs").getString("text"); - String resultStrOne = FlowResultSplitUtil.flowOutputTextSplit(text, "任务1", "任务2"); - String resultStrTwo = FlowResultSplitUtil.flowOutputTextSplit(text, "任务2", null); - if (StringUtils.isBlank(resultStrOne) || StringUtils.isBlank(resultStrTwo)){ - log.info("企微语料解析为空,text:{}", text); - return null; - } - Map ltoMap = new HashMap<>(); - ltoMap.put("analysisRecordId", execDifyFlow.getString("aiAnalysisRequestId")); - ltoMap.put("analysisScene", "1"); - ltoMap.put("unionId", corpusReportDTO.getUnionId()); - ltoMap.put("consultantId", corpusReportDTO.getUserId()); - ltoMap.put("communicateDate", corpusReportDTO.getCorpusTime()); - ltoMap.put("analysisResult", resultStrOne); - ltoMap.put("analysisDetail", resultStrTwo); - // 发送MQ - log.info("send mq {}", ltoMap); - return ltoMap; - } public Map queryTcBusinessType() { @@ -228,13 +171,7 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { )); } - public TcBusinessType queryTcBusinessType(String businessRequestType) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(TcBusinessType::getBusinessRequestType, businessRequestType); - queryWrapper.eq(TcBusinessType::getIsDeleted, "0"); - TcBusinessType tcBusinessType =tcBusinessTypeMapper.selectOne(queryWrapper); - return tcBusinessType; - } + private void sendMq(String topic, Object message){ rocketMqTemplate.asyncSend(topic, MessageBuilder.withPayload(message).build(), From 1ab356b7d3ff6a069700fca13444b36db22d0afb Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 18 Apr 2025 16:39:09 +0800 Subject: [PATCH 09/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=9B=B4=E6=96=B0log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytic/center/mq/AnalysisDifyCallbackMqConsumer.java | 5 ++++- .../center/service/impl/AiAnalysisDifyServiceImpl.java | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java index c5b55ba..c8aa099 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyCallbackMqConsumer.java @@ -66,7 +66,9 @@ public class AnalysisDifyCallbackMqConsumer implements RocketMQListener new IllegalArgumentException("AiAnalysisRequestId查询对象为空!")); AiAnalysisRequestLogs aiAnalysisRequestLogs = new AiAnalysisRequestLogs(); aiAnalysisRequestLogs.setAiAnalysisRequestId(analysisResp.getAiAnalysisRequestId()); @@ -76,6 +78,9 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { aiAnalysisRequestLogs.setWorkflowRunId(analysisResp.getWorkflowRunId()); aiAnalysisRequestLogs.setWorkflowAppId(analysisResp.getWorkflowRunId()); aiAnalysisRequestLogs.setWorkUserId(analysisResp.getWorkUserId()); + + JSONObject difyJson = JSONObject.parseObject(analysisResp.getDifyResponse()); + aiAnalysisRequestLogs.setBusinessResponse(difyJson.getString("outputs")); aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(aiAnalysisRequestLogs); // 发送 mq From 63b7571f1a8ef006a6ce1e9686412b51d224e102 Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 18 Apr 2025 17:06:51 +0800 Subject: [PATCH 10/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/controller/AiAnalysisDifyController.java | 7 ++++--- .../ai/analytic/center/service/AiAnalysisDifyService.java | 3 ++- .../center/service/impl/AiAnalysisDifyServiceImpl.java | 5 ++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java index 468b339..a0807b1 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java @@ -3,6 +3,7 @@ package com.volvo.ai.analytic.center.controller; import com.volvo.ai.analytic.center.dto.req.AnalysisQueryReq; import com.volvo.ai.analytic.center.dto.req.AnalysisReq; +import com.volvo.ai.analytic.center.dto.resp.AnalysisDifyResultDTO; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; import com.volvo.common.core.util.ResultMsg; @@ -36,9 +37,9 @@ public class AiAnalysisDifyController { @PostMapping("/updateByAiId") @ApiOperation(value = "更新dify结果") - public ResultMsg updateByAiId(@RequestBody String message) { - log.info("updateByAiId message: {}",message); - aiAnalysisDifyService.updateAiDifyResult(message); + public ResultMsg updateByAiId(@RequestBody AnalysisDifyResultDTO analysisResp) { + log.info("updateByAiId message: {}",analysisResp.getAiAnalysisRequestId()); + aiAnalysisDifyService.updateAiDifyResult(analysisResp); return ResultMsg.ok("ok"); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java index 08c5a22..0c481fc 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java @@ -2,11 +2,12 @@ package com.volvo.ai.analytic.center.service; import com.volvo.ai.analytic.center.dto.req.AnalysisQueryReq; import com.volvo.ai.analytic.center.dto.req.AnalysisReq; +import com.volvo.ai.analytic.center.dto.resp.AnalysisDifyResultDTO; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; public interface AiAnalysisDifyService { - public boolean updateAiDifyResult(String message); + public boolean updateAiDifyResult(AnalysisDifyResultDTO analysisResp); AnalysisResp aiAnalyze(AnalysisReq analysisReq); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java index 6caef50..f32831e 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java @@ -61,13 +61,12 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { @Autowired private RedisCounterRateLimiter redisCounterRateLimiter; @Override - public boolean updateAiDifyResult(String message) { + public boolean updateAiDifyResult(AnalysisDifyResultDTO analysisResp) { // 计数-1 redisCounterRateLimiter.decrement(ConstantStr.DIFY_COUNTERRATELIMIT); log.info("redisdecrement计数数量: " + redisCounterRateLimiter.getCurrentCount(ConstantStr.DIFY_COUNTERRATELIMIT)); - if(StringUtils.isNotEmpty(message)){ - AnalysisDifyResultDTO analysisResp = JSONObject.parseObject(message, AnalysisDifyResultDTO.class); + if(null != analysisResp){ Optional.ofNullable(aiAnalysisRequestLogsService.queryByAiAnalysisRequestId(analysisResp.getAiAnalysisRequestId())) .orElseThrow(() -> new IllegalArgumentException("AiAnalysisRequestId查询对象为空!")); From ef378bf84528a80489fbe6f278f17f64aa898002 Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 18 Apr 2025 18:10:29 +0800 Subject: [PATCH 11/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/controller/AiAnalysisDifyController.java | 11 ++++------- .../center/service/AiAnalysisDifyService.java | 2 +- .../service/impl/AiAnalysisDifyServiceImpl.java | 5 +++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java index a0807b1..51bc12c 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java @@ -14,10 +14,7 @@ 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.validation.annotation.Validated; -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; +import org.springframework.web.bind.annotation.*; @RestController() @@ -37,9 +34,9 @@ public class AiAnalysisDifyController { @PostMapping("/updateByAiId") @ApiOperation(value = "更新dify结果") - public ResultMsg updateByAiId(@RequestBody AnalysisDifyResultDTO analysisResp) { - log.info("updateByAiId message: {}",analysisResp.getAiAnalysisRequestId()); - aiAnalysisDifyService.updateAiDifyResult(analysisResp); + public ResultMsg updateByAiId(@RequestBody String message) { + log.info("updateByAiId message: {}", message); + aiAnalysisDifyService.updateAiDifyResult(message); return ResultMsg.ok("ok"); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java index 0c481fc..3663dd4 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/AiAnalysisDifyService.java @@ -7,7 +7,7 @@ import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; public interface AiAnalysisDifyService { - public boolean updateAiDifyResult(AnalysisDifyResultDTO analysisResp); + public boolean updateAiDifyResult(String message); AnalysisResp aiAnalyze(AnalysisReq analysisReq); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java index f32831e..6caef50 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java @@ -61,12 +61,13 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { @Autowired private RedisCounterRateLimiter redisCounterRateLimiter; @Override - public boolean updateAiDifyResult(AnalysisDifyResultDTO analysisResp) { + public boolean updateAiDifyResult(String message) { // 计数-1 redisCounterRateLimiter.decrement(ConstantStr.DIFY_COUNTERRATELIMIT); log.info("redisdecrement计数数量: " + redisCounterRateLimiter.getCurrentCount(ConstantStr.DIFY_COUNTERRATELIMIT)); - if(null != analysisResp){ + if(StringUtils.isNotEmpty(message)){ + AnalysisDifyResultDTO analysisResp = JSONObject.parseObject(message, AnalysisDifyResultDTO.class); Optional.ofNullable(aiAnalysisRequestLogsService.queryByAiAnalysisRequestId(analysisResp.getAiAnalysisRequestId())) .orElseThrow(() -> new IllegalArgumentException("AiAnalysisRequestId查询对象为空!")); From 7042ee02427e0b5ee6b74d5e62e71e81cfb68374 Mon Sep 17 00:00:00 2001 From: zren25 Date: Tue, 22 Apr 2025 16:17:32 +0800 Subject: [PATCH 12/28] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E5=88=A4=E6=96=AD=E6=98=AF=E5=90=A6=E5=8F=91?= =?UTF-8?q?=E9=80=81=E5=9B=9E=E8=B0=83mq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/service/impl/AiAnalysisDifyServiceImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java index 6caef50..1c8820e 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java @@ -69,7 +69,7 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { if(StringUtils.isNotEmpty(message)){ AnalysisDifyResultDTO analysisResp = JSONObject.parseObject(message, AnalysisDifyResultDTO.class); - Optional.ofNullable(aiAnalysisRequestLogsService.queryByAiAnalysisRequestId(analysisResp.getAiAnalysisRequestId())) + AiAnalysisRequestLogs oldAiAnalysisRequestLogs = Optional.ofNullable(aiAnalysisRequestLogsService.queryByAiAnalysisRequestId(analysisResp.getAiAnalysisRequestId())) .orElseThrow(() -> new IllegalArgumentException("AiAnalysisRequestId查询对象为空!")); AiAnalysisRequestLogs aiAnalysisRequestLogs = new AiAnalysisRequestLogs(); @@ -83,8 +83,10 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { aiAnalysisRequestLogs.setBusinessResponse(difyJson.getString("outputs")); aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(aiAnalysisRequestLogs); - // 发送 mq - sendMq(callbackTopic, analysisResp); + if(StringUtils.isNotEmpty(oldAiAnalysisRequestLogs.getCallbackUrl())){ + // 发送 mq + sendMq(callbackTopic, analysisResp); + } return true; } From 6c716701ad8abc75977cafbf8bb6b31e7ab425da Mon Sep 17 00:00:00 2001 From: zren25 Date: Thu, 24 Apr 2025 10:13:14 +0800 Subject: [PATCH 13/28] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/mq/AnalysisDifyMqConsumer.java | 19 ++++++++++++++++++- .../impl/AiAnalysisDifyServiceImpl.java | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index 710a810..ffdc877 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -4,6 +4,8 @@ package com.volvo.ai.analytic.center.mq; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import com.volvo.ai.analytic.center.dto.req.DiFyReq; +import com.volvo.ai.analytic.center.entity.AiAnalysisErrors; +import com.volvo.ai.analytic.center.service.AiAnalysisErrorsService; import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.DiFyService; import com.volvo.ai.analytic.center.utils.ConstantStr; @@ -56,6 +58,9 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { @Autowired private RedisCounterRateLimiter redisCounterRateLimiter; + @Autowired + private AiAnalysisErrorsService aiAnalysisErrorsService; + private final ObjectMapper objectMapper = new ObjectMapper(); @Override @@ -76,7 +81,19 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); // JSONObject json = future.get(); - future.thenAccept(result -> log.info("异步处理asyncExecuteDifyFlow完成aiAnalysisRequestId: {},处理结果:{}", aiAnalysisRequestId, result)).exceptionally(ex -> { + future.thenAccept(result -> { + log.info("异步处理asyncExecuteDifyFlow完成aiAnalysisRequestId: {},处理结果:{}", aiAnalysisRequestId, result); + JSONObject data = result.getJSONObject("data"); + + if(null == result || data.get("status").equals("failed")){ + aiAnalysisErrorsService.saveAiAnalysisErrors(AiAnalysisErrors.builder() + .aiAnalysisRequestId(aiAnalysisRequestId) + .aiAnalysisRequestType(difyRequest.getString("aiAnalysisRequestType")) + .aiAnalysisErrorHandlingStatus("0") + .aiAnalysisErrorMessage(data.getString("error")) + .build()); + } + }).exceptionally(ex -> { log.error("异步处理asyncExecuteDifyFlow 失败aiAnalysisRequestId: {} ,{}", aiAnalysisRequestId,ex.getMessage()); return null; }); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java index 1c8820e..9ce96f2 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java @@ -123,6 +123,7 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { diFyReq.setFlowId(tcBusinessType.getWorkflowApiKey()); JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(analysisReq.getData()), JSONObject.class); difyRequest.put("aiAnalysisRequestId", aiAnalysisRequestId); + difyRequest.put("aiAnalysisRequestType", tcBusinessType.getBusinessRequestType() ); diFyReq.setInputs(difyRequest); return diFyReq; } From 4cde67da33f48c068a0f7b063ec3862eb7a14944 Mon Sep 17 00:00:00 2001 From: zren25 Date: Thu, 24 Apr 2025 19:23:14 +0800 Subject: [PATCH 14/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/mq/AnalysisDifyMqConsumer.java | 27 ++++++++++++------- .../impl/AiAnalysisDifyServiceImpl.java | 11 +++++--- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index ffdc877..7b3717d 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -17,6 +17,8 @@ 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.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RestController; @@ -63,23 +65,30 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { private final ObjectMapper objectMapper = new ObjectMapper(); + @Autowired + private RedisTemplate redisTemplate; + @Override public void onMessage(MessageExt messageExt) { log.info("analysisDifyMqConsumer 当前线程: {}, 线程ID: {}", Thread.currentThread().getName(), Thread.currentThread().getId()); long startTime = System.currentTimeMillis(); - log.info("redis计数数量: " + redisCounterRateLimiter.getCurrentCount(ConstantStr.DIFY_COUNTERRATELIMIT)); - boolean flag = redisCounterRateLimiter.incrementAndCheck(ConstantStr.DIFY_COUNTERRATELIMIT, difyLimit, expire); - if(!flag){ + ZSetOperations zSetOperations = redisTemplate.opsForZSet(); + Long count = zSetOperations.zCard(ConstantStr.DIFY_COUNTERRATELIMIT); + log.info("redis计数数量: " + count); + if(count>=difyLimit){ log.info("analysisDifyMqConsumer 请求dify超过基数 :{},稍后请求: " + redisCounterRateLimiter.getCurrentCount(ConstantStr.DIFY_COUNTERRATELIMIT)); throw new RuntimeException("请求dify超过基数 " ); } + String message = new String(messageExt.getBody()); + log.info("analysisDifyMqConsumer message: " + message); + DiFyReq difyReq = JSONObject.parseObject(message, DiFyReq.class); + JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); + String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); + + zSetOperations.add(ConstantStr.DIFY_COUNTERRATELIMIT, aiAnalysisRequestId, startTime); + zSetOperations.removeRangeByScore(ConstantStr.DIFY_COUNTERRATELIMIT, 0, startTime - (expire * 1000)); try { - String message = new String(messageExt.getBody()); - log.info("analysisDifyMqConsumer message: " + message); - DiFyReq difyReq = JSONObject.parseObject(message, DiFyReq.class); - CompletableFuture future = diFyService.asyncExecuteDifyFlow(difyReq); - JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); - String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); + CompletableFuture future = diFyService.asyncExecuteDifyFlow(difyReq); // JSONObject json = future.get(); future.thenAccept(result -> { log.info("异步处理asyncExecuteDifyFlow完成aiAnalysisRequestId: {},处理结果:{}", aiAnalysisRequestId, result); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java index 9ce96f2..b9e01d0 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/AiAnalysisDifyServiceImpl.java @@ -25,6 +25,7 @@ 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.data.redis.core.RedisTemplate; import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Service; @@ -60,14 +61,18 @@ public class AiAnalysisDifyServiceImpl implements AiAnalysisDifyService { @Autowired private RedisCounterRateLimiter redisCounterRateLimiter; + + @Autowired + private RedisTemplate redisTemplate; @Override public boolean updateAiDifyResult(String message) { - // 计数-1 - redisCounterRateLimiter.decrement(ConstantStr.DIFY_COUNTERRATELIMIT); - log.info("redisdecrement计数数量: " + redisCounterRateLimiter.getCurrentCount(ConstantStr.DIFY_COUNTERRATELIMIT)); + if(StringUtils.isNotEmpty(message)){ AnalysisDifyResultDTO analysisResp = JSONObject.parseObject(message, AnalysisDifyResultDTO.class); + // 计数-1 + Long removedCount = redisTemplate.opsForZSet().remove(ConstantStr.DIFY_COUNTERRATELIMIT, analysisResp.getAiAnalysisRequestId()); + log.info("redisdecrement计数数量: " + removedCount); AiAnalysisRequestLogs oldAiAnalysisRequestLogs = Optional.ofNullable(aiAnalysisRequestLogsService.queryByAiAnalysisRequestId(analysisResp.getAiAnalysisRequestId())) .orElseThrow(() -> new IllegalArgumentException("AiAnalysisRequestId查询对象为空!")); From 391deb1e68df512a1f3101bf7ba5cc3e5e9c8610 Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 25 Apr 2025 11:28:54 +0800 Subject: [PATCH 15/28] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/analytic/center/controller/AiDifyResultController.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiDifyResultController.java deleted file mode 100644 index e69de29..0000000 From 0a1ee0efcf91684d1cc38c933effbf984cc8efd8 Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 25 Apr 2025 17:16:28 +0800 Subject: [PATCH 16/28] =?UTF-8?q?=E5=A2=9E=E5=8A=A0redis=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RedisTestController.java | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java new file mode 100644 index 0000000..a4ccbb5 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java @@ -0,0 +1,105 @@ +package com.volvo.ai.analytic.center.controller; + + +import com.volvo.ai.analytic.center.dto.req.AnalysisQueryReq; +import com.volvo.ai.analytic.center.dto.req.AnalysisReq; +import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; +import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; +import com.volvo.ai.analytic.center.utils.ConstantStr; +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.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ZSetOperations; +import org.springframework.validation.annotation.Validated; +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; + +import java.util.Set; +import java.util.concurrent.TimeUnit; + + +@RestController() +@Api(tags = "分析中心接口") +@Slf4j +@RefreshScope +@RequestMapping("redis") +public class RedisTestController { + + @Autowired + private RocketMQTemplate rocketMQTemplate; + + @Autowired + private AiAnalysisDifyService aiAnalysisDifyService; + + + @Autowired + private RedisTemplate redisTemplate; + + + + @PostMapping("/testRedis") + @ApiOperation(value = "Ai解析结果查询") + public AnalysisResp testRedis(@RequestBody String key) { + log.info("aiAnalyze queryRedis : {}",key); + + for (int i = 0; i < 10; i++){ + ZSetOperations zSetOperations = redisTemplate.opsForZSet(); + long currentMs = System.currentTimeMillis(); + zSetOperations.add(key, key+i, currentMs); + + // set the expiration time for the code user + //redisTemplate.expire(key, 60, TimeUnit.SECONDS); + + // remove the value that out of current window + zSetOperations.removeRangeByScore(key, 0, currentMs - 5 * 1000); + + // check all available count + Long count = zSetOperations.zCard(key); + System.out.println("count:" + count); + + Set getredisSet = redisTemplate.opsForZSet().range(key, 0, -1); + System.out.println("getredisSet:" + getredisSet); + try { + TimeUnit.SECONDS.sleep(5); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + Long count2 = zSetOperations.zCard(key); + System.out.println("count2:" + count2); + + Set getredisSet2 = redisTemplate.opsForZSet().range(key, 0, -1); + System.out.println("getredisSet2:" + getredisSet2); + } + + return AnalysisResp.success("ok"); + } + @PostMapping("/queryRedis") + @ApiOperation(value = "queryRedis") + public ResultMsg queryRedis(@RequestBody String key) { + log.info("aiAnalyze queryRedis : {}",key); + Set getredisSet = redisTemplate.opsForZSet().range(key, 0, -1); + log.info("queryRedis:{}", getredisSet); + return ResultMsg.ok(getredisSet); + } + @PostMapping("/del") + @ApiOperation(value = "del") + public ResultMsg del(@RequestBody String key) { + log.info("aiAnalyze queryRedis : {}",key); + redisTemplate.opsForZSet().removeRange(key, 0, -1); + Set getRedisSet = redisTemplate.opsForZSet().range(key, 0, -1); + log.info("removeRange:{}" , getRedisSet); + redisTemplate.delete(key); + Set getredisSet2 = redisTemplate.opsForZSet().range(key, 0, -1); + log.info("delete:{}", getredisSet2); + return ResultMsg.ok(getredisSet2); + } + +} + From 3e0f5b916174311c0f33ef319a39779d9c69a49e Mon Sep 17 00:00:00 2001 From: zren25 Date: Sun, 27 Apr 2025 09:51:08 +0800 Subject: [PATCH 17/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9redis=E9=99=90=E5=88=B6?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RedisTestController.java | 63 ++++++------------- .../center/mq/AnalysisDifyMqConsumer.java | 23 +++---- .../analytic/center/utils/RedisZSetUtil.java | 49 +++++++++++++++ 3 files changed, 79 insertions(+), 56 deletions(-) create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisZSetUtil.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java index a4ccbb5..fcbe32f 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java @@ -1,11 +1,9 @@ package com.volvo.ai.analytic.center.controller; -import com.volvo.ai.analytic.center.dto.req.AnalysisQueryReq; -import com.volvo.ai.analytic.center.dto.req.AnalysisReq; -import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; +import com.alibaba.fastjson.JSONObject; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; -import com.volvo.ai.analytic.center.utils.ConstantStr; +import com.volvo.ai.analytic.center.utils.RedisZSetUtil; import com.volvo.common.core.util.ResultMsg; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -14,15 +12,13 @@ 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.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ZSetOperations; -import org.springframework.validation.annotation.Validated; 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; +import java.time.Instant; import java.util.Set; -import java.util.concurrent.TimeUnit; @RestController() @@ -41,49 +37,30 @@ public class RedisTestController { @Autowired private RedisTemplate redisTemplate; - - + @Autowired + private RedisZSetUtil redisZSetUtil; @PostMapping("/testRedis") - @ApiOperation(value = "Ai解析结果查询") - public AnalysisResp testRedis(@RequestBody String key) { - log.info("aiAnalyze queryRedis : {}",key); + public void test(@RequestBody String message) { + String zsetKey = "myZSet"; + JSONObject json = JSONObject.parseObject(message); + String key = json.getString("key"); + String value =json.getString("value"); + // 添加成员并设置过期时间戳 + long expireTime1 = Instant.now().plusSeconds(30).toEpochMilli(); // 30秒后过期 + long expireTime2 = Instant.now().plusSeconds(60).toEpochMilli(); // 60秒后过期 + redisZSetUtil.addWithExpire(zsetKey, "member1", expireTime1); + redisZSetUtil.addWithExpire(zsetKey, "member2", expireTime2); - for (int i = 0; i < 10; i++){ - ZSetOperations zSetOperations = redisTemplate.opsForZSet(); - long currentMs = System.currentTimeMillis(); - zSetOperations.add(key, key+i, currentMs); - - // set the expiration time for the code user - //redisTemplate.expire(key, 60, TimeUnit.SECONDS); - - // remove the value that out of current window - zSetOperations.removeRangeByScore(key, 0, currentMs - 5 * 1000); - - // check all available count - Long count = zSetOperations.zCard(key); - System.out.println("count:" + count); - - Set getredisSet = redisTemplate.opsForZSet().range(key, 0, -1); - System.out.println("getredisSet:" + getredisSet); - try { - TimeUnit.SECONDS.sleep(5); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - Long count2 = zSetOperations.zCard(key); - System.out.println("count2:" + count2); - - Set getredisSet2 = redisTemplate.opsForZSet().range(key, 0, -1); - System.out.println("getredisSet2:" + getredisSet2); - } - - return AnalysisResp.success("ok"); + // 获取未过期的成员 + Set validMembers = redisZSetUtil.getValidMembers(zsetKey); + System.out.println("Valid members: " + validMembers); } + @PostMapping("/queryRedis") @ApiOperation(value = "queryRedis") public ResultMsg queryRedis(@RequestBody String key) { - log.info("aiAnalyze queryRedis : {}",key); + log.info("aiAnalyze queryRedis : {}", redisTemplate.opsForZSet().zCard(key)); Set getredisSet = redisTemplate.opsForZSet().range(key, 0, -1); log.info("queryRedis:{}", getredisSet); return ResultMsg.ok(getredisSet); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index 7b3717d..df5ac31 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -2,7 +2,6 @@ package com.volvo.ai.analytic.center.mq; import com.alibaba.fastjson.JSONObject; -import com.fasterxml.jackson.databind.ObjectMapper; import com.volvo.ai.analytic.center.dto.req.DiFyReq; import com.volvo.ai.analytic.center.entity.AiAnalysisErrors; import com.volvo.ai.analytic.center.service.AiAnalysisErrorsService; @@ -10,6 +9,7 @@ import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.DiFyService; import com.volvo.ai.analytic.center.utils.ConstantStr; import com.volvo.ai.analytic.center.utils.RedisCounterRateLimiter; +import com.volvo.ai.analytic.center.utils.RedisZSetUtil; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -18,10 +18,10 @@ 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.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RestController; +import java.time.Instant; import java.util.concurrent.CompletableFuture; /** @@ -38,7 +38,7 @@ import java.util.concurrent.CompletableFuture; @RestController @RocketMQMessageListener(topic = "${rocketmq.consumer.analysisDify.topic}",consumerGroup = "${rocketmq.consumer.analysisDify.group}", instanceName = "analysisDifyMqConsumer", - consumeThreadNumber = 40, + consumeThreadNumber = 1, enableMsgTrace = true) public class AnalysisDifyMqConsumer implements RocketMQListener { @@ -63,20 +63,19 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { @Autowired private AiAnalysisErrorsService aiAnalysisErrorsService; - private final ObjectMapper objectMapper = new ObjectMapper(); - @Autowired private RedisTemplate redisTemplate; + @Autowired + private RedisZSetUtil redisZSetUtil; @Override public void onMessage(MessageExt messageExt) { log.info("analysisDifyMqConsumer 当前线程: {}, 线程ID: {}", Thread.currentThread().getName(), Thread.currentThread().getId()); long startTime = System.currentTimeMillis(); - ZSetOperations zSetOperations = redisTemplate.opsForZSet(); - Long count = zSetOperations.zCard(ConstantStr.DIFY_COUNTERRATELIMIT); - log.info("redis计数数量: " + count); + Long count = redisZSetUtil.zCard(ConstantStr.DIFY_COUNTERRATELIMIT); + log.info("redis计数数量: {}", count); if(count>=difyLimit){ - log.info("analysisDifyMqConsumer 请求dify超过基数 :{},稍后请求: " + redisCounterRateLimiter.getCurrentCount(ConstantStr.DIFY_COUNTERRATELIMIT)); + log.info("analysisDifyMqConsumer 请求dify超过基数 :{},稍后请求: " + redisZSetUtil.getValidMembers(ConstantStr.DIFY_COUNTERRATELIMIT)); throw new RuntimeException("请求dify超过基数 " ); } String message = new String(messageExt.getBody()); @@ -84,12 +83,10 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { DiFyReq difyReq = JSONObject.parseObject(message, DiFyReq.class); JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); - - zSetOperations.add(ConstantStr.DIFY_COUNTERRATELIMIT, aiAnalysisRequestId, startTime); - zSetOperations.removeRangeByScore(ConstantStr.DIFY_COUNTERRATELIMIT, 0, startTime - (expire * 1000)); + long expireTime = Instant.now().plusSeconds(expire).toEpochMilli(); // 60秒后过期 + redisZSetUtil.addWithExpire(ConstantStr.DIFY_COUNTERRATELIMIT, aiAnalysisRequestId, expireTime); try { CompletableFuture future = diFyService.asyncExecuteDifyFlow(difyReq); - // JSONObject json = future.get(); future.thenAccept(result -> { log.info("异步处理asyncExecuteDifyFlow完成aiAnalysisRequestId: {},处理结果:{}", aiAnalysisRequestId, result); JSONObject data = result.getJSONObject("data"); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisZSetUtil.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisZSetUtil.java new file mode 100644 index 0000000..14e9e10 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisZSetUtil.java @@ -0,0 +1,49 @@ +package com.volvo.ai.analytic.center.utils; + +import org.springframework.beans.factory.annotation.Autowired; + + +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.time.Instant; +import java.util.Set; + +@Service +public class RedisZSetUtil { + +// @Autowired + private RedisTemplate redisTemplate; + @Autowired + public RedisZSetUtil(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + /** + * 添加成员到 ZSet,并设置过期时间戳 + */ + public void addWithExpire(String zsetKey, String member, long expireTimeMillis) { + redisTemplate.opsForZSet().add(zsetKey, member, expireTimeMillis); + } + + /** + * 清理过期的成员 + */ + @Scheduled(fixedRate = 1000) + public void cleanupExpiredMembers() { + long now = Instant.now().toEpochMilli(); + redisTemplate.opsForZSet().removeRangeByScore(ConstantStr.DIFY_COUNTERRATELIMIT, 0, now); + } + + /** + * 获取未过期的成员 + */ + public Set getValidMembers(String zsetKey) { + long now = Instant.now().toEpochMilli(); + return redisTemplate.opsForZSet().rangeByScore(zsetKey, now, Double.MAX_VALUE); + } + + public Long zCard(String zsetKey) { + return redisTemplate.opsForZSet().zCard(zsetKey); + } +} \ No newline at end of file From 69fb252597c9fe00942e97093615b204c64028ec Mon Sep 17 00:00:00 2001 From: zren25 Date: Sun, 27 Apr 2025 09:59:18 +0800 Subject: [PATCH 18/28] sonar --- .../analytic/center/controller/RedisTestController.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java index fcbe32f..e36818c 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/RedisTestController.java @@ -44,17 +44,15 @@ public class RedisTestController { public void test(@RequestBody String message) { String zsetKey = "myZSet"; JSONObject json = JSONObject.parseObject(message); - String key = json.getString("key"); - String value =json.getString("value"); - // 添加成员并设置过期时间戳 + + // 添加成员并设置过期时间戳 long expireTime1 = Instant.now().plusSeconds(30).toEpochMilli(); // 30秒后过期 long expireTime2 = Instant.now().plusSeconds(60).toEpochMilli(); // 60秒后过期 redisZSetUtil.addWithExpire(zsetKey, "member1", expireTime1); redisZSetUtil.addWithExpire(zsetKey, "member2", expireTime2); - // 获取未过期的成员 Set validMembers = redisZSetUtil.getValidMembers(zsetKey); - System.out.println("Valid members: " + validMembers); + log.info("Valid members: " + validMembers); } @PostMapping("/queryRedis") From 93e50437dd2327d115a5050b2e328a88d517f813 Mon Sep 17 00:00:00 2001 From: zren25 Date: Sun, 27 Apr 2025 14:29:02 +0800 Subject: [PATCH 19/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9json=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AiAnalysisDifyController.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java index 51bc12c..30eceb0 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/AiAnalysisDifyController.java @@ -1,9 +1,12 @@ package com.volvo.ai.analytic.center.controller; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import com.volvo.ai.analytic.center.dto.req.AnalysisQueryReq; import com.volvo.ai.analytic.center.dto.req.AnalysisReq; -import com.volvo.ai.analytic.center.dto.resp.AnalysisDifyResultDTO; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; import com.volvo.common.core.util.ResultMsg; @@ -14,7 +17,10 @@ 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.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +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() @@ -42,9 +48,19 @@ public class AiAnalysisDifyController { @PostMapping("/aiAnalyze") @ApiOperation(value = "Ai解析接口") - public AnalysisResp aiAnalyze(@Validated @RequestBody AnalysisReq analysisReq) { - log.info("aiAnalyze data: {}",analysisReq); - return aiAnalysisDifyService.aiAnalyze(analysisReq); + public AnalysisResp aiAnalyze(@Validated @RequestBody String message) { + log.info("aiAnalyze data: {}",message); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); // 允许未转义的控制字符 + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + try { + AnalysisReq analysisReq = objectMapper.readValue(message, AnalysisReq.class); + analysisReq.validate(); + return aiAnalysisDifyService.aiAnalyze(analysisReq); + } catch (JsonProcessingException e) { + log.info("aiAnalyze data error: {}",e); + return AnalysisResp.failed("解析失败"); + } } @PostMapping("/query") From 04780a5a9143d2fbf6ab66eb88d16d861a5d0fb0 Mon Sep 17 00:00:00 2001 From: zren25 Date: Sun, 27 Apr 2025 14:44:51 +0800 Subject: [PATCH 20/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9json=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/analytic/center/dto/req/AnalysisReq.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java index fe4d58d..1c3e557 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/AnalysisReq.java @@ -1,5 +1,6 @@ package com.volvo.ai.analytic.center.dto.req; +import com.alibaba.csp.sentinel.util.StringUtil; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -40,4 +41,16 @@ public class AnalysisReq { @NotBlank(message = "业务类型不能为空") private String aiAnalysisRequestType; + public void validate() { + if (null == data){ + throw new IllegalArgumentException("请求语料不能为空"); + } + if (StringUtil.isBlank(aiAnalysisRequestType)){ + throw new IllegalArgumentException("业务类型不能为空"); + } + if (StringUtil.isBlank(callbackUrl)){ + throw new IllegalArgumentException("回调地址不能为空"); + } + } + } From bafbfefeed2c1219120e0c25290a3d7878b972d3 Mon Sep 17 00:00:00 2001 From: zren25 Date: Sun, 27 Apr 2025 15:30:55 +0800 Subject: [PATCH 21/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index df5ac31..03cd8b1 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -38,7 +38,7 @@ import java.util.concurrent.CompletableFuture; @RestController @RocketMQMessageListener(topic = "${rocketmq.consumer.analysisDify.topic}",consumerGroup = "${rocketmq.consumer.analysisDify.group}", instanceName = "analysisDifyMqConsumer", - consumeThreadNumber = 1, + consumeThreadNumber = 20, enableMsgTrace = true) public class AnalysisDifyMqConsumer implements RocketMQListener { From 96dec58d1138d96d787a6fd3c0a5e01c38b31379 Mon Sep 17 00:00:00 2001 From: zren25 Date: Mon, 28 Apr 2025 14:52:25 +0800 Subject: [PATCH 22/28] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index 03cd8b1..df5ac31 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -38,7 +38,7 @@ import java.util.concurrent.CompletableFuture; @RestController @RocketMQMessageListener(topic = "${rocketmq.consumer.analysisDify.topic}",consumerGroup = "${rocketmq.consumer.analysisDify.group}", instanceName = "analysisDifyMqConsumer", - consumeThreadNumber = 20, + consumeThreadNumber = 1, enableMsgTrace = true) public class AnalysisDifyMqConsumer implements RocketMQListener { From bfe30983e3a612435e05cf062deb648da51218a4 Mon Sep 17 00:00:00 2001 From: zren25 Date: Mon, 28 Apr 2025 22:01:14 +0800 Subject: [PATCH 23/28] =?UTF-8?q?=E5=A2=9E=E5=8A=A0redis=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai-analytic-center-biz/pom.xml | 12 +++ .../center/mq/AnalysisDifyMqConsumer.java | 93 ++++++++++++------- 2 files changed, 72 insertions(+), 33 deletions(-) diff --git a/ai-analytic-center-biz/pom.xml b/ai-analytic-center-biz/pom.xml index 2389754..cdea7a5 100644 --- a/ai-analytic-center-biz/pom.xml +++ b/ai-analytic-center-biz/pom.xml @@ -244,6 +244,18 @@ 1.9 + + org.redisson + redisson-spring-boot-starter + 3.16.4 + + + org.springframework.data + spring-data-redis + + + + diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index df5ac31..942a32b 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -14,6 +14,8 @@ 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.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.RestController; import java.time.Instant; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; /** * @ClassName AnalysisDifyMqConsumer @@ -38,7 +41,7 @@ import java.util.concurrent.CompletableFuture; @RestController @RocketMQMessageListener(topic = "${rocketmq.consumer.analysisDify.topic}",consumerGroup = "${rocketmq.consumer.analysisDify.group}", instanceName = "analysisDifyMqConsumer", - consumeThreadNumber = 1, + consumeThreadNumber = 20, enableMsgTrace = true) public class AnalysisDifyMqConsumer implements RocketMQListener { @@ -68,44 +71,68 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { @Autowired private RedisZSetUtil redisZSetUtil; + @Autowired + private RedissonClient redissonClient; @Override public void onMessage(MessageExt messageExt) { log.info("analysisDifyMqConsumer 当前线程: {}, 线程ID: {}", Thread.currentThread().getName(), Thread.currentThread().getId()); long startTime = System.currentTimeMillis(); - Long count = redisZSetUtil.zCard(ConstantStr.DIFY_COUNTERRATELIMIT); - log.info("redis计数数量: {}", count); - if(count>=difyLimit){ - log.info("analysisDifyMqConsumer 请求dify超过基数 :{},稍后请求: " + redisZSetUtil.getValidMembers(ConstantStr.DIFY_COUNTERRATELIMIT)); - throw new RuntimeException("请求dify超过基数 " ); - } - String message = new String(messageExt.getBody()); - log.info("analysisDifyMqConsumer message: " + message); - DiFyReq difyReq = JSONObject.parseObject(message, DiFyReq.class); - JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); - String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); - long expireTime = Instant.now().plusSeconds(expire).toEpochMilli(); // 60秒后过期 - redisZSetUtil.addWithExpire(ConstantStr.DIFY_COUNTERRATELIMIT, aiAnalysisRequestId, expireTime); + RLock lock = redissonClient.getLock("LOCK_PREFIX:" + ConstantStr.DIFY_COUNTERRATELIMIT); try { - CompletableFuture future = diFyService.asyncExecuteDifyFlow(difyReq); - future.thenAccept(result -> { - log.info("异步处理asyncExecuteDifyFlow完成aiAnalysisRequestId: {},处理结果:{}", aiAnalysisRequestId, result); - JSONObject data = result.getJSONObject("data"); - - if(null == result || data.get("status").equals("failed")){ - aiAnalysisErrorsService.saveAiAnalysisErrors(AiAnalysisErrors.builder() - .aiAnalysisRequestId(aiAnalysisRequestId) - .aiAnalysisRequestType(difyRequest.getString("aiAnalysisRequestType")) - .aiAnalysisErrorHandlingStatus("0") - .aiAnalysisErrorMessage(data.getString("error")) - .build()); + // 2. 尝试加锁(参数说明:等待时间, 锁自动释放时间, 时间单位) + boolean isLocked = lock.tryLock(10, expire, TimeUnit.SECONDS); // 不等待,立即尝试获取 + if (isLocked) { + Long count = redisZSetUtil.zCard(ConstantStr.DIFY_COUNTERRATELIMIT); + log.info("redis计数数量: {}", count); + if(count>=difyLimit){ + log.info("analysisDifyMqConsumer 请求dify超过基数 :{},稍后请求: " + redisZSetUtil.getValidMembers(ConstantStr.DIFY_COUNTERRATELIMIT)); + throw new RuntimeException("请求dify超过基数 " ); } - }).exceptionally(ex -> { - log.error("异步处理asyncExecuteDifyFlow 失败aiAnalysisRequestId: {} ,{}", aiAnalysisRequestId,ex.getMessage()); - return null; - }); - log.info("analysisDifyMqConsumer处理完成,耗时:{}", System.currentTimeMillis() - startTime); - } catch (Exception e) { - log.info(" analysisDifyMqConsumer 处理失败:{}", e.getMessage()); + String message = new String(messageExt.getBody()); + log.info("analysisDifyMqConsumer message: " + message); + DiFyReq difyReq = JSONObject.parseObject(message, DiFyReq.class); + JSONObject difyRequest = JSONObject.parseObject(JSONObject.toJSONString(difyReq.getInputs()), JSONObject.class); + String aiAnalysisRequestId = difyRequest.getString("aiAnalysisRequestId"); + long expireTime = Instant.now().plusSeconds(expire).toEpochMilli(); // 60秒后过期 + redisZSetUtil.addWithExpire(ConstantStr.DIFY_COUNTERRATELIMIT, aiAnalysisRequestId, expireTime); + + CompletableFuture future = diFyService.asyncExecuteDifyFlow(difyReq); + future.thenAccept(result -> { + log.info("异步处理asyncExecuteDifyFlow完成aiAnalysisRequestId: {},处理结果:{}", aiAnalysisRequestId, result); + JSONObject data = result.getJSONObject("data"); + + if(null == result || data.get("status").equals("failed")){ + aiAnalysisErrorsService.saveAiAnalysisErrors(AiAnalysisErrors.builder() + .aiAnalysisRequestId(aiAnalysisRequestId) + .aiAnalysisRequestType(difyRequest.getString("aiAnalysisRequestType")) + .aiAnalysisErrorHandlingStatus("0") + .aiAnalysisErrorMessage(data.getString("error")) + .build()); + } + }).exceptionally(ex -> { + log.error("异步处理asyncExecuteDifyFlow 失败aiAnalysisRequestId: {} ,{}", aiAnalysisRequestId,ex.getMessage()); + return null; + }); + lock.unlock(); + log.info("analysisDifyMqConsumer处理完成,耗时:{}", System.currentTimeMillis() - startTime); + }else{ + log.info("redis锁未获取到 "); + throw new RuntimeException("锁超时 " ); + } + + } catch (InterruptedException e) { +// Thread.currentThread().interrupt(); // 保持中断状态 + throw new RuntimeException("锁获取被中断", e); + } catch (Exception e){ + log.error("analysisDifyMqConsumer 异常:{}", e.getMessage()); + throw new RuntimeException("请求dify超过基数 " ); + }finally { + // 4. 确保只有持有锁的线程才能解锁(关键!) + if (lock != null && lock.isHeldByCurrentThread()) { + lock.unlock(); + // 建议记录解锁日志 + log.info("释放锁成功,锁KEY: {}", ConstantStr.DIFY_COUNTERRATELIMIT); + } } } From 4490be3a9c1c296f7c365253a3ea694fc2cca695 Mon Sep 17 00:00:00 2001 From: zren25 Date: Tue, 29 Apr 2025 14:34:16 +0800 Subject: [PATCH 24/28] =?UTF-8?q?=E5=A2=9E=E5=8A=A0redisson=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/config/RedissonConfig.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java new file mode 100644 index 0000000..c106ab7 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java @@ -0,0 +1,40 @@ +package com.volvo.ai.analytic.center.config; + +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RefreshScope +public class RedissonConfig { + + @Value("${spring.redis.host}") + private String host; + + @Value("${spring.redis.port}") + private String port; + + @Value("${spring.redis.password}") + private String password; + + @Value("${spring.redis.username}") + private String userName; + + @Bean(destroyMethod = "shutdown") + public RedissonClient redissonClient() { + Config config = new Config(); + config.useSingleServer() + .setAddress("redis://" + host + ":" + port) + .setPassword(password).setUsername(userName) + .setDatabase(0) + .setConnectionMinimumIdleSize(5) + .setIdleConnectionTimeout(10000) + .setConnectTimeout(10000) + .setTimeout(3000); + return Redisson.create(config); + } +} \ No newline at end of file From aaffd3e8f4e7221068fd32d1a21518ef6c669268 Mon Sep 17 00:00:00 2001 From: zren25 Date: Tue, 29 Apr 2025 14:35:09 +0800 Subject: [PATCH 25/28] =?UTF-8?q?=E5=A2=9E=E5=8A=A0redisson=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/volvo/ai/analytic/center/config/RedissonConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java index c106ab7..c638d6d 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java @@ -33,8 +33,8 @@ public class RedissonConfig { .setDatabase(0) .setConnectionMinimumIdleSize(5) .setIdleConnectionTimeout(10000) - .setConnectTimeout(10000) - .setTimeout(3000); + .setConnectTimeout(50000) + .setTimeout(50000); return Redisson.create(config); } } \ No newline at end of file From 4be5906991521325cd9dd509c5f693be25ebeb2e Mon Sep 17 00:00:00 2001 From: zren25 Date: Tue, 29 Apr 2025 16:41:20 +0800 Subject: [PATCH 26/28] =?UTF-8?q?=E5=88=A0=E9=99=A4redisson?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/config/RedissonConfig.java | 40 ----------------- .../center/mq/AnalysisDifyMqConsumer.java | 31 ++++++------- .../center/utils/RedisLockService.java | 43 +++++++++++++++++++ 3 files changed, 56 insertions(+), 58 deletions(-) delete mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisLockService.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java deleted file mode 100644 index c638d6d..0000000 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.volvo.ai.analytic.center.config; - -import org.redisson.Redisson; -import org.redisson.api.RedissonClient; -import org.redisson.config.Config; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@RefreshScope -public class RedissonConfig { - - @Value("${spring.redis.host}") - private String host; - - @Value("${spring.redis.port}") - private String port; - - @Value("${spring.redis.password}") - private String password; - - @Value("${spring.redis.username}") - private String userName; - - @Bean(destroyMethod = "shutdown") - public RedissonClient redissonClient() { - Config config = new Config(); - config.useSingleServer() - .setAddress("redis://" + host + ":" + port) - .setPassword(password).setUsername(userName) - .setDatabase(0) - .setConnectionMinimumIdleSize(5) - .setIdleConnectionTimeout(10000) - .setConnectTimeout(50000) - .setTimeout(50000); - return Redisson.create(config); - } -} \ No newline at end of file diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index 942a32b..6a14976 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -9,13 +9,12 @@ import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.DiFyService; import com.volvo.ai.analytic.center.utils.ConstantStr; import com.volvo.ai.analytic.center.utils.RedisCounterRateLimiter; +import com.volvo.ai.analytic.center.utils.RedisLockService; import com.volvo.ai.analytic.center.utils.RedisZSetUtil; 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.redisson.api.RLock; -import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -25,7 +24,6 @@ import org.springframework.web.bind.annotation.RestController; import java.time.Instant; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; /** * @ClassName AnalysisDifyMqConsumer @@ -71,16 +69,18 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { @Autowired private RedisZSetUtil redisZSetUtil; + @Autowired - private RedissonClient redissonClient; + private RedisLockService redisLockService; @Override public void onMessage(MessageExt messageExt) { log.info("analysisDifyMqConsumer 当前线程: {}, 线程ID: {}", Thread.currentThread().getName(), Thread.currentThread().getId()); long startTime = System.currentTimeMillis(); - RLock lock = redissonClient.getLock("LOCK_PREFIX:" + ConstantStr.DIFY_COUNTERRATELIMIT); + String lockKey = "LOCK_PREFIX:" + ConstantStr.DIFY_COUNTERRATELIMIT; +// RLock lock = redissonClient.getLock("LOCK_PREFIX:" + ConstantStr.DIFY_COUNTERRATELIMIT); try { - // 2. 尝试加锁(参数说明:等待时间, 锁自动释放时间, 时间单位) - boolean isLocked = lock.tryLock(10, expire, TimeUnit.SECONDS); // 不等待,立即尝试获取 + + boolean isLocked = redisLockService.tryLock(lockKey,ConstantStr.DIFY_COUNTERRATELIMIT, expire); // 不等待,立即尝试获取 if (isLocked) { Long count = redisZSetUtil.zCard(ConstantStr.DIFY_COUNTERRATELIMIT); log.info("redis计数数量: {}", count); @@ -113,26 +113,21 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { log.error("异步处理asyncExecuteDifyFlow 失败aiAnalysisRequestId: {} ,{}", aiAnalysisRequestId,ex.getMessage()); return null; }); - lock.unlock(); + redisLockService.releaseLock(lockKey, ConstantStr.DIFY_COUNTERRATELIMIT); log.info("analysisDifyMqConsumer处理完成,耗时:{}", System.currentTimeMillis() - startTime); }else{ log.info("redis锁未获取到 "); throw new RuntimeException("锁超时 " ); } - } catch (InterruptedException e) { -// Thread.currentThread().interrupt(); // 保持中断状态 - throw new RuntimeException("锁获取被中断", e); - } catch (Exception e){ + } catch (Exception e){ log.error("analysisDifyMqConsumer 异常:{}", e.getMessage()); throw new RuntimeException("请求dify超过基数 " ); }finally { - // 4. 确保只有持有锁的线程才能解锁(关键!) - if (lock != null && lock.isHeldByCurrentThread()) { - lock.unlock(); - // 建议记录解锁日志 - log.info("释放锁成功,锁KEY: {}", ConstantStr.DIFY_COUNTERRATELIMIT); - } + redisLockService.releaseLock(lockKey, ConstantStr.DIFY_COUNTERRATELIMIT); + // 建议记录解锁日志 + log.info("释放锁成功,锁KEY: {}", ConstantStr.DIFY_COUNTERRATELIMIT); + } } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisLockService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisLockService.java new file mode 100644 index 0000000..58b91ca --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisLockService.java @@ -0,0 +1,43 @@ +package com.volvo.ai.analytic.center.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +@Service +public class RedisLockService { + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + /** + * 尝试获取分布式锁 + * + * @param lockKey 锁的键名 + * @param requestId 请求标识(用于解锁时验证) + * @param expireTime 锁的过期时间(秒) + * @return 是否获取锁成功 + */ + public boolean tryLock(String lockKey, String requestId, long expireTime) { + return stringRedisTemplate.opsForValue() + .setIfAbsent(lockKey, requestId, expireTime, TimeUnit.SECONDS); + } + + /** + * 释放分布式锁 + * + * @param lockKey 锁的键名 + * @param requestId 请求标识(用于验证) + * @return 是否释放锁成功 + */ + public boolean releaseLock(String lockKey, String requestId) { + String currentValue = stringRedisTemplate.opsForValue().get(lockKey); + if (currentValue != null && currentValue.equals(requestId)) { + stringRedisTemplate.delete(lockKey); + return true; + } + return false; + } +} From 2e6a75a62d765b911924e65e0c2d3b004d3f2102 Mon Sep 17 00:00:00 2001 From: zren25 Date: Tue, 29 Apr 2025 16:41:31 +0800 Subject: [PATCH 27/28] =?UTF-8?q?=E5=88=A0=E9=99=A4redisson?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai-analytic-center-biz/pom.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/ai-analytic-center-biz/pom.xml b/ai-analytic-center-biz/pom.xml index cdea7a5..35dc96d 100644 --- a/ai-analytic-center-biz/pom.xml +++ b/ai-analytic-center-biz/pom.xml @@ -244,17 +244,17 @@ 1.9 - - org.redisson - redisson-spring-boot-starter - 3.16.4 - - - org.springframework.data - spring-data-redis - - - + + + + + + + + + + + From 18b9fdac69ded389def6daa81066f2a0732430d1 Mon Sep 17 00:00:00 2001 From: zren25 Date: Tue, 29 Apr 2025 16:46:47 +0800 Subject: [PATCH 28/28] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index 6a14976..f89d9cc 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -110,6 +110,12 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { .build()); } }).exceptionally(ex -> { + aiAnalysisErrorsService.saveAiAnalysisErrors(AiAnalysisErrors.builder() + .aiAnalysisRequestId(aiAnalysisRequestId) + .aiAnalysisRequestType(difyRequest.getString("aiAnalysisRequestType")) + .aiAnalysisErrorHandlingStatus("0") + .aiAnalysisErrorMessage(ex.getMessage()) + .build()); log.error("异步处理asyncExecuteDifyFlow 失败aiAnalysisRequestId: {} ,{}", aiAnalysisRequestId,ex.getMessage()); return null; });