Merge branch 'master' into feature_20250519_nameplate

# Conflicts:
#	ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/job/CorpusFailJob.java
#	ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/TmTelephoneCorpusServiceImpl.java
This commit is contained in:
jie.lu
2025-08-21 10:02:18 +08:00
61 changed files with 3769 additions and 29 deletions

View File

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

View File

@@ -0,0 +1,38 @@
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 Long id;
private String sessionId;
/**
* 消息内容文本
*/
private String msgContent;
/**
* 客户类型0:用户 1:百度 2:GPT 3:人工 4:唯都Agent
*/
private Integer customerType;
private Long msgTimestamp;
private String userDemand;
public ImCurMessageDTO() {
}
}

View File

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

View File

@@ -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<T> {
/**
* 事件来源上下文标识串,source+id可以唯一确定一个事件
*/
@Schema(description = "事件来源上下文标识串,source+id可以唯一确定一个事件")
private String source;
/**
* 事件类型
*/
@Schema(description = "事件类型")
private String type;
/**
* 事件发生的主题或对象,用以标识哪个具体对象发生了当前事件
*/
@Schema(description = "事件发生的主题或对象,用以标识哪个具体对象发生了当前事件")
private String subject;
/**
* 事件的负载内容
*/
@Schema(description = "事件的负载内容")
private T data;
}

View File

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

View File

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

View File

@@ -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<SubscriptionTarget> targets = null;
}

View File

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

View File

@@ -33,4 +33,7 @@ public class ClaimVerificationFileDTO {
//诊断报告
private JSONObject diagnosticReport;
//诊断报告
private JSONObject warrantyReport;
}

View File

@@ -0,0 +1,18 @@
package com.volvo.ai.analytic.center.dto.req;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class ConsultingRequestDTO {
private String businessType; // 新增字段
private String text;
private String sourceCorpusId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date sourceCorpusTime;
}

View File

@@ -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<String> files;
private String platform;
private String theme;
private String communityRequestId;
private String redNoteType;
private String userId;
private String postUrl;
}

View File

@@ -0,0 +1,13 @@
package com.volvo.ai.analytic.center.dto.req;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
@Data
public class SummaryQuestionRequestDTO {
private String summaryReportId;
private String preliminarySummaryResults;
}

View File

@@ -16,4 +16,53 @@ public class ResultDTO<T> implements Serializable {
private String errMsg;
private T data;
public ResultDTO() {
}
public static <T> ResultDTO<T> success() {
return success("200", "成功");
}
public static <T> ResultDTO<T> success(T t) {
return success("200", "成功", t);
}
public static <T> ResultDTO<T> success(String successCode, String successMessage) {
return success(successCode, successMessage, null);
}
public static <T> ResultDTO<T> success(String successCode, String successMessage, T t) {
ResultDTO<T> responseDTO = new ResultDTO<>();
responseDTO.setReturnCode(successCode);
responseDTO.setReturnMessage(successMessage);
responseDTO.setData(t);
return responseDTO;
}
public static <T> ResultDTO<T> failure() {
return failure("500", "处理异常");
}
public static <T> ResultDTO<T> failure(T t) {
return failure("500", "处理异常", t);
}
public static <T> ResultDTO<T> failure(String failureCode, String failureMessage) {
return failure(failureCode, failureMessage, null);
}
public static <T> ResultDTO<T> failure(String failureMessage) {
return failure("500", failureMessage, null);
}
public static <T> ResultDTO<T> failure(String failureCode, String failureMessage, T t) {
ResultDTO<T> responseDTO = new ResultDTO<>();
responseDTO.setReturnCode(failureCode);
responseDTO.setReturnMessage(failureMessage);
responseDTO.setData(t);
return responseDTO;
}
}

View File

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

View File

@@ -0,0 +1,125 @@
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("user_demand")
private String userDemand;
/**
* 分析结果
*/
@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;
/**
* 原语料外部主键
*/
@TableField("source_corpus_id")
private String sourceCorpusId;
/**
* 原语料时间
*/
@TableField("source_corpus_time")
private Date sourceCorpusTime;
}

View File

@@ -0,0 +1,105 @@
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;
/**
* 关联id
*/
@TableField("summary_report_id")
private String summaryReportId;
/**
* 删除标识(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;
}

View File

@@ -0,0 +1,232 @@
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.util.Date;
/**
* @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 Date testDriveStartTime;
/**
* 试驾结束时间
*/
@TableField("test_drive_end_time")
private Date 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 Date createdTime;
/**
* 创建人
*/
@TableField("created_by")
private String createdBy;
/**
* 更新时间
*/
@TableField("updated_time")
private Date updatedTime;
/**
* 更新人
*/
@TableField("updated_by")
private String updatedBy;
/**
* 删除标志位,0:未删除,1:已删除
*/
@TableField("is_deleted")
private Byte isDeleted;
}

View File

@@ -0,0 +1,171 @@
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.util.Date;
/**
* @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 Date 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 Date createdTime;
/**
* 创建人
*/
@TableField("created_by")
private String createdBy;
/**
* 更新时间
*/
@TableField("updated_time")
private Date updatedTime;
/**
* 更新人
*/
@TableField("updated_by")
private String updatedBy;
/**
* 删除标志位,0:未删除,1:已删除
*/
@TableField("is_deleted")
private Byte isDeleted;
}

View File

@@ -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", "索赔检核文件分析"),
@@ -26,7 +26,18 @@ public enum BusinessTypeEnum {
CASE("case", "舆情事件"),
SMART_ASSISTANT_NAMEPLATE("SMART_ASSISTANT_NAMEPLATE", "智能助手-铭牌")
SMART_ASSISTANT_NAMEPLATE("SMART_ASSISTANT_NAMEPLATE", "智能助手-铭牌"),
IM_CORPUS_ANALYSIS("IM_CORPUS_ANALYSIS", "IM语料库"),
SUMMARY_REPORT("SUMMARY_REPORT", "问题总结"),
//特邀发言官
SPOKESMAN("SPOKESMAN", "特邀发言官"),
//特邀发言官敏感词
SPOKESMAN_SENSITIVE_WORD("SPOKESMAN_SENSITIVE_WORD", "特邀发言官敏感词"),
//特邀发言官审核规则
SPOKESMAN_AUDIT_RULE("SPOKESMAN_AUDIT_RULE", "特邀发言官审核规则"),
;
private String code;

View File

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

View File

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