From 3702cc873eb33a63e5f63800275155d78cb0948e Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 11 Apr 2025 16:00:35 +0800 Subject: [PATCH 01/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] 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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] 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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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/36] =?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; }); From 334862149c6a908b96068c23886867c2925880fb Mon Sep 17 00:00:00 2001 From: lxu75 Date: Fri, 23 May 2025 20:00:34 +0800 Subject: [PATCH 29/36] =?UTF-8?q?feed=E6=B5=81=E5=A5=BD=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/dto/req/CommunityTargetDTO.java | 1 + .../center/enums/BusinessTypeEnum.java | 3 + .../impl/MqMessageRecordServiceImpl.java | 145 +++++++++++++----- 3 files changed, 111 insertions(+), 38 deletions(-) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/CommunityTargetDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/CommunityTargetDTO.java index 2fa70d6..3a4c34d 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/CommunityTargetDTO.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/CommunityTargetDTO.java @@ -12,6 +12,7 @@ public class CommunityTargetDTO { private String targetType; private String targetId; private String communityRequestId; + private String communityType; private List content; @Setter 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 2f3b50f..9596e1e 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,6 +6,9 @@ import lombok.Getter; public enum BusinessTypeEnum { COMMUNITYTARGET("CommunityTarget", "社区舆情分析"), + FEEDQUALITY("feedQuality", "Feed流好内容"), + PUBLICOPINIONAUTOMATION("publicOpinionAutomation", "舆情自动化"), + SMART_ASSISTANT("SMART_ASSISTANT", "智能助手-DCC"), SMART_ASSISTANT_QIWEI("SMART_ASSISTANT_QIWEI", "智能助手-企微"), INTELLIGENT_CUSTOMER("INTELLIGENT_CUSTOMER_4IN1", "智能客服-4合一"), diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java index 5e2ce92..90a5e6d 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java @@ -80,6 +80,9 @@ public class MqMessageRecordServiceImpl extends ServiceImpl caseWorkFlow = CompletableFuture.supplyAsync(() -> callCaseCommunityWorkFlow(difyCommunityTargetDTO,user, caseToken),getAsyncExecutor); + @Async + protected void processFeedDify(DifyCommunityTargetDTO difyCommunityTargetDTO, JSONArray difyResult, String aiAnalysisRequestId) { + try { + DiFyReq diFyFeedQualityReq = new DiFyReq(); + diFyFeedQualityReq.setUser(user); + diFyFeedQualityReq.setFlowId(feedToken); + diFyFeedQualityReq.setInputs(difyCommunityTargetDTO); + JSONObject difFeedQualityResult = (JSONObject) diFyService.getDiFyObject(diFyFeedQualityReq); + if (difFeedQualityResult != null) { + difFeedQualityResult.put("communityType",BusinessTypeEnum.FEEDQUALITY.getCode()); + //返回结果推送到社区的MQ + rocketMQTemplate.syncSend(topic, difFeedQualityResult.toString()); + log.info("Feed流好内容发送回调MQ完成: {}", difFeedQualityResult); + aiAnalysisRequestLogsMapper.update(new AiAnalysisRequestLogs(), + new UpdateWrapper().set("dify_response", difFeedQualityResult.toJSONString()) + .eq("ai_analysis_request_id", aiAnalysisRequestId)); + } + } catch (Exception e) { + saveOrUpdateError(aiAnalysisRequestId, e, BusinessTypeEnum.FEEDQUALITY.getCode()); + } + } - // 内容主题关键词打标 - CompletableFuture keywordWorkFlow = CompletableFuture.supplyAsync(() -> callCommunityWorkFlow(difyCommunityTargetDTO,user, keywordToken),getAsyncExecutor); + @Async + protected void processPublicOpinionAutomationDify(DifyCommunityTargetDTO difyCommunityTargetDTO, String user, JSONArray difyResult, String aiAnalysisRequestId) { + try { + //舆情案件分析 + CompletableFuture caseWorkFlow = CompletableFuture.supplyAsync(() -> callCaseCommunityWorkFlow(difyCommunityTargetDTO, user, caseToken), getAsyncExecutor); - // litecrm线索分析 - CompletableFuture clueAnalysisWorkFlow = CompletableFuture.supplyAsync(() -> callCommunityWorkFlow(difyCommunityTargetDTO,user, clueAnalysisToken),getAsyncExecutor); + // 内容主题关键词打标 + CompletableFuture keywordWorkFlow = CompletableFuture.supplyAsync(() -> callCommunityWorkFlow(difyCommunityTargetDTO, user, keywordToken), getAsyncExecutor); - CompletableFuture allFutures = CompletableFuture.allOf(caseWorkFlow, keywordWorkFlow, clueAnalysisWorkFlow); - // 等待所有API调用完成 - allFutures.get(); - // 获取各个API的结果 - JSONObject caseResult = caseWorkFlow.get(); - JSONObject keywordResult = keywordWorkFlow.get(); - JSONObject clueAnalysisResult = clueAnalysisWorkFlow.get(); - difyResult.add(caseResult); - difyResult.add(keywordResult); - difyResult.add(clueAnalysisResult); - //处理结果 - processingCommunityDifyResponse(caseResult,keywordResult,clueAnalysisResult, aiAnalysisRequestId,difyCommunityTargetDTO.getCommunityRequestId()); + // litecrm线索分析 + CompletableFuture clueAnalysisWorkFlow = CompletableFuture.supplyAsync(() -> callCommunityWorkFlow(difyCommunityTargetDTO, user, clueAnalysisToken), getAsyncExecutor); + + CompletableFuture allFutures = CompletableFuture.allOf(caseWorkFlow, keywordWorkFlow, clueAnalysisWorkFlow); + // 等待所有API调用完成 + allFutures.get(); + // 获取各个API的结果 + JSONObject caseResult = caseWorkFlow.get(); + JSONObject keywordResult = keywordWorkFlow.get(); + JSONObject clueAnalysisResult = clueAnalysisWorkFlow.get(); + difyResult.add(caseResult); + difyResult.add(keywordResult); + difyResult.add(clueAnalysisResult); + //处理结果 + processingCommunityDifyResponse(caseResult, keywordResult, clueAnalysisResult, aiAnalysisRequestId, difyCommunityTargetDTO.getCommunityRequestId()); + } catch (Exception e) { + saveOrUpdateError(aiAnalysisRequestId, e, BusinessTypeEnum.PUBLICOPINIONAUTOMATION.getCode()); + } + } + + private void saveOrUpdateError(String aiAnalysisRequestId, Exception e, String businnessType) { + //根据aiAnalysisRequestId查询是否存在错误日志,无则新增,有则更新retryCount+1 + AiAnalysisErrors aiAnalysisErrors = aiAnalysisErrorsMapper.selectOne( + new LambdaQueryWrapper() + .eq(AiAnalysisErrors::getAiAnalysisRequestId, aiAnalysisRequestId) + .eq(AiAnalysisErrors::getAiAnalysisRequestType, businnessType) + .last("for update") // 添加悲观锁 + ); + if (aiAnalysisErrors != null) { + aiAnalysisErrors.setRetryCount(aiAnalysisErrors.getRetryCount() + 1); + aiAnalysisErrorsMapper.updateById(aiAnalysisErrors); + log.error("处理错误日志失败:{}", e.getMessage()); + } else { + aiAnalysisErrorsMapper.insert(AiAnalysisErrors.builder() + .aiAnalysisRequestId(aiAnalysisRequestId) + .aiAnalysisErrorMessage(e.getMessage()) + //舆情自动化标识 + .aiAnalysisRequestType(businnessType) + .build()); + } } /** * 调用案件,关键词,线索工作流 */ - private JSONObject callCommunityWorkFlow(DifyCommunityTargetDTO difyCommunityTargetDTO ,String user, String token) { - log.info("开始调用关键词,线索工作流,token: {}",token); + private JSONObject callCommunityWorkFlow(DifyCommunityTargetDTO difyCommunityTargetDTO, String user, String token) { + log.info("开始调用关键词,线索工作流,token: {}", token); DiFyReq diFyReq = new DiFyReq(); diFyReq.setUser(user); diFyReq.setInputs(difyCommunityTargetDTO); @@ -196,7 +250,7 @@ public class MqMessageRecordServiceImpl extends ServiceImpl aiAnalyticBusinessConfigs = aiAnalyticBusinessConfigMapper.selectList( Wrappers.lambdaQuery() .eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.COMMUNITYTARGET.getCode()) @@ -204,7 +258,7 @@ public class MqMessageRecordServiceImpl extends ServiceImpl aiAnalysisErrors = aiAnalysisErrorsMapper.selectList(new LambdaQueryWrapper() - .eq(AiAnalysisErrors::getAiAnalysisRequestType, BusinessTypeEnum.COMMUNITYTARGET.getCode()) + .in(AiAnalysisErrors::getAiAnalysisRequestType, BusinessTypeEnum.COMMUNITYTARGET.getCode(), + BusinessTypeEnum.PUBLICOPINIONAUTOMATION.getCode(), BusinessTypeEnum.FEEDQUALITY.getCode()) .eq(AiAnalysisErrors::getAiAnalysisErrorHandlingStatus, "0") .lt(AiAnalysisErrors::getRetryCount, maxRetryCount)); if (aiAnalysisErrors != null && aiAnalysisErrors.size() > 0) { @@ -670,8 +729,18 @@ public class MqMessageRecordServiceImpl extends ServiceImpl() .eq(AiAnalysisErrors::getAiAnalysisRequestId, aiAnalysisError.getAiAnalysisRequestId()) @@ -681,14 +750,14 @@ public class MqMessageRecordServiceImpl extends ServiceImpl() .eq(AiAnalysisRequestLogs::getAiAnalysisRequestId, aiAnalysisError.getAiAnalysisRequestId()) .set(AiAnalysisRequestLogs::getDifyResponse, difyResult.toJSONString())); - }else{ + } else { aiAnalysisErrorsMapper.update(new AiAnalysisErrors(), new LambdaUpdateWrapper() .eq(AiAnalysisErrors::getAiAnalysisRequestId, aiAnalysisError.getAiAnalysisRequestId()) .set(AiAnalysisErrors::getAiAnalysisErrorHandlingStatus, "2")); } } } catch (Exception e) { - log.error("补偿社区消息,AIID:{},异常:{}",aiAnalysisError.getAiAnalysisRequestId(), e); + log.error("补偿社区消息,AIID:{},异常:{}", aiAnalysisError.getAiAnalysisRequestId(), e); aiAnalysisErrorsMapper.update(new AiAnalysisErrors(), new LambdaUpdateWrapper() .eq(AiAnalysisErrors::getAiAnalysisRequestId, aiAnalysisError.getAiAnalysisRequestId()) .set(AiAnalysisErrors::getRetryCount, aiAnalysisError.getRetryCount() + 1)); @@ -696,7 +765,7 @@ public class MqMessageRecordServiceImpl extends ServiceImpl Date: Mon, 26 May 2025 10:34:40 +0800 Subject: [PATCH 30/36] =?UTF-8?q?feed=E6=B5=81=E5=A5=BD=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E7=BA=BF=E7=A8=8B=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/config/AsyncTaskExecutePool.java | 68 ------------------- .../impl/MqMessageRecordServiceImpl.java | 16 +---- 2 files changed, 3 insertions(+), 81 deletions(-) delete mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/AsyncTaskExecutePool.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/AsyncTaskExecutePool.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/AsyncTaskExecutePool.java deleted file mode 100644 index 51254a4..0000000 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/AsyncTaskExecutePool.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.volvo.ai.analytic.center.config; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.scheduling.annotation.AsyncConfigurer; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.stereotype.Component; - -import java.util.concurrent.*; - -/** - * 异步任务线程池装配类 - * @author gubin - * @date 2022-04-14 - */ -@EnableAsync -@Slf4j -@Component -public class AsyncTaskExecutePool implements AsyncConfigurer { - - @Value("${task.pool.corePoolSize}") - private int corePoolSize; - - @Value("${task.pool.maxPoolSize}") - private int maxPoolSize; - - @Value("${task.pool.queueCapacity}") - private int queueCapacity; - - @Value("${task.pool.keepAliveSeconds}") - private int keepAliveSeconds; - - - @Bean - @Override - public Executor getAsyncExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - //核心线程池大小 - executor.setCorePoolSize(corePoolSize); - //最大线程数 - executor.setMaxPoolSize(maxPoolSize); - //队列容量 - executor.setQueueCapacity(queueCapacity); - //活跃时间 - executor.setKeepAliveSeconds(keepAliveSeconds); - //线程名字前缀 - executor.setThreadNamePrefix("async-task-"); - // setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务 - // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - executor.initialize(); - return executor; - } - - @Override - public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { - return (throwable, method, objects) -> { - log.error("===="+throwable.getMessage()+"====", throwable); - log.error("exception method:"+method.getName()); - }; - } - - - -} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java index 90a5e6d..b2f9c30 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java @@ -95,9 +95,6 @@ public class MqMessageRecordServiceImpl extends ServiceImpl caseWorkFlow = CompletableFuture.supplyAsync(() -> callCaseCommunityWorkFlow(difyCommunityTargetDTO, user, caseToken), getAsyncExecutor); + JSONObject caseResult = callCaseCommunityWorkFlow(difyCommunityTargetDTO,user, caseToken); // 内容主题关键词打标 - CompletableFuture keywordWorkFlow = CompletableFuture.supplyAsync(() -> callCommunityWorkFlow(difyCommunityTargetDTO, user, keywordToken), getAsyncExecutor); + JSONObject keywordResult = callCommunityWorkFlow(difyCommunityTargetDTO,user, keywordToken); // litecrm线索分析 - CompletableFuture clueAnalysisWorkFlow = CompletableFuture.supplyAsync(() -> callCommunityWorkFlow(difyCommunityTargetDTO, user, clueAnalysisToken), getAsyncExecutor); + JSONObject clueAnalysisResult = callCommunityWorkFlow(difyCommunityTargetDTO,user, clueAnalysisToken); - CompletableFuture allFutures = CompletableFuture.allOf(caseWorkFlow, keywordWorkFlow, clueAnalysisWorkFlow); - // 等待所有API调用完成 - allFutures.get(); - // 获取各个API的结果 - JSONObject caseResult = caseWorkFlow.get(); - JSONObject keywordResult = keywordWorkFlow.get(); - JSONObject clueAnalysisResult = clueAnalysisWorkFlow.get(); difyResult.add(caseResult); difyResult.add(keywordResult); difyResult.add(clueAnalysisResult); From 1f3c35b146b2c52aedbce6d4ce5b6093d210f8a4 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Tue, 27 May 2025 19:28:20 +0800 Subject: [PATCH 31/36] =?UTF-8?q?feed=E6=B5=81=E5=A5=BD=E5=86=85=E5=AE=B9,?= =?UTF-8?q?=E6=9B=B4=E6=96=B0dify=E5=93=8D=E5=BA=94=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/MqMessageRecordServiceImpl.java | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java index b2f9c30..ec2ba60 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -167,30 +168,52 @@ public class MqMessageRecordServiceImpl extends ServiceImpl().set("dify_response", difFeedQualityResult.toJSONString()) - .eq("ai_analysis_request_id", aiAnalysisRequestId)); + //aiAnalysisRequestId 根据查询日志表,获取dify_response,设置到aiAnalysisRequestLogs表中 + updaterDifyResponse(aiAnalysisRequestId, difFeedQualityResult, BusinessTypeEnum.FEEDQUALITY.getCode()); } } catch (Exception e) { saveOrUpdateError(aiAnalysisRequestId, e, BusinessTypeEnum.FEEDQUALITY.getCode()); } } + private void updaterDifyResponse(String aiAnalysisRequestId, JSONObject difFeedQualityResult, String businessType) { + AiAnalysisRequestLogs aiAnalysisRequestLogs = aiAnalysisRequestLogsMapper.selectOne( + new LambdaQueryWrapper() + .eq(AiAnalysisRequestLogs::getAiAnalysisRequestId, aiAnalysisRequestId) + .last("for update")); + + if (aiAnalysisRequestLogs == null) { + log.error("未找到对应的 AiAnalysisRequestLogs,请求ID: {}", aiAnalysisRequestId); + throw new RuntimeException("未找到对应的请求日志"); + } + + String difyResponseStr = aiAnalysisRequestLogs.getDifyResponse(); + JSONObject difyResponse = StringUtils.isNotBlank(difyResponseStr) + ? JSONObject.parseObject(difyResponseStr) + : new JSONObject(); + + difyResponse.put(businessType, difFeedQualityResult); + + aiAnalysisRequestLogsMapper.update(null, + new UpdateWrapper() + .set("dify_response", difyResponse.toJSONString()) + .eq("ai_analysis_request_id", aiAnalysisRequestId)); + } @Async protected void processPublicOpinionAutomationDify(DifyCommunityTargetDTO difyCommunityTargetDTO, String user, JSONArray difyResult, String aiAnalysisRequestId) { try { //舆情案件分析 - JSONObject caseResult = callCaseCommunityWorkFlow(difyCommunityTargetDTO,user, caseToken); + JSONObject caseResult = callCaseCommunityWorkFlow(difyCommunityTargetDTO, user, caseToken); // 内容主题关键词打标 - JSONObject keywordResult = callCommunityWorkFlow(difyCommunityTargetDTO,user, keywordToken); + JSONObject keywordResult = callCommunityWorkFlow(difyCommunityTargetDTO, user, keywordToken); // litecrm线索分析 - JSONObject clueAnalysisResult = callCommunityWorkFlow(difyCommunityTargetDTO,user, clueAnalysisToken); + JSONObject clueAnalysisResult = callCommunityWorkFlow(difyCommunityTargetDTO, user, clueAnalysisToken); difyResult.add(caseResult); difyResult.add(keywordResult); @@ -328,13 +351,11 @@ public class MqMessageRecordServiceImpl extends ServiceImpl().set("dify_response", caseResult.toJSONString()) - .eq("ai_analysis_request_id", aiAnalysisRequestId)); + updaterDifyResponse(aiAnalysisRequestId, caseResult, BusinessTypeEnum.PUBLICOPINIONAUTOMATION.getCode()); } } @@ -723,7 +744,7 @@ public class MqMessageRecordServiceImpl extends ServiceImpl() - .eq(AiAnalysisRequestLogs::getAiAnalysisRequestId, aiAnalysisError.getAiAnalysisRequestId()) - .set(AiAnalysisRequestLogs::getDifyResponse, difyResult.toJSONString())); } else { aiAnalysisErrorsMapper.update(new AiAnalysisErrors(), new LambdaUpdateWrapper() .eq(AiAnalysisErrors::getAiAnalysisRequestId, aiAnalysisError.getAiAnalysisRequestId()) From 2b45621d1350d41818de74a519aaae9e6c767796 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Tue, 27 May 2025 19:59:24 +0800 Subject: [PATCH 32/36] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/service/impl/MqMessageRecordServiceImpl.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java index ec2ba60..b14c802 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java @@ -6,7 +6,6 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -39,9 +38,6 @@ import org.springframework.util.CollectionUtils; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; import java.util.stream.Collectors; @Slf4j From 90a5ba063e00d59820462b7e4dbb7d563fe30299 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Wed, 28 May 2025 14:43:38 +0800 Subject: [PATCH 33/36] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/service/impl/MqMessageRecordServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java index b14c802..22a53db 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java @@ -172,6 +172,7 @@ public class MqMessageRecordServiceImpl extends ServiceImpl Date: Wed, 28 May 2025 14:45:57 +0800 Subject: [PATCH 34/36] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/service/impl/MqMessageRecordServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java index 22a53db..6d11f5e 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/MqMessageRecordServiceImpl.java @@ -741,13 +741,16 @@ public class MqMessageRecordServiceImpl extends ServiceImpl Date: Sun, 25 May 2025 15:01:39 +0800 Subject: [PATCH 35/36] =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 106e34fbd75574ade5e55814e6a3aae9c770c2fb) --- .../center/mq/CorpusProcessKafkaProducer.java | 14 ++++-- .../TmOdsVdqwMessagearchivingServiceImpl.java | 49 +++++++++++-------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusProcessKafkaProducer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusProcessKafkaProducer.java index e6cb9af..43f1877 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusProcessKafkaProducer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusProcessKafkaProducer.java @@ -76,12 +76,12 @@ public class CorpusProcessKafkaProducer { @KafkaListener(topics = "${spring.kafka.topic}", groupId = "${spring.kafka.group}") public void listen(List> recordMessages) { long startTime = System.currentTimeMillis(); + log.info("CorpusProcessKafkaProducer Received message: {}", recordMessages); + // 获取消息列表 + int optimalThreadPoolSize = Runtime.getRuntime().availableProcessors() + 2; + log.info("获取的线程数:{}", optimalThreadPoolSize); + ExecutorService executor = Executors.newFixedThreadPool(optimalThreadPoolSize); try { - log.info("CorpusProcessKafkaProducer Received message: {}", recordMessages); - // 获取消息列表 - int optimalThreadPoolSize = Runtime.getRuntime().availableProcessors() + 2; - log.info("获取的线程数:{}", optimalThreadPoolSize); - ExecutorService executor = Executors.newFixedThreadPool(optimalThreadPoolSize); if(CollectionUtils.isNotEmpty(recordMessages)){ log.info("CorpusProcessKafkaProducer List size: {}", recordMessages.size()); for (ConsumerRecord record : recordMessages) { @@ -120,6 +120,8 @@ public class CorpusProcessKafkaProducer { } } catch (Exception e) { log.error("CorpusProcessKafkaProducer 电话语料 解析JSON出错: {}", e.getMessage()); + }finally { + executor.shutdown(); } }); @@ -131,6 +133,8 @@ public class CorpusProcessKafkaProducer { // 在这里可以添加对解析后的对象的进一步处理逻辑 } catch (Exception e) { log.error("CorpusProcessKafkaProducer 电话语料 解析JSON出错: {}" , e.getMessage()); + }finally { + executor.shutdown(); } } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsVdqwMessagearchivingServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsVdqwMessagearchivingServiceImpl.java index 16f85da..6d2965d 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsVdqwMessagearchivingServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsVdqwMessagearchivingServiceImpl.java @@ -125,27 +125,34 @@ public class TmOdsVdqwMessagearchivingServiceImpl extends ServiceImpl messageList = tmOdsVdqwMessagearchivingMapper.queryOdsVdqwMessageByData(statTime, endTime, offset, pageSize, retry); - // 处理查询到的数据 - // 使用 CompletableFuture 并行处理 - CompletableFuture[] futures = messageList.stream() - .map(item -> CompletableFuture.runAsync(() -> { - try { - processItem(item, finalStatTime, finalEndTime); - } catch (Exception e) { - log.error("处理企微语料失败: FromUserId={}, AcceptUserId={}, 异常: {}", - item.getFromUserId(), item.getAcceptUserId(), e.getMessage(), e); - } - }, executor)) - .toArray(CompletableFuture[]::new); - // 等待所有任务完成 - CompletableFuture.allOf(futures).join(); - } - // 关闭线程池 - executor.shutdown(); - log.info("企微数据跑批结束 耗时:{}",System.currentTimeMillis()-startTime); + try { + for (int i = 1; i <= totalPages; i++) { + int offset = (i - 1) * pageSize; + List messageList = tmOdsVdqwMessagearchivingMapper.queryOdsVdqwMessageByData(statTime, endTime, offset, pageSize, retry); + // 处理查询到的数据 + // 使用 CompletableFuture 并行处理 + CompletableFuture[] futures = messageList.stream() + .map(item -> CompletableFuture.runAsync(() -> { + try { + processItem(item, finalStatTime, finalEndTime); + } catch (Exception e) { + log.error("处理企微语料失败: FromUserId={}, AcceptUserId={}, 异常: {}", + item.getFromUserId(), item.getAcceptUserId(), e.getMessage(), e); + } + }, executor)) + .toArray(CompletableFuture[]::new); + // 等待所有任务完成 + CompletableFuture.allOf(futures).join(); + } + // 关闭线程池 + executor.shutdown(); + } catch (Exception e) { + log.error("企微数据跑批异常",e); + } finally { + // 关闭线程池 + executor.shutdown(); + } + log.info("企微数据跑批结束 耗时:{}",System.currentTimeMillis()-startTime); } private void processItem(OdsVdqwMessageOTD item, String statTime, String endTime) { From 33f76aad2ab9aa770a1951224576b51ea49b86de Mon Sep 17 00:00:00 2001 From: zren25 Date: Mon, 16 Jun 2025 11:12:32 +0800 Subject: [PATCH 36/36] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai-analytic-center-biz/pom.xml | 8 ++---- .../controller/RedisTestController.java | 25 ++++++++++--------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/ai-analytic-center-biz/pom.xml b/ai-analytic-center-biz/pom.xml index 35dc96d..8084d29 100644 --- a/ai-analytic-center-biz/pom.xml +++ b/ai-analytic-center-biz/pom.xml @@ -61,6 +61,7 @@ com.alibaba druid-spring-boot-starter + 1.2.18 io.springfox @@ -71,7 +72,7 @@ com.baomidou mybatis-plus-boot-starter - 3.3.0 + 3.5.3.1 @@ -157,11 +158,6 @@ com.zaxxer HikariCP - - com.alibaba - druid-spring-boot-starter - 1.1.13 - com.volvo 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 e36818c..bc06cd7 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 @@ -12,10 +12,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.data.redis.core.RedisTemplate; -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.*; import java.time.Instant; import java.util.Set; @@ -65,15 +62,19 @@ public class RedisTestController { } @PostMapping("/del") @ApiOperation(value = "del") - public ResultMsg del(@RequestBody String key) { + public ResultMsg del(@RequestParam("key") String key, @RequestParam("nameAuth") String nameAuth) { 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); + if(nameAuth.equals("kb2f78sQCUvg")){ + 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); + } + return ResultMsg.ok(null); + } }