From 4b459846a0b1558d1e9552bbe9340fde0073a7bc Mon Sep 17 00:00:00 2001 From: lxu75 Date: Wed, 4 Jun 2025 16:12:03 +0800 Subject: [PATCH 01/55] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=BD=91=E6=A0=BC=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pom.xml b/pom.xml index 2947598..d6846aa 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,27 @@ org.springframework.boot spring-boot-starter-web + + + com.huaweicloud.sdk + huaweicloud-sdk-eg + 3.1.36 + + + + com.huaweicloud.sdk + huaweicloud-sdk-core + 3.1.36 + + + + + io.cloudevents + cloudevents-json-jackson + 2.2.0 + + + From 8adc0e0575ff833445b8c69227abf1a8f179c0cd Mon Sep 17 00:00:00 2001 From: lxu75 Date: Wed, 4 Jun 2025 17:20:29 +0800 Subject: [PATCH 02/55] =?UTF-8?q?=E5=9B=9E=E6=BB=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/pom.xml b/pom.xml index d6846aa..2947598 100644 --- a/pom.xml +++ b/pom.xml @@ -67,27 +67,6 @@ org.springframework.boot spring-boot-starter-web - - - com.huaweicloud.sdk - huaweicloud-sdk-eg - 3.1.36 - - - - com.huaweicloud.sdk - huaweicloud-sdk-core - 3.1.36 - - - - - io.cloudevents - cloudevents-json-jackson - 2.2.0 - - - From 5a6704bab40b170aa5a7d436d827714c0874a02b Mon Sep 17 00:00:00 2001 From: zren25 Date: Fri, 30 May 2025 18:08:03 +0800 Subject: [PATCH 03/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0EG=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/ListSubscriptionsRequestDto.java | 58 +++ .../center/dto/event/SendEventDto.java | 36 ++ .../center/dto/event/SourceChannelDto.java | 19 + .../analytic/center/dto/event/SourceDto.java | 12 + .../dto/event/SubscriptionCreateReqDto.java | 52 ++ .../dto/event/SubscriptionOperateReqDto.java | 17 + .../analytic/center/dto/resp/ResultDTO.java | 49 ++ .../center/config/HuaWeiEGConfig.java | 59 +++ .../EGEventSubscriptionController.java | 179 +++++++ .../analytic/center/service/CloudService.java | 285 ++++++++++ .../center/service/HuaWeiEGService.java | 493 ++++++++++++++++++ .../ai/analytic/center/utils/Signer.java | 147 ++++++ pom.xml | 27 + 13 files changed, 1433 insertions(+) create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/ListSubscriptionsRequestDto.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SendEventDto.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SourceChannelDto.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SourceDto.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SubscriptionCreateReqDto.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SubscriptionOperateReqDto.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/HuaWeiEGConfig.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/EGEventSubscriptionController.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/CloudService.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/HuaWeiEGService.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/Signer.java diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/ListSubscriptionsRequestDto.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/ListSubscriptionsRequestDto.java new file mode 100644 index 0000000..2e1a00c --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/ListSubscriptionsRequestDto.java @@ -0,0 +1,58 @@ +package com.volvo.ai.analytic.center.dto.event; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class ListSubscriptionsRequestDto { + + /** + * 所属事件通道ID + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty(value = "channel_id") + private String channelId; + + /** + * 偏移量,表示从此偏移量开始查询,偏移量不能小于0 + * 最小值:0 + * 最大值:100 + * 缺省值:0 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty(value = "offset") + private Integer offset; + + /** + * 每页显示的条目数量,不能小于0 + * 最小值:0 + * 最大值:100 + * 缺省值:15 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty(value = "limit") + private Integer limit; + + /** + * 指定查询排序 + * 缺省值:created_time:DESC + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty(value = "sort") + private String sort; + + /** + * 指定查询的事件订阅名称,精准匹配 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty(value = "name") + private String name; + + /** + * 指定查询的事件订阅名称,模糊匹配 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty(value = "fuzzy_name") + private String fuzzyName; +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SendEventDto.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SendEventDto.java new file mode 100644 index 0000000..8fc6ced --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SendEventDto.java @@ -0,0 +1,36 @@ +package com.volvo.ai.analytic.center.dto.event; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +@Schema(description = "") +public class SendEventDto { + + /** + * 事件来源上下文标识串,source+id可以唯一确定一个事件 + */ + @Schema(description = "事件来源上下文标识串,source+id可以唯一确定一个事件") + private String source; + + /** + * 事件类型 + */ + @Schema(description = "事件类型") + private String type; + + /** + * 事件发生的主题或对象,用以标识哪个具体对象发生了当前事件 + */ + @Schema(description = "事件发生的主题或对象,用以标识哪个具体对象发生了当前事件") + private String subject; + + /** + * 事件的负载内容 + */ + @Schema(description = "事件的负载内容") + private T data; + +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SourceChannelDto.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SourceChannelDto.java new file mode 100644 index 0000000..4f8441c --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SourceChannelDto.java @@ -0,0 +1,19 @@ +package com.volvo.ai.analytic.center.dto.event; + +import lombok.Data; + +@Data +public class SourceChannelDto { + + private String channelId; + + private String sourceName; + + public SourceChannelDto() { + } + + public SourceChannelDto(String channelId, String sourceName) { + this.channelId = channelId; + this.sourceName = sourceName; + } +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SourceDto.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SourceDto.java new file mode 100644 index 0000000..ad00a59 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SourceDto.java @@ -0,0 +1,12 @@ +package com.volvo.ai.analytic.center.dto.event; + +import lombok.Data; + +@Data +public class SourceDto { + + private String id; + private String name; + + private String channelId; +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SubscriptionCreateReqDto.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SubscriptionCreateReqDto.java new file mode 100644 index 0000000..ac8d172 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SubscriptionCreateReqDto.java @@ -0,0 +1,52 @@ +package com.volvo.ai.analytic.center.dto.event; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.huaweicloud.sdk.eg.v1.model.SubscriptionSource; +import com.huaweicloud.sdk.eg.v1.model.SubscriptionTarget; +import lombok.Data; + +import java.util.List; + +@Data +public class SubscriptionCreateReqDto { + + /** + * 所属事件通道ID + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty(value = "channel_id") + private String channelId; + + /** + * 订阅名称,租户下唯一,由字母、数字、点、下划线和中划线组成,必须字母或数字开头 + * 最小长度:1 + * 最大长度:128 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("name") + private String name; + + /** + * 订阅描述 + * 最大长度:255 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("description") + private String description; + + /** + * 订阅的事件源 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("sources") + private SubscriptionSource sources = null; + + /** + * 事件目标列表,至少订阅一个事件目标 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("targets") + private List targets = null; + +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SubscriptionOperateReqDto.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SubscriptionOperateReqDto.java new file mode 100644 index 0000000..58aa622 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/event/SubscriptionOperateReqDto.java @@ -0,0 +1,17 @@ +package com.volvo.ai.analytic.center.dto.event; + +import lombok.Data; + +@Data +public class SubscriptionOperateReqDto { + + /** + * 事件订阅ID + */ + private String subscriptionId; + + /** + * 0-禁用 1-启用 + */ + private int status; +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/ResultDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/ResultDTO.java index c8b8551..7d47ced 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/ResultDTO.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/resp/ResultDTO.java @@ -16,4 +16,53 @@ public class ResultDTO implements Serializable { private String errMsg; private T data; + + public ResultDTO() { + } + + public static ResultDTO success() { + return success("200", "成功"); + } + + public static ResultDTO success(T t) { + return success("200", "成功", t); + } + + public static ResultDTO success(String successCode, String successMessage) { + return success(successCode, successMessage, null); + } + + public static ResultDTO success(String successCode, String successMessage, T t) { + ResultDTO responseDTO = new ResultDTO<>(); + responseDTO.setReturnCode(successCode); + responseDTO.setReturnMessage(successMessage); + responseDTO.setData(t); + return responseDTO; + } + + public static ResultDTO failure() { + return failure("500", "处理异常"); + } + + public static ResultDTO failure(T t) { + return failure("500", "处理异常", t); + } + + public static ResultDTO failure(String failureCode, String failureMessage) { + return failure(failureCode, failureMessage, null); + } + + public static ResultDTO failure(String failureMessage) { + return failure("500", failureMessage, null); + } + + public static ResultDTO failure(String failureCode, String failureMessage, T t) { + ResultDTO responseDTO = new ResultDTO<>(); + responseDTO.setReturnCode(failureCode); + responseDTO.setReturnMessage(failureMessage); + responseDTO.setData(t); + return responseDTO; + } + + } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/HuaWeiEGConfig.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/HuaWeiEGConfig.java new file mode 100644 index 0000000..6c9ff4a --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/HuaWeiEGConfig.java @@ -0,0 +1,59 @@ +package com.volvo.ai.analytic.center.config; + +import com.huaweicloud.sdk.core.auth.BasicCredentials; +import com.huaweicloud.sdk.core.auth.ICredential; +import com.huaweicloud.sdk.core.http.HttpConfig; +import com.huaweicloud.sdk.eg.v1.EgClient; +import com.huaweicloud.sdk.eg.v1.region.EgRegion; +import lombok.Data; +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; + +/** + * HuaWeiConfig 配置类 + */ +@Data +@Configuration +@RefreshScope +public class HuaWeiEGConfig { + + /** + * 创建 EventProperties 对象 + * @return EventProperties 对象 + */ + @Value("${huawei.cloud.EG.ak}") + private String ak; + @Value("${huawei.cloud.EG.sk}") + private String sk; + @Value("${huawei.cloud.EG.projectId}") + private String projectId; + @Value("${huawei.cloud.EG.endpoint}") + private String endpoint; + @Value("${huawei.cloud.EG.region}") + private String region; + + + /** + * 创建 EgClient 对象 + * @return EgClient 对象 + */ + @Bean + public EgClient egClient() { + // 创建 BasicCredentials 对象,并设置 accessKey 和 secretKey + ICredential auth = new BasicCredentials() + .withAk(ak) + .withSk(sk); + + // 创建 HttpConfig 对象 + HttpConfig httpConfig = HttpConfig.getDefaultHttpConfig(); + + // 创建 EgClient 对象,并设置认证信息、Http配置和区域 + return EgClient.newBuilder() + .withCredential(auth) + .withHttpConfig(httpConfig) + .withRegion(EgRegion.valueOf(region)) + .build(); + } +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/EGEventSubscriptionController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/EGEventSubscriptionController.java new file mode 100644 index 0000000..e0d124c --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/EGEventSubscriptionController.java @@ -0,0 +1,179 @@ +package com.volvo.ai.analytic.center.controller; + +import com.huaweicloud.sdk.eg.v1.model.*; +import com.volvo.ai.analytic.center.dto.event.ListSubscriptionsRequestDto; +import com.volvo.ai.analytic.center.dto.event.SendEventDto; +import com.volvo.ai.analytic.center.dto.event.SubscriptionCreateReqDto; +import com.volvo.ai.analytic.center.dto.event.SubscriptionOperateReqDto; +import com.volvo.ai.analytic.center.dto.resp.ResultDTO; +import com.volvo.ai.analytic.center.service.HuaWeiEGService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.concurrent.ExecutionException; + +/** + * 事件订阅管理 + */ +@Tag(name = "/event", description = "事件订阅管理") +@RestController +@RequestMapping("/event") +@Slf4j +public class EGEventSubscriptionController { + + @Resource + HuaWeiEGService huaWeiService; + /** + * 发布事件到事件通道 + */ + @Operation(summary = "发布事件到事件通道") + @PostMapping("/sendEvent") + public ResultDTO sendEvent(@RequestBody CloudEvents req, @RequestParam("channel") String channel) throws ExecutionException { + return ResultDTO.success(huaWeiService.sendEvent(req, "channel")); + } + + /** + * 创建事件订阅 + * + * @param req req + * @return 事件订阅ID + */ + @Operation(summary = "创建事件订阅") + @PostMapping("/subscription") + public ResultDTO createSubscription(@RequestBody SubscriptionCreateReqDto req) { + return ResultDTO.success(huaWeiService.createSubscription(req)); + } + + /** + * 创建事件订阅目标 + * + * @param req req + * @return 事件订阅目标ID + */ + @Operation(summary = "创建事件订阅目标") + @PostMapping("/subscriptionTarget") + public ResultDTO createSubscriptionTarget(@RequestBody CreateSubscriptionTargetRequest req) { + return ResultDTO.success(huaWeiService.createSubscriptionTarget(req)); + } + + /** + * 删除事件订阅 + * + * @param subscriptionId 事件订阅ID + * @return + */ + @Operation(summary = "删除事件订阅") + @DeleteMapping("/subscription/{subscriptionId}") + public ResultDTO deleteSubscription(@PathVariable("subscriptionId") String subscriptionId) { + huaWeiService.deleteSubscription(subscriptionId); + return ResultDTO.success(); + } + + /** + * 删除事件订阅目标 + * + * @param subscriptionId 事件订阅ID + * @param targetId 事件订阅目标ID + * @return + */ + @Operation(summary = "删除事件订阅目标") + @DeleteMapping("/subscriptionTarget/{subscriptionId}/{targetId}") + public ResultDTO deleteSubscriptionTarget(@PathVariable("subscriptionId") String subscriptionId, @PathVariable("targetId") String targetId) { + huaWeiService.deleteSubscriptionTarget(subscriptionId, targetId); + return ResultDTO.success(); + } + + /** + * 查询事件订阅列表 + * + * @param req req + * @return + */ + @Operation(summary = "查询事件订阅列表") + @PostMapping("/subscription/list") + public ResultDTO listSubscriptions(@RequestBody ListSubscriptionsRequestDto req) { + return ResultDTO.success(huaWeiService.listSubscriptions(req)); + } + + /** + * 启用禁用事件订阅 + * + * @param req req + * @return + */ + @Operation(summary = "启用禁用事件订阅") + @PostMapping("/subscription/enabled") + public ResultDTO operateSubscription(@RequestBody SubscriptionOperateReqDto req) { + huaWeiService.operateSubscription(req); + return ResultDTO.success(); + } + + /** + * 查询事件订阅详情 + * + * @param subscriptionId 事件订阅ID + * @return + */ + @Operation(summary = "查询事件订阅详情") + @GetMapping("/subscription/{subscriptionId}") + public ResultDTO showDetailOfSubscription(@PathVariable("subscriptionId") String subscriptionId) { + return ResultDTO.success(huaWeiService.showDetailOfSubscription(subscriptionId)); + } + + /** + * 查询事件订阅目标详情 + * + * @param subscriptionId 事件订阅ID + * @param targetId 事件订阅目标ID + * @return + */ + @Operation(summary = "查询事件订阅目标详情") + @GetMapping("/subscriptionTarget/{subscriptionId}/{targetId}") + public ResultDTO showDetailOfSubscriptionTarget(@PathVariable("subscriptionId") String subscriptionId, + @PathVariable("targetId") String targetId) { + return ResultDTO.success(huaWeiService.showDetailOfSubscriptionTarget(subscriptionId, targetId)); + } + + /** + * 更新事件订阅 + * + * @param req req + * @return + */ + @Operation(summary = "更新事件订阅") + @PutMapping("/subscription") + public ResultDTO updateSubscription(@RequestBody UpdateSubscriptionRequest req) { + huaWeiService.updateSubscription(req); + return ResultDTO.success(); + } + + /** + * 更新事件订阅源 + * + * @param req req + * @return + */ + @Operation(summary = "更新事件订阅源") + @PutMapping("/subscriptionSource") + public ResultDTO updateSubscriptionSource(@RequestBody UpdateSubscriptionSourceRequest req) { + huaWeiService.updateSubscriptionSource(req); + return ResultDTO.success(); + } + + /** + * 更新事件订阅目标 + * + * @param req req + * @return + */ + @Operation(summary = "更新事件订阅目标") + @PutMapping("/subscriptionTarget") + public ResultDTO updateSubscriptionTarget(@RequestBody UpdateSubscriptionTargetRequest req) { + huaWeiService.updateSubscriptionTarget(req); + return ResultDTO.success(); + } + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/CloudService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/CloudService.java new file mode 100644 index 0000000..c07660e --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/CloudService.java @@ -0,0 +1,285 @@ +package com.volvo.ai.analytic.center.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.huaweicloud.sdk.core.exception.ClientRequestException; +import com.huaweicloud.sdk.eg.v1.model.*; +import com.volvo.ai.analytic.center.config.HuaWeiEGConfig; +import com.volvo.ai.analytic.center.dto.event.SendEventDto; +import com.volvo.ai.analytic.center.dto.event.SourceChannelDto; +import com.volvo.ai.analytic.center.dto.resp.ResultDTO; +import com.volvo.ai.analytic.center.utils.Signer; +import io.cloudevents.CloudEvent; +import io.cloudevents.core.builder.CloudEventBuilder; +import io.cloudevents.core.data.PojoCloudEventData; +import io.cloudevents.jackson.JsonFormat; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ExecutionException; + +@Slf4j +@Service +public class CloudService implements InitializingBean { + + @Resource + RestTemplate restTemplate; + + @Resource + HuaWeiEGService huaWeiService; + + @Resource + RedisTemplate redisTemplate; + + @Resource + HuaWeiEGConfig huaWeiEGConfig; + + private static final String HA_WEI_REQUEST = "hwReq={}"; + private static final String HA_WEI_RESPONSE = "hwRes={}"; + private static final String SEND_EVENT_MSG = "发布事件到事件通道异常"; + private static final String HTTPS = "https://"; + private static final String V1 = "/v1/"; + private static final String CHANNELS = "/channels/"; + private static final String EVENTS = "/events"; + private static final String BODY_PRE = "{\"events\":["; + private static final String BODY_END = "]}"; + private static final String APPLICATION = "APPLICATION"; + private static final String COMMA = ","; + + /** + * 事件通道缓存 + */ + private static final String SOURCE_KEY = "eSource"; + + /** + * 发送事件 + * + * @param req 发送事件的负载内容 + * @return 发送结果 + * @throws ExecutionException 如果执行异常 + */ + public ResultDTO sendEvent(SendEventDto req) throws ExecutionException { + String eventId = UUID.randomUUID().toString(); + return send(req, eventId); + } + + /** + * 发送事件 + * + * @param req 发送事件的请求数据 + * @param eventId 事件ID + * @return 发送事件的响应数据 + * @throws ExecutionException 如果执行异常 + */ + private ResultDTO send(SendEventDto req, String eventId) throws ExecutionException { + // 根据sourceId或sourceName获取通道数据 + SourceChannelDto dto = req.getSource().contains("-") ? getChannelBySourceId(req.getSource()) : getChannelBySourceName(req.getSource()); + + + + // 构建CloudEvent对象 + CloudEvent event = CloudEventBuilder.v1().withId(eventId) + .withSource(URI.create(dto.getSourceName())).withType(StringUtils.isEmpty(req.getType()) ? APPLICATION : req.getType()) + .withData(MediaType.APPLICATION_JSON_VALUE, PojoCloudEventData.wrap(req.getData(), JSON::toJSONBytes)) + .withSubject(req.getSubject()).withTime(OffsetDateTime.now()).build(); + + // 将CloudEvent对象转换为JSON字符串 + String b = new String(new JsonFormat().serialize(event), StandardCharsets.UTF_8); + String body = BODY_PRE + b + BODY_END; + return getResponseDTO(eventId, dto, body); + } + + /** + * 发送事件 + * + * @param req 发送事件的请求数据 + * @return 发送事件的响应数据 + * @throws ExecutionException 如果执行异常 + */ + private ResultDTO sendList(SendEventDto> req) throws ExecutionException { + // 根据sourceId或sourceName获取通道数据 + SourceChannelDto dto = req.getSource().contains("-") ? getChannelBySourceId(req.getSource()) : getChannelBySourceName(req.getSource()); + + List eventIdList = new ArrayList<>(); + List eventList = new ArrayList<>(); + for (Object data : req.getData()) { + String eventId = UUID.randomUUID().toString(); + eventIdList.add(eventId); + + // 构建CloudEvent对象 + CloudEvent event = CloudEventBuilder.v1().withId(eventId) + .withSource(URI.create(dto.getSourceName())).withType(StringUtils.isEmpty(req.getType()) ? APPLICATION : req.getType()) + .withData(MediaType.APPLICATION_JSON_VALUE, PojoCloudEventData.wrap(data, JSON::toJSONBytes)) + .withSubject(req.getSubject()).withTime(OffsetDateTime.now()).build(); + // 将CloudEvent对象转换为JSON字符串 + eventList.add(new String(new JsonFormat().serialize(event), StandardCharsets.UTF_8)); + } + + + String eId = String.join(COMMA, eventIdList); + String body = BODY_PRE + String.join(COMMA, eventList) + BODY_END; + return getResponseDTO(eId, dto, body); + } + + /** + * 发送请求 + * + * @param eventId + * @param dto + * @param body + * @return + */ + private ResultDTO getResponseDTO(String eventId, SourceChannelDto dto, String body) { + String url = HTTPS + huaWeiEGConfig.getEndpoint() + V1 + + huaWeiEGConfig.getProjectId() + CHANNELS + dto.getChannelId() + EVENTS; + + Map headers = null; + try { + // 对请求进行签名 + headers = Signer.sign(huaWeiEGConfig.getAk(), huaWeiEGConfig.getSk(), url, body, huaWeiEGConfig.getEndpoint()); + } catch (Exception e) { + log.error("sign", e); + + } + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setAll(headers); + log.info(HA_WEI_REQUEST, body); + + // 发送POST请求 + String resp = restTemplate.postForEntity(url, new HttpEntity<>(body.getBytes(StandardCharsets.UTF_8), httpHeaders), String.class).getBody(); + log.info(HA_WEI_RESPONSE, resp); + PutEventsResponse response1 = JSON.parseObject(resp, new TypeReference() { + }); + + if (response1.getFailedCount() != 0) { + List events = response1.getEvents(); + List eventIds = new ArrayList<>(); + List errorMsgList = new ArrayList<>(); + for (PutEventsRespEvents response : events) { + eventIds.add(response.getEventId()); + errorMsgList.add(response.getEventId() + ":" + response.getErrorMsg()); + } + ResultDTO res =new ResultDTO(); + res.setErrMsg(String.join(COMMA, errorMsgList)); + res.setData(String.join(COMMA, eventIds)); + res.setReturnCode("500"); + return res; + } + return ResultDTO.success(eventId); + } + + + /** + * 根据事件源ID查询事件通道详情,并返回事件通道信息 + * + * @param sourceId 事件源ID + * @return 事件通道信息 + * @throws ExecutionException 如果执行查询操作失败,抛出执行异常 + */ + @NotNull + private SourceChannelDto getChannelBySourceId(String sourceId) throws ExecutionException { + + //根据事件源ID查询详情 + ShowDetailOfEventSourceResponse response; + try { + response = huaWeiService.showDetailOfEventSource(sourceId); + } catch (ClientRequestException e) { + + throw e; + } + if (response.getHttpStatusCode() != 200) { + log.info("根据事件源ID未查询到事件通道"); + } + SourceChannelDto dto = new SourceChannelDto(response.getChannelId(), response.getName()); + redisTemplate.opsForHash().put(SOURCE_KEY, sourceId, dto); + + return dto; + } + + /** + * 根据事件源名称查询事件通道 + * + * @param source 事件源名称 + * @return 事件通道信息 + * @throws ExecutionException 如果执行过程中发生异常,抛出执行异常 + */ + @NotNull + private SourceChannelDto getChannelBySourceName(String source) throws ExecutionException { + + + ListEventSourcesRequest sourcesRequest = new ListEventSourcesRequest(); + sourcesRequest.setName(source); + sourcesRequest.setLimit(1); + sourcesRequest.setOffset(0); + //根据事件源名称查询事件通道 + ListEventSourcesResponse res = huaWeiService.listEventSources(sourcesRequest); + if (res.getTotal() == 1) { + CustomizeSourceInfo sourceInfo = res.getItems().get(0); + SourceChannelDto dto = new SourceChannelDto(sourceInfo.getChannelId(), sourceInfo.getName()); + redisTemplate.opsForHash().put(SOURCE_KEY, source, dto); + return dto; + } else { + log.info("根据事件源名称未查询到事件通道"); + } + return null; + + } + + /** + * 在属性设置之后执行的操作。 + * + * @throws Exception 如果在属性设置过程中发生异常 + */ + @Override + public void afterPropertiesSet() throws Exception { + // 创建ListEventSourcesRequest对象 + ListEventSourcesRequest request = new ListEventSourcesRequest(); + // 设置请求的Limit属性为500 + request.setLimit(500); + // 设置请求的FuzzyName属性为"source" + request.setFuzzyName("source"); + + // 调用huaWeiService的listEventSources方法,获取ListEventSourcesResponse对象 + ListEventSourcesResponse response = huaWeiService.listEventSources(request); + + // 如果response的HttpStatusCode属性不等于200,则抛出BussinessException异常 + if (response.getHttpStatusCode() != 200) { + log.info("查询事件源列表异常"); + } + + // 删除redis中的SOURCE_KEY键值对 + redisTemplate.delete(SOURCE_KEY); + + // 如果response的Items属性不为空 + if (!CollectionUtils.isEmpty(response.getItems())) { + // 遍历response的Items属性 + for (CustomizeSourceInfo info : response.getItems()) { + // 创建SourceChannelDto对象 + SourceChannelDto dto = new SourceChannelDto(info.getChannelId(), info.getName()); + + // 将dto存储到redis的SOURCE_KEY键的hash表中,使用info.getId()作为键,dto作为值 + redisTemplate.opsForHash().put(SOURCE_KEY, info.getId(), dto); + + // 将dto存储到redis的SOURCE_KEY键的hash表中,使用info.getName()作为键,dto作为值 + redisTemplate.opsForHash().put(SOURCE_KEY, info.getName(), dto); + } + } + } +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/HuaWeiEGService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/HuaWeiEGService.java new file mode 100644 index 0000000..0f5558e --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/HuaWeiEGService.java @@ -0,0 +1,493 @@ +package com.volvo.ai.analytic.center.service; + +import com.alibaba.fastjson.JSON; +import com.huaweicloud.sdk.eg.v1.EgClient; +import com.huaweicloud.sdk.eg.v1.model.*; +import com.volvo.ai.analytic.center.dto.event.ListSubscriptionsRequestDto; +import com.volvo.ai.analytic.center.dto.event.SubscriptionCreateReqDto; +import com.volvo.ai.analytic.center.dto.event.SubscriptionOperateReqDto; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Component +@Slf4j +public class HuaWeiEGService { + + private static final String HA_WEI_REQUEST = "hwReq={}"; + private static final String HA_WEI_RESPONSE = "hwRes={}"; + + @Resource + EgClient egClient; + + + /** + * 发布事件到事件通道 sdk + * + * @param event event + * @param channel channel + */ + public PutEventsResponse sendEvent(CloudEvents event, String channel) { + PutEventsRequest request = new PutEventsRequest(); + request.withChannelId(channel); + + List eventsList = new ArrayList<>(); + eventsList.add(event); + PutEventsReq body = new PutEventsReq(); + body.setEvents(eventsList); + request.withBody(body); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + PutEventsResponse response = egClient.putEvents(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 创建事件订阅 + */ + public CreateSubscriptionResponse createSubscription(SubscriptionCreateReqDto reqDto) { + CreateSubscriptionRequest request = new CreateSubscriptionRequest(); + + SubscriptionCreateReq body = new SubscriptionCreateReq(); + BeanUtils.copyProperties(reqDto, body); + List sources = new ArrayList<>(); + sources.add(reqDto.getSources()); + body.setSources(sources); + + request.withBody(body); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + CreateSubscriptionResponse response = egClient.createSubscription(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 创建事件订阅目标 + */ + public CreateSubscriptionTargetResponse createSubscriptionTarget(CreateSubscriptionTargetRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + CreateSubscriptionTargetResponse response = egClient.createSubscriptionTarget(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 删除事件订阅 + */ + public void deleteSubscription(String subscriptionId) { + DeleteSubscriptionRequest request = new DeleteSubscriptionRequest(); + request.setSubscriptionId(subscriptionId); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + DeleteSubscriptionResponse response = egClient.deleteSubscription(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + } + + /** + * 删除事件订阅目标 + */ + public void deleteSubscriptionTarget(String subscriptionId, String targetId) { + DeleteSubscriptionTargetRequest request = new DeleteSubscriptionTargetRequest(); + request.setSubscriptionId(subscriptionId); + request.setTargetId(targetId); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + DeleteSubscriptionTargetResponse response = egClient.deleteSubscriptionTarget(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + } + + /** + * 查询事件订阅列表 + */ + public ListSubscriptionsResponse listSubscriptions(ListSubscriptionsRequestDto requestDto) { + ListSubscriptionsRequest request = new ListSubscriptionsRequest(); + BeanUtils.copyProperties(requestDto, request); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ListSubscriptionsResponse response = egClient.listSubscriptions(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 操作事件订阅 + */ + public OperateSubscriptionResponse operateSubscription(SubscriptionOperateReqDto req) { + OperateSubscriptionRequest request = new OperateSubscriptionRequest(); + + SubscriptionOperateReq body = new SubscriptionOperateReq(); + List subscriptionIds = new ArrayList<>(); + subscriptionIds.add(req.getSubscriptionId()); + body.setSubscriptionIds(subscriptionIds); + body.setOperation(req.getStatus() == 1 ? SubscriptionOperateReq.OperationEnum.ENABLE : SubscriptionOperateReq.OperationEnum.DISABLE); + request.withBody(body); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + OperateSubscriptionResponse response = egClient.operateSubscription(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件订阅详情 + */ + public ShowDetailOfSubscriptionResponse showDetailOfSubscription(String subscriptionId) { + ShowDetailOfSubscriptionRequest request = new ShowDetailOfSubscriptionRequest(); + request.setSubscriptionId(subscriptionId); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ShowDetailOfSubscriptionResponse response = egClient.showDetailOfSubscription(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件订阅目标详情 + */ + public ShowDetailOfSubscriptionTargetResponse showDetailOfSubscriptionTarget(String subscriptionId, String targetId) { + ShowDetailOfSubscriptionTargetRequest request = new ShowDetailOfSubscriptionTargetRequest(); + request.setSubscriptionId(subscriptionId); + request.setTargetId(targetId); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ShowDetailOfSubscriptionTargetResponse response = egClient.showDetailOfSubscriptionTarget(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 更新事件订阅 + */ + public UpdateSubscriptionResponse updateSubscription(UpdateSubscriptionRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + UpdateSubscriptionResponse response = egClient.updateSubscription(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 更新事件订阅源 + */ + public UpdateSubscriptionSourceResponse updateSubscriptionSource(UpdateSubscriptionSourceRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + UpdateSubscriptionSourceResponse response = egClient.updateSubscriptionSource(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 更新事件订阅目标 + */ + public UpdateSubscriptionTargetResponse updateSubscriptionTarget(UpdateSubscriptionTargetRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + UpdateSubscriptionTargetResponse response = egClient.updateSubscriptionTarget(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 创建自定义事件通道 + */ + public CreateChannelResponse createChannel(ChannelCreateReq body) { + CreateChannelRequest request = new CreateChannelRequest(); + request.withBody(body); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + CreateChannelResponse response = egClient.createChannel(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 删除自定义事件通道 + */ + public DeleteChannelResponse deleteChannel(String channelId) { + DeleteChannelRequest request = new DeleteChannelRequest(); + request.withChannelId(channelId); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + DeleteChannelResponse response = egClient.deleteChannel(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件通道列表 + */ + public ListChannelsResponse listChannels(ListChannelsRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ListChannelsResponse response = egClient.listChannels(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件通道详情 + */ + public ShowDetailOfChannelResponse showDetailOfChannel(String channelId) { + ShowDetailOfChannelRequest request = new ShowDetailOfChannelRequest(); + request.withChannelId(channelId); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ShowDetailOfChannelResponse response = egClient.showDetailOfChannel(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 更新自定义事件通道 + */ + public UpdateChannelResponse updateChannel(UpdateChannelRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + UpdateChannelResponse response = egClient.updateChannel(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 创建自定义事件源 + */ + public CreateEventSourceResponse createEventSource(CustomizeSourceCreateReq body) { + CreateEventSourceRequest request = new CreateEventSourceRequest(); + request.withBody(body); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + CreateEventSourceResponse response = egClient.createEventSource(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 删除自定义事件源 + */ + public DeleteEventSourceResponse deleteEventSource(String sourceId) { + DeleteEventSourceRequest request = new DeleteEventSourceRequest(); + request.withSourceId(sourceId); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + DeleteEventSourceResponse response = egClient.deleteEventSource(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件源列表 + */ + public ListEventSourcesResponse listEventSources(ListEventSourcesRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ListEventSourcesResponse response = egClient.listEventSources(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件源详情 + */ + public ShowDetailOfEventSourceResponse showDetailOfEventSource(String sourceId) { + ShowDetailOfEventSourceRequest request = new ShowDetailOfEventSourceRequest(); + request.withSourceId(sourceId); + + return egClient.showDetailOfEventSource(request); + } + + /** + * 更新自定义事件源 + */ + public UpdateEventSourceResponse updateEventSource(UpdateEventSourceRequest request) { + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + UpdateEventSourceResponse response = egClient.updateEventSource(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 创建目标连接 + */ + public CreateConnectionResponse createConnection(ConnectionCreateReq body) { + CreateConnectionRequest request = new CreateConnectionRequest(); + request.withBody(body); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + CreateConnectionResponse response = egClient.createConnection(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 删除目标连接 + */ + public DeleteConnectionResponse deleteConnection(String connectionId) { + DeleteConnectionRequest request = new DeleteConnectionRequest(); + request.withConnectionId(connectionId); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + DeleteConnectionResponse response = egClient.deleteConnection(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询目标连接列表 + */ + public ListConnectionsResponse listConnections(ListConnectionsRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ListConnectionsResponse response = egClient.listConnections(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询目标连接详情 + */ + public ShowDetailOfConnectionResponse showDetailOfConnection(String connectionId) { + ShowDetailOfConnectionRequest request = new ShowDetailOfConnectionRequest(); + request.withConnectionId(connectionId); + + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ShowDetailOfConnectionResponse response = egClient.showDetailOfConnection(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 更新目标连接 + */ + public UpdateConnectionResponse updateConnection(UpdateConnectionRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + UpdateConnectionResponse response = egClient.updateConnection(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件目标分类 + */ + public ListEventTargetResponse listEventTarget(ListEventTargetRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ListEventTargetResponse response = egClient.listEventTarget(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 创建自定义事件模型 + */ + public CreateEventSchemaResponse createEventSchema(CustomizeSchemaCreateReq body) { + CreateEventSchemaRequest request = new CreateEventSchemaRequest(); + request.withBody(body); + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + CreateEventSchemaResponse response = egClient.createEventSchema(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 创建自定义事件模型 + */ + public CreateEventSchemaVersionResponse createEventSchemaVersion(CreateEventSchemaVersionRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + CreateEventSchemaVersionResponse response = egClient.createEventSchemaVersion(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 删除事件模型 + */ + public DeleteEventSchemaResponse deleteEventSchema(String schemaId) { + DeleteEventSchemaRequest request = new DeleteEventSchemaRequest(); + request.withSchemaId(schemaId); + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + DeleteEventSchemaResponse response = egClient.deleteEventSchema(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 删除事件模型 + */ + public DeleteEventSchemaVersionResponse deleteEventSchemaVersion(String schemaId, Integer version) { + DeleteEventSchemaVersionRequest request = new DeleteEventSchemaVersionRequest(); + request.withSchemaId(schemaId); + request.withVersion(version); + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + DeleteEventSchemaVersionResponse response = egClient.deleteEventSchemaVersion(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 事件模型自动发现 + */ + public DiscoverEventSchemaFromDataResponse discoverEventSchemaFromData(DiscoverEventSchemaFromDataReq body) { + DiscoverEventSchemaFromDataRequest request = new DiscoverEventSchemaFromDataRequest(); + request.withBody(body); + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + DiscoverEventSchemaFromDataResponse response = egClient.discoverEventSchemaFromData(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件模型列表 + */ + public ListEventSchemaResponse listEventSchema(ListEventSchemaRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ListEventSchemaResponse response = egClient.listEventSchema(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件模型版本列表 + */ + public ListEventSchemaVersionsResponse listEventSchemaVersions(ListEventSchemaVersionsRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ListEventSchemaVersionsResponse response = egClient.listEventSchemaVersions(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件模型详情 + */ + public ShowDetailOfEventSchemaResponse showDetailOfEventSchema(String schemaId) { + ShowDetailOfEventSchemaRequest request = new ShowDetailOfEventSchemaRequest(); + request.withSchemaId(schemaId); + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ShowDetailOfEventSchemaResponse response = egClient.showDetailOfEventSchema(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 查询事件模型版本详情 + */ + public ShowDetailOfEventSchemaVersionResponse showDetailOfEventSchemaVersion(String schemaId, Integer version) { + ShowDetailOfEventSchemaVersionRequest request = new ShowDetailOfEventSchemaVersionRequest(); + request.withSchemaId(schemaId); + request.withVersion(version); + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + ShowDetailOfEventSchemaVersionResponse response = egClient.showDetailOfEventSchemaVersion(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + + /** + * 更新自定义事件模型 + */ + public UpdateEventSchemaResponse updateEventSchema(UpdateEventSchemaRequest request) { + log.info(HA_WEI_REQUEST, JSON.toJSONString(request)); + UpdateEventSchemaResponse response = egClient.updateEventSchema(request); + log.info(HA_WEI_RESPONSE, JSON.toJSONString(response)); + return response; + } + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/Signer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/Signer.java new file mode 100644 index 0000000..000fa71 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/Signer.java @@ -0,0 +1,147 @@ +package com.volvo.ai.analytic.center.utils; + +import org.apache.commons.codec.digest.DigestUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public final class Signer { + + private static final String AUTHORIZATION = "Authorization"; + private static final String SDK_HMAC_SHA256 = "SDK-HMAC-SHA256"; + private static final String LINE = "\n"; + private static final String ACCESS = " Access="; + private static final String SIGNED_HEADERS = ", SignedHeaders="; + private static final String SIGNATURE = ", Signature="; + private static final String SLASH = "/"; + private static final String HMAC_SHA256 = "HmacSHA256"; + private static final String POST = "POST"; + + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'").withZone(ZoneId.of("UTC")); + + private static final String[] HEADERS = new String[]{"Host", "X-Sdk-Date"}; + + private static final String SIGNED_HEADERS_STR = getSignedHeadersString(HEADERS); + + private Signer() { + + } + + public static Map sign(String key, String secret, String url, String body, String host) throws NoSuchAlgorithmException, InvalidKeyException { + String singerDate = DATE_TIME_FORMATTER.format(ZonedDateTime.now()); + + Map headers = new HashMap<>(8); + headers.put(HEADERS[0], host); + headers.put(HEADERS[1], singerDate); + + String contentSha256 = toHex(hash(body)); + + String canonicalRequest = createCanonicalRequest(headers, getPath(url), POST, HEADERS, contentSha256, SIGNED_HEADERS_STR); + String stringToSign = createStringToSign(canonicalRequest, singerDate); + byte[] signingKey = secret.getBytes(StandardCharsets.UTF_8); + byte[] signature = sign(stringToSign.getBytes(StandardCharsets.UTF_8), signingKey, HMAC_SHA256); + headers.put(AUTHORIZATION, buildAuthorizationHeader(SIGNED_HEADERS_STR, signature, key)); + + return headers; + } + + private static String getPath(String url) { + int i = url.indexOf("://"); + if (i >= 0) { + url = url.substring(i + 3); + } + + i = url.indexOf(47); + return i >= 0 ? url.substring(i) : SLASH; + } + + private static String buildAuthorizationHeader(String signedHeadersStr, byte[] signature, String accessKey) { + return new StringBuilder(SDK_HMAC_SHA256).append(ACCESS).append(accessKey).append(SIGNED_HEADERS).append(signedHeadersStr).append(SIGNATURE).append(toHex(signature)).toString(); + } + + private static byte[] hash(String text) { + MessageDigest md = DigestUtils.getSha256Digest(); + md.update(text.getBytes(StandardCharsets.UTF_8)); + return md.digest(); + } + + private static byte[] sign(byte[] data, byte[] key, String algorithm) throws NoSuchAlgorithmException, InvalidKeyException { + Mac mac = Mac.getInstance(algorithm); + mac.init(new SecretKeySpec(key, algorithm)); + return mac.doFinal(data); + } + + private static String createCanonicalRequest(Map requestHeaders, String path, String method, + String[] signedHeaders, String contentSha256, String signedHeadersStr) { + return new StringBuilder(method).append(LINE).append(path) + .append((SLASH)).append(LINE).append(LINE).append(getCanonicalizedHeaderString(requestHeaders, signedHeaders)) + .append(LINE).append(signedHeadersStr).append(LINE).append(contentSha256).toString(); + } + + private static String createStringToSign(String canonicalRequest, String singerDate) { + return new StringBuilder(SDK_HMAC_SHA256).append(LINE).append(singerDate).append(LINE).append(toHex(hash(canonicalRequest))).toString(); + } + + private static String getCanonicalizedHeaderString(Map requestHeaders, String[] signedHeaders) { + StringBuilder buffer = new StringBuilder(); + String[] var5 = signedHeaders; + int var6 = signedHeaders.length; + + for (int var7 = 0; var7 < var6; ++var7) { + String header = var5[var7]; + String key = header.toLowerCase(); + String value = requestHeaders.get(header); + buffer.append(key).append(":"); + if (value != null) { + buffer.append(value.trim()); + } + buffer.append(LINE); + } + return buffer.toString(); + } + + private static String getSignedHeadersString(String[] signedHeaders) { + StringBuilder buffer = new StringBuilder(); + String[] var3 = signedHeaders; + int var4 = signedHeaders.length; + + for (int var5 = 0; var5 < var4; ++var5) { + String header = var3[var5]; + if (buffer.length() > 0) { + buffer.append(";"); + } + + buffer.append(header.toLowerCase()); + } + return buffer.toString(); + } + + private static String toHex(byte[] data) { + StringBuilder sb = new StringBuilder(data.length * 2); + byte[] var2 = data; + int var3 = data.length; + + for (int var4 = 0; var4 < var3; ++var4) { + byte b = var2[var4]; + String hex = Integer.toHexString(b); + if (hex.length() == 1) { + sb.append("0"); + } else if (hex.length() == 8) { + hex = hex.substring(6); + } + + sb.append(hex); + } + return sb.toString().toLowerCase(Locale.getDefault()); + } +} diff --git a/pom.xml b/pom.xml index 2947598..b5802bd 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,33 @@ org.springframework.boot spring-boot-starter-web + + + + org.springdoc + springdoc-openapi-ui + 1.8.0 + + + + com.huaweicloud.sdk + huaweicloud-sdk-eg + 3.1.36 + + + + com.huaweicloud.sdk + huaweicloud-sdk-core + 3.1.36 + + + + + io.cloudevents + cloudevents-json-jackson + 2.2.0 + + From 4d2d538125bd1694f628f20d07ff4d0a88d4c5ca Mon Sep 17 00:00:00 2001 From: lxu75 Date: Wed, 4 Jun 2025 18:06:25 +0800 Subject: [PATCH 04/55] =?UTF-8?q?EG=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai-analytic-center-biz/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ai-analytic-center-biz/pom.xml b/ai-analytic-center-biz/pom.xml index 1a1a413..2389754 100644 --- a/ai-analytic-center-biz/pom.xml +++ b/ai-analytic-center-biz/pom.xml @@ -232,6 +232,11 @@ 2.3.0 + + + org.springframework.boot + spring-boot-starter-data-redis + org.apache.commons From bf43b9647fa934b6d7443b1fa700413b75494867 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Thu, 5 Jun 2025 19:00:18 +0800 Subject: [PATCH 05/55] =?UTF-8?q?=E7=89=B9=E9=82=80=E5=8F=91=E8=A8=80?= =?UTF-8?q?=E5=AE=98=E4=BB=A3=E7=A0=81=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytic/center/dto/req/SpokesManDTO.java | 27 +++ .../center/entity/DifySpokesManDTO.java | 13 ++ .../center/enums/BusinessTypeEnum.java | 10 +- .../CommunityEGEventController.java | 27 +++ .../center/service/SpokesManService.java | 161 ++++++++++++++++++ 5 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SpokesManDTO.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/DifySpokesManDTO.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SpokesManDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SpokesManDTO.java new file mode 100644 index 0000000..04a82a8 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SpokesManDTO.java @@ -0,0 +1,27 @@ +package com.volvo.ai.analytic.center.dto.req; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SpokesManDTO { + + private List files; + + private String platform; + + private String theme; + + private String communityRequestId; + + private String redNoteType; + + private String userId; + + private String postUrl; +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/DifySpokesManDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/DifySpokesManDTO.java new file mode 100644 index 0000000..66159b3 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/DifySpokesManDTO.java @@ -0,0 +1,13 @@ +package com.volvo.ai.analytic.center.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DifySpokesManDTO { + + private String channel; +} 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..8afc6fd 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 @@ -23,7 +23,15 @@ public enum BusinessTypeEnum { CASE("case", "舆情事件"), - SMART_ASSISTANT_NAMEPLATE("SMART_ASSISTANT_NAMEPLATE", "智能助手-铭牌") + SMART_ASSISTANT_NAMEPLATE("SMART_ASSISTANT_NAMEPLATE", "智能助手-铭牌"), + + + //特邀发言官 + SPOKESMAN("SPOKESMAN", "特邀发言官"), + //特邀发言官敏感词 + SPOKESMAN_SENSITIVE_WORD("SPOKESMAN_SENSITIVE_WORD", "特邀发言官敏感词"), + //特邀发言官审核规则 + SPOKESMAN_AUDIT_RULE("SPOKESMAN_AUDIT_RULE", "特邀发言官审核规则"), ; private String code; diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java new file mode 100644 index 0000000..fa8590f --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java @@ -0,0 +1,27 @@ +package com.volvo.ai.analytic.center.controller; + + +import com.alibaba.fastjson.JSON; +import com.volvo.ai.analytic.center.service.SpokesManService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +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 +@RequestMapping("/community/event") +@Slf4j +public class CommunityEGEventController { + + @Autowired + private SpokesManService spokesmanService; + + @PostMapping("/spokesmanCallBack") + public void spokesmanCallBack(@RequestBody Object req){ + log.info("社区特邀发言官入参", JSON.toJSONString(req)); + spokesmanService.spokesManCallBack(req); + } +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java new file mode 100644 index 0000000..7ef367f --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -0,0 +1,161 @@ +package com.volvo.ai.analytic.center.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.huaweicloud.sdk.eg.v1.model.CloudEvents; +import com.volvo.ai.analytic.center.dto.req.DiFyReq; +import com.volvo.ai.analytic.center.dto.req.DifyCommunityTargetDTO; +import com.volvo.ai.analytic.center.dto.req.DifyImageWorkFlow; +import com.volvo.ai.analytic.center.dto.req.SpokesManDTO; +import com.volvo.ai.analytic.center.entity.AiAnalysisErrors; +import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; +import com.volvo.ai.analytic.center.entity.AiAnalyticBusinessConfig; +import com.volvo.ai.analytic.center.enums.BusinessTypeEnum; +import com.volvo.ai.analytic.center.mapper.AiAnalysisErrorsMapper; +import com.volvo.ai.analytic.center.mapper.AiAnalysisRequestLogsMapper; +import com.volvo.ai.analytic.center.mapper.AiAnalyticBusinessConfigMapper; +import com.volvo.ai.analytic.center.utils.AiAnalysisUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 社区特邀发言官服务 + * 该服务用于处理社区特邀发言官相关的业务逻辑 + */ +@Slf4j +@Service +public class SpokesManService { + + @Autowired + private AiAnalyticBusinessConfigMapper aiAnalyticBusinessConfigMapper; + + @Autowired + private DiFyService diFyService; + + @Autowired + private HuaWeiEGService huaWeiEGService; + + @Autowired + private AiAnalysisRequestLogsMapper aiAnalysisRequestLogsMapper; + + @Autowired + private AiAnalysisErrorsMapper aiAnalysisErrorsMapper; + + @Value("${dify.spokesMan.token}") + private String spokesManToken; + + @Value("${dify.spokesMan.channel}") + private String channel; + + /** + * 处理社区特邀发言官回调请求 + * + * @param req SpokesManDTO 请求对象 + */ + public void spokesManCallBack(Object req) { + + //把req转成SpokesManDTO对象 + SpokesManDTO spokesManDTO = JSON.parseObject(JSON.toJSONString(req), SpokesManDTO.class); + if (spokesManDTO == null || spokesManDTO.getFiles() == null || spokesManDTO.getFiles().isEmpty() + || spokesManDTO.getPlatform() == null || spokesManDTO.getTheme() == null) { + log.error("社区特邀发言官入参错误"); + } + // 生成ai分析请求id + String aiAnalysisRequestId = AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.COMMUNITYTARGET.getCode()); + try { + // 异步保存请求日志 + syncSaveRequestLogs(JSON.toJSONString(req), aiAnalysisRequestId); + + //获取特邀发言官敏感词配置 + List sensiveWordLibraryList = aiAnalyticBusinessConfigMapper.selectList( + Wrappers.lambdaQuery() + .eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.SPOKESMAN.getCode()) + .eq(AiAnalyticBusinessConfig::getConfigType, BusinessTypeEnum.SPOKESMAN_SENSITIVE_WORD.getCode()) + .eq(AiAnalyticBusinessConfig::getIsDeleted, 0) + .eq(AiAnalyticBusinessConfig::getConfigVersion, 1) + ); + log.info("社区特邀发言官敏感词配置:{}", sensiveWordLibraryList.toArray()); + //获取审核规则配置 + List auditRulesList = aiAnalyticBusinessConfigMapper.selectList( + Wrappers.lambdaQuery() + .eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.SPOKESMAN.getCode()) + .eq(AiAnalyticBusinessConfig::getConfigType, BusinessTypeEnum.SPOKESMAN_AUDIT_RULE.getCode()) + .eq(AiAnalyticBusinessConfig::getIsDeleted, 0) + .eq(AiAnalyticBusinessConfig::getConfigVersion, 1) + ); + log.info("社区特邀发言官审核规则配置:{}", auditRulesList.toArray()); + String sensiveWordLibrary = sensiveWordLibraryList.stream() + .map(AiAnalyticBusinessConfig::getConfigData) + .collect(Collectors.joining(" ")); + String auditRules = auditRulesList.stream() + .map(AiAnalyticBusinessConfig::getConfigData) + .collect(Collectors.joining(" ")); + JSONArray imageUrls = new JSONArray(); + + for (String url : spokesManDTO.getFiles()) { + DifyImageWorkFlow diFyImageWorkFlow = new DifyImageWorkFlow(); + diFyImageWorkFlow.setUrl(url); + imageUrls.add(diFyImageWorkFlow); + } + DiFyReq diFyReq = new DiFyReq(); + diFyReq.setUser(BusinessTypeEnum.SPOKESMAN.getCode()); + diFyReq.setFlowId(spokesManToken); + JSONObject inputs = new JSONObject(); + inputs.put("files", imageUrls); + inputs.put("platform", spokesManDTO.getPlatform()); + inputs.put("theme", spokesManDTO.getTheme()); + inputs.put("auditRule", auditRules); + inputs.put("sensitiveWordLibrary", sensiveWordLibrary); + diFyReq.setInputs(inputs); + //异步更新dify请求日志 + syncUpdateDiFyRequest(diFyReq, aiAnalysisRequestId); + //调用workflow + JSONObject difSpokesManResult = (JSONObject) diFyService.getDiFyObject(diFyReq); + //发送事件网格 + CloudEvents cloudEvents = new CloudEvents(); + cloudEvents.setData(difSpokesManResult); + huaWeiEGService.sendEvent(cloudEvents, channel); + //异步更新dify响应日志 + syncUpdateDiFyResponse(difSpokesManResult, aiAnalysisRequestId); + } catch (Exception e) { + log.error("舆情自动化异常:{}", e.getMessage()); + //保存错误日志 + aiAnalysisErrorsMapper.insert(AiAnalysisErrors.builder() + .aiAnalysisRequestId(aiAnalysisRequestId) + .aiAnalysisErrorMessage(e.getMessage()) + .aiAnalysisRequestType(BusinessTypeEnum.SPOKESMAN.getCode()) + .build()); + } + } + + @Async + protected void syncSaveRequestLogs(String message, String aiAnalysisRequestId) { + aiAnalysisRequestLogsMapper.insert(AiAnalysisRequestLogs.builder() + .aiAnalysisRequestId(aiAnalysisRequestId) + .businessRequest(message) + .difyAgentKey(spokesManToken) + .aiAnalysisRequestType(BusinessTypeEnum.SPOKESMAN.getCode()) + .build()); + } + @Async + protected void syncUpdateDiFyRequest(Object obj, String aiAnalysisRequestId) { + aiAnalysisRequestLogsMapper.update(new AiAnalysisRequestLogs(), + new UpdateWrapper().set("dify_request", JSON.toJSONString(obj)) + .eq("ai_analysis_request_id", aiAnalysisRequestId)); + } + @Async + protected void syncUpdateDiFyResponse(JSONObject result, String aiAnalysisRequestId) { + aiAnalysisRequestLogsMapper.update(new AiAnalysisRequestLogs(), + new UpdateWrapper().set("dify_response", result.toJSONString()) + .eq("ai_analysis_request_id", aiAnalysisRequestId)); + } +} From 32f9659bd3468154dd77880c7e69c43a249c437b Mon Sep 17 00:00:00 2001 From: lxu75 Date: Fri, 6 Jun 2025 16:51:13 +0800 Subject: [PATCH 06/55] =?UTF-8?q?=E7=89=B9=E9=82=80=E5=8F=91=E8=A8=80?= =?UTF-8?q?=E5=AE=98=E4=BB=A3=E7=A0=81=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytic/center/service/SpokesManService.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index 7ef367f..16d7d6a 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.huaweicloud.sdk.eg.v1.model.CloudEvents; import com.volvo.ai.analytic.center.dto.req.DiFyReq; -import com.volvo.ai.analytic.center.dto.req.DifyCommunityTargetDTO; import com.volvo.ai.analytic.center.dto.req.DifyImageWorkFlow; import com.volvo.ai.analytic.center.dto.req.SpokesManDTO; import com.volvo.ai.analytic.center.entity.AiAnalysisErrors; @@ -53,8 +52,11 @@ public class SpokesManService { @Value("${dify.spokesMan.token}") private String spokesManToken; - @Value("${dify.spokesMan.channel}") - private String channel; + @Value("${huawei.cloud.EG.spokesMan.channelId}") + private String channelId; + + @Value("${huawei.cloud.EG.spokesMan.sourceId}") + private String sourceId; /** * 处理社区特邀发言官回调请求 @@ -123,7 +125,11 @@ public class SpokesManService { //发送事件网格 CloudEvents cloudEvents = new CloudEvents(); cloudEvents.setData(difSpokesManResult); - huaWeiEGService.sendEvent(cloudEvents, channel); + cloudEvents.setSource(sourceId); + cloudEvents.setSpecversion("3.1.51"); + cloudEvents.setType("ai-analytic-center"); + cloudEvents.setId(aiAnalysisRequestId); + huaWeiEGService.sendEvent(cloudEvents, channelId); //异步更新dify响应日志 syncUpdateDiFyResponse(difSpokesManResult, aiAnalysisRequestId); } catch (Exception e) { From 4b2124630c175d47aac59834663ceb21e81ff96f Mon Sep 17 00:00:00 2001 From: lxu75 Date: Tue, 10 Jun 2025 14:42:12 +0800 Subject: [PATCH 07/55] =?UTF-8?q?=E7=89=B9=E9=82=80=E5=8F=91=E8=A8=80?= =?UTF-8?q?=E5=AE=98=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/volvo/ai/analytic/center/service/SpokesManService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index 16d7d6a..02e4b1e 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -91,6 +91,7 @@ public class SpokesManService { Wrappers.lambdaQuery() .eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.SPOKESMAN.getCode()) .eq(AiAnalyticBusinessConfig::getConfigType, BusinessTypeEnum.SPOKESMAN_AUDIT_RULE.getCode()) + .eq(AiAnalyticBusinessConfig::getVerificationMethod, spokesManDTO.getPlatform()) .eq(AiAnalyticBusinessConfig::getIsDeleted, 0) .eq(AiAnalyticBusinessConfig::getConfigVersion, 1) ); From 5d17420899416422544ae7bd462d4945e6ec3404 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Tue, 10 Jun 2025 18:10:54 +0800 Subject: [PATCH 08/55] =?UTF-8?q?=E5=BC=82=E5=B8=B8=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytic/center/service/SpokesManService.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index 02e4b1e..727f64e 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -65,17 +65,18 @@ public class SpokesManService { */ public void spokesManCallBack(Object req) { - //把req转成SpokesManDTO对象 - SpokesManDTO spokesManDTO = JSON.parseObject(JSON.toJSONString(req), SpokesManDTO.class); - if (spokesManDTO == null || spokesManDTO.getFiles() == null || spokesManDTO.getFiles().isEmpty() - || spokesManDTO.getPlatform() == null || spokesManDTO.getTheme() == null) { - log.error("社区特邀发言官入参错误"); - } // 生成ai分析请求id String aiAnalysisRequestId = AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.COMMUNITYTARGET.getCode()); try { // 异步保存请求日志 syncSaveRequestLogs(JSON.toJSONString(req), aiAnalysisRequestId); + //把req转成SpokesManDTO对象 + SpokesManDTO spokesManDTO = JSON.parseObject(JSON.toJSONString(req), SpokesManDTO.class); + if (spokesManDTO == null || spokesManDTO.getFiles() == null || spokesManDTO.getFiles().isEmpty() + || spokesManDTO.getPlatform() == null || spokesManDTO.getTheme() == null) { + log.error("社区特邀发言官入参错误"); + throw new RuntimeException("社区特邀发言官入参错误"); + } //获取特邀发言官敏感词配置 List sensiveWordLibraryList = aiAnalyticBusinessConfigMapper.selectList( From f17343423547ac8914e0e127e65a0fc5899c5766 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Wed, 11 Jun 2025 11:46:44 +0800 Subject: [PATCH 09/55] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/controller/CommunityEGEventController.java | 2 +- .../ai/analytic/center/service/SpokesManService.java | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java index fa8590f..ee34fd7 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java @@ -20,7 +20,7 @@ public class CommunityEGEventController { private SpokesManService spokesmanService; @PostMapping("/spokesmanCallBack") - public void spokesmanCallBack(@RequestBody Object req){ + public void spokesmanCallBack(@RequestBody String req){ log.info("社区特邀发言官入参", JSON.toJSONString(req)); spokesmanService.spokesManCallBack(req); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index 727f64e..5dc1b4c 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -63,15 +63,17 @@ public class SpokesManService { * * @param req SpokesManDTO 请求对象 */ - public void spokesManCallBack(Object req) { + public void spokesManCallBack(String req) { // 生成ai分析请求id String aiAnalysisRequestId = AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.COMMUNITYTARGET.getCode()); try { + JSONObject jsonObject = JSON.parseObject(req); + String data = jsonObject.getString("data"); // 异步保存请求日志 - syncSaveRequestLogs(JSON.toJSONString(req), aiAnalysisRequestId); + syncSaveRequestLogs(JSON.toJSONString(data), aiAnalysisRequestId); //把req转成SpokesManDTO对象 - SpokesManDTO spokesManDTO = JSON.parseObject(JSON.toJSONString(req), SpokesManDTO.class); + SpokesManDTO spokesManDTO = JSON.parseObject(data, SpokesManDTO.class); if (spokesManDTO == null || spokesManDTO.getFiles() == null || spokesManDTO.getFiles().isEmpty() || spokesManDTO.getPlatform() == null || spokesManDTO.getTheme() == null) { log.error("社区特邀发言官入参错误"); From c6835dc51eec08834ff9f184b1110681f7c60327 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Wed, 11 Jun 2025 14:18:35 +0800 Subject: [PATCH 10/55] =?UTF-8?q?fix=20=E6=97=A5=E5=BF=97=E6=89=93?= =?UTF-8?q?=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytic/center/controller/CommunityEGEventController.java | 2 +- .../com/volvo/ai/analytic/center/service/SpokesManService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java index ee34fd7..38d018d 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java @@ -21,7 +21,7 @@ public class CommunityEGEventController { @PostMapping("/spokesmanCallBack") public void spokesmanCallBack(@RequestBody String req){ - log.info("社区特邀发言官入参", JSON.toJSONString(req)); + log.info("社区特邀发言官入参:{}", JSON.toJSONString(req)); spokesmanService.spokesManCallBack(req); } } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index 5dc1b4c..c3be3cd 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -137,7 +137,7 @@ public class SpokesManService { //异步更新dify响应日志 syncUpdateDiFyResponse(difSpokesManResult, aiAnalysisRequestId); } catch (Exception e) { - log.error("舆情自动化异常:{}", e.getMessage()); + log.error("特邀发言官异常:{}", e.getMessage()); //保存错误日志 aiAnalysisErrorsMapper.insert(AiAnalysisErrors.builder() .aiAnalysisRequestId(aiAnalysisRequestId) From 93b1176851946ba16d71588f6a26ca87e8ed3e08 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Wed, 11 Jun 2025 14:26:49 +0800 Subject: [PATCH 11/55] =?UTF-8?q?fix=20=E5=8F=91=E9=80=81=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../volvo/ai/analytic/center/service/SpokesManService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index c3be3cd..63df8e0 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -130,8 +130,9 @@ public class SpokesManService { CloudEvents cloudEvents = new CloudEvents(); cloudEvents.setData(difSpokesManResult); cloudEvents.setSource(sourceId); - cloudEvents.setSpecversion("3.1.51"); - cloudEvents.setType("ai-analytic-center"); + cloudEvents.setSpecversion("1.0"); + cloudEvents.setDatacontenttype("application/json"); + cloudEvents.setType("SPOKESMAN"); cloudEvents.setId(aiAnalysisRequestId); huaWeiEGService.sendEvent(cloudEvents, channelId); //异步更新dify响应日志 From f8ed21e1148208f72f82a1a5b289e7410069baaf Mon Sep 17 00:00:00 2001 From: lxu75 Date: Wed, 11 Jun 2025 17:49:23 +0800 Subject: [PATCH 12/55] =?UTF-8?q?=E5=93=8D=E5=BA=94=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=A4=BE=E5=8C=BA=E5=94=AF=E4=B8=80=E7=BC=96=E5=8F=B7=EF=BC=8C?= =?UTF-8?q?ai=E5=94=AF=E4=B8=80id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/volvo/ai/analytic/center/service/SpokesManService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index 63df8e0..a5a3a9e 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -126,6 +126,8 @@ public class SpokesManService { syncUpdateDiFyRequest(diFyReq, aiAnalysisRequestId); //调用workflow JSONObject difSpokesManResult = (JSONObject) diFyService.getDiFyObject(diFyReq); + difSpokesManResult.put("communityRequestId", spokesManDTO.getCommunityRequestId()); + difSpokesManResult.put("aiAnalysisRequestId", aiAnalysisRequestId); //发送事件网格 CloudEvents cloudEvents = new CloudEvents(); cloudEvents.setData(difSpokesManResult); From edc6c77b01b067c0e1fb2b3e5c40f3b24e1776c8 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Thu, 12 Jun 2025 14:52:08 +0800 Subject: [PATCH 13/55] =?UTF-8?q?=E5=8F=91=E5=B8=83=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/service/SpokesManService.java | 48 ++++++++++++++++++ .../center/utils/PublishedTimeFormatter.java | 50 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index a5a3a9e..5c290d1 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -17,6 +17,7 @@ import com.volvo.ai.analytic.center.mapper.AiAnalysisErrorsMapper; import com.volvo.ai.analytic.center.mapper.AiAnalysisRequestLogsMapper; import com.volvo.ai.analytic.center.mapper.AiAnalyticBusinessConfigMapper; import com.volvo.ai.analytic.center.utils.AiAnalysisUtils; +import com.volvo.ai.analytic.center.utils.PublishedTimeFormatter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -128,6 +129,34 @@ public class SpokesManService { JSONObject difSpokesManResult = (JSONObject) diFyService.getDiFyObject(diFyReq); difSpokesManResult.put("communityRequestId", spokesManDTO.getCommunityRequestId()); difSpokesManResult.put("aiAnalysisRequestId", aiAnalysisRequestId); + + //处理发布时间 + // 获取原始时间字段 + String publishedTime = difSpokesManResult.getJSONObject("ContentAnalysisResult") + .getJSONObject("contentAnalysisReport") + .getJSONObject("publishedContent") + .getJSONObject("publishedContent") + .getString("publishedTime"); + + // 格式化时间 + String formattedPublishedTime = PublishedTimeFormatter.parsePublishedTime(publishedTime); + + // 如果转换成功,则更新回 JSON 对象 + if (formattedPublishedTime != null) { + difSpokesManResult.getJSONObject("ContentAnalysisResult") + .getJSONObject("contentAnalysisReport") + .getJSONObject("publishedContent") + .getJSONObject("publishedContent") + .put("publishedTime", formattedPublishedTime); + } else { + // 可选:设置为空或默认值 + difSpokesManResult.getJSONObject("ContentAnalysisResult") + .getJSONObject("contentAnalysisReport") + .getJSONObject("publishedContent") + .getJSONObject("publishedContent") + .put("publishedTime", ""); + } + //发送事件网格 CloudEvents cloudEvents = new CloudEvents(); cloudEvents.setData(difSpokesManResult); @@ -136,6 +165,7 @@ public class SpokesManService { cloudEvents.setDatacontenttype("application/json"); cloudEvents.setType("SPOKESMAN"); cloudEvents.setId(aiAnalysisRequestId); + log.info("发送特邀发言官事件消息:{}",difSpokesManResult.toString()); huaWeiEGService.sendEvent(cloudEvents, channelId); //异步更新dify响应日志 syncUpdateDiFyResponse(difSpokesManResult, aiAnalysisRequestId); @@ -150,6 +180,24 @@ public class SpokesManService { } } + public static void main(String[] args) { + + String str = "{\n" + + "\t\"ContentAnalysisResult\": \"{\\n \\\"contentAnalysisReport\\\": {\\n \\\"publishedContent\\\": {\\n \\\"publisherAccount\\\": \\\"\\\",\\n \\\"needSubscribe\\\": \\\"No\\\",\\n \\\"publishedContent\\\": {\\n \\\"contentType\\\": \\\"Normal\\\",\\n \\\"matchTheme\\\": \\\"Yes\\\",\\n \\\"publishedTime\\\": \\\"\\\",\\n \\\"contentOverview\\\": \\\"图片展示了一辆沃尔沃全新XC90停在一座传统建筑前,背景为山景和古建筑。\\\",\\n \\\"pictureOverview\\\": \\\"图片内容为一辆沃尔沃全新XC90停在传统建筑前,共有2张图片。\\\",\\n \\\"topicTags\\\": []\\n }\\n },\\n \\\"indicatorData\\\": {\\n \\\"contentTopic\\\": \\\"沃尔沃全新XC90\\\",\\n \\\"countCharacters\\\": 0,\\n \\\"totalNumberOfPictures\\\": 2,\\n \\\"videoDuration\\\": \\\"\\\",\\n \\\"interactionVolume\\\": {\\n \\\"read\\\": \\\"\\\",\\n \\\"like\\\": \\\"\\\",\\n \\\"collection\\\": \\\"\\\",\\n \\\"comment\\\": \\\"\\\",\\n \\\"forward\\\": \\\"\\\"\\n }\\n },\\n \\\"riskDetection\\\": {\\n \\\"sensitiveWords\\\": \\\"NOT\\\",\\n \\\"sensitiveContent\\\": \\\"\\\"\\n }\\n }\\n}\",\n" + + "\t\"auditReport\": \"{\\n \\\"auditReport\\\": {\\n \\\"auditRule\\\": \\\"1. 根据是否需要订阅判定是否为本人发布,需要订阅的为非本人发布;2. 互动量要累计点赞、评论、收藏、转发的总数。\\\",\\n \\\"auditResult\\\": \\\"PASS\\\",\\n \\\"reportsummary\\\": \\\"审核通过。内容为本人发布,无需订阅;互动量数据为空,暂无风险检测异常问题。\\\"\\n }\\n}\"\n" + + "}"; + + String str1 = "{\n" + + "\t\"ContentAnalysisResult\": \"{\\n\\t\\\"contentAnalysisReport\\\": {\\n\\t\\t\\\"publishedContent\\\": {\\n\\t\\t\\t\\\"publisherAccount\\\": \\\"林宇 325\\\",\\n \\\"needSubscribe\\\": \\\"No\\\",\\n\\t\\t\\t\\\"publishedContent\\\": {\\n \\\"matchTheme\\\": \\\"Yes\\\", \\n\\t\\t\\t\\t\\\"publishedTime\\\": \\\"8天前\\\",\\n\\t\\t\\t\\t\\\"contentOverview\\\": \\\"心向往之 行则将至 #沃尔沃\\\",\\n\\t\\t\\t\\t\\\"pictureOverview\\\": \\\"图片内容为一辆白色汽车停在草地上,背景是多云的天空。图片总数为1张。\\\",\\n\\t\\t\\t\\t\\\"topicTags\\\": [\\\"#沃尔沃\\\"]\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\t\\\"indicatorData\\\": {\\n\\t\\t\\t\\\"contentTopic\\\": \\\"#沃尔沃\\\",\\n\\t\\t\\t\\\"countCharacters\\\": 14,\\n\\t\\t\\t\\\"totalNumberOfPictures\\\": 1,\\n\\t\\t\\t\\\"videoDuration\\\": \\\"\\\",\\n\\t\\t\\t\\\"interactionVolume\\\": {\\n\\t\\t\\t\\t\\\"like\\\": 12,\\n\\t\\t\\t\\t\\\"collection\\\": 3,\\n\\t\\t\\t\\t\\\"comment\\\": 7,\\n\\t\\t\\t\\t\\\"forward\\\": 7\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\t\\\"riskDetection\\\": {\\n\\t\\t\\t\\\"sensitiveWords\\\": \\\"NOT\\\",\\n\\t\\t\\t\\\"sensitiveContent\\\": \\\"\\\"\\n\\t\\t}\\n\\t}\\n}\",\n" + + "\t\"auditReport\": \"{\\n \\\"auditReport\\\": {\\n \\\"auditRule\\\": \\\"必须为本人发布,视频时长≥15秒,标题内容不含敏感词,发布时间需在2025年5月31日之前,互动量(点赞+评论+收藏+转发)总和≥10,带沃尔沃相关话题。\\\",\\n \\\"auditResult\\\": \\\"FAIL\\\",\\n \\\"reportsummary\\\": \\\"审核未通过。原因如下:1. 发布内容非视频,且视频时长不足15秒;2. 互动量满足要求(总和为29),发布时间符合要求(8天前),内容匹配主题并带有沃尔沃相关话题;3. 标题内容未检测到敏感词。综上,因缺少视频及视频时长不达标,判定为未通过。\\\"\\n }\\n}\"\n" + + "}"; + + String str2 = "{ \"ContentAnalysisResult\": \"{\\n \\\"contentAnalysisReport\\\": {\\n \\\"publishedContent\\\": {\\n \\\"publisherAccount\\\": \\\"@yoyo\\\",\\n \\\"needSubscribe\\\": \\\"Yes\\\",\\n \\\"publishedContent\\\": {\\n \\\"matchTheme\\\": \\\"Yes\\\",\\n \\\"publishedTime\\\": \\\"4月16日\\\",\\n \\\"contentOverview\\\": \\\"全新XC90耀世登场 ✨ 北欧匠心设计×六座奢适空间 以安全与豪华重新定义出行 \uD83D\uDEE1 邀您共赏旗舰风范\\\",\\n \\\"pictureOverview\\\": \\\"图片内容为沃尔沃全新XC90的发布会现场,包括主持人和活动现场的照片。图片总数为2张,当前展示的是第1张和第2张。\\\",\\n \\\"topicTags\\\": [\\\"#沃尔沃全新XC90\\\", \\\"#全新XC90进口旗舰大六座\\\"]\\n }\\n },\\n \\\"indicatorData\\\": {\\n \\\"contentTopic\\\": \\\"沃尔沃全新XC90\\\",\\n \\\"countCharacters\\\": 63,\\n \\\"totalNumberOfPictures\\\": 2,\\n \\\"videoDuration\\\": \\\"00:33\\\",\\n \\\"interactionVolume\\\": {\\n \\\"like\\\": \\\"4\\\",\\n \\\"collection\\\": \\\"\\\",\\n \\\"comment\\\": \\\"\\\",\\n \\\"forward\\\": \\\"\\\"\\n }\\n },\\n \\\"riskDetection\\\": {\\n \\\"sensitiveWords\\\": \\\"NOT\\\",\\n \\\"sensitiveContent\\\": \\\"\\\"\\n }\\n }\\n}\", \"auditReport\": \"{\\n \\\"auditReport\\\": {\\n \\\"auditRule\\\": \\\"必须为本人发布,视频时长≥15秒,标题内容不含敏感词,发布时间需在2025年5月31日之前,互动量(点赞+评论+收藏+转发)总和≥10,带沃尔沃相关话题。\\\",\\n \\\"auditResult\\\": \\\"FAIL\\\",\\n \\\"reportSummary\\\": \\\"审核未通过。原因:1. 发布账户需要订阅,判定为非本人发布;2. 互动总量不足,当前仅有4次点赞,未达到最低要求的10次互动量。\\\"\\n }\\n}\" }"; + JSONObject difSpokesManResult = JSON.parseObject(str1); + String publishedTime = difSpokesManResult.getJSONObject("ContentAnalysisResult").getJSONObject("contentAnalysisReport").getJSONObject("publishedContent").getJSONObject("publishedContent").getString("publishedTime"); + //处理publishedTime转换为年月日,年默认为当前年 + System.out.println(publishedTime); + } @Async protected void syncSaveRequestLogs(String message, String aiAnalysisRequestId) { aiAnalysisRequestLogsMapper.insert(AiAnalysisRequestLogs.builder() diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java new file mode 100644 index 0000000..2f32c26 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java @@ -0,0 +1,50 @@ +package com.volvo.ai.analytic.center.utils; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; + +@Slf4j +@Component +public class PublishedTimeFormatter { + private static final DateTimeFormatter MONTH_DAY_FORMAT = DateTimeFormatter.ofPattern("M月d日"); + private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH.mm"); + + public static String parsePublishedTime(String publishedTime) { + if (publishedTime == null || publishedTime.isEmpty() || publishedTime.equals("\"\"")) { + return null; // 空值直接返回null或按需处理 + } + + LocalDate now = LocalDate.now(); + + try { + // 处理 "8天前" 格式 + if (publishedTime.endsWith("天前")) { + int daysAgo = Integer.parseInt(publishedTime.replace("天前", "")); + return now.minus(daysAgo, ChronoUnit.DAYS).format(DateTimeFormatter.ISO_DATE); + } + + // 处理 "4月16日" 格式 + if (publishedTime.matches("\\d+月\\d+日")) { + LocalDate parsed = LocalDate.parse(publishedTime, MONTH_DAY_FORMAT); + return LocalDate.of(now.getYear(), parsed.getMonth(), parsed.getDayOfMonth()) + .format(DateTimeFormatter.ISO_DATE); + } + + // 处理 "2025-05-06 23.00" 格式 + if (publishedTime.contains("-")) { + LocalDateTime parsed = LocalDateTime.parse(publishedTime, DATE_TIME_FORMAT); + return parsed.toLocalDate().format(DateTimeFormatter.ISO_DATE); + } + + } catch (Exception e) { + // 可记录异常或忽略错误格式 + System.err.println("无法解析时间: " + publishedTime); + } + return null; // 未知格式返回null + } +} From d306af45519b3d32cc927c93078b8a0d93815dd5 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Thu, 12 Jun 2025 19:26:14 +0800 Subject: [PATCH 14/55] =?UTF-8?q?=E5=8F=91=E5=B8=83=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/service/SpokesManService.java | 66 +++++++------------ .../center/utils/PublishedTimeFormatter.java | 24 ++++--- 2 files changed, 40 insertions(+), 50 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index 5c290d1..05b12db 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -129,34 +129,8 @@ public class SpokesManService { JSONObject difSpokesManResult = (JSONObject) diFyService.getDiFyObject(diFyReq); difSpokesManResult.put("communityRequestId", spokesManDTO.getCommunityRequestId()); difSpokesManResult.put("aiAnalysisRequestId", aiAnalysisRequestId); - //处理发布时间 - // 获取原始时间字段 - String publishedTime = difSpokesManResult.getJSONObject("ContentAnalysisResult") - .getJSONObject("contentAnalysisReport") - .getJSONObject("publishedContent") - .getJSONObject("publishedContent") - .getString("publishedTime"); - - // 格式化时间 - String formattedPublishedTime = PublishedTimeFormatter.parsePublishedTime(publishedTime); - - // 如果转换成功,则更新回 JSON 对象 - if (formattedPublishedTime != null) { - difSpokesManResult.getJSONObject("ContentAnalysisResult") - .getJSONObject("contentAnalysisReport") - .getJSONObject("publishedContent") - .getJSONObject("publishedContent") - .put("publishedTime", formattedPublishedTime); - } else { - // 可选:设置为空或默认值 - difSpokesManResult.getJSONObject("ContentAnalysisResult") - .getJSONObject("contentAnalysisReport") - .getJSONObject("publishedContent") - .getJSONObject("publishedContent") - .put("publishedTime", ""); - } - + updatePublishedTime(difSpokesManResult); //发送事件网格 CloudEvents cloudEvents = new CloudEvents(); cloudEvents.setData(difSpokesManResult); @@ -165,7 +139,6 @@ public class SpokesManService { cloudEvents.setDatacontenttype("application/json"); cloudEvents.setType("SPOKESMAN"); cloudEvents.setId(aiAnalysisRequestId); - log.info("发送特邀发言官事件消息:{}",difSpokesManResult.toString()); huaWeiEGService.sendEvent(cloudEvents, channelId); //异步更新dify响应日志 syncUpdateDiFyResponse(difSpokesManResult, aiAnalysisRequestId); @@ -180,24 +153,33 @@ public class SpokesManService { } } - public static void main(String[] args) { + public static void updatePublishedTime(JSONObject rootJson) { + String contentAnalysisResultStr = rootJson.getString("ContentAnalysisResult"); + if (contentAnalysisResultStr == null || contentAnalysisResultStr.isEmpty()) return; - String str = "{\n" + - "\t\"ContentAnalysisResult\": \"{\\n \\\"contentAnalysisReport\\\": {\\n \\\"publishedContent\\\": {\\n \\\"publisherAccount\\\": \\\"\\\",\\n \\\"needSubscribe\\\": \\\"No\\\",\\n \\\"publishedContent\\\": {\\n \\\"contentType\\\": \\\"Normal\\\",\\n \\\"matchTheme\\\": \\\"Yes\\\",\\n \\\"publishedTime\\\": \\\"\\\",\\n \\\"contentOverview\\\": \\\"图片展示了一辆沃尔沃全新XC90停在一座传统建筑前,背景为山景和古建筑。\\\",\\n \\\"pictureOverview\\\": \\\"图片内容为一辆沃尔沃全新XC90停在传统建筑前,共有2张图片。\\\",\\n \\\"topicTags\\\": []\\n }\\n },\\n \\\"indicatorData\\\": {\\n \\\"contentTopic\\\": \\\"沃尔沃全新XC90\\\",\\n \\\"countCharacters\\\": 0,\\n \\\"totalNumberOfPictures\\\": 2,\\n \\\"videoDuration\\\": \\\"\\\",\\n \\\"interactionVolume\\\": {\\n \\\"read\\\": \\\"\\\",\\n \\\"like\\\": \\\"\\\",\\n \\\"collection\\\": \\\"\\\",\\n \\\"comment\\\": \\\"\\\",\\n \\\"forward\\\": \\\"\\\"\\n }\\n },\\n \\\"riskDetection\\\": {\\n \\\"sensitiveWords\\\": \\\"NOT\\\",\\n \\\"sensitiveContent\\\": \\\"\\\"\\n }\\n }\\n}\",\n" + - "\t\"auditReport\": \"{\\n \\\"auditReport\\\": {\\n \\\"auditRule\\\": \\\"1. 根据是否需要订阅判定是否为本人发布,需要订阅的为非本人发布;2. 互动量要累计点赞、评论、收藏、转发的总数。\\\",\\n \\\"auditResult\\\": \\\"PASS\\\",\\n \\\"reportsummary\\\": \\\"审核通过。内容为本人发布,无需订阅;互动量数据为空,暂无风险检测异常问题。\\\"\\n }\\n}\"\n" + - "}"; + JSONObject contentAnalysisResult = JSON.parseObject(contentAnalysisResultStr); + JSONObject contentAnalysisReport = contentAnalysisResult.getJSONObject("contentAnalysisReport"); + if (contentAnalysisReport == null) return; - String str1 = "{\n" + - "\t\"ContentAnalysisResult\": \"{\\n\\t\\\"contentAnalysisReport\\\": {\\n\\t\\t\\\"publishedContent\\\": {\\n\\t\\t\\t\\\"publisherAccount\\\": \\\"林宇 325\\\",\\n \\\"needSubscribe\\\": \\\"No\\\",\\n\\t\\t\\t\\\"publishedContent\\\": {\\n \\\"matchTheme\\\": \\\"Yes\\\", \\n\\t\\t\\t\\t\\\"publishedTime\\\": \\\"8天前\\\",\\n\\t\\t\\t\\t\\\"contentOverview\\\": \\\"心向往之 行则将至 #沃尔沃\\\",\\n\\t\\t\\t\\t\\\"pictureOverview\\\": \\\"图片内容为一辆白色汽车停在草地上,背景是多云的天空。图片总数为1张。\\\",\\n\\t\\t\\t\\t\\\"topicTags\\\": [\\\"#沃尔沃\\\"]\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\t\\\"indicatorData\\\": {\\n\\t\\t\\t\\\"contentTopic\\\": \\\"#沃尔沃\\\",\\n\\t\\t\\t\\\"countCharacters\\\": 14,\\n\\t\\t\\t\\\"totalNumberOfPictures\\\": 1,\\n\\t\\t\\t\\\"videoDuration\\\": \\\"\\\",\\n\\t\\t\\t\\\"interactionVolume\\\": {\\n\\t\\t\\t\\t\\\"like\\\": 12,\\n\\t\\t\\t\\t\\\"collection\\\": 3,\\n\\t\\t\\t\\t\\\"comment\\\": 7,\\n\\t\\t\\t\\t\\\"forward\\\": 7\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\t\\\"riskDetection\\\": {\\n\\t\\t\\t\\\"sensitiveWords\\\": \\\"NOT\\\",\\n\\t\\t\\t\\\"sensitiveContent\\\": \\\"\\\"\\n\\t\\t}\\n\\t}\\n}\",\n" + - "\t\"auditReport\": \"{\\n \\\"auditReport\\\": {\\n \\\"auditRule\\\": \\\"必须为本人发布,视频时长≥15秒,标题内容不含敏感词,发布时间需在2025年5月31日之前,互动量(点赞+评论+收藏+转发)总和≥10,带沃尔沃相关话题。\\\",\\n \\\"auditResult\\\": \\\"FAIL\\\",\\n \\\"reportsummary\\\": \\\"审核未通过。原因如下:1. 发布内容非视频,且视频时长不足15秒;2. 互动量满足要求(总和为29),发布时间符合要求(8天前),内容匹配主题并带有沃尔沃相关话题;3. 标题内容未检测到敏感词。综上,因缺少视频及视频时长不达标,判定为未通过。\\\"\\n }\\n}\"\n" + - "}"; + JSONObject publishedContentOuter = contentAnalysisReport.getJSONObject("publishedContent"); + if (publishedContentOuter == null) return; - String str2 = "{ \"ContentAnalysisResult\": \"{\\n \\\"contentAnalysisReport\\\": {\\n \\\"publishedContent\\\": {\\n \\\"publisherAccount\\\": \\\"@yoyo\\\",\\n \\\"needSubscribe\\\": \\\"Yes\\\",\\n \\\"publishedContent\\\": {\\n \\\"matchTheme\\\": \\\"Yes\\\",\\n \\\"publishedTime\\\": \\\"4月16日\\\",\\n \\\"contentOverview\\\": \\\"全新XC90耀世登场 ✨ 北欧匠心设计×六座奢适空间 以安全与豪华重新定义出行 \uD83D\uDEE1 邀您共赏旗舰风范\\\",\\n \\\"pictureOverview\\\": \\\"图片内容为沃尔沃全新XC90的发布会现场,包括主持人和活动现场的照片。图片总数为2张,当前展示的是第1张和第2张。\\\",\\n \\\"topicTags\\\": [\\\"#沃尔沃全新XC90\\\", \\\"#全新XC90进口旗舰大六座\\\"]\\n }\\n },\\n \\\"indicatorData\\\": {\\n \\\"contentTopic\\\": \\\"沃尔沃全新XC90\\\",\\n \\\"countCharacters\\\": 63,\\n \\\"totalNumberOfPictures\\\": 2,\\n \\\"videoDuration\\\": \\\"00:33\\\",\\n \\\"interactionVolume\\\": {\\n \\\"like\\\": \\\"4\\\",\\n \\\"collection\\\": \\\"\\\",\\n \\\"comment\\\": \\\"\\\",\\n \\\"forward\\\": \\\"\\\"\\n }\\n },\\n \\\"riskDetection\\\": {\\n \\\"sensitiveWords\\\": \\\"NOT\\\",\\n \\\"sensitiveContent\\\": \\\"\\\"\\n }\\n }\\n}\", \"auditReport\": \"{\\n \\\"auditReport\\\": {\\n \\\"auditRule\\\": \\\"必须为本人发布,视频时长≥15秒,标题内容不含敏感词,发布时间需在2025年5月31日之前,互动量(点赞+评论+收藏+转发)总和≥10,带沃尔沃相关话题。\\\",\\n \\\"auditResult\\\": \\\"FAIL\\\",\\n \\\"reportSummary\\\": \\\"审核未通过。原因:1. 发布账户需要订阅,判定为非本人发布;2. 互动总量不足,当前仅有4次点赞,未达到最低要求的10次互动量。\\\"\\n }\\n}\" }"; - JSONObject difSpokesManResult = JSON.parseObject(str1); - String publishedTime = difSpokesManResult.getJSONObject("ContentAnalysisResult").getJSONObject("contentAnalysisReport").getJSONObject("publishedContent").getJSONObject("publishedContent").getString("publishedTime"); - //处理publishedTime转换为年月日,年默认为当前年 - System.out.println(publishedTime); + JSONObject publishedContentInner = publishedContentOuter.getJSONObject("publishedContent"); + if (publishedContentInner == null) return; + + String publishedTime = publishedContentInner.getString("publishedTime"); + String formattedPublishedTime = PublishedTimeFormatter.parsePublishedTime(publishedTime); + + if (formattedPublishedTime != null) { + publishedContentInner.put("publishedTime", formattedPublishedTime); + publishedContentOuter.put("publishedContent", publishedContentInner); + contentAnalysisReport.put("publishedContent", publishedContentOuter); + contentAnalysisResult.put("contentAnalysisReport", contentAnalysisReport); + rootJson.put("ContentAnalysisResult", contentAnalysisResult.toJSONString()); + } } + + @Async protected void syncSaveRequestLogs(String message, String aiAnalysisRequestId) { aiAnalysisRequestLogsMapper.insert(AiAnalysisRequestLogs.builder() diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java index 2f32c26..7ad77b2 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java @@ -11,8 +11,7 @@ import java.time.temporal.ChronoUnit; @Slf4j @Component public class PublishedTimeFormatter { - private static final DateTimeFormatter MONTH_DAY_FORMAT = DateTimeFormatter.ofPattern("M月d日"); - private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH.mm"); + private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); public static String parsePublishedTime(String publishedTime) { if (publishedTime == null || publishedTime.isEmpty() || publishedTime.equals("\"\"")) { @@ -22,20 +21,29 @@ public class PublishedTimeFormatter { LocalDate now = LocalDate.now(); try { - // 处理 "8天前" 格式 + // 处理 "X天前" 格式 if (publishedTime.endsWith("天前")) { int daysAgo = Integer.parseInt(publishedTime.replace("天前", "")); return now.minus(daysAgo, ChronoUnit.DAYS).format(DateTimeFormatter.ISO_DATE); } - // 处理 "4月16日" 格式 + // 处理 "X月X日" 格式 if (publishedTime.matches("\\d+月\\d+日")) { - LocalDate parsed = LocalDate.parse(publishedTime, MONTH_DAY_FORMAT); - return LocalDate.of(now.getYear(), parsed.getMonth(), parsed.getDayOfMonth()) + // 提取月份和日期 + int monthStart = 0; + int monthEnd = publishedTime.indexOf("月"); + int dayStart = monthEnd + 1; + int dayEnd = publishedTime.indexOf("日"); + + int monthValue = Integer.parseInt(publishedTime.substring(monthStart, monthEnd)); + int dayValue = Integer.parseInt(publishedTime.substring(dayStart, dayEnd)); + + // 构建当年的 LocalDate 对象 + return LocalDate.of(now.getYear(), monthValue, dayValue) .format(DateTimeFormatter.ISO_DATE); } - // 处理 "2025-05-06 23.00" 格式 + // 处理 "2025-05-06 23:00:00" 格式 if (publishedTime.contains("-")) { LocalDateTime parsed = LocalDateTime.parse(publishedTime, DATE_TIME_FORMAT); return parsed.toLocalDate().format(DateTimeFormatter.ISO_DATE); @@ -43,7 +51,7 @@ public class PublishedTimeFormatter { } catch (Exception e) { // 可记录异常或忽略错误格式 - System.err.println("无法解析时间: " + publishedTime); + log.error("无法解析时间:{} " ,publishedTime); } return null; // 未知格式返回null } From c6ade56f80a24736f98aa26d5aa59d62b4ab35a9 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Fri, 13 Jun 2025 10:09:37 +0800 Subject: [PATCH 15/55] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E6=95=8F=E6=84=9F?= =?UTF-8?q?=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytic/center/service/SpokesManService.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index 05b12db..601422f 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -80,16 +80,6 @@ public class SpokesManService { log.error("社区特邀发言官入参错误"); throw new RuntimeException("社区特邀发言官入参错误"); } - - //获取特邀发言官敏感词配置 - List sensiveWordLibraryList = aiAnalyticBusinessConfigMapper.selectList( - Wrappers.lambdaQuery() - .eq(AiAnalyticBusinessConfig::getBusinessLine, BusinessTypeEnum.SPOKESMAN.getCode()) - .eq(AiAnalyticBusinessConfig::getConfigType, BusinessTypeEnum.SPOKESMAN_SENSITIVE_WORD.getCode()) - .eq(AiAnalyticBusinessConfig::getIsDeleted, 0) - .eq(AiAnalyticBusinessConfig::getConfigVersion, 1) - ); - log.info("社区特邀发言官敏感词配置:{}", sensiveWordLibraryList.toArray()); //获取审核规则配置 List auditRulesList = aiAnalyticBusinessConfigMapper.selectList( Wrappers.lambdaQuery() @@ -100,9 +90,6 @@ public class SpokesManService { .eq(AiAnalyticBusinessConfig::getConfigVersion, 1) ); log.info("社区特邀发言官审核规则配置:{}", auditRulesList.toArray()); - String sensiveWordLibrary = sensiveWordLibraryList.stream() - .map(AiAnalyticBusinessConfig::getConfigData) - .collect(Collectors.joining(" ")); String auditRules = auditRulesList.stream() .map(AiAnalyticBusinessConfig::getConfigData) .collect(Collectors.joining(" ")); @@ -121,7 +108,6 @@ public class SpokesManService { inputs.put("platform", spokesManDTO.getPlatform()); inputs.put("theme", spokesManDTO.getTheme()); inputs.put("auditRule", auditRules); - inputs.put("sensitiveWordLibrary", sensiveWordLibrary); diFyReq.setInputs(inputs); //异步更新dify请求日志 syncUpdateDiFyRequest(diFyReq, aiAnalysisRequestId); From a50ca609de56553f728116197835bcd00559c0d7 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Tue, 17 Jun 2025 14:37:43 +0800 Subject: [PATCH 16/55] =?UTF-8?q?=E7=89=B9=E9=82=80=E5=8F=91=E8=A8=80?= =?UTF-8?q?=E5=AE=98EG=E6=94=B9=E4=B8=BAMQ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommunityEGEventController.java | 27 ------------------- .../center/mq/InvitedSpeakerConsumer.java | 25 +++++++++++++++++ .../center/service/SpokesManService.java | 26 ++++++------------ 3 files changed, 33 insertions(+), 45 deletions(-) delete mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/InvitedSpeakerConsumer.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java deleted file mode 100644 index 38d018d..0000000 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/CommunityEGEventController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.volvo.ai.analytic.center.controller; - - -import com.alibaba.fastjson.JSON; -import com.volvo.ai.analytic.center.service.SpokesManService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -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 -@RequestMapping("/community/event") -@Slf4j -public class CommunityEGEventController { - - @Autowired - private SpokesManService spokesmanService; - - @PostMapping("/spokesmanCallBack") - public void spokesmanCallBack(@RequestBody String req){ - log.info("社区特邀发言官入参:{}", JSON.toJSONString(req)); - spokesmanService.spokesManCallBack(req); - } -} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/InvitedSpeakerConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/InvitedSpeakerConsumer.java new file mode 100644 index 0000000..2a085ae --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/InvitedSpeakerConsumer.java @@ -0,0 +1,25 @@ +package com.volvo.ai.analytic.center.mq; + +import com.volvo.ai.analytic.center.service.SpokesManService; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RocketMQMessageListener(consumerGroup = "${rocketmq.consumer.InvitedSpeaker.group}", + topic = "${rocketmq.consumer.InvitedSpeaker.topic}", + enableMsgTrace = true) +public class InvitedSpeakerConsumer implements RocketMQListener { + + @Autowired + private SpokesManService spokesmanService; + @Override + public void onMessage(MessageExt messageExt) { + log.info("特邀发言官 message: " + messageExt); + spokesmanService.spokesManCallBack(new String(messageExt.getBody())); + } +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index 601422f..d7c6304 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.huaweicloud.sdk.eg.v1.model.CloudEvents; import com.volvo.ai.analytic.center.dto.req.DiFyReq; import com.volvo.ai.analytic.center.dto.req.DifyImageWorkFlow; import com.volvo.ai.analytic.center.dto.req.SpokesManDTO; @@ -19,6 +18,7 @@ import com.volvo.ai.analytic.center.mapper.AiAnalyticBusinessConfigMapper; import com.volvo.ai.analytic.center.utils.AiAnalysisUtils; import com.volvo.ai.analytic.center.utils.PublishedTimeFormatter; import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; @@ -41,23 +41,20 @@ public class SpokesManService { @Autowired private DiFyService diFyService; - @Autowired - private HuaWeiEGService huaWeiEGService; - @Autowired private AiAnalysisRequestLogsMapper aiAnalysisRequestLogsMapper; @Autowired private AiAnalysisErrorsMapper aiAnalysisErrorsMapper; + @Autowired + private RocketMQTemplate rocketMQTemplate; + @Value("${dify.spokesMan.token}") private String spokesManToken; - @Value("${huawei.cloud.EG.spokesMan.channelId}") - private String channelId; - - @Value("${huawei.cloud.EG.spokesMan.sourceId}") - private String sourceId; + @Value("${rocketmq.producer.InvitedSpeaker.topic}") + private String topic; /** * 处理社区特邀发言官回调请求 @@ -117,15 +114,8 @@ public class SpokesManService { difSpokesManResult.put("aiAnalysisRequestId", aiAnalysisRequestId); //处理发布时间 updatePublishedTime(difSpokesManResult); - //发送事件网格 - CloudEvents cloudEvents = new CloudEvents(); - cloudEvents.setData(difSpokesManResult); - cloudEvents.setSource(sourceId); - cloudEvents.setSpecversion("1.0"); - cloudEvents.setDatacontenttype("application/json"); - cloudEvents.setType("SPOKESMAN"); - cloudEvents.setId(aiAnalysisRequestId); - huaWeiEGService.sendEvent(cloudEvents, channelId); + //返回结果推送到社区的MQ + rocketMQTemplate.syncSend(topic, difSpokesManResult.toString()); //异步更新dify响应日志 syncUpdateDiFyResponse(difSpokesManResult, aiAnalysisRequestId); } catch (Exception e) { From 78946e0156fd76b54b393da60e9d05698b9b9d39 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Tue, 17 Jun 2025 16:19:01 +0800 Subject: [PATCH 17/55] =?UTF-8?q?=E7=89=B9=E9=82=80=E5=8F=91=E8=A8=80?= =?UTF-8?q?=E5=AE=98=E8=A1=A5=E5=81=BF=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/job/InvitedSpeakerJob.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java new file mode 100644 index 0000000..227ad3c --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java @@ -0,0 +1,33 @@ +package com.volvo.ai.analytic.center.job; + + +import com.volvo.ai.analytic.center.service.SpokesManService; +import com.volvo.common.core.util.ResultMsg; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class InvitedSpeakerJob { + + @Autowired + private SpokesManService spokesmanService; + + + /** + * 邀约消息推送 + */ + @XxlJob("invitedSpeakerJobTask") + public ResultMsg invitedSpeakerJobTask() { + try { + log.info("invitedSpeakerJobTask 开始执行特邀发言官定时任务补偿处理消息"); + spokesmanService.communityMessageByTask(); + } catch (Exception e) { + log.error("invitedSpeakerJobTask 定时任务补偿处理消息异常",e.getMessage()); + throw new RuntimeException(e); + } + return ResultMsg.ok(); + } +} From 6785e93cb4229c5eb0ce2bde605a704ee853800a Mon Sep 17 00:00:00 2001 From: lxu75 Date: Tue, 17 Jun 2025 18:38:27 +0800 Subject: [PATCH 18/55] fix sonar --- .../volvo/ai/analytic/center/utils/PublishedTimeFormatter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java index 7ad77b2..397bcab 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/PublishedTimeFormatter.java @@ -10,6 +10,7 @@ import java.time.temporal.ChronoUnit; @Slf4j @Component +@SuppressWarnings("squid:S4784") public class PublishedTimeFormatter { private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); From 03b2cabc89e103980f62886980428654f38b1a93 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Thu, 19 Jun 2025 19:33:48 +0800 Subject: [PATCH 19/55] =?UTF-8?q?=E7=89=B9=E9=82=80=E5=8F=91=E8=A8=80?= =?UTF-8?q?=E5=AE=98=E8=A1=A5=E5=81=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java index 227ad3c..b89fa32 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java @@ -23,7 +23,7 @@ public class InvitedSpeakerJob { public ResultMsg invitedSpeakerJobTask() { try { log.info("invitedSpeakerJobTask 开始执行特邀发言官定时任务补偿处理消息"); - spokesmanService.communityMessageByTask(); + spokesmanService.spokesManCallBack("111"); } catch (Exception e) { log.error("invitedSpeakerJobTask 定时任务补偿处理消息异常",e.getMessage()); throw new RuntimeException(e); From 9550cf76e08a582e51896f8915c48e40b041c61c Mon Sep 17 00:00:00 2001 From: lxu75 Date: Thu, 19 Jun 2025 19:49:21 +0800 Subject: [PATCH 20/55] =?UTF-8?q?=E7=89=B9=E9=82=80=E5=8F=91=E8=A8=80?= =?UTF-8?q?=E5=AE=98fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../volvo/ai/analytic/center/mq/InvitedSpeakerConsumer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/InvitedSpeakerConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/InvitedSpeakerConsumer.java index 2a085ae..cdf0f3f 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/InvitedSpeakerConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/InvitedSpeakerConsumer.java @@ -10,8 +10,8 @@ import org.springframework.stereotype.Component; @Slf4j @Component -@RocketMQMessageListener(consumerGroup = "${rocketmq.consumer.InvitedSpeaker.group}", - topic = "${rocketmq.consumer.InvitedSpeaker.topic}", +@RocketMQMessageListener(consumerGroup = "${rocketmq.consumer.invitedSpeaker.group}", + topic = "${rocketmq.consumer.invitedSpeaker.topic}", enableMsgTrace = true) public class InvitedSpeakerConsumer implements RocketMQListener { From 1c1a78001a6373959d44793e918515ae824f0b52 Mon Sep 17 00:00:00 2001 From: lxu75 Date: Fri, 20 Jun 2025 15:43:14 +0800 Subject: [PATCH 21/55] =?UTF-8?q?=E7=89=B9=E9=82=80=E5=8F=91=E8=A8=80?= =?UTF-8?q?=E5=AE=98=20=E8=A1=A5=E5=81=BF=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/job/InvitedSpeakerJob.java | 2 +- .../center/service/SpokesManService.java | 64 ++++++++++++++++--- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java index b89fa32..25afd48 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/InvitedSpeakerJob.java @@ -23,7 +23,7 @@ public class InvitedSpeakerJob { public ResultMsg invitedSpeakerJobTask() { try { log.info("invitedSpeakerJobTask 开始执行特邀发言官定时任务补偿处理消息"); - spokesmanService.spokesManCallBack("111"); + spokesmanService.spokesManTask(); } catch (Exception e) { log.error("invitedSpeakerJobTask 定时任务补偿处理消息异常",e.getMessage()); throw new RuntimeException(e); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java index d7c6304..26b3a82 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/SpokesManService.java @@ -1,13 +1,14 @@ package com.volvo.ai.analytic.center.service; +import com.alibaba.cloud.commons.lang.StringUtils; 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.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.volvo.ai.analytic.center.dto.req.DiFyReq; -import com.volvo.ai.analytic.center.dto.req.DifyImageWorkFlow; -import com.volvo.ai.analytic.center.dto.req.SpokesManDTO; +import com.volvo.ai.analytic.center.dto.req.*; import com.volvo.ai.analytic.center.entity.AiAnalysisErrors; import com.volvo.ai.analytic.center.entity.AiAnalysisRequestLogs; import com.volvo.ai.analytic.center.entity.AiAnalyticBusinessConfig; @@ -66,14 +67,12 @@ public class SpokesManService { // 生成ai分析请求id String aiAnalysisRequestId = AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.COMMUNITYTARGET.getCode()); try { - JSONObject jsonObject = JSON.parseObject(req); - String data = jsonObject.getString("data"); // 异步保存请求日志 - syncSaveRequestLogs(JSON.toJSONString(data), aiAnalysisRequestId); + syncSaveRequestLogs(JSON.toJSONString(req), aiAnalysisRequestId); //把req转成SpokesManDTO对象 - SpokesManDTO spokesManDTO = JSON.parseObject(data, SpokesManDTO.class); + SpokesManDTO spokesManDTO = JSON.parseObject(req, SpokesManDTO.class); if (spokesManDTO == null || spokesManDTO.getFiles() == null || spokesManDTO.getFiles().isEmpty() - || spokesManDTO.getPlatform() == null || spokesManDTO.getTheme() == null) { + || spokesManDTO.getPlatform() == null) { log.error("社区特邀发言官入参错误"); throw new RuntimeException("社区特邀发言官入参错误"); } @@ -128,7 +127,54 @@ public class SpokesManService { .build()); } } - + //特邀发言补偿 + public void spokesManTask() { + try { + //捞取异常表中属于社区的异常数据 + List aiAnalysisErrors = aiAnalysisErrorsMapper.selectList(new LambdaQueryWrapper() + .eq(AiAnalysisErrors::getAiAnalysisRequestType, BusinessTypeEnum.SPOKESMAN.getCode()) + .eq(AiAnalysisErrors::getAiAnalysisErrorHandlingStatus, "0") + .lt(AiAnalysisErrors::getRetryCount, 4)); + if (aiAnalysisErrors != null && aiAnalysisErrors.size() > 0) { + //根据ai_analysis_request_id获取AiAnalysisRequestLogs表中的对应的dify_request字段 + for (AiAnalysisErrors aiAnalysisError : aiAnalysisErrors) { + try { + AiAnalysisRequestLogs aiAnalysisRequestLogs = aiAnalysisRequestLogsMapper.selectOne(new LambdaQueryWrapper() + .eq(AiAnalysisRequestLogs::getAiAnalysisRequestId, aiAnalysisError.getAiAnalysisRequestId())); + if (aiAnalysisRequestLogs != null) { + //获取dify_request字段 + String message = aiAnalysisRequestLogs.getBusinessRequest(); + String difyRequest = aiAnalysisRequestLogs.getDifyRequest(); + if (StringUtils.isNotEmpty(message) || StringUtils.isNotEmpty(difyRequest)) { + SpokesManDTO spokesManDTO = JSON.parseObject(message, SpokesManDTO.class); DiFyReq diFyReq = JSON.parseObject(difyRequest, DiFyReq.class); + //调用workflow + JSONObject difSpokesManResult = (JSONObject) diFyService.getDiFyObject(diFyReq); + difSpokesManResult.put("communityRequestId", spokesManDTO.getCommunityRequestId()); + difSpokesManResult.put("aiAnalysisRequestId", aiAnalysisError.getAiAnalysisRequestId()); + //处理发布时间 + updatePublishedTime(difSpokesManResult); + //返回结果推送到社区的MQ + rocketMQTemplate.syncSend(topic, difSpokesManResult.toString()); + //异步更新dify响应日志 + syncUpdateDiFyResponse(difSpokesManResult, aiAnalysisError.getAiAnalysisRequestId()); + } 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); + aiAnalysisErrorsMapper.update(new AiAnalysisErrors(), new LambdaUpdateWrapper() + .eq(AiAnalysisErrors::getAiAnalysisRequestId, aiAnalysisError.getAiAnalysisRequestId()) + .set(AiAnalysisErrors::getRetryCount, aiAnalysisError.getRetryCount() + 1)); + } + } + } + } catch (Exception e) { + log.error("处理社区异常消息异常:{}", e); + } + } public static void updatePublishedTime(JSONObject rootJson) { String contentAnalysisResultStr = rootJson.getString("ContentAnalysisResult"); if (contentAnalysisResultStr == null || contentAnalysisResultStr.isEmpty()) return; From e4f93e684a6ff9eb1f832c6f377d79290d35d072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E4=BA=9A=E6=B4=B2?= Date: Thu, 26 Jun 2025 00:53:14 +0800 Subject: [PATCH 22/55] =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/analytic/center/constant/Constant.java | 2 + .../center/enums/BusinessTypeEnum.java | 2 +- .../AiAnalyticCenterServiceApplication.java | 2 + .../ai/analytic/center/job/CorpusFailJob.java | 107 +++++++++++++++++- .../center/mq/CorpusDccMqConsumer.java | 20 +++- .../center/mq/CorpusProcessKafkaProducer.java | 4 +- .../service/TmTelephoneCorpusService.java | 3 + .../center/service/impl/DiFyServiceImpl.java | 16 ++- .../impl/IntelligentCustomerServiceImpl.java | 44 ------- .../impl/TmTelephoneCorpusServiceImpl.java | 98 +++++++++++++++- .../ai/analytic/center/utils/ConstantStr.java | 6 +- 11 files changed, 243 insertions(+), 61 deletions(-) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/constant/Constant.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/constant/Constant.java index e256aa2..db15973 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/constant/Constant.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/constant/Constant.java @@ -4,6 +4,8 @@ public class Constant { public static final String CHANNEL_DCC = "Channel_Dcc"; + public static final String CHANNEL_4IN1 = "Channel_4in1"; + public static final String DISPLAY_STATUS = "FINISHED"; public static final String INTELLIGENT_CUSTOMER_4IN1 = "INTELLIGENT_CUSTOMER_4IN1"; 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 9596e1e..3a1eba1 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 @@ -12,7 +12,7 @@ public enum BusinessTypeEnum { SMART_ASSISTANT("SMART_ASSISTANT", "智能助手-DCC"), SMART_ASSISTANT_QIWEI("SMART_ASSISTANT_QIWEI", "智能助手-企微"), INTELLIGENT_CUSTOMER("INTELLIGENT_CUSTOMER_4IN1", "智能客服-4合一"), - + SMART_ASSISTANT_4IN1("SMART_ASSISTANT_4IN1", "智能客服-4In1"), //索赔检核 CLAIM_VERIFICATION("CLAIM_VERIFICATION", "索赔检核流程"), CLAIM_VERIFICATION_FILE_ANALYSIS("99001", "索赔检核文件分析"), diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/AiAnalyticCenterServiceApplication.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/AiAnalyticCenterServiceApplication.java index 7eddcf7..ccca816 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/AiAnalyticCenterServiceApplication.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/AiAnalyticCenterServiceApplication.java @@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.Bean; import org.springframework.retry.annotation.EnableRetry; +import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.client.RestTemplate; @@ -18,6 +19,7 @@ import com.volvo.common.feign.annotation.EnableVolvoFeignClients; @MapperScan({"com.volvo.ai.analytic.center.mapper"}) @EnableDiscoveryClient @EnableRetry +@EnableAsync public class AiAnalyticCenterServiceApplication { public static void main(String[] args) { diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/CorpusFailJob.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/CorpusFailJob.java index 4e90b9d..02b36bf 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/CorpusFailJob.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/CorpusFailJob.java @@ -3,6 +3,7 @@ package com.volvo.ai.analytic.center.job; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.volvo.ai.analytic.center.dto.PageDto; import com.volvo.ai.analytic.center.dto.corpus.AicorpusTelephoneDTO; import com.volvo.ai.analytic.center.dto.corpus.CorpusReportDTO; @@ -11,12 +12,10 @@ 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.feign.DiFyFeign; import com.volvo.ai.analytic.center.mapper.AiAnalysisRequestLogsMapper; import com.volvo.ai.analytic.center.mapper.TmTelephoneCorpusMapper; -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.service.TmTelephoneCorpusService; +import com.volvo.ai.analytic.center.service.*; import com.volvo.ai.analytic.center.utils.FlowResultSplitUtil; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.extern.slf4j.Slf4j; @@ -34,6 +33,8 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.Arrays; +import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -69,9 +70,16 @@ public class CorpusFailJob { private String dccMqTipic; @Value("${rocketmq.consumer.intelligentCustomer.topic}") private String intelligentCustomerTipic; + + @Value("${rocketmq.producer.intelligentCustomer.topic}") + private String intelligentCustomerProducerTopic; + @Autowired private TmTelephoneCorpusMapper tmTelephoneCorpusMapper; + @Autowired + private DiFyFeign diFyFeign; + /** * 企微语料处理 @@ -235,4 +243,95 @@ public class CorpusFailJob { } } } + + /** + * 智能客服-电话场景-四合一 一分钟一次 + */ + @XxlJob("intelligentCustomer4in1MobileFailTask") + @PostMapping("intelligentCustomer4in1MobileFailTask") + public void intelligentCustomer4in1MobileFailTask() { + + log.info(" intelligentCustomer4in1MobileFailTask 解析失败重试处理"); + Integer total = aiAnalysisErrorsService.queryCountAnalysisErrorList(Collections.singletonList(BusinessTypeEnum.SMART_ASSISTANT_4IN1.getCode())); + log.info("intelligentCustomer4in1MobileFailTask 语料解析失败重试处理数据量:{}", total); + int totalPages = PageDto.getTotalPages(total, pageSize); + log.info("intelligentCustomer4in1MobileFailTask 语料解析失败重试处理数据量:{},总页数:{}", total, totalPages); + for (int i = 1; i <= totalPages; i++) { + int offset = (i - 1) * pageSize; + + List aiAnalysisErrorsListlist = aiAnalysisErrorsService.queryAnalysisErrorList( + Collections.singletonList(BusinessTypeEnum.SMART_ASSISTANT_4IN1.getCode()), offset, pageSize); + if (CollectionUtils.isNotEmpty(aiAnalysisErrorsListlist)) { + log.info("intelligentCustomer4in1MobileFailTask语料解析失败重试处理 size:{}", aiAnalysisErrorsListlist.size()); + aiAnalysisErrorsListlist.forEach(aiAnalysisErrors -> { + try { + log.info("intelligentCustomer4in1MobileFailTask aiAnalysisRequestLogs-id:{}", aiAnalysisErrors.getAiAnalysisRequestId()); + String aiAnalysisRequestId = aiAnalysisErrors.getAiAnalysisRequestId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AiAnalysisRequestLogs::getAiAnalysisRequestId, aiAnalysisRequestId); + AiAnalysisRequestLogs aiAnalysisRequestLogs = aiAnalysisRequestLogsMapper.selectOne(queryWrapper); + + log.info("intelligentCustomer4in1MobileFailTask aiAnalysisRequestLogs:{}", aiAnalysisRequestLogs); + + if (null != aiAnalysisRequestLogs) { + String difyRequest = aiAnalysisRequestLogs.getDifyRequest(); + log.info("intelligentCustomer4in1MobileFailTask aiAnalysisRequestLogs difyRequest:{}", aiAnalysisRequestLogs); + DiFyReq diFyReq = JSON.parseObject(difyRequest, DiFyReq.class); + Map map = new HashMap<>(); + map.put("inputs", diFyReq.getInputs()); + map.put("response_mode", "blocking"); + map.put("user", diFyReq.getUser()); + log.info("intelligentCustomer4in1MobileFailTask execDifyFlow dify request data:{}", map); + JSONObject difyResult = diFyFeign.runWorkflows("Bearer " + diFyReq.getFlowId(), map); + JSONObject data = difyResult.getJSONObject("data"); + log.info("intelligentCustomer4in1MobileFailTask execDifyFlow dify response aiID:{} , data:{}", aiAnalysisRequestId, data); + data.put("aiAnalysisRequestId", aiAnalysisRequestId); + + if (data.get("status").equals("succeeded")) { + JSONObject outputsJson = data.getJSONObject("outputs"); + String message = JSONObject.toJSONString(outputsJson); + log.info("intelligentCustomer4in1MobileFailTask send 4IN1mq {}", message); + rocketMqTemplate.asyncSend(intelligentCustomerProducerTopic, MessageBuilder.withPayload(message).build(), new SendCallback() { + @Override + public void onSuccess(SendResult sendResult) { + log.info(" intelligentCustomer4in1MobileFailTask 失败补偿 发送MQ成功 消息体:{}", message); + } + + @Override + public void onException(Throwable e) { + log.error("intelligentCustomer4in1MobileFailTask 失败补偿 送MQ异常 消息体:{}, 异常:", message, e); + } + }, 10000); + AiAnalysisErrors aiAnalysisErrors1 = new AiAnalysisErrors(); + aiAnalysisErrors1.setAiAnalysisRequestId(aiAnalysisRequestId); + aiAnalysisErrors1.setAiAnalysisErrorHandlingStatus("1"); + aiAnalysisErrorsService.updateAiAnalysisErrors(aiAnalysisErrors1); + aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder() + .aiAnalysisRequestId(data.getString("aiAnalysisRequestId")) + .businessResponse(message) + .difyResponse(data.toJSONString()) + .build()); + } else { + log.info("intelligentCustomer4in1MobileFailTask execDifyFlow failed, aiAnalysisRequestId:{} , data:{}", aiAnalysisRequestId, + data); + String errorMsg = data.getString("error"); + aiAnalysisErrors.setRetryCount(aiAnalysisErrors.getRetryCount() + 1); + aiAnalysisErrors.setUpdateBy("xxlJob"); + aiAnalysisErrors.setUpdateTime(new Date()); + aiAnalysisErrors.setAiAnalysisErrorMessage(errorMsg.length() > 1000 ? errorMsg.substring(0, 1000) : errorMsg); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(AiAnalysisErrors::getAiAnalysisRequestId, aiAnalysisRequestId); + aiAnalysisErrorsService.update(aiAnalysisErrors,updateWrapper); + } + } + } catch (Exception e) { + log.info("intelligentCustomer4in1MobileFailTask 语料解析失败补偿异常:{}", e); + aiAnalysisErrors.setAiAnalysisErrorHandlingStatus("0"); + aiAnalysisErrors.setRetryCount(aiAnalysisErrors.getRetryCount() + 1); + updateAiAnalysisErrors(aiAnalysisErrors, aiAnalysisErrors.getAiAnalysisRequestId()); + } + }); + } + } + } } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusDccMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusDccMqConsumer.java index 4c0d351..d583973 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusDccMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusDccMqConsumer.java @@ -1,10 +1,11 @@ package com.volvo.ai.analytic.center.mq; +import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.volvo.ai.analytic.center.constant.Constant; import com.volvo.ai.analytic.center.dto.corpus.AicorpusTelephoneDTO; -import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.TmTelephoneCorpusService; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.common.message.MessageExt; @@ -15,8 +16,10 @@ import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RestController; +import java.util.Objects; + /** - * @ClassName CorpusProcessKafkaConsumer + * @ClassName 湖仓发送过来的kafka消息自己发MQ自己消费 DCC通话记录 (目前接入的需求:4IN1的智能工单-电话场景,LTO跟进记录AI总结) * @Description * @Author renzhen * @Date 2025-03-04 10:18 @@ -37,9 +40,6 @@ public class CorpusDccMqConsumer implements RocketMQListener { @Autowired private TmTelephoneCorpusService tmTelephoneCorpusService; - @Autowired - private AiAnalysisRequestLogsService aiAnalysisRequestLogsService; - private final ObjectMapper objectMapper = new ObjectMapper(); @Override @@ -50,7 +50,15 @@ public class CorpusDccMqConsumer implements RocketMQListener { String message = new String(messageExt.getBody()); log.info("dcc_mq message: " + message); AicorpusTelephoneDTO aicorpusTelephone = objectMapper.readValue(message, AicorpusTelephoneDTO.class); - tmTelephoneCorpusService.runTelephoneCorpusDify(aicorpusTelephone); + //DCC场景 + if(Objects.equals(aicorpusTelephone.getCategoryCode(), Constant.CHANNEL_DCC)){ + tmTelephoneCorpusService.runTelephoneCorpusDify(aicorpusTelephone); + } + //channel_4in1场景 + if(Objects.equals(aicorpusTelephone.getCategoryCode(), Constant.CHANNEL_4IN1)){ + log.info("channel_4in1 message: " + JSON.toJSONString(aicorpusTelephone)); + tmTelephoneCorpusService.runTelephoneCorpusDify4in1(aicorpusTelephone); + } log.info("corpusDccMqProducer mq 处理完成: {}", aicorpusTelephone.getSourceId()); log.info("dcc_mq 处理完成,耗时:{}", System.currentTimeMillis() - startTime); } catch (JsonProcessingException e) { 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 43f1877..db43838 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 @@ -30,7 +30,7 @@ import java.util.concurrent.Executors; /** * @ClassName CorpusProcessKafkaConsumer - * @Description + * @Description 消费湖仓同步的DCC通话记录kafka消息 * @Author renzhen * @Date 2025-03-04 10:18 * @Version 1.0 @@ -99,7 +99,7 @@ public class CorpusProcessKafkaProducer { tmTelephoneCorpus.setCreateTime(LocalDateTime.now()); // 条件:只处理dcc的 10s通话时间以上 log.info("CorpusProcessKafkaProducer getCategoryCode: {},audioFileId:{},sourceId:{}", tmTelephoneCorpus.getCategoryCode(), aicorpusTelephone.getAudioFileId(), aicorpusTelephone.getSourceId()); - if (Constant.CHANNEL_DCC.equals(tmTelephoneCorpus.getCategoryCode())) { + if (Constant.CHANNEL_DCC.equals(tmTelephoneCorpus.getCategoryCode())||Constant.CHANNEL_4IN1.equals(tmTelephoneCorpus.getCategoryCode())) { log.info(" dcc 语料开始处理"); tmTelephoneCorpusService.saveTelephoneCorpus(tmTelephoneCorpus); long startTimeDify = System.currentTimeMillis(); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmTelephoneCorpusService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmTelephoneCorpusService.java index 256518f..dfdf9eb 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmTelephoneCorpusService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmTelephoneCorpusService.java @@ -17,6 +17,9 @@ public interface TmTelephoneCorpusService extends IService { void runTelephoneCorpusDify(AicorpusTelephoneDTO aicorpusTelephone); + void runTelephoneCorpusDify4in1(AicorpusTelephoneDTO aicorpusTelephone); + + String getCarModelList(); void sendMq(String tag, String message); 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 0703edc..be3b78f 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 @@ -73,10 +73,13 @@ public class DiFyServiceImpl implements DiFyService{ public JSONObject executeDifyFlow(DiFyReq diFyReq, String businessType, String businessData, String oldAiAnalysisRequestId) { String aiAnalysisRequestId = StringUtils.isEmpty(oldAiAnalysisRequestId)? AiAnalysisUtils.getAiAnalysisRequestId(businessType):oldAiAnalysisRequestId; try { + Map inputMap = JSON.parseObject(JSONObject.toJSONString(diFyReq.getInputs()),Map.class); + inputMap.put("aiAnalysisRequestId",aiAnalysisRequestId); Map map = new HashMap<>(); - map.put("inputs",diFyReq.getInputs()); + map.put("inputs", inputMap); map.put("response_mode","blocking"); map.put("user",diFyReq.getUser()); + diFyReq.setInputs(inputMap); // 保存请求日志 aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder() @@ -93,6 +96,17 @@ public class DiFyServiceImpl implements DiFyService{ log.debug("execDifyFlow dify response aiID:{} , data:{}",aiAnalysisRequestId,data); data.put("aiAnalysisRequestId",aiAnalysisRequestId); + if (data.get("status").equals("failed")) { + log.info("execDifyFlow failed, aiAnalysisRequestId:{} , data:{}",aiAnalysisRequestId,data); + String errorMsg = data.getString("error"); + aiAnalysisErrorsService.saveAiAnalysisErrors(AiAnalysisErrors.builder() + .aiAnalysisRequestId(aiAnalysisRequestId) + .aiAnalysisRequestType(businessType) + .aiAnalysisErrorHandlingStatus("0") + .aiAnalysisErrorMessage(errorMsg.length()>1000?errorMsg.substring(0,1000):errorMsg) + .build()); + } + aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder() .aiAnalysisRequestId(aiAnalysisRequestId) .difyResponse(data.toJSONString()) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/IntelligentCustomerServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/IntelligentCustomerServiceImpl.java index a2c4d7c..14f6969 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/IntelligentCustomerServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/IntelligentCustomerServiceImpl.java @@ -54,8 +54,6 @@ public class IntelligentCustomerServiceImpl implements IntelligentCustomerServic private String topic; @Value("${dify.intelligentCustomer.fourInOneToken}") private String fourInOneToken; - @Autowired - private RemoteCarModelClient remoteCarModelClient; @Autowired private DataMaskingRuleService dataMaskingRuleService; @@ -66,13 +64,6 @@ public class IntelligentCustomerServiceImpl implements IntelligentCustomerServic @Autowired private AiAnalysisErrorsService aiAnalysisErrorsService; - @Autowired - private AiAnalysisErrorsMapper aiAnalysisErrorsMapper; - - @Autowired - private TcIntelligentCustomerMapper tcIntelligentCustomerMapper; - - private Map> tcIntelligentCustomer = Collections.EMPTY_MAP; @Override public void fourInOneMqService(FourInOneRequestDTO fourInOneRequestDTO) { @@ -148,39 +139,4 @@ public class IntelligentCustomerServiceImpl implements IntelligentCustomerServic }, 10000); } - // 咨询类【201】/投诉类【202】/投诉类型【203】 过滤 - /** private String fourInOneMqServiceFilter(String customerType,String customerValue){ - if(tcIntelligentCustomer.isEmpty()){ - queryTcIntelligentCustomer(); - } - List typeValues = tcIntelligentCustomer.get(customerType); - if(!typeValues.contains(customerValue)){ - return ""; - } - return customerValue; - } - - - public Map> queryTcIntelligentCustomer() { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(TcIntelligentCustomer::getIsDeleted, "0"); - List tcIntelligentCustomerList =tcIntelligentCustomerMapper.selectList(queryWrapper); - tcIntelligentCustomer = tcIntelligentCustomerList.stream() - .collect(Collectors.groupingBy( - TcIntelligentCustomer::getIntelligentCustomerType, // 按照 IntelligentCustomerType 分组 - Collectors.mapping( - customer -> { - if (customer.getIntelligentCustomerType().equals(IntelligentCustomerTypeEnum.CONSULT_TYPE.getCode())) { - return customer.getTypeOne(); // 如果是咨询类型,返回 TypeOne - } else { - return customer.getTypeOne().concat("#").concat(customer.getTypeTwo()).concat("#").concat(customer.getTypeThree()); // 其他类型,拼接 TypeOne、TypeTwo、TypeThree - } - }, - Collectors.toList() - ) - )); - return tcIntelligentCustomer; - } -**/ - } \ No newline at end of file diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmTelephoneCorpusServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmTelephoneCorpusServiceImpl.java index 117a212..b6f26e2 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmTelephoneCorpusServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmTelephoneCorpusServiceImpl.java @@ -21,6 +21,7 @@ import com.volvo.ai.analytic.center.feign.RemoteCarModelClient; import com.volvo.ai.analytic.center.mapper.AiAnalysisErrorsMapper; import com.volvo.ai.analytic.center.mapper.TmTelephoneCorpusMapper; import com.volvo.ai.analytic.center.service.*; +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 lombok.extern.slf4j.Slf4j; @@ -66,6 +67,9 @@ public class TmTelephoneCorpusServiceImpl extends ServiceImpl maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(BusinessTypeEnum.SMART_ASSISTANT_4IN1.getCode()); + + RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput(); + runMaskingRuleInput.setDataMaskingRules(maskingRuleItems); + + Map inputMap = new HashMap(); + DiFyReq diFyImageReq = new DiFyReq(); + diFyImageReq.setUser(ConstantStr.corpus_user); + diFyImageReq.setFlowId(channel4In1Token); + + + JSONObject jsonObject = JSONObject.parseObject( aicorpusTelephone.getDisplay()); + JSONArray segments = jsonObject.getJSONArray("segments"); + // Long audioDuration = jsonObject.getLong("audio_duration"); // 毫秒 + // if(audioDuration/1000 <=10){ + // log.info("电话语料时长小于10秒,不进行dify处理"); + // return; + // } + if (segments == null || segments.isEmpty()) { + log.info("电话语料内容segments为空,不进行dify处理"); + return; + } + // 遍历 segments + StringBuffer chatList = new StringBuffer(); + segments.stream() + .map(segment -> (JSONObject) segment) + .forEach(segment -> { + JSONObject result = segment.getJSONObject("result"); + String text = result.getString("text"); + JSONObject analysisInfo = result.getJSONObject("analysis_info"); + String role = analysisInfo.getString("role"); + String title=""; + if(role.equals("AGENT")){ + title="顾问"; + }else{ + title="客户"; + } + // 拼接 role 和 text + String chat = title + ": " + text; + runMaskingRuleInput.setOldStr(chat); + String corpusChat = dataMaskingRuleService.runMaskingRule(runMaskingRuleInput); + chatList.append(corpusChat).append("\n"); + + }); + inputMap.put("workOrderContent", chatList.toString()); + inputMap.put("workOrderId",aicorpusTelephone.getSourceId()); + + String oldAiAnalysisRequestId = aicorpusTelephone.getAiAnalysisRequestId(); + String newAiAnalysisRequestId = StringUtils.isEmpty(oldAiAnalysisRequestId)? AiAnalysisUtils.getAiAnalysisRequestId(BusinessTypeEnum.SMART_ASSISTANT_4IN1.getCode()): + oldAiAnalysisRequestId; + + inputMap.put("aiAnalysisRequestId",newAiAnalysisRequestId); + diFyImageReq.setInputs(inputMap); + CorpusReportDTO corpusReportDTO = new CorpusReportDTO(); + corpusReportDTO.setRecordId(aicorpusTelephone.getSourceId()); + + log.info("开始处理智能客服4IN1工作流,{}",diFyImageReq); + + // 获取配置 + JSONObject execDifyFlow = diFyService.executeDifyFlow(diFyImageReq, BusinessTypeEnum.SMART_ASSISTANT_4IN1.getCode(), JSONObject.toJSONString(corpusReportDTO),newAiAnalysisRequestId ); + log.info("runDify智能客服4IN1 {}",execDifyFlow); + String aiAnalysisRequestId = execDifyFlow.getString("aiAnalysisRequestId"); + if(null != execDifyFlow && execDifyFlow.get("status").equals("succeeded")){ + JSONObject outputsJson = execDifyFlow.getJSONObject("outputs"); + String message = JSONObject.toJSONString(outputsJson); + log.info("send 4IN1mq {}",message); + intelligentCustomerService.sendMq(message); + if(StringUtils.isNotEmpty(aicorpusTelephone.getAiAnalysisRequestId())){ + AiAnalysisErrors aiAnalysisErrors = new AiAnalysisErrors(); + aiAnalysisErrors.setAiAnalysisRequestId(aiAnalysisRequestId); + aiAnalysisErrors.setAiAnalysisErrorHandlingStatus("1"); + aiAnalysisErrorsService.updateAiAnalysisErrors(aiAnalysisErrors); + } + aiAnalysisRequestLogsService.saveAiAnalysisRequestLogs(AiAnalysisRequestLogs.builder().aiAnalysisRequestId(execDifyFlow.getString("aiAnalysisRequestId")).businessResponse(message).build()); + + } + + } + } + public String getCarModelList(){ try { long startTime = System.currentTimeMillis(); 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 c0eff96..bb9c3cc 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 @@ -16,7 +16,11 @@ public class ConstantStr { public static final String INTELLIGENT_CUSTOMER_4IN1 = "INTELLIGENT_CUSTOMER_4IN1"; + public static final String statTime = "statTime"; + public static final String endTime = "endTime"; + public static final String customerFlowIds = "customerFlowIds"; + public static final String aiAnalysisRequestId = "aiAnalysisRequestId"; public static final String DIFY_COUNTERRATELIMIT = "DIFY_COUNTERRATELIMIT"; -} +} \ No newline at end of file From 44754dbf3c2b86c3a0fe89c7eb67e04181286533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E4=BA=9A=E6=B4=B2?= Date: Fri, 27 Jun 2025 10:41:19 +0800 Subject: [PATCH 23/55] =?UTF-8?q?AI=E7=B4=A2=E8=B5=94=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/analytic/center/dto/req/ClaimVerificationFileDTO.java | 3 +++ .../center/service/impl/ClaimVerificationServiceImpl.java | 1 + 2 files changed, 4 insertions(+) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ClaimVerificationFileDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ClaimVerificationFileDTO.java index aa95c33..451a1f9 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ClaimVerificationFileDTO.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ClaimVerificationFileDTO.java @@ -33,4 +33,7 @@ public class ClaimVerificationFileDTO { //诊断报告 private JSONObject diagnosticReport; + + //诊断报告 + private JSONObject warrantyReport; } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java index a0c64d6..808bd99 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java @@ -231,6 +231,7 @@ public class ClaimVerificationServiceImpl implements ClaimVerificationService { audit.put("diagnosticReport", claimVerificationFileAnalysisDTO.getDiagnosticReport() == null ? " " :claimVerificationFileAnalysisDTO.getDiagnosticReport().toString()); audit.put("preCheckReport", claimVerificationFileAnalysisDTO.getPreCheckReport() == null ? " " :claimVerificationFileAnalysisDTO.getPreCheckReport().toString()); audit.put("dtcReport", claimVerificationFileAnalysisDTO.getDtcReport() == null ? " " :claimVerificationFileAnalysisDTO.getDtcReport().toString()); + audit.put("warrantyReport", claimVerificationFileAnalysisDTO.getWarrantyReport() == null ? " " :claimVerificationFileAnalysisDTO.getWarrantyReport().toString()); //脱敏处理 List maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(Constant.CHANNEL_DCC); From 35f4f6badf6cb1aa45d2d2d9e004f6b14fad8e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E4=BA=9A=E6=B4=B2?= Date: Wed, 9 Jul 2025 19:35:32 +0800 Subject: [PATCH 24/55] =?UTF-8?q?refactor(ai-analytic-center-biz):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20ClaimVerificationServiceImpl=20=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=20getJsonObjectToNewBie=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重新调整了 JSON 对象的处理逻辑,提高了代码的可读性和维护性 -移除了不必要的字符串转义和解析操作,简化了数据处理流程- 优化了变量命名,提高了代码的可理解性 --- .../service/impl/ClaimVerificationServiceImpl.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java index 808bd99..e149a7d 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java @@ -245,16 +245,15 @@ public class ClaimVerificationServiceImpl implements ClaimVerificationService { @NotNull private static JSONObject getJsonObjectToNewBie(JSONObject diFyObject, ClaimVerificationFileDTO claimVerificationFileAnalysisDTO, String aiAnalysisRequestId) { - if (diFyObject.containsKey("answer") && !diFyObject.getJSONObject("answer").isEmpty()) { - diFyObject = diFyObject.getJSONObject("answer"); + JSONObject warrantyAuditReport = diFyObject.getJSONObject("warrantyAuditReport"); + if (warrantyAuditReport.containsKey("answer") && !warrantyAuditReport.getJSONObject("answer").isEmpty()) { + warrantyAuditReport = warrantyAuditReport.getJSONObject("answer"); } - String warrantyAuditReport = diFyObject.getString("warrantyAuditReport"); - warrantyAuditReport = StringEscapeUtils.unescapeJava(warrantyAuditReport); - JSONObject audiResToAfter = JSON.parseObject(warrantyAuditReport); + JSONObject data = new JSONObject(); data.put("newBieAfterSalesId", claimVerificationFileAnalysisDTO.getNewBieAfterSalesId()); data.put("businessType", claimVerificationFileAnalysisDTO.getBusinessType()); - data.put("warrantyAuditReport", audiResToAfter); + data.put("warrantyAuditReport", warrantyAuditReport); data.put("aiAnalysisRequestId", aiAnalysisRequestId); return data; } From 4656172cd5b5a0bd2b19ebef7058d6084abcb609 Mon Sep 17 00:00:00 2001 From: mliu71 Date: Thu, 17 Jul 2025 15:46:49 +0800 Subject: [PATCH 25/55] =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=B1=BB=E5=92=8Cmappe?= =?UTF-8?q?r=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/entity/TmCorpusQuestionReport.java | 107 ++++++++ .../TmOdsAinpArrivalTestdriveVoiceInfo.java | 231 ++++++++++++++++++ .../entity/TmOdsImRealtimeMessageCur.java | 170 +++++++++++++ .../controller/AiAnalysisDifyController.java | 22 +- .../mapper/TmCorpusQuestionReportMapper.java | 13 + ...dsAinpArrivalTestdriveVoiceInfoMapper.java | 14 ++ .../TmOdsImRealtimeMessageCurMapper.java | 14 ++ 7 files changed, 567 insertions(+), 4 deletions(-) create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsAinpArrivalTestdriveVoiceInfo.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsImRealtimeMessageCur.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionReportMapper.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsAinpArrivalTestdriveVoiceInfoMapper.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsImRealtimeMessageCurMapper.java diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java new file mode 100644 index 0000000..aa7f229 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java @@ -0,0 +1,107 @@ +package com.volvo.ai.analytic.center.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 单条语料分析结论表 + */ +@Data +@TableName("tm_corpus_question_report") +public class TmCorpusQuestionReport { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + + /** + * 主类别 + */ + @TableField("main_category") + private String mainCategory; + + /** + * 子类别 + */ + @TableField("sub_category") + private String subCategory; + + /** + * 置信度 + */ + @TableField("'confidence'") + private String confidence; + + /** + * 业务类型 + */ + @TableField("business_type") + private String businessType; + + /** + * 分析结果 + */ + @TableField("analysis_result_json") + private String analysisResultJson; + + + /** + * 删除标识(0-未删除,1-已删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 记录版本号,即乐观锁 + */ + @TableField("versions") + private Integer versions; + + /** + * 创建人 + */ + @TableField("create_by") + private String createBy; + + /** + * 更新人 + */ + @TableField("update_by") + private String updateBy; + + /** + * 创建sql人 + */ + @TableField("create_sqlby") + private String createSqlby; + + /** + * 更新sql人 + */ + @TableField("update_sqlby") + private String updateSqlby; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @TableField("update_time") + private Date updateTime; + + +} \ No newline at end of file diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsAinpArrivalTestdriveVoiceInfo.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsAinpArrivalTestdriveVoiceInfo.java new file mode 100644 index 0000000..25605c6 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsAinpArrivalTestdriveVoiceInfo.java @@ -0,0 +1,231 @@ +package com.volvo.ai.analytic.center.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * @author Lingma (灵码) + * @description 湖仓同步AI铭牌到店试驾语料信息 (tm_ods_ainp_arrival_testdrive_voice_info) + * @date 2025-07-17 + */ +@Data +@TableName("tm_ods_ainp_arrival_testdrive_voice_info") +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TmOdsAinpArrivalTestdriveVoiceInfo { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 客流id + */ + @TableField("cust_flow_id") + private Long custFlowId; + + /** + * 商机id + */ + @TableField("biz_opp_id") + private Long bizOppId; + + /** + * 试驾id + */ + @TableField("test_drive_id") + private Long testDriveId; + + /** + * 经销商代码 + */ + @TableField("dealer_code") + private String dealerCode; + + /** + * 线索状态 + */ + @TableField("leads_stat") + private Integer leadsStat; + + /** + * 厅接待意向车型 + */ + @TableField("showroom_reception_intention_veh_model") + private String showroomReceptionIntentionVehModel; + + /** + * 厅接待意向车型燃料类型 + */ + @TableField("showroom_veh_model_fuel_type") + private Integer showroomVehModelFuelType; + + /** + * 商机主意向车型 + */ + @TableField("main_intention_veh_model") + private String mainIntentionVehModel; + + /** + * 商机主意向车型燃料类型 + */ + @TableField("main_intention_veh_model_fuel_type") + private Integer mainIntentionVehModelFuelType; + + /** + * 试驾车型 + */ + @TableField("test_drive_veh_model") + private String testDriveVehModel; + + /** + * 试驾车型燃料类型 + */ + @TableField("test_drive_veh_model_fuel_type") + private Integer testDriveVehModelFuelType; + + /** + * 到店销售顾问id + */ + @TableField("arrival_sales_consultant_id") + private String arrivalSalesConsultantId; + + /** + * 到店销售顾问 + */ + @TableField("arrival_sales_consultant") + private String arrivalSalesConsultant; + + /** + * 到店接待顾问id + */ + @TableField("arrival_reception_consultant_id") + private String arrivalReceptionConsultantId; + + /** + * 到店接待顾问 + */ + @TableField("arrival_reception_consultant") + private String arrivalReceptionConsultant; + + /** + * 试驾销售顾问id + */ + @TableField("test_drive_sales_consultant_id") + private String testDriveSalesConsultantId; + + /** + * 试驾销售顾问 + */ + @TableField("test_drive_sales_consultant") + private String testDriveSalesConsultant; + + /** + * 试驾顾问id + */ + @TableField("test_drive_consultant_id") + private String testDriveConsultantId; + + /** + * 试驾顾问 + */ + @TableField("test_drive_consultant") + private String testDriveConsultant; + + /** + * 试驾开始时间 + */ + @TableField("test_drive_start_time") + private LocalDateTime testDriveStartTime; + + /** + * 试驾结束时间 + */ + @TableField("test_drive_end_time") + private LocalDateTime testDriveEndTime; + + /** + * 录音开始时间 + */ + @TableField("voice_start_time") + private String voiceStartTime; + + /** + * 录音结束时间 + */ + @TableField("voice_end_time") + private String voiceEndTime; + + /** + * 录音时长,单位秒 + */ + @TableField("voice_duration") + private Integer voiceDuration; + + /** + * 语料内容 + */ + @TableField("content") + private String content; + + /** + * 声道标识位 + */ + @TableField("is_mix") + private Byte isMix; + + /** + * 语料类型 + */ + @TableField("content_code") + private Byte contentCode; + + /** + * 分区字段 + */ + @TableField("pday") + private String pday; + + /** + * 创建时间 + */ + @TableField("created_time") + private LocalDateTime createdTime; + + /** + * 创建人 + */ + @TableField("created_by") + private String createdBy; + + /** + * 更新时间 + */ + @TableField("updated_time") + private LocalDateTime updatedTime; + + /** + * 更新人 + */ + @TableField("updated_by") + private String updatedBy; + + /** + * 删除标志位,0:未删除,1:已删除 + */ + @TableField("is_deleted") + private Byte isDeleted; +} diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsImRealtimeMessageCur.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsImRealtimeMessageCur.java new file mode 100644 index 0000000..bc15311 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsImRealtimeMessageCur.java @@ -0,0 +1,170 @@ +package com.volvo.ai.analytic.center.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * @description 湖仓同步实时IM消息表 (tm_ods_im_realtime_message_cur) + * @date 2025-07-17 + */ +@Data +@TableName("tm_ods_im_realtime_message_cur") +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TmOdsImRealtimeMessageCur { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 消息唯一标识键 + */ + @TableField("msg_key") + private String msgKey; + + /** + * 会话ID + */ + @TableField("session_id") + private String sessionId; + + /** + * 消息内容 + */ + @TableField("msg_content") + private String msgContent; + + /** + * 消息类型,文本类型:TIMTextElem + */ + @TableField("msg_type") + private String msgType; + + /** + * 消息体 + */ + @TableField("msg_body") + private String msgBody; + + /** + * 客户类型0:用户 1:百度 2:GPT 3:人工 4:唯都Agent + */ + @TableField("customer_type") + private Integer customerType; + + /** + * 云端自定义数据 + */ + @TableField("cloud_custom_data") + private String cloudCustomData; + + /** + * 客服来源 + */ + @TableField("cs_source") + private String csSource; + + /** + * 发送方账号 + */ + @TableField("from_account") + private String fromAccount; + + /** + * 插入时间(原字符串格式转换为datetime) + */ + @TableField("insert_time") + private LocalDateTime insertTime; + + /** + * 会员ID + */ + @TableField("member_id") + private String memberId; + + /** + * 消息标志位 + */ + @TableField("msg_flag_bits") + private Integer msgFlagBits; + + /** + * 消息随机数 + */ + @TableField("msg_random") + private Long msgRandom; + + /** + * 消息序列号 + */ + @TableField("msg_seq") + private String msgSeq; + + /** + * 消息时间戳(毫秒级) + */ + @TableField("msg_timestamp") + private Long msgTimestamp; + + /** + * 第三方平台OpenID + */ + @TableField("open_id") + private String openId; + + /** + * 来源标识 0:公众号,1:app + */ + @TableField("source_type") + private Integer sourceType; + + /** + * 接收方账号 + */ + @TableField("to_account") + private String toAccount; + + /** + * 创建时间 + */ + @TableField("created_time") + private LocalDateTime createdTime; + + /** + * 创建人 + */ + @TableField("created_by") + private String createdBy; + + /** + * 更新时间 + */ + @TableField("updated_time") + private LocalDateTime updatedTime; + + /** + * 更新人 + */ + @TableField("updated_by") + private String updatedBy; + + /** + * 删除标志位,0:未删除,1:已删除 + */ + @TableField("is_deleted") + private Byte isDeleted; +} 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 30eceb0..457e349 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,12 +1,14 @@ package com.volvo.ai.analytic.center.controller; +import com.alibaba.fastjson.JSONObject; 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.req.ConsultingRequestDTO; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; import com.volvo.common.core.util.ResultMsg; @@ -17,10 +19,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() @@ -77,5 +76,20 @@ public class AiAnalysisDifyController { } + + @PostMapping("/corpusQuestion") + @ApiOperation(value = "单条语料分析结论入库") + public AnalysisResp corpusQuestion(@RequestHeader(value = "appKey") String appKey, + @RequestBody ConsultingRequestDTO requestDTO) { + // 打印接收到的参数 + System.out.println("Received appKey: " + appKey); + System.out.println("Received businessType: " + requestDTO.getBusinessType()); + JSONObject jsonObject = JSONObject.parseObject(requestDTO.getText()); + System.out.println("Received text: " + jsonObject.toString()); + + return AnalysisResp .success("ok"); + } + + } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionReportMapper.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionReportMapper.java new file mode 100644 index 0000000..55f7e57 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionReportMapper.java @@ -0,0 +1,13 @@ +package com.volvo.ai.analytic.center.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.volvo.ai.analytic.center.entity.TmCorpusQuestionReport; +import org.apache.ibatis.annotations.Mapper; + +/** + * 单条语料分析结论 + */ +@Mapper +public interface TmCorpusQuestionReportMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsAinpArrivalTestdriveVoiceInfoMapper.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsAinpArrivalTestdriveVoiceInfoMapper.java new file mode 100644 index 0000000..9f37e70 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsAinpArrivalTestdriveVoiceInfoMapper.java @@ -0,0 +1,14 @@ +package com.volvo.ai.analytic.center.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.volvo.ai.analytic.center.entity.TmOdsAinpArrivalTestdriveVoiceInfo; +import org.apache.ibatis.annotations.Mapper; + +/** + * @description 湖仓同步AI铭牌到店试驾语料信息- + * @date 2025-07-17 + */ +@Mapper +public interface TmOdsAinpArrivalTestdriveVoiceInfoMapper extends BaseMapper { +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsImRealtimeMessageCurMapper.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsImRealtimeMessageCurMapper.java new file mode 100644 index 0000000..ed5689f --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsImRealtimeMessageCurMapper.java @@ -0,0 +1,14 @@ +package com.volvo.ai.analytic.center.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.volvo.ai.analytic.center.entity.TmOdsImRealtimeMessageCur; +import org.apache.ibatis.annotations.Mapper; + +/** + * @description 湖仓同步实时IM消息表-Mapper (tm_ods_im_realtime_message_cur) + * @date 2025-07-17 + */ +@Mapper +public interface TmOdsImRealtimeMessageCurMapper extends BaseMapper { +} From f8bc2beea027327547328fcbb13bdc09cc2d5cd4 Mon Sep 17 00:00:00 2001 From: mliu71 Date: Fri, 18 Jul 2025 10:36:23 +0800 Subject: [PATCH 26/55] =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=B1=BB=E5=92=8Cmappe?= =?UTF-8?q?r=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/entity/TmCorpusQuestionReport.java | 12 ++++++++++++ .../entity/TmOdsAinpArrivalTestdriveVoiceInfo.java | 11 ++++++----- .../center/entity/TmOdsImRealtimeMessageCur.java | 9 +++++---- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java index aa7f229..08a793d 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java @@ -103,5 +103,17 @@ public class TmCorpusQuestionReport { @TableField("update_time") private Date updateTime; + /** + * 原语料外部主键 + */ + @TableField("source_corpus_id") + private String sourceCorpusId; + + /** + * 原语料时间 + */ + @TableField("source_corpus_time") + private Date sourceCorpusTime; + } \ No newline at end of file diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsAinpArrivalTestdriveVoiceInfo.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsAinpArrivalTestdriveVoiceInfo.java index 25605c6..007c61d 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsAinpArrivalTestdriveVoiceInfo.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsAinpArrivalTestdriveVoiceInfo.java @@ -9,7 +9,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; +import java.util.Date; + /** * @author Lingma (灵码) @@ -149,13 +150,13 @@ public class TmOdsAinpArrivalTestdriveVoiceInfo { * 试驾开始时间 */ @TableField("test_drive_start_time") - private LocalDateTime testDriveStartTime; + private Date testDriveStartTime; /** * 试驾结束时间 */ @TableField("test_drive_end_time") - private LocalDateTime testDriveEndTime; + private Date testDriveEndTime; /** * 录音开始时间 @@ -203,7 +204,7 @@ public class TmOdsAinpArrivalTestdriveVoiceInfo { * 创建时间 */ @TableField("created_time") - private LocalDateTime createdTime; + private Date createdTime; /** * 创建人 @@ -215,7 +216,7 @@ public class TmOdsAinpArrivalTestdriveVoiceInfo { * 更新时间 */ @TableField("updated_time") - private LocalDateTime updatedTime; + private Date updatedTime; /** * 更新人 diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsImRealtimeMessageCur.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsImRealtimeMessageCur.java index bc15311..107ec37 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsImRealtimeMessageCur.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmOdsImRealtimeMessageCur.java @@ -9,7 +9,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; +import java.util.Date; + /** * @description 湖仓同步实时IM消息表 (tm_ods_im_realtime_message_cur) @@ -88,7 +89,7 @@ public class TmOdsImRealtimeMessageCur { * 插入时间(原字符串格式转换为datetime) */ @TableField("insert_time") - private LocalDateTime insertTime; + private Date insertTime; /** * 会员ID @@ -142,7 +143,7 @@ public class TmOdsImRealtimeMessageCur { * 创建时间 */ @TableField("created_time") - private LocalDateTime createdTime; + private Date createdTime; /** * 创建人 @@ -154,7 +155,7 @@ public class TmOdsImRealtimeMessageCur { * 更新时间 */ @TableField("updated_time") - private LocalDateTime updatedTime; + private Date updatedTime; /** * 更新人 From 3d2e0b4716ae67e3080399f42da92aa4e6c40296 Mon Sep 17 00:00:00 2001 From: mliu71 Date: Fri, 18 Jul 2025 16:51:18 +0800 Subject: [PATCH 27/55] =?UTF-8?q?=E5=8D=95=E6=9D=A1=E8=AF=AD=E6=96=99?= =?UTF-8?q?=E5=88=86=E6=9E=90=E7=BB=93=E8=AE=BA=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AiAnalysisDifyController.java | 13 +++---- .../center/mq/CorpusQuestionConsumer.java | 38 +++++++++++++++++++ .../center/mq/CorpusQuestionProducer.java | 29 ++++++++++++++ .../center/service/CorpusQuestionService.java | 7 ++++ .../impl/CorpusQuestionServiceImpl.java | 35 +++++++++++++++++ .../impl/TmTelephoneCorpusServiceImpl.java | 15 +++++++- 6 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionProducer.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/CorpusQuestionService.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/CorpusQuestionServiceImpl.java 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 457e349..4e216f0 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,7 +1,7 @@ package com.volvo.ai.analytic.center.controller; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -11,6 +11,7 @@ import com.volvo.ai.analytic.center.dto.req.AnalysisReq; import com.volvo.ai.analytic.center.dto.req.ConsultingRequestDTO; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; +import com.volvo.ai.analytic.center.service.impl.CorpusQuestionServiceImpl; import com.volvo.common.core.util.ResultMsg; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -35,7 +36,8 @@ public class AiAnalysisDifyController { @Autowired private AiAnalysisDifyService aiAnalysisDifyService; - + @Autowired + private CorpusQuestionServiceImpl corpusQuestionServiceImpl; @PostMapping("/updateByAiId") @ApiOperation(value = "更新dify结果") @@ -81,12 +83,9 @@ public class AiAnalysisDifyController { @ApiOperation(value = "单条语料分析结论入库") public AnalysisResp corpusQuestion(@RequestHeader(value = "appKey") String appKey, @RequestBody ConsultingRequestDTO requestDTO) { + log.info("aiAnalyze corpusQuestion requestDTO: {} ,appKey:{}", JSON.toJSONString(requestDTO),appKey); // 打印接收到的参数 - System.out.println("Received appKey: " + appKey); - System.out.println("Received businessType: " + requestDTO.getBusinessType()); - JSONObject jsonObject = JSONObject.parseObject(requestDTO.getText()); - System.out.println("Received text: " + jsonObject.toString()); - + corpusQuestionServiceImpl.runCorpusQuestionDify(requestDTO); return AnalysisResp .success("ok"); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java new file mode 100644 index 0000000..62aa0da --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java @@ -0,0 +1,38 @@ +package com.volvo.ai.analytic.center.mq; + +import com.alibaba.fastjson.JSONObject; +import com.volvo.ai.analytic.center.constant.Constant; +import com.volvo.ai.analytic.center.feign.DiFyFeign; +import lombok.extern.slf4j.Slf4j; +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 java.util.Map; + +@Slf4j +@Component +@RocketMQMessageListener(consumerGroup = "${rocketmq.consumer.corpus.questiongroup}", + topic = "${rocketmq.consumer.corpus.questiontopic}", consumeThreadNumber = 2) +@RefreshScope +public class CorpusQuestionConsumer implements RocketMQListener> { + + + @Value("${dify.corpusQuestion.token: app-erbXevAmaQiyg5QFPn2NpJ7G}") + private String corpusQuestionToken; + + + @Autowired + private DiFyFeign diFyFeign; + + @Override + public void onMessage(Map inputMap) { + + inputMap.put("businessType", Constant.CHANNEL_4IN1); + JSONObject difyResult = diFyFeign.runWorkflows("Bearer " + corpusQuestionToken, inputMap); + log.info("difyResult {}", difyResult.toJSONString()); + } +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionProducer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionProducer.java new file mode 100644 index 0000000..ee9e22e --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionProducer.java @@ -0,0 +1,29 @@ +package com.volvo.ai.analytic.center.mq; + +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +@Component +@Slf4j +public class CorpusQuestionProducer { + + @Value("${rocketmq.producer.corpus.questiontopic}") + private String corpusQuestionTopic; + + + @Resource + private RocketMQTemplate rocketMQTemplate; + + public void sendCorpusQuestion(Map inputMap) { + + rocketMQTemplate.convertAndSend(corpusQuestionTopic, inputMap); + + } + + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/CorpusQuestionService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/CorpusQuestionService.java new file mode 100644 index 0000000..97fb46a --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/CorpusQuestionService.java @@ -0,0 +1,7 @@ +package com.volvo.ai.analytic.center.service; + +import com.volvo.ai.analytic.center.dto.req.ConsultingRequestDTO; + +public interface CorpusQuestionService { + void runCorpusQuestionDify(ConsultingRequestDTO consultingRequestDTO); +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/CorpusQuestionServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/CorpusQuestionServiceImpl.java new file mode 100644 index 0000000..6b44f64 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/CorpusQuestionServiceImpl.java @@ -0,0 +1,35 @@ +package com.volvo.ai.analytic.center.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.volvo.ai.analytic.center.dto.req.ConsultingRequestDTO; +import com.volvo.ai.analytic.center.entity.TmCorpusQuestionReport; +import com.volvo.ai.analytic.center.mapper.TmCorpusQuestionReportMapper; +import com.volvo.ai.analytic.center.service.CorpusQuestionService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class CorpusQuestionServiceImpl implements CorpusQuestionService { + + @Autowired + TmCorpusQuestionReportMapper tmCorpusQuestionReportMapper; + + @Override + public void runCorpusQuestionDify(ConsultingRequestDTO consultingRequestDTO) { + String text = consultingRequestDTO.getText(); + JSONObject textJsonObject = JSONObject.parseObject(text); + JSONObject consultingScenario = textJsonObject.getJSONObject("consultingScenario"); + TmCorpusQuestionReport tmCorpusQuestionReport = new TmCorpusQuestionReport(); + tmCorpusQuestionReport.setMainCategory(consultingScenario.getString("mainCategory")); + tmCorpusQuestionReport.setSubCategory(consultingScenario.getString("subCategory")); + tmCorpusQuestionReport.setConfidence(consultingScenario.getString("confidence")); + tmCorpusQuestionReport.setBusinessType(consultingRequestDTO.getBusinessType()); + tmCorpusQuestionReport.setSourceCorpusId(consultingRequestDTO.getSourceCorpusId()); + tmCorpusQuestionReport.setSourceCorpusTime(consultingRequestDTO.getSourceCorpusTime()); + tmCorpusQuestionReport.setAnalysisResultJson(text); + tmCorpusQuestionReportMapper.insert(tmCorpusQuestionReport); + + } +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmTelephoneCorpusServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmTelephoneCorpusServiceImpl.java index b6f26e2..69a0d08 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmTelephoneCorpusServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmTelephoneCorpusServiceImpl.java @@ -18,8 +18,8 @@ import com.volvo.ai.analytic.center.enums.BizEnum; import com.volvo.ai.analytic.center.enums.BusinessTypeEnum; import com.volvo.ai.analytic.center.enums.CategoryEnum; import com.volvo.ai.analytic.center.feign.RemoteCarModelClient; -import com.volvo.ai.analytic.center.mapper.AiAnalysisErrorsMapper; import com.volvo.ai.analytic.center.mapper.TmTelephoneCorpusMapper; +import com.volvo.ai.analytic.center.mq.CorpusQuestionProducer; import com.volvo.ai.analytic.center.service.*; import com.volvo.ai.analytic.center.utils.AiAnalysisUtils; import com.volvo.ai.analytic.center.utils.ConstantStr; @@ -84,6 +84,10 @@ public class TmTelephoneCorpusServiceImpl extends ServiceImpl questionInput = new HashMap(); + questionInput.put("chat", chatList.toString()); + questionInput.put("sourceCorpusId", aicorpusTelephone.getSourceId()); + questionInput.put("sourceCorpusTime", aicorpusTelephone.getTranscribeTime()); + + //发送单个问题消息 + corpusQuestionProducer.sendCorpusQuestion(questionInput); + inputMap.put("workOrderId",aicorpusTelephone.getSourceId()); String oldAiAnalysisRequestId = aicorpusTelephone.getAiAnalysisRequestId(); From 15ef98d490ae7736929079358e2f001cdc811473 Mon Sep 17 00:00:00 2001 From: mliu71 Date: Fri, 18 Jul 2025 17:08:32 +0800 Subject: [PATCH 28/55] =?UTF-8?q?=E5=8D=95=E6=9D=A1=E8=AF=AD=E6=96=99?= =?UTF-8?q?=E5=88=86=E6=9E=90=E7=BB=93=E8=AE=BA=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/dto/req/ConsultingRequestDTO.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ConsultingRequestDTO.java diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ConsultingRequestDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ConsultingRequestDTO.java new file mode 100644 index 0000000..1f341e7 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ConsultingRequestDTO.java @@ -0,0 +1,15 @@ +package com.volvo.ai.analytic.center.dto.req; + +import lombok.Data; + +import java.util.Date; + +@Data +public class ConsultingRequestDTO { + private String businessType; // 新增字段 + private String text; + private String sourceCorpusId; + private Date sourceCorpusTime; + + +} From 3b83ff86ba616dc6964ea9ec73fe602c1d6c3931 Mon Sep 17 00:00:00 2001 From: "jie.lu" Date: Fri, 18 Jul 2025 17:49:36 +0800 Subject: [PATCH 29/55] =?UTF-8?q?IM=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/dto/corpus/ImCurMessageDTO.java | 34 +++ .../center/enums/BusinessTypeEnum.java | 2 + .../center/enums/ImCustomTypeEnums.java | 27 ++ .../center/job/ImMessageAnalysisJob.java | 44 ++++ .../TmOdsImRealtimeMessageCurMapper.java | 12 + .../TmOdsImRealtimeMessageCurService.java | 15 ++ .../TmOdsImRealtimeMessageCurServiceImpl.java | 234 ++++++++++++++++++ .../TmOdsImRealtimeMessageCurMapper.xml | 53 ++++ .../TmOdsImRealtimeMessageCurMapper.xml | 53 ++++ 9 files changed, 474 insertions(+) create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/ImCustomTypeEnums.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/ImMessageAnalysisJob.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmOdsImRealtimeMessageCurService.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java create mode 100644 ai-analytic-center-biz/src/main/resources/mapper/TmOdsImRealtimeMessageCurMapper.xml create mode 100644 ai-analytic-center-biz/target/classes/mapper/TmOdsImRealtimeMessageCurMapper.xml diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java new file mode 100644 index 0000000..98e921d --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java @@ -0,0 +1,34 @@ +package com.volvo.ai.analytic.center.dto.corpus; + +import lombok.Data; + +import java.util.Date; + +/** + * @description IM会话存档消息记录表-湖仓同步表 + * @author jlu + * @date 2025-07-17 + */ +@Data +public class ImCurMessageDTO { + + private static final long serialVersionUID = 1L; + + private String sessionId; + + /** + * 消息内容文本 + */ + private String msgContent; + + /** + * 客户类型0:用户 1:百度 2:GPT 3:人工 4:唯都Agent + */ + private Integer customerType; + + private Long msgTimestamp; + + public ImCurMessageDTO() { + } + +} \ No newline at end of file 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 c735c33..706a83d 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 @@ -28,6 +28,8 @@ public enum BusinessTypeEnum { SMART_ASSISTANT_NAMEPLATE("SMART_ASSISTANT_NAMEPLATE", "智能助手-铭牌"), + IM_CORPUS_ANALYSIS("IM_CORPUS_ANALYSIS", "IM语料库"), + //特邀发言官 SPOKESMAN("SPOKESMAN", "特邀发言官"), diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/ImCustomTypeEnums.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/ImCustomTypeEnums.java new file mode 100644 index 0000000..5185164 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/ImCustomTypeEnums.java @@ -0,0 +1,27 @@ +package com.volvo.ai.analytic.center.enums; + +public enum ImCustomTypeEnums { + + CUSTOMER(0, "用户"), + BAIDU(1, "百度"), + GPT(2, "GPT"), + MANUAL(3, "人工"), + VOLVO_AGENT(4, "唯都Agent"), + ; + + private Integer code; + private String message; + + ImCustomTypeEnums(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return this.code; + } + + public String getMessage() { + return this.message; + } +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/ImMessageAnalysisJob.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/ImMessageAnalysisJob.java new file mode 100644 index 0000000..bb88f38 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/ImMessageAnalysisJob.java @@ -0,0 +1,44 @@ +package com.volvo.ai.analytic.center.job; + +import com.volvo.ai.analytic.center.service.TmOdsImRealtimeMessageCurService; +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 ImMessageAnalysisJob { + + @Autowired + private TmOdsImRealtimeMessageCurService tmOdsImRealtimeMessageCurService; + + /** + * 企微语料处理 + */ + @XxlJob("imMessageAnalysisTask") + public ResultMsg imMessageAnalysisTask(@RequestBody String paramJson) { + try { + // 获取任务参数 + String param = XxlJobHelper.getJobParam(); + if(StringUtils.isEmpty(param)){ + param = paramJson; + } + // 执行业务逻辑 + XxlJobHelper.log("任务参数: {}", param); + log.info("imMessageAnalysisTask IM语料分析处理:{}",param); + tmOdsImRealtimeMessageCurService.runImCorpusDify(param); + } catch (Exception e) { + log.error("imMessageAnalysisTask 定时任务处理消息异常",e.getMessage()); + throw new RuntimeException(e); + } + return ResultMsg.ok(); + } + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsImRealtimeMessageCurMapper.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsImRealtimeMessageCurMapper.java index ed5689f..ce70cb4 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsImRealtimeMessageCurMapper.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmOdsImRealtimeMessageCurMapper.java @@ -2,8 +2,13 @@ package com.volvo.ai.analytic.center.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.volvo.ai.analytic.center.dto.corpus.ImCurMessageDTO; import com.volvo.ai.analytic.center.entity.TmOdsImRealtimeMessageCur; + +import java.util.List; + import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * @description 湖仓同步实时IM消息表-Mapper (tm_ods_im_realtime_message_cur) @@ -11,4 +16,11 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface TmOdsImRealtimeMessageCurMapper extends BaseMapper { + + // 统计IM消息数据 + int countImRealtimeMessageCurByDate(@Param("statTime") Long statTime, @Param("endTime") Long endTime); + // 分页获取处理数据 + List queryImRealtimeMessageCurByDate(@Param("statTime") Long statTime, @Param("endTime") Long endTime, @Param("offset") int offset, @Param("pageSize") int pageSize); + + List queryImRealtimeMessageCurBySessionId(@Param("statTime") Long statTime, @Param("endTime") Long endTime, @Param("sessionId") String sessionId); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmOdsImRealtimeMessageCurService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmOdsImRealtimeMessageCurService.java new file mode 100644 index 0000000..ce2b71f --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/TmOdsImRealtimeMessageCurService.java @@ -0,0 +1,15 @@ +package com.volvo.ai.analytic.center.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.volvo.ai.analytic.center.entity.TmOdsImRealtimeMessageCur; +/** + * @description 电话语料表-同步表 + * @author BEJSON + * @date 2025-03-04 + */ +public interface TmOdsImRealtimeMessageCurService extends IService { + + void runImCorpusDify(String paramJson); + + +} \ No newline at end of file diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java new file mode 100644 index 0000000..6f769d5 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java @@ -0,0 +1,234 @@ +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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.volvo.ai.analytic.center.dto.PageDto; +import com.volvo.ai.analytic.center.dto.corpus.CorpusReportDTO; +import com.volvo.ai.analytic.center.dto.corpus.ImCurMessageDTO; +import com.volvo.ai.analytic.center.dto.corpus.OdsVdqwMessageOTD; +import com.volvo.ai.analytic.center.dto.req.ConsultingRequestDTO; +import com.volvo.ai.analytic.center.dto.req.DiFyReq; +import com.volvo.ai.analytic.center.dto.req.RunMaskingRuleInput; +import com.volvo.ai.analytic.center.entity.*; +import com.volvo.ai.analytic.center.enums.BusinessTypeEnum; +import com.volvo.ai.analytic.center.enums.CategoryEnum; +import com.volvo.ai.analytic.center.enums.ImCustomTypeEnums; +import com.volvo.ai.analytic.center.feign.RemoteCarModelClient; +import com.volvo.ai.analytic.center.mapper.TmOdsImRealtimeMessageCurMapper; +import com.volvo.ai.analytic.center.mapper.TmOdsVdqwExternalcontactMapper; +import com.volvo.ai.analytic.center.mapper.TmOdsVdqwMessagearchivingMapper; +import com.volvo.ai.analytic.center.mapper.TmOdsVdqwWorkuserinfoMapper; +import com.volvo.ai.analytic.center.mapper.TtVdqwRecordMapper; +import com.volvo.ai.analytic.center.service.*; +import com.volvo.ai.analytic.center.utils.ConstantStr; +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.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; + + +/** + * @description 企微语料表-同步表 + * @author jlu + * @date 2025-07-17 + */ +@RefreshScope +@Slf4j +@Service +public class TmOdsImRealtimeMessageCurServiceImpl extends ServiceImpl implements TmOdsImRealtimeMessageCurService { + + @Autowired + private TmOdsImRealtimeMessageCurMapper tmOdsImRealtimeMessageCurMapper; + + @Autowired + private DiFyService diFyService; + + @Value("${dify.corpus.imCurToken}") + private String imCurToken; + + @Value("${batch.size}") + public int pageSize = 100; + + @Autowired + private DataMaskingRuleService dataMaskingRuleService; + + @Autowired + private CorpusQuestionService corpusQuestionService; + + @Override + public void runImCorpusDify(String paramJson) { + long startTime = System.currentTimeMillis(); + log.info("runImCorpusDify paramJson {}", paramJson); + // 获取当前日期 + LocalDate today = LocalDate.now(); + // 获取前一天日期 + LocalDate yesterday = today.minusDays(1); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // 格式化输出 + String formattedDate = yesterday.toString(); // 默认格式为 yyyy-MM-dd + String statTimeString = formattedDate.concat(" 00:00:00"); + String endTimeString = formattedDate.concat(" 23:59:59"); + if (StringUtils.isNotBlank(paramJson)) { + JSONObject paramJsonObj = JSONObject.parseObject(paramJson); + if (null != paramJsonObj && paramJsonObj.containsKey("statTime") && paramJsonObj.containsKey("endTime")) { + statTimeString = paramJsonObj.getString("statTime"); + endTimeString = paramJsonObj.getString("endTime"); + } + } + Long finalStatTime = stringTimeToTimeStamp(statTimeString, formatter); + Long finalEndTime = stringTimeToTimeStamp(endTimeString, formatter); + + Long statTime = stringTimeToTimeStamp(statTimeString, formatter); + Long endTime = stringTimeToTimeStamp(endTimeString, formatter); + + Integer total = tmOdsImRealtimeMessageCurMapper.countImRealtimeMessageCurByDate(statTime, endTime); + int totalPages = PageDto.getTotalPages(total, pageSize); + + // 设置脱敏规则 + List maskingRuleItems = dataMaskingRuleService.getDataMaskingRuleListByApplicationChannel(BusinessTypeEnum.SMART_ASSISTANT_QIWEI.getCode()); + RunMaskingRuleInput runMaskingRuleInput = new RunMaskingRuleInput(); + runMaskingRuleInput.setDataMaskingRules(maskingRuleItems); + + // 创建线程池 + int optimalThreadPoolSize = Runtime.getRuntime().availableProcessors() + 1; + log.info("IM处理总数据量:{},总页数:{},获取的线程数:{}",total,totalPages,optimalThreadPoolSize); + ExecutorService executor = Executors.newFixedThreadPool(optimalThreadPoolSize); // 根据需求调整线程池大小 + + try { + for (int i = 1; i <= totalPages; i++) { + int offset = (i - 1) * pageSize; + List messageList = tmOdsImRealtimeMessageCurMapper.queryImRealtimeMessageCurByDate(statTime, endTime, offset, pageSize); + // 处理查询到的数据 + // 使用 CompletableFuture 并行处理 + CompletableFuture[] futures = messageList.stream() + .map(item -> CompletableFuture.runAsync(() -> { + try { + processItem(item, finalStatTime, finalEndTime, runMaskingRuleInput, formatter); + } catch (Exception e) { + log.error("处理IM语料失败: sessionId={}, 异常: {}", + item.getSessionId(), 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(ImCurMessageDTO item, Long statTime, Long endTime, RunMaskingRuleInput runMaskingRuleInput, DateTimeFormatter formatter) { + log.info("IM语料内容处理:sessionId:{}", item.getSessionId()); + + // 获取语料信息 + List contetnList = tmOdsImRealtimeMessageCurMapper.queryImRealtimeMessageCurBySessionId(statTime, endTime, item.getSessionId()); + + // 组装语料信息 + StringBuffer chatList = new StringBuffer(); + contetnList.forEach(contentItem -> { + String title = ""; + if(ImCustomTypeEnums.CUSTOMER.getCode().equals(contentItem.getCustomerType())){ + title="客户:"; + }else{ + title="顾问:"; + } + JSONObject contentJson = JSONObject.parseObject(contentItem.getMsgContent()); + String content = contentJson.getString("text"); + // 拼接 role 和 text + String chat = title.concat(content); + runMaskingRuleInput.setOldStr(chat); + String corpusChat = dataMaskingRuleService.runMaskingRule(runMaskingRuleInput); + chatList.append(corpusChat).append("\n"); + }); + Map inputMap = new HashMap<>(); + inputMap.put("chat", chatList.toString()); + inputMap.put("businessType", BusinessTypeEnum.IM_CORPUS_ANALYSIS.getCode()); + inputMap.put("sourceCorpusId", item.getSessionId()); + inputMap.put("sourceCorpusTime", timeStampToLocalDateTime(item.getMsgTimestamp(), formatter)); + + DiFyReq diFyImageReq = new DiFyReq(); + diFyImageReq.setUser(ConstantStr.corpus_user); + diFyImageReq.setFlowId(imCurToken); + diFyImageReq.setInputs(inputMap); + // 调用dify + JSONObject resultJsonObject = (JSONObject) diFyService.getDiFyObject(diFyImageReq); + log.info("runDify difyflow {}", resultJsonObject); + + // 保存结果 + if (resultJsonObject != null) { + ConsultingRequestDTO corpusQuestion = new ConsultingRequestDTO(); + corpusQuestion.setText(resultJsonObject.getString("text")); + corpusQuestion.setBusinessType(resultJsonObject.getString("businessType")); + corpusQuestion.setSourceCorpusId(resultJsonObject.getString("sourceCorpusId")); + String sourceCorpusTimeStr = resultJsonObject.getString("sourceCorpusTime"); + if (StringUtils.isNotBlank(sourceCorpusTimeStr)) { + try { + corpusQuestion.setSourceCorpusTime(DateUtil.parse(sourceCorpusTimeStr)); + } catch (Exception e) { + log.error("转换 sourceCorpusTime 为 Date 类型失败,时间字符串: {}", sourceCorpusTimeStr, e); + } + } + corpusQuestionService.runCorpusQuestionDify(corpusQuestion); + } + + } + + /** + * 时间字符串转时间戳秒级 + * @param stringTime + * @param formatter + * @return + */ + private Long stringTimeToTimeStamp(String stringTime, DateTimeFormatter formatter) { + LocalDateTime localDateTime = LocalDateTime.parse(stringTime, formatter); + + // 转换为秒级时间戳 + long timestampSeconds = localDateTime.atZone(ZoneId.systemDefault()).toEpochSecond(); + return timestampSeconds; + } + + /** + * 秒级时间戳转时间字符串 + * @param timeStamp + * @param formatter + * @return + */ + private String timeStampToLocalDateTime(Long timeStamp, DateTimeFormatter formatter) { + Instant instant = Instant.ofEpochSecond(timeStamp); + LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); + return localDateTime.format(formatter); + } + +} \ No newline at end of file diff --git a/ai-analytic-center-biz/src/main/resources/mapper/TmOdsImRealtimeMessageCurMapper.xml b/ai-analytic-center-biz/src/main/resources/mapper/TmOdsImRealtimeMessageCurMapper.xml new file mode 100644 index 0000000..3fdd28b --- /dev/null +++ b/ai-analytic-center-biz/src/main/resources/mapper/TmOdsImRealtimeMessageCurMapper.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/ai-analytic-center-biz/target/classes/mapper/TmOdsImRealtimeMessageCurMapper.xml b/ai-analytic-center-biz/target/classes/mapper/TmOdsImRealtimeMessageCurMapper.xml new file mode 100644 index 0000000..3fdd28b --- /dev/null +++ b/ai-analytic-center-biz/target/classes/mapper/TmOdsImRealtimeMessageCurMapper.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + \ No newline at end of file From bcfd3f911174ff272896eef71933bb4fc6577be4 Mon Sep 17 00:00:00 2001 From: "jie.lu" Date: Mon, 21 Jul 2025 10:42:09 +0800 Subject: [PATCH 30/55] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TmOdsImRealtimeMessageCurServiceImpl.java | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java index 6f769d5..e9cd9b2 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java @@ -1,55 +1,37 @@ 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.volvo.ai.analytic.center.dto.PageDto; -import com.volvo.ai.analytic.center.dto.corpus.CorpusReportDTO; import com.volvo.ai.analytic.center.dto.corpus.ImCurMessageDTO; -import com.volvo.ai.analytic.center.dto.corpus.OdsVdqwMessageOTD; import com.volvo.ai.analytic.center.dto.req.ConsultingRequestDTO; import com.volvo.ai.analytic.center.dto.req.DiFyReq; import com.volvo.ai.analytic.center.dto.req.RunMaskingRuleInput; import com.volvo.ai.analytic.center.entity.*; import com.volvo.ai.analytic.center.enums.BusinessTypeEnum; -import com.volvo.ai.analytic.center.enums.CategoryEnum; import com.volvo.ai.analytic.center.enums.ImCustomTypeEnums; -import com.volvo.ai.analytic.center.feign.RemoteCarModelClient; import com.volvo.ai.analytic.center.mapper.TmOdsImRealtimeMessageCurMapper; -import com.volvo.ai.analytic.center.mapper.TmOdsVdqwExternalcontactMapper; -import com.volvo.ai.analytic.center.mapper.TmOdsVdqwMessagearchivingMapper; -import com.volvo.ai.analytic.center.mapper.TmOdsVdqwWorkuserinfoMapper; -import com.volvo.ai.analytic.center.mapper.TtVdqwRecordMapper; import com.volvo.ai.analytic.center.service.*; import com.volvo.ai.analytic.center.utils.ConstantStr; -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.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; -import javax.annotation.Resource; - import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicInteger; /** @@ -141,12 +123,12 @@ public class TmOdsImRealtimeMessageCurServiceImpl extends ServiceImpl Date: Mon, 21 Jul 2025 11:22:21 +0800 Subject: [PATCH 31/55] =?UTF-8?q?sonar=E4=BB=A3=E7=A0=81=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/TmOdsImRealtimeMessageCurServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java index e9cd9b2..e7ce25e 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java @@ -197,8 +197,7 @@ public class TmOdsImRealtimeMessageCurServiceImpl extends ServiceImpl Date: Mon, 21 Jul 2025 12:06:55 +0800 Subject: [PATCH 32/55] =?UTF-8?q?=E5=A4=84=E7=90=86=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TmOdsImRealtimeMessageCurServiceImpl.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java index e7ce25e..fcabebb 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java @@ -140,6 +140,9 @@ public class TmOdsImRealtimeMessageCurServiceImpl extends ServiceImpl { + if (item.getMsgTimestamp() == null) { + item.setMsgTimestamp(endTime); + } String title = ""; if(ImCustomTypeEnums.CUSTOMER.getCode().equals(contentItem.getCustomerType())){ title="客户:"; @@ -158,7 +161,7 @@ public class TmOdsImRealtimeMessageCurServiceImpl extends ServiceImpl Date: Mon, 21 Jul 2025 14:18:17 +0800 Subject: [PATCH 33/55] =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=B1=BB=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=98=A0=E5=B0=84bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java index 08a793d..5504139 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java @@ -39,7 +39,7 @@ public class TmCorpusQuestionReport { /** * 置信度 */ - @TableField("'confidence'") + @TableField("confidence") private String confidence; /** From 7780c7b37a8c63f9b0e0bfa4e8111257f17b7e60 Mon Sep 17 00:00:00 2001 From: mliu71 Date: Mon, 21 Jul 2025 14:34:39 +0800 Subject: [PATCH 34/55] =?UTF-8?q?=E5=A2=9E=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/controller/AiAnalysisDifyController.java | 5 +++-- .../volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java | 6 ++++-- 2 files changed, 7 insertions(+), 4 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 4e216f0..7a55069 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 @@ -11,6 +11,7 @@ import com.volvo.ai.analytic.center.dto.req.AnalysisReq; import com.volvo.ai.analytic.center.dto.req.ConsultingRequestDTO; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; +import com.volvo.ai.analytic.center.service.CorpusQuestionService; import com.volvo.ai.analytic.center.service.impl.CorpusQuestionServiceImpl; import com.volvo.common.core.util.ResultMsg; import io.swagger.annotations.Api; @@ -37,7 +38,7 @@ public class AiAnalysisDifyController { private AiAnalysisDifyService aiAnalysisDifyService; @Autowired - private CorpusQuestionServiceImpl corpusQuestionServiceImpl; + private CorpusQuestionService corpusQuestionService; @PostMapping("/updateByAiId") @ApiOperation(value = "更新dify结果") @@ -85,7 +86,7 @@ public class AiAnalysisDifyController { @RequestBody ConsultingRequestDTO requestDTO) { log.info("aiAnalyze corpusQuestion requestDTO: {} ,appKey:{}", JSON.toJSONString(requestDTO),appKey); // 打印接收到的参数 - corpusQuestionServiceImpl.runCorpusQuestionDify(requestDTO); + corpusQuestionService.runCorpusQuestionDify(requestDTO); return AnalysisResp .success("ok"); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java index 62aa0da..c41bf2a 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java @@ -1,5 +1,6 @@ package com.volvo.ai.analytic.center.mq; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.volvo.ai.analytic.center.constant.Constant; import com.volvo.ai.analytic.center.feign.DiFyFeign; @@ -21,7 +22,7 @@ import java.util.Map; public class CorpusQuestionConsumer implements RocketMQListener> { - @Value("${dify.corpusQuestion.token: app-erbXevAmaQiyg5QFPn2NpJ7G}") + @Value("${dify.corpusQuestion.token:app-erbXevAmaQiyg5QFPn2NpJ7G}") private String corpusQuestionToken; @@ -30,8 +31,9 @@ public class CorpusQuestionConsumer implements RocketMQListener inputMap) { - inputMap.put("businessType", Constant.CHANNEL_4IN1); + log.info("corpusQuestionConsumer {}", JSON.toJSONString(inputMap)); + log.info("corpusQuestionToken {}", corpusQuestionToken); JSONObject difyResult = diFyFeign.runWorkflows("Bearer " + corpusQuestionToken, inputMap); log.info("difyResult {}", difyResult.toJSONString()); } From 31f8501da581264f6778793f0893b96a61a3b578 Mon Sep 17 00:00:00 2001 From: "jie.lu" Date: Mon, 21 Jul 2025 15:03:51 +0800 Subject: [PATCH 35/55] =?UTF-8?q?sonar=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/analytic/center/controller/AiAnalysisDifyController.java | 1 - 1 file changed, 1 deletion(-) 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 7a55069..1cb6573 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 @@ -12,7 +12,6 @@ import com.volvo.ai.analytic.center.dto.req.ConsultingRequestDTO; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; import com.volvo.ai.analytic.center.service.CorpusQuestionService; -import com.volvo.ai.analytic.center.service.impl.CorpusQuestionServiceImpl; import com.volvo.common.core.util.ResultMsg; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; From 57836cbdd45cf485ad4b37a41e9a5a2b5d65f45f Mon Sep 17 00:00:00 2001 From: mliu71 Date: Mon, 21 Jul 2025 15:51:43 +0800 Subject: [PATCH 36/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/volvo/ai/analytic/center/controller/TestController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/TestController.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/TestController.java index 64c7396..af83558 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/TestController.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/controller/TestController.java @@ -36,6 +36,7 @@ public class TestController { @PostMapping("/mockMq") @ApiOperation(value = "补偿处理消息") public ResultMsg mockMq(@RequestBody String message) { + log.info("mockMq message:{}", message); JSONObject messageJson = JSONObject.parseObject(message); rocketMQTemplate.syncSend(messageJson.getString("topic"), messageJson.getString("message")); return ResultMsg.ok("ok"); From 6e2fa38fd333020efa49e9b5a47c9105b11a907d Mon Sep 17 00:00:00 2001 From: mliu71 Date: Mon, 21 Jul 2025 17:35:44 +0800 Subject: [PATCH 37/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java | 3 +++ .../java/com/volvo/ai/analytic/center/utils/ConstantStr.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java index c41bf2a..acf7b91 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.volvo.ai.analytic.center.constant.Constant; import com.volvo.ai.analytic.center.feign.DiFyFeign; +import com.volvo.ai.analytic.center.utils.ConstantStr; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; @@ -34,6 +35,8 @@ public class CorpusQuestionConsumer implements RocketMQListener Date: Mon, 21 Jul 2025 17:50:39 +0800 Subject: [PATCH 38/55] =?UTF-8?q?API=E5=85=A5=E5=8F=82=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytic/center/mq/CorpusQuestionConsumer.java | 12 ++++++++++-- .../volvo/ai/analytic/center/utils/ConstantStr.java | 3 +++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java index c41bf2a..17e1ecf 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.volvo.ai.analytic.center.constant.Constant; import com.volvo.ai.analytic.center.feign.DiFyFeign; +import com.volvo.ai.analytic.center.utils.ConstantStr; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; @@ -12,6 +13,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; +import java.util.HashMap; import java.util.Map; @Slf4j @@ -34,7 +36,13 @@ public class CorpusQuestionConsumer implements RocketMQListener requestMap = new HashMap<>(); + requestMap.put("inputs", inputMap); + requestMap.put("user", ConstantStr.CORPUS_QUESTION_USER); + requestMap.put("response_mode","blocking"); + + JSONObject difyResult = diFyFeign.runWorkflows("Bearer " + corpusQuestionToken, requestMap); + log.info("dify corpusQuestionResult {}", difyResult.toJSONString()); } } 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 bb9c3cc..b5d0f55 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 @@ -12,6 +12,9 @@ public class ConstantStr { public static final String CHANNEL_DCC = "Channel_Dcc"; public static final String corpus_user = "corpush_user"; + public static final String CORPUS_QUESTION_USER = "corpush_question_user"; + + public static final String CARMODELLIST_CACHEKEY = "ai_carmodellist"; public static final String INTELLIGENT_CUSTOMER_4IN1 = "INTELLIGENT_CUSTOMER_4IN1"; From d772138501bb61a9a8fcbff7c76c2340d286b66f Mon Sep 17 00:00:00 2001 From: mliu71 Date: Mon, 21 Jul 2025 18:35:39 +0800 Subject: [PATCH 39/55] =?UTF-8?q?=E5=8D=95=E6=9D=A1=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/mq/CorpusQuestionConsumer.java | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java index 17e1ecf..b083a31 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java @@ -1,9 +1,12 @@ package com.volvo.ai.analytic.center.mq; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.volvo.ai.analytic.center.constant.Constant; +import com.volvo.ai.analytic.center.entity.TmCorpusQuestionReport; import com.volvo.ai.analytic.center.feign.DiFyFeign; +import com.volvo.ai.analytic.center.mapper.TmCorpusQuestionReportMapper; import com.volvo.ai.analytic.center.utils.ConstantStr; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -13,6 +16,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -27,7 +31,8 @@ public class CorpusQuestionConsumer implements RocketMQListener requestMap = new HashMap<>(); requestMap.put("inputs", inputMap); requestMap.put("user", ConstantStr.CORPUS_QUESTION_USER); - requestMap.put("response_mode","blocking"); + requestMap.put("response_mode", "blocking"); - JSONObject difyResult = diFyFeign.runWorkflows("Bearer " + corpusQuestionToken, requestMap); - log.info("dify corpusQuestionResult {}", difyResult.toJSONString()); + try { + JSONObject difyResult = diFyFeign.runWorkflows("Bearer " + corpusQuestionToken, requestMap); + log.info("dify corpusQuestionResult {}", difyResult.toJSONString()); + JSONObject data = difyResult.getJSONObject("data"); + + if (data.get("status").equals("succeeded")) { + JSONObject outputJson = data.getJSONObject("outputs"); + JSONObject textJsonObject = JSONObject.parseObject(outputJson.getString("text")); + JSONObject consultingScenario = textJsonObject.getJSONObject("consultingScenario"); + TmCorpusQuestionReport tmCorpusQuestionReport = new TmCorpusQuestionReport(); + tmCorpusQuestionReport.setBusinessType(outputJson.getString("businessType")); + tmCorpusQuestionReport.setSourceCorpusId(outputJson.getString("sourceCorpusId")); + + Date sourceCorpusDate = DateUtil.parse(outputJson.getString("sourceCorpusTime"), "yyyy-MM-dd HH:mm:ss"); + tmCorpusQuestionReport.setAnalysisResultJson(outputJson.toJSONString()); + tmCorpusQuestionReport.setMainCategory(consultingScenario.getString("mainCategory")); + tmCorpusQuestionReport.setSubCategory(consultingScenario.getString("subCategory")); + tmCorpusQuestionReport.setConfidence(consultingScenario.getString("confidence")); + tmCorpusQuestionReport.setSourceCorpusTime(sourceCorpusDate); + tmCorpusQuestionReportMapper.insert(tmCorpusQuestionReport); + } else { + log.info("dify corpusQuestion fail {}", JSON.toJSONString(inputMap)); + } + } catch (Exception e) { + log.info("dify corpusQuestion Exception {}", e.getMessage()); + } } } From 0486a16de970b3fc8bc2ef07ec171f4b877f9619 Mon Sep 17 00:00:00 2001 From: mliu71 Date: Tue, 22 Jul 2025 10:09:37 +0800 Subject: [PATCH 40/55] =?UTF-8?q?=E5=85=A5=E5=8F=82=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../volvo/ai/analytic/center/dto/req/ConsultingRequestDTO.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ConsultingRequestDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ConsultingRequestDTO.java index 1f341e7..df660e8 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ConsultingRequestDTO.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/ConsultingRequestDTO.java @@ -1,5 +1,6 @@ package com.volvo.ai.analytic.center.dto.req; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @@ -9,6 +10,8 @@ public class ConsultingRequestDTO { private String businessType; // 新增字段 private String text; private String sourceCorpusId; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date sourceCorpusTime; From 8c1c37bf88c53efac9eb84382c48faf4cf0c5820 Mon Sep 17 00:00:00 2001 From: mliu71 Date: Wed, 23 Jul 2025 15:51:24 +0800 Subject: [PATCH 41/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/entity/TmCorpusQuestionReport.java | 6 ++ .../entity/TmCorpusQuestionSummaryReport.java | 98 +++++++++++++++++++ .../TmCorpusQuestionSummaryReportMapper.java | 8 ++ 3 files changed, 112 insertions(+) create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionSummaryReport.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionSummaryReportMapper.java diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java index 5504139..660975c 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionReport.java @@ -48,6 +48,12 @@ public class TmCorpusQuestionReport { @TableField("business_type") private String businessType; + /** + * 用户需求 + */ + @TableField("user_demand") + private String userDemand; + /** * 分析结果 */ diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionSummaryReport.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionSummaryReport.java new file mode 100644 index 0000000..590f2a3 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionSummaryReport.java @@ -0,0 +1,98 @@ +package com.volvo.ai.analytic.center.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 语料分析初步总结表 + */ +@Data +@TableName("tm_corpus_question_summary_report") +public class TmCorpusQuestionSummaryReport { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 主类别 + */ + @TableField("main_category") + private String mainCategory; + + /** + * 子类别 + */ + @TableField("sub_category") + private String subCategory; + + /** + * 初步结果 + */ + @TableField("preliminary_summary_results") + private String preliminarySummaryResults; + + /** + * 原语料时间 + */ + @TableField("source_time") + private Date sourceTime; + + /** + * 删除标识(0-未删除,1-已删除) + */ + @TableField("is_deleted") + private Integer isDeleted; + + /** + * 记录版本号,即乐观锁 + */ + @TableField("versions") + private Integer versions; + + /** + * 创建人 + */ + @TableField("create_by") + private String createBy; + + /** + * 更新人 + */ + @TableField("update_by") + private String updateBy; + + /** + * 创建sql人 + */ + @TableField("create_sqlby") + private String createSqlby; + + /** + * 更新sql人 + */ + @TableField("update_sqlby") + private String updateSqlby; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @TableField("update_time") + private Date updateTime; + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionSummaryReportMapper.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionSummaryReportMapper.java new file mode 100644 index 0000000..cc63dfc --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionSummaryReportMapper.java @@ -0,0 +1,8 @@ +package com.volvo.ai.analytic.center.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.volvo.ai.analytic.center.entity.TmCorpusQuestionSummaryReport; + +public interface TmCorpusQuestionSummaryReportMapper extends BaseMapper { + +} \ No newline at end of file From bf9fac4f0de03b2ba227843be99c5e3ef28966ba Mon Sep 17 00:00:00 2001 From: mliu71 Date: Wed, 23 Jul 2025 16:01:37 +0800 Subject: [PATCH 42/55] =?UTF-8?q?=E8=AF=AD=E6=96=99=E5=88=86=E6=9E=90?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/analytic/center/mq/CorpusQuestionConsumer.java | 7 ++++++- .../center/service/impl/CorpusQuestionServiceImpl.java | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java index b083a31..076fb0f 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/CorpusQuestionConsumer.java @@ -56,10 +56,15 @@ public class CorpusQuestionConsumer implements RocketMQListener 4000) { + log.warn("userDemand 字段长度超过 4000,已自动截取。原始长度:{}", userDemand.length()); + userDemand = userDemand.substring(0, 4000); + } TmCorpusQuestionReport tmCorpusQuestionReport = new TmCorpusQuestionReport(); tmCorpusQuestionReport.setBusinessType(outputJson.getString("businessType")); tmCorpusQuestionReport.setSourceCorpusId(outputJson.getString("sourceCorpusId")); - + tmCorpusQuestionReport.setUserDemand(userDemand); Date sourceCorpusDate = DateUtil.parse(outputJson.getString("sourceCorpusTime"), "yyyy-MM-dd HH:mm:ss"); tmCorpusQuestionReport.setAnalysisResultJson(outputJson.toJSONString()); tmCorpusQuestionReport.setMainCategory(consultingScenario.getString("mainCategory")); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/CorpusQuestionServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/CorpusQuestionServiceImpl.java index 6b44f64..4ad6a80 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/CorpusQuestionServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/CorpusQuestionServiceImpl.java @@ -21,9 +21,16 @@ public class CorpusQuestionServiceImpl implements CorpusQuestionService { String text = consultingRequestDTO.getText(); JSONObject textJsonObject = JSONObject.parseObject(text); JSONObject consultingScenario = textJsonObject.getJSONObject("consultingScenario"); + String userDemand = textJsonObject.getString("userDemand"); + if (userDemand != null && userDemand.length() > 4000) { + log.warn("userDemand 字段长度超过 4000,已自动截取。原始长度:{}", userDemand.length()); + userDemand = userDemand.substring(0, 4000); + } TmCorpusQuestionReport tmCorpusQuestionReport = new TmCorpusQuestionReport(); tmCorpusQuestionReport.setMainCategory(consultingScenario.getString("mainCategory")); tmCorpusQuestionReport.setSubCategory(consultingScenario.getString("subCategory")); + tmCorpusQuestionReport.setUserDemand(userDemand); + tmCorpusQuestionReport.setConfidence(consultingScenario.getString("confidence")); tmCorpusQuestionReport.setBusinessType(consultingRequestDTO.getBusinessType()); tmCorpusQuestionReport.setSourceCorpusId(consultingRequestDTO.getSourceCorpusId()); From 7c341657e1dbc8e26f0e09a1a4459fd01ce05e1f Mon Sep 17 00:00:00 2001 From: "jie.lu" Date: Thu, 24 Jul 2025 11:03:34 +0800 Subject: [PATCH 43/55] =?UTF-8?q?=E9=97=AE=E9=A2=98=E6=B1=87=E6=80=BB?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/dto/corpus/ImCurMessageDTO.java | 2 + .../enums/QuestionMainCategoryEnum.java | 26 ++++ .../center/job/UserQuestionSummaryJob.java | 44 ++++++ .../mapper/TmCorpusQuestionReportMapper.java | 8 + .../service/UserQuestionSummaryService.java | 15 ++ .../impl/UserQuestionSummaryServiceImpl.java | 141 ++++++++++++++++++ .../mapper/TmCorpusQuestionReportMapper.xml | 17 +++ .../mapper/TmCorpusQuestionReportMapper.xml | 17 +++ 8 files changed, 270 insertions(+) create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/QuestionMainCategoryEnum.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/UserQuestionSummaryJob.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/UserQuestionSummaryService.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java create mode 100644 ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml create mode 100644 ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionReportMapper.xml diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java index 98e921d..6579574 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java @@ -27,6 +27,8 @@ public class ImCurMessageDTO { private Integer customerType; private Long msgTimestamp; + + private String userDemand; public ImCurMessageDTO() { } diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/QuestionMainCategoryEnum.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/QuestionMainCategoryEnum.java new file mode 100644 index 0000000..8bed73b --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/enums/QuestionMainCategoryEnum.java @@ -0,0 +1,26 @@ +package com.volvo.ai.analytic.center.enums; + +public enum QuestionMainCategoryEnum { + + CAR_PURCHASE_RELATED("CAR_PURCHASE_RELATED", "购车相关"), + AFTER_SALES_SERVICE("AFTER_SALES_SERVICE", "售后服务"), + USER_OPERATION("USER_OPERATION", "用户运营"), + CORPORATE_VALUES("CORPORATE_VALUES", "企业价值观"), + SCENE_NOT_CLEAR("SCENE_NOT_CLEAR", "场景不明确"), + ; + private String code; + private String message; + + QuestionMainCategoryEnum(String code, String message) { + this.code = code; + this.message = message; + } + + public String getCode() { + return this.code; + } + + public String getMessage() { + return this.message; + } +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/UserQuestionSummaryJob.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/UserQuestionSummaryJob.java new file mode 100644 index 0000000..29fb684 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/UserQuestionSummaryJob.java @@ -0,0 +1,44 @@ +package com.volvo.ai.analytic.center.job; + +import com.volvo.ai.analytic.center.service.UserQuestionSummaryService; +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 UserQuestionSummaryJob { + + @Autowired + private UserQuestionSummaryService userQuestionSummaryService; + + /** + * 企微语料处理 + */ + @XxlJob("userQuestionSummaryTask") + public ResultMsg userQuestionSummaryTask(@RequestBody String paramJson) { + try { + // 获取任务参数 + String param = XxlJobHelper.getJobParam(); + if(StringUtils.isEmpty(param)){ + param = paramJson; + } + // 执行业务逻辑 + XxlJobHelper.log("任务参数: {}", param); + log.info("userQuestionSummaryTask 用户问题总结处理:{}",param); + userQuestionSummaryService.runUserQuestionSummary(param); + } catch (Exception e) { + log.error("userQuestionSummaryTask 定时任务处理消息异常",e.getMessage()); + throw new RuntimeException(e); + } + return ResultMsg.ok(); + } + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionReportMapper.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionReportMapper.java index 55f7e57..6695b99 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionReportMapper.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionReportMapper.java @@ -1,13 +1,21 @@ package com.volvo.ai.analytic.center.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.volvo.ai.analytic.center.dto.corpus.ImCurMessageDTO; import com.volvo.ai.analytic.center.entity.TmCorpusQuestionReport; + +import java.util.Date; +import java.util.List; + import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * 单条语料分析结论 */ @Mapper public interface TmCorpusQuestionReportMapper extends BaseMapper { + + List queryQuestionReportList(@Param("statTime") Date statTime, @Param("endTime") Date endTime, @Param("mainCategory") String mainCategory); } \ No newline at end of file diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/UserQuestionSummaryService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/UserQuestionSummaryService.java new file mode 100644 index 0000000..381c434 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/UserQuestionSummaryService.java @@ -0,0 +1,15 @@ +package com.volvo.ai.analytic.center.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.volvo.ai.analytic.center.entity.TmCorpusQuestionSummaryReport; +/** + * @description 用户问题总结 + * @author lujie + * @date 2025-07-23 + */ +public interface UserQuestionSummaryService extends IService { + + void runUserQuestionSummary(String paramJson); + + +} \ No newline at end of file diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java new file mode 100644 index 0000000..0597c80 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java @@ -0,0 +1,141 @@ +package com.volvo.ai.analytic.center.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.volvo.ai.analytic.center.dto.corpus.ImCurMessageDTO; +import com.volvo.ai.analytic.center.dto.req.DiFyReq; +import com.volvo.ai.analytic.center.entity.*; +import com.volvo.ai.analytic.center.enums.QuestionMainCategoryEnum; +import com.volvo.ai.analytic.center.mapper.TmCorpusQuestionReportMapper; +import com.volvo.ai.analytic.center.mapper.TmCorpusQuestionSummaryReportMapper; +import com.volvo.ai.analytic.center.service.*; +import com.volvo.ai.analytic.center.utils.ConstantStr; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +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.Service; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * @description 用户问题汇总 + * @author jlu + * @date 2025-07-17 + */ +@RefreshScope +@Slf4j +@Service +public class UserQuestionSummaryServiceImpl extends ServiceImpl implements UserQuestionSummaryService { + + @Autowired + private TmCorpusQuestionSummaryReportMapper tmCorpusQuestionSummaryReportMapper; + @Autowired + private TmCorpusQuestionReportMapper tmCorpusQuestionReportMapper; + + @Autowired + private DiFyService diFyService; + + @Value("${dify.corpus.reportSummaryToken}") + private String reportSummaryToken; + + @Override + public void runUserQuestionSummary(String paramJson) { + long startTime = System.currentTimeMillis(); + log.info("runUserQuestionSummary paramJson {}", paramJson); + // 获取当前日期 + LocalDate today = LocalDate.now(); + // 获取前一天日期 + LocalDate yesterday = today.minusDays(1); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // 格式化输出 + String formattedDate = yesterday.toString(); // 默认格式为 yyyy-MM-dd + String statTimeString = formattedDate.concat(" 00:00:00"); + String endTimeString = formattedDate.concat(" 23:59:59"); + if (StringUtils.isNotBlank(paramJson)) { + JSONObject paramJsonObj = JSONObject.parseObject(paramJson); + if (null != paramJsonObj && paramJsonObj.containsKey("statTime") && paramJsonObj.containsKey("endTime")) { + statTimeString = paramJsonObj.getString("statTime"); + endTimeString = paramJsonObj.getString("endTime"); + } + } + + Date statTime = stringTimeToDate(statTimeString, formatter); + Date endTime = stringTimeToDate(endTimeString, formatter); + + for (QuestionMainCategoryEnum enumValue : QuestionMainCategoryEnum.values()) { + String mainCategoryString = enumValue.getMessage(); + try { + processItem(statTime, endTime, mainCategoryString); + } catch (Exception e) { + log.error("处理问题汇总失败: 异常: {}", e.getMessage(), e); + } + } + log.info("处理问题结束 耗时:{}",System.currentTimeMillis()-startTime); + } + + private void processItem(Date statTime, Date endTime, String mainCategoryString) { + log.info("用户问题总结处理:mainCategory:{}", mainCategoryString); + + // 获取分析结果信息 + List resultList = tmCorpusQuestionReportMapper.queryQuestionReportList(statTime, endTime, mainCategoryString); + + if (resultList == null || resultList.isEmpty()) { + return; + } + + // 组装语料信息 + StringBuffer demandList = new StringBuffer(); + resultList.forEach(contentItem -> { + if (StringUtils.isNotBlank(contentItem.getUserDemand())) { + demandList.append(contentItem.getUserDemand()).append("\n"); + } + }); + Map inputMap = new HashMap<>(); + inputMap.put("chat", demandList.toString()); + + DiFyReq diFyImageReq = new DiFyReq(); + diFyImageReq.setUser(ConstantStr.corpus_user); + diFyImageReq.setFlowId(reportSummaryToken); + diFyImageReq.setInputs(inputMap); + // 调用dify + JSONObject resultJsonObject = (JSONObject) diFyService.getDiFyObject(diFyImageReq); + log.info("runDify userQuestionSummary difyflow {}", resultJsonObject); + + // 保存结果 + if (resultJsonObject != null) { + TmCorpusQuestionSummaryReport summaryReport = new TmCorpusQuestionSummaryReport(); + summaryReport.setPreliminarySummaryResults(resultJsonObject.getString("preliminarySummaryResults")); + summaryReport.setMainCategory(mainCategoryString); + summaryReport.setSourceTime(statTime); + tmCorpusQuestionSummaryReportMapper.insert(summaryReport); + } + + } + + /** + * 时间字符串转时间戳秒级 + * @param stringTime + * @param formatter + * @return + */ + private Date stringTimeToDate(String stringTime, DateTimeFormatter formatter) { + if (StringUtils.isBlank(stringTime)) { + return null; + } + LocalDateTime localDateTime = LocalDateTime.parse(stringTime, formatter); + + // 转换为秒级时间戳 + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + +} \ No newline at end of file diff --git a/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml b/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml new file mode 100644 index 0000000..40df504 --- /dev/null +++ b/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionReportMapper.xml b/ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionReportMapper.xml new file mode 100644 index 0000000..40df504 --- /dev/null +++ b/ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionReportMapper.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file From 5e39b346b89d083a52994d9360196dc5d34e9e24 Mon Sep 17 00:00:00 2001 From: "jie.lu" Date: Thu, 24 Jul 2025 11:54:29 +0800 Subject: [PATCH 44/55] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=86=99=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/TmOdsImRealtimeMessageCurServiceImpl.java | 2 +- .../src/main/resources/mapper/TmCorpusQuestionReportMapper.xml | 2 +- .../target/classes/mapper/TmCorpusQuestionReportMapper.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java index fcabebb..bf7901a 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmOdsImRealtimeMessageCurServiceImpl.java @@ -141,7 +141,7 @@ public class TmOdsImRealtimeMessageCurServiceImpl extends ServiceImpl { if (item.getMsgTimestamp() == null) { - item.setMsgTimestamp(endTime); + item.setMsgTimestamp(contentItem.getMsgTimestamp()); } String title = ""; if(ImCustomTypeEnums.CUSTOMER.getCode().equals(contentItem.getCustomerType())){ diff --git a/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml b/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml index 40df504..81f0b12 100644 --- a/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml +++ b/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml @@ -9,7 +9,7 @@ FROM `tm_corpus_question_report` tcqr WHERE tcqr.is_deleted = 0 - AND tcqr.msg_timestamp between #{statTime} and #{endTime} + AND tcqr.source_corpus_time between #{statTime} and #{endTime} AND tcqr.main_category = #{mainCategory} diff --git a/ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionReportMapper.xml b/ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionReportMapper.xml index 40df504..81f0b12 100644 --- a/ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionReportMapper.xml +++ b/ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionReportMapper.xml @@ -9,7 +9,7 @@ FROM `tm_corpus_question_report` tcqr WHERE tcqr.is_deleted = 0 - AND tcqr.msg_timestamp between #{statTime} and #{endTime} + AND tcqr.source_corpus_time between #{statTime} and #{endTime} AND tcqr.main_category = #{mainCategory} From 8fa2b9c0fe95e59a28d3d4edac118fe66b97c3d0 Mon Sep 17 00:00:00 2001 From: "jie.lu" Date: Thu, 24 Jul 2025 12:17:47 +0800 Subject: [PATCH 45/55] =?UTF-8?q?=E6=9B=B4=E6=94=B9sql=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/analytic/center/dto/corpus/ImCurMessageDTO.java | 2 ++ .../resources/mapper/TmCorpusQuestionReportMapper.xml | 1 + .../mapper/TmOdsImRealtimeMessageCurMapper.xml | 10 ++++++---- .../classes/mapper/TmCorpusQuestionReportMapper.xml | 1 + .../classes/mapper/TmOdsImRealtimeMessageCurMapper.xml | 10 ++++++---- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java index 6579574..1ab00a6 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/corpus/ImCurMessageDTO.java @@ -14,6 +14,8 @@ public class ImCurMessageDTO { private static final long serialVersionUID = 1L; + private Long id; + private String sessionId; /** diff --git a/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml b/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml index 81f0b12..5955f0f 100644 --- a/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml +++ b/ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionReportMapper.xml @@ -5,6 +5,7 @@ SELECT + toi.id as id, toi.session_id as sessionId FROM `tm_ods_im_realtime_message_cur` toi @@ -35,10 +36,11 @@ SELECT + tcqr.id as id, tcqr.user_demand as userDemand FROM `tm_corpus_question_report` tcqr diff --git a/ai-analytic-center-biz/target/classes/mapper/TmOdsImRealtimeMessageCurMapper.xml b/ai-analytic-center-biz/target/classes/mapper/TmOdsImRealtimeMessageCurMapper.xml index 3fdd28b..2f8de71 100644 --- a/ai-analytic-center-biz/target/classes/mapper/TmOdsImRealtimeMessageCurMapper.xml +++ b/ai-analytic-center-biz/target/classes/mapper/TmOdsImRealtimeMessageCurMapper.xml @@ -20,6 +20,7 @@ SELECT - toi.session_id as sessionId, - toi.msg_content as msgContent, - toi.customer_type as customerType, - toi.msg_timestamp as msgTimestamp + toi.id as id, + toi.session_id as sessionId, + toi.msg_content as msgContent, + toi.customer_type as customerType, + toi.msg_timestamp as msgTimestamp FROM `tm_ods_im_realtime_message_cur` toi WHERE toi.is_deleted = 0 From 0af598039e3641a7ae823748d7acd2734a51a120 Mon Sep 17 00:00:00 2001 From: mliu71 Date: Thu, 24 Jul 2025 14:22:42 +0800 Subject: [PATCH 46/55] =?UTF-8?q?=E8=AF=AD=E6=96=99=E5=88=86=E6=9E=90?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/entity/TmCorpusQuestionSummaryReport.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionSummaryReport.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionSummaryReport.java index 590f2a3..a834906 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionSummaryReport.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/entity/TmCorpusQuestionSummaryReport.java @@ -47,6 +47,13 @@ public class TmCorpusQuestionSummaryReport { @TableField("source_time") private Date sourceTime; + /** + * 关联id + */ + @TableField("summary_report_id") + private String summaryReportId; + + /** * 删除标识(0-未删除,1-已删除) */ From c5d6857935ad0e10b63ee4b3b2bb5464c93a3342 Mon Sep 17 00:00:00 2001 From: "jie.lu" Date: Thu, 24 Jul 2025 14:33:40 +0800 Subject: [PATCH 47/55] =?UTF-8?q?=E5=9B=9E=E8=B0=83=E6=9B=B4=E6=96=B0repor?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/req/SummaryQuestionRequestDTO.java | 12 ++++++++ .../center/enums/BusinessTypeEnum.java | 1 + .../controller/AiAnalysisDifyController.java | 16 +++++----- .../TmCorpusQuestionSummaryReportMapper.java | 4 +++ .../service/UserQuestionSummaryService.java | 3 ++ .../impl/UserQuestionSummaryServiceImpl.java | 29 +++++++++++++------ .../TmCorpusQuestionSummaryReportMapper.xml | 11 +++++++ .../TmCorpusQuestionSummaryReportMapper.xml | 11 +++++++ 8 files changed, 69 insertions(+), 18 deletions(-) create mode 100644 ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java create mode 100644 ai-analytic-center-biz/src/main/resources/mapper/TmCorpusQuestionSummaryReportMapper.xml create mode 100644 ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionSummaryReportMapper.xml diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java new file mode 100644 index 0000000..57c7506 --- /dev/null +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java @@ -0,0 +1,12 @@ +package com.volvo.ai.analytic.center.dto.req; + +import lombok.Data; + +@Data +public class SummaryQuestionRequestDTO { + + private String summaryReportId; + + private String preliminarySummaryResults; + +} 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 706a83d..dc2f221 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 @@ -29,6 +29,7 @@ public enum BusinessTypeEnum { SMART_ASSISTANT_NAMEPLATE("SMART_ASSISTANT_NAMEPLATE", "智能助手-铭牌"), IM_CORPUS_ANALYSIS("IM_CORPUS_ANALYSIS", "IM语料库"), + SUMMARY_REPORT("SUMMARY_REPORT", "问题总结"), //特邀发言官 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 1cb6573..5f78711 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 @@ -9,9 +9,11 @@ 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.req.ConsultingRequestDTO; +import com.volvo.ai.analytic.center.dto.req.SummaryQuestionRequestDTO; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; import com.volvo.ai.analytic.center.service.CorpusQuestionService; +import com.volvo.ai.analytic.center.service.UserQuestionSummaryService; import com.volvo.common.core.util.ResultMsg; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -30,14 +32,11 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("analysis") public class AiAnalysisDifyController { - @Autowired - private RocketMQTemplate rocketMQTemplate; - @Autowired private AiAnalysisDifyService aiAnalysisDifyService; @Autowired - private CorpusQuestionService corpusQuestionService; + private UserQuestionSummaryService userQuestionSummaryService; @PostMapping("/updateByAiId") @ApiOperation(value = "更新dify结果") @@ -79,13 +78,12 @@ public class AiAnalysisDifyController { - @PostMapping("/corpusQuestion") + @PostMapping("/corpusSummaryQuestion") @ApiOperation(value = "单条语料分析结论入库") - public AnalysisResp corpusQuestion(@RequestHeader(value = "appKey") String appKey, - @RequestBody ConsultingRequestDTO requestDTO) { - log.info("aiAnalyze corpusQuestion requestDTO: {} ,appKey:{}", JSON.toJSONString(requestDTO),appKey); + public AnalysisResp corpusSummaryQuestion(@RequestBody SummaryQuestionRequestDTO requestDTO) { + log.info("aiAnalyze corpusSummaryQuestion requestDTO: {}", JSON.toJSONString(requestDTO)); // 打印接收到的参数 - corpusQuestionService.runCorpusQuestionDify(requestDTO); + userQuestionSummaryService.updateSummery(requestDTO); return AnalysisResp .success("ok"); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionSummaryReportMapper.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionSummaryReportMapper.java index cc63dfc..3157dc2 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionSummaryReportMapper.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mapper/TmCorpusQuestionSummaryReportMapper.java @@ -1,8 +1,12 @@ package com.volvo.ai.analytic.center.mapper; +import org.apache.ibatis.annotations.Param; + import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.volvo.ai.analytic.center.entity.TmCorpusQuestionSummaryReport; public interface TmCorpusQuestionSummaryReportMapper extends BaseMapper { + int updateBySummaryReportId(@Param("summaryReportId") String summaryReportId, @Param("preliminarySummaryResults") String preliminarySummaryResults); + } \ No newline at end of file diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/UserQuestionSummaryService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/UserQuestionSummaryService.java index 381c434..1f797f8 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/UserQuestionSummaryService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/UserQuestionSummaryService.java @@ -1,6 +1,7 @@ package com.volvo.ai.analytic.center.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.volvo.ai.analytic.center.dto.req.SummaryQuestionRequestDTO; import com.volvo.ai.analytic.center.entity.TmCorpusQuestionSummaryReport; /** * @description 用户问题总结 @@ -11,5 +12,7 @@ public interface UserQuestionSummaryService extends IService inputMap = new HashMap<>(); inputMap.put("chat", demandList.toString()); + inputMap.put("summaryReportId", aiAnalysisRequestId); DiFyReq diFyImageReq = new DiFyReq(); diFyImageReq.setUser(ConstantStr.corpus_user); @@ -111,15 +131,6 @@ public class UserQuestionSummaryServiceImpl extends ServiceImpl + + + + + update tm_corpus_question_summary_report + set preliminary_summary_results = #{preliminarySummaryResults} + where summary_report_id = #{summaryReportId} + + + \ No newline at end of file diff --git a/ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionSummaryReportMapper.xml b/ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionSummaryReportMapper.xml new file mode 100644 index 0000000..94ab11a --- /dev/null +++ b/ai-analytic-center-biz/target/classes/mapper/TmCorpusQuestionSummaryReportMapper.xml @@ -0,0 +1,11 @@ + + + + + + update tm_corpus_question_summary_report + set preliminary_summary_results = #{preliminarySummaryResults} + where summary_report_id = #{summaryReportId} + + + \ No newline at end of file From b99ed5c407674a81bdf69302ca48551f43d3e598 Mon Sep 17 00:00:00 2001 From: "jie.lu" Date: Thu, 24 Jul 2025 14:43:08 +0800 Subject: [PATCH 48/55] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytic/center/controller/AiAnalysisDifyController.java | 3 --- 1 file changed, 3 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 5f78711..510696d 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 @@ -8,17 +8,14 @@ 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.req.ConsultingRequestDTO; import com.volvo.ai.analytic.center.dto.req.SummaryQuestionRequestDTO; import com.volvo.ai.analytic.center.dto.resp.AnalysisResp; import com.volvo.ai.analytic.center.service.AiAnalysisDifyService; -import com.volvo.ai.analytic.center.service.CorpusQuestionService; import com.volvo.ai.analytic.center.service.UserQuestionSummaryService; 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.validation.annotation.Validated; From f3ceede2dcebf078ce1f6e678491838b65532e3f Mon Sep 17 00:00:00 2001 From: mliu71 Date: Thu, 24 Jul 2025 16:26:33 +0800 Subject: [PATCH 49/55] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/controller/AiAnalysisDifyController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 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 510696d..f0ae674 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 @@ -77,8 +77,10 @@ public class AiAnalysisDifyController { @PostMapping("/corpusSummaryQuestion") @ApiOperation(value = "单条语料分析结论入库") - public AnalysisResp corpusSummaryQuestion(@RequestBody SummaryQuestionRequestDTO requestDTO) { - log.info("aiAnalyze corpusSummaryQuestion requestDTO: {}", JSON.toJSONString(requestDTO)); + public AnalysisResp corpusSummaryQuestion(@RequestBody String requestDTO1) { + log.info("aiAnalyze corpusSummaryQuestion requestDTO: {}", JSON.toJSONString(requestDTO1)); + + SummaryQuestionRequestDTO requestDTO = new SummaryQuestionRequestDTO(); // 打印接收到的参数 userQuestionSummaryService.updateSummery(requestDTO); return AnalysisResp .success("ok"); From 4656e156f3a4f4551e9a1c6fb4e11b5110cfa8d4 Mon Sep 17 00:00:00 2001 From: mliu71 Date: Thu, 24 Jul 2025 17:14:54 +0800 Subject: [PATCH 50/55] =?UTF-8?q?=E8=AF=AD=E6=96=99=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=88=86=E6=9E=90=E5=85=A5=E5=8F=82=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/req/SummaryQuestionRequestDTO.java | 3 +- .../controller/AiAnalysisDifyController.java | 35 ++++++++++--------- .../impl/UserQuestionSummaryServiceImpl.java | 4 +-- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java index 57c7506..c2df661 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java @@ -1,5 +1,6 @@ package com.volvo.ai.analytic.center.dto.req; +import com.alibaba.fastjson.JSONObject; import lombok.Data; @Data @@ -7,6 +8,6 @@ public class SummaryQuestionRequestDTO { private String summaryReportId; - private String preliminarySummaryResults; + private JSONObject preliminarySummaryResults; } 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 f0ae674..ffb5f4e 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 @@ -19,7 +19,10 @@ import lombok.extern.slf4j.Slf4j; 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() @@ -45,45 +48,43 @@ public class AiAnalysisDifyController { @PostMapping("/aiAnalyze") @ApiOperation(value = "Ai解析接口") - public AnalysisResp aiAnalyze(@Validated @RequestBody String message) { - log.info("aiAnalyze data: {}",message); + 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 analysisReq = objectMapper.readValue(message, AnalysisReq.class); analysisReq.validate(); - return aiAnalysisDifyService.aiAnalyze(analysisReq); + return aiAnalysisDifyService.aiAnalyze(analysisReq); } catch (JsonProcessingException e) { - log.info("aiAnalyze data error: {}",e); + log.info("aiAnalyze data error: {}", e); return AnalysisResp.failed("解析失败"); } } @PostMapping("/query") @ApiOperation(value = "Ai解析结果查询") - public AnalysisResp query(@RequestBody @Validated AnalysisQueryReq analysisQueryReq) { - log.info("aiAnalyze query data: {}",analysisQueryReq); - return aiAnalysisDifyService.query(analysisQueryReq); + 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"); + log.info("aiAnalyze testCallback data: {}", analysisResp); + return AnalysisResp.success("ok"); } - @PostMapping("/corpusSummaryQuestion") @ApiOperation(value = "单条语料分析结论入库") - public AnalysisResp corpusSummaryQuestion(@RequestBody String requestDTO1) { - log.info("aiAnalyze corpusSummaryQuestion requestDTO: {}", JSON.toJSONString(requestDTO1)); - - SummaryQuestionRequestDTO requestDTO = new SummaryQuestionRequestDTO(); + public AnalysisResp corpusSummaryQuestion(@RequestBody SummaryQuestionRequestDTO requestDTO) { + log.info("aiAnalyze corpusSummaryQuestion requestDTO: {}", JSON.toJSONString(requestDTO)); // 打印接收到的参数 userQuestionSummaryService.updateSummery(requestDTO); - return AnalysisResp .success("ok"); + return AnalysisResp.success("ok"); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java index 99a46c9..296eed1 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java @@ -89,10 +89,10 @@ public class UserQuestionSummaryServiceImpl extends ServiceImpl Date: Thu, 24 Jul 2025 17:56:45 +0800 Subject: [PATCH 51/55] =?UTF-8?q?=E8=AF=AD=E6=96=99=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=88=86=E6=9E=90=E5=85=A5=E5=8F=82=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java | 2 +- .../center/service/impl/UserQuestionSummaryServiceImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java index c2df661..0fe2a34 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/dto/req/SummaryQuestionRequestDTO.java @@ -8,6 +8,6 @@ public class SummaryQuestionRequestDTO { private String summaryReportId; - private JSONObject preliminarySummaryResults; + private String preliminarySummaryResults; } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java index 296eed1..99a46c9 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java @@ -89,10 +89,10 @@ public class UserQuestionSummaryServiceImpl extends ServiceImpl Date: Thu, 24 Jul 2025 18:06:58 +0800 Subject: [PATCH 52/55] =?UTF-8?q?=E8=AF=AD=E6=96=99=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=88=86=E6=9E=90=E5=85=A5=E5=8F=82=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AiAnalysisDifyController.java | 24 +++++++++++++------ 1 file changed, 17 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 ffb5f4e..8cf1dd9 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,7 +1,6 @@ package com.volvo.ai.analytic.center.controller; -import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -17,12 +16,11 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.messaging.handler.annotation.Header; 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() @@ -38,6 +36,9 @@ public class AiAnalysisDifyController { @Autowired private UserQuestionSummaryService userQuestionSummaryService; + @Value("${rocketmq.producer.corpus.dcctopic}") + private String corpusQuestionAppKey; + @PostMapping("/updateByAiId") @ApiOperation(value = "更新dify结果") public ResultMsg updateByAiId(@RequestBody String message) { @@ -80,9 +81,18 @@ public class AiAnalysisDifyController { @PostMapping("/corpusSummaryQuestion") @ApiOperation(value = "单条语料分析结论入库") - public AnalysisResp corpusSummaryQuestion(@RequestBody SummaryQuestionRequestDTO requestDTO) { - log.info("aiAnalyze corpusSummaryQuestion requestDTO: {}", JSON.toJSONString(requestDTO)); + public AnalysisResp corpusSummaryQuestion( + @Header String appKey, + @RequestParam("summaryReportId") String summaryReportId, + @RequestParam("preliminarySummaryResults") String preliminarySummaryResults) { + log.info("aiAnalyze corpusSummaryQuestion appKey={},summaryReportId={},preliminarySummaryResults={}", appKey, summaryReportId, preliminarySummaryResults); + if (!corpusQuestionAppKey.equals(appKey)) { + return AnalysisResp.failed("appKey 不正确 "); + } // 打印接收到的参数 + SummaryQuestionRequestDTO requestDTO = new SummaryQuestionRequestDTO(); + requestDTO.setSummaryReportId(summaryReportId); + requestDTO.setPreliminarySummaryResults(preliminarySummaryResults); userQuestionSummaryService.updateSummery(requestDTO); return AnalysisResp.success("ok"); } From 1f6c1e429dd8a12d6b9901943fd6fc284fadf08f Mon Sep 17 00:00:00 2001 From: mliu71 Date: Thu, 24 Jul 2025 18:08:25 +0800 Subject: [PATCH 53/55] =?UTF-8?q?=E8=AF=AD=E6=96=99=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=88=86=E6=9E=90=E5=85=A5=E5=8F=82=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/analytic/center/controller/AiAnalysisDifyController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8cf1dd9..041774f 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 @@ -36,7 +36,7 @@ public class AiAnalysisDifyController { @Autowired private UserQuestionSummaryService userQuestionSummaryService; - @Value("${rocketmq.producer.corpus.dcctopic}") + @Value("${dify.corpusQuestion.appKey:z9B4hg9NFEikyfg81neDd1nl}") private String corpusQuestionAppKey; @PostMapping("/updateByAiId") From b2934a06ce0eb6a4c8b246c1b4d283202bffb006 Mon Sep 17 00:00:00 2001 From: mliu71 Date: Thu, 24 Jul 2025 18:18:31 +0800 Subject: [PATCH 54/55] =?UTF-8?q?=E8=AF=AD=E6=96=99=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=88=86=E6=9E=90=E5=85=A5=E5=8F=82=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytic/center/controller/AiAnalysisDifyController.java | 3 +-- 1 file changed, 1 insertion(+), 2 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 041774f..c170448 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 @@ -18,7 +18,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.messaging.handler.annotation.Header; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -82,7 +81,7 @@ public class AiAnalysisDifyController { @PostMapping("/corpusSummaryQuestion") @ApiOperation(value = "单条语料分析结论入库") public AnalysisResp corpusSummaryQuestion( - @Header String appKey, + @RequestHeader(value = "appKey", required = true) String appKey, @RequestParam("summaryReportId") String summaryReportId, @RequestParam("preliminarySummaryResults") String preliminarySummaryResults) { log.info("aiAnalyze corpusSummaryQuestion appKey={},summaryReportId={},preliminarySummaryResults={}", appKey, summaryReportId, preliminarySummaryResults); From 32ccb7d98d2fbad322694171c24f28f42aaa9494 Mon Sep 17 00:00:00 2001 From: "jie.lu" Date: Thu, 24 Jul 2025 23:53:35 +0800 Subject: [PATCH 55/55] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B1=87=E6=80=BB?= =?UTF-8?q?=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/UserQuestionSummaryServiceImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java index 99a46c9..c6e4625 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/UserQuestionSummaryServiceImpl.java @@ -89,10 +89,10 @@ public class UserQuestionSummaryServiceImpl extends ServiceImpl