Преглед на файлове

请求 二组AI 服务标签评论

qxy преди 2 месеца
родител
ревизия
779f35b8a0

+ 67 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreCommentSummary.java

@@ -0,0 +1,67 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * AI服务 店铺评论总结表:记录店铺评论的时间范围、任务信息、总结内容等
+ */
+@Data
+@JsonInclude
+@TableName("tags_main")
+@ApiModel(value = "tags_main", description = "tags_main")
+public class StoreCommentSummary {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "店铺ID(新增字段)")
+    @TableField("store_id")
+    private Integer storeId;
+
+    @ApiModelProperty(value = "店铺名称(对应表格“店铺名称”)")
+    @TableField("store_name")
+    private String storeName;
+
+    @ApiModelProperty(value = "总结内容(对应表格“总结内容”,允许为空)")
+    @TableField("summary")
+    private String summary;
+
+    @ApiModelProperty(value = "任务唯一标识(如 UUID,新增字段)")
+    @TableField("task_id")
+    private String taskId;
+
+    @ApiModelProperty(value = "是否显示:0-不显示,1-显示(新增字段)")
+    @TableField("is_show")
+    private Integer isShow;
+
+    @ApiModelProperty(value = "删除标识")
+    @TableLogic
+    @TableField("delete_flag")
+    private Integer  deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}

+ 61 - 0
alien-entity/src/main/java/shop/alien/entity/store/TagsMain.java

@@ -0,0 +1,61 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * AI服务标签主表
+ */
+@Data
+@JsonInclude
+@TableName("tags_main")
+@ApiModel(value = "tags_main", description = "tags_main")
+public class TagsMain {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "标签名称")
+    @TableField("tag_name")
+    private String tagName;
+
+    @ApiModelProperty(value = "删除标识")
+    @TableLogic
+    @TableField("delete_flag")
+    private Integer  deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "门店id")
+    @TableField("store_id")
+    private Integer storeId;
+
+    @ApiModelProperty(value = "标签类型,0:好评,1:中评,2:差评")
+    @TableField("tag_type")
+    private Integer tagType;
+
+}

+ 67 - 0
alien-entity/src/main/java/shop/alien/entity/store/TagsSynonym.java

@@ -0,0 +1,67 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * AI服务标签子表
+ */
+@Data
+@JsonInclude
+@TableName("tags_synonym")
+@ApiModel(value = "tags_synonym", description = "tags_synonym")
+public class TagsSynonym {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "主标签ID")
+    @TableField("main_tag_id")
+    private Integer mainTagId;
+
+    @ApiModelProperty(value = "评论ID")
+    @TableField("comment_id")
+    private Integer commentId;
+
+    @ApiModelProperty(value = "子标签名称")
+    @TableField("synonym_tag")
+    private String synonymTag;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    private int deleteFlag;
+
+    @ApiModelProperty(value = "标签类型, 0:店铺级标签, 1:商品级标签")
+    @TableField("tag_type")
+    private int tagType;
+
+    @ApiModelProperty(value = "任务唯一标识(由生产者生成,如 UUID)")
+    @TableField("task_id")
+    private String taskId;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}

+ 22 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/TagsMainVo.java

@@ -0,0 +1,22 @@
+package shop.alien.entity.store.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import shop.alien.entity.store.TagsMain;
+
+
+@Data
+@JsonInclude
+@NoArgsConstructor
+@ApiModel(value = "TagsMainVo对象", description = "AI服务标签")
+public class TagsMainVo extends TagsMain {
+
+    @ApiModelProperty(value = "评价数量")
+    private Integer evaluateNumber;
+
+
+}

+ 44 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreCommentSummaryMapper.java

@@ -0,0 +1,44 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import shop.alien.entity.store.StoreCommentSummary;
+
+
+import java.util.List;
+
+/**
+ * qxy
+ * AI 服务 推荐数据信息 店铺评论总结表
+ */
+@Mapper
+public interface StoreCommentSummaryMapper extends BaseMapper<StoreCommentSummary> {
+
+    @Insert({
+            "<script>", // 开启动态 SQL 脚本
+            "INSERT INTO store_comment_summary (",
+            "  id, store_id, store_name, summary, task_id, is_show, delete_flag, created_time, created_user_id,",
+            "  updated_time, updated_user_id",
+            ")",
+            "VALUES",
+            "<foreach collection='list' item='item' separator=','>",
+            "(",
+            "  #{item.id},",
+            "  #{item.storeId},",
+            "  #{item.storeName},",
+            "  #{item.summary},",
+            "  #{item.taskId},",
+            "  #{item.isShow},",
+            "  #{item.deleteFlag},",
+            "  #{item.createdTime},",
+            "  #{item.createdUserId},",
+            "  #{item.updatedTime},",
+            "  #{item.updatedUserId}",
+            ")",
+            "</foreach>",
+            "</script>" // 关闭动态 SQL 脚本
+    })
+    int insertBatchStoreCommentSummary(List<StoreCommentSummary> storeCommentSummaryList);
+
+}

+ 62 - 0
alien-entity/src/main/java/shop/alien/mapper/TagsMainMapper.java

@@ -0,0 +1,62 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.store.TagsMain;
+import shop.alien.entity.store.vo.TagsMainVo;
+
+import java.util.List;
+
+/**
+ * qxy
+ * AI 服务标签主表
+ */
+@Mapper
+public interface TagsMainMapper extends BaseMapper<TagsMain> {
+
+    @Insert({
+            "<script>", // 开启动态 SQL 脚本
+            "INSERT INTO tags_main (",
+            "  id, tag_name, delete_flag, created_time, created_user_id,",
+            "  updated_time, updated_user_id, store_id, tag_type",
+            ")",
+            "VALUES",
+            "<foreach collection='list' item='item' separator=','>",
+            "(",
+            "  #{item.id},",
+            "  #{item.tagName},",
+            "  #{item.deleteFlag},",
+            "  #{item.createdTime},",
+            "  #{item.createdUserId},",
+            "  #{item.updatedTime},",
+            "  #{item.updatedUserId},",
+            "  #{item.storeId},",
+            "  #{item.tagType}",
+            ")",
+            "</foreach>",
+            "</script>" // 关闭动态 SQL 脚本
+    })
+    int insertBatchTagsMain(List<TagsMain> tagsMainList);
+
+    @Select("\tSELECT\n" +
+            "\tmain.id,\n" +
+            "\tmain.tag_name,\n" +
+            "\tmain.store_id,\n" +
+            "\tmain.tag_type,\n" +
+            "\tCOUNT(main.id) AS evaluateNumber\n" +
+            "FROM\n" +
+            "\ttags_main main \n" +
+            "\tLEFT JOIN tags_synonym synonym ON main.id = synonym.main_tag_id \n" +
+            "\tAND synonym.tag_type = 0 \n" +
+            "WHERE\n" +
+            "\tmain.store_id = 685 \n" +
+            "\tAND main.delete_flag = 0\n" +
+            "\tAND synonym.delete_flag = 0\n" +
+            "GROUP BY\n" +
+            "\tmain.id\t\n" +
+            "ORDER BY\n" +
+            "\tmain.id;")
+    List<TagsMainVo> getStoreEvaluateTags(int storeId);
+}

+ 43 - 0
alien-entity/src/main/java/shop/alien/mapper/TagsSynonymMapper.java

@@ -0,0 +1,43 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import shop.alien.entity.store.TagsSynonym;
+
+import java.util.List;
+
+/**
+ * qxy
+ * AI 服务标签子表
+ */
+
+@Mapper
+public interface TagsSynonymMapper extends BaseMapper<TagsSynonym> {
+
+    @Insert({
+            "<script>", // 开启动态 SQL 脚本
+            "INSERT INTO tags_synonym (",
+            "  id, main_tag_id, comment_id, synonym_tag, delete_flag, created_time, created_user_id,",
+            "  updated_time, updated_user_id, tag_type, task_id",
+            ")",
+            "VALUES",
+            "<foreach collection='list' item='item' separator=','>",
+            "(",
+            "  #{item.id},",
+            "  #{item.mainTagId},",
+            "  #{item.commentId},",
+            "  #{item.synonymTag},",
+            "  #{item.deleteFlag},",
+            "  #{item.createdTime},",
+            "  #{item.createdUserId},",
+            "  #{item.updatedTime},",
+            "  #{item.updatedUserId},",
+            "  #{item.tagType},",
+            "  #{item.taskId}",
+            ")",
+            "</foreach>",
+            "</script>" // 关闭动态 SQL 脚本
+    })
+    int insertBatchTagsSynonym(List<TagsSynonym> tagsSynonymList);
+}

+ 345 - 0
alien-job/src/main/java/shop/alien/job/store/AiTagJob.java

@@ -0,0 +1,345 @@
+package shop.alien.job.store;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+import shop.alien.entity.store.StoreCommentSummary;
+import shop.alien.entity.store.TagsMain;
+import shop.alien.entity.store.TagsSynonym;
+import shop.alien.mapper.StoreCommentSummaryMapper;
+import shop.alien.mapper.TagsMainMapper;
+import shop.alien.mapper.TagsSynonymMapper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *调用AI标签数据服务类
+ *
+ * @author qxy
+ * @date 2025/9/12 14:21
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class AiTagJob {
+
+    private final RestTemplate restTemplate;
+
+    private final TagsMainMapper tagsMainMapper;
+
+    private final TagsSynonymMapper tagsSynonymMapper;
+
+    private final StoreCommentSummaryMapper storeCommentSummaryMapper;
+
+    // 第三方接口地址 获取所有标签主表信息
+    @Value("${third-party-tag.base-url}")
+    private String tagMainUrl;
+
+    // 第三方接口地址 获取所有标签子表信息
+    @Value("${third-party-synonym.base-url}")
+    private String tagsSynonymUrl;
+
+    // 第三方接口地址 获取推荐信息数据 店铺评论总结表
+    @Value("${third-party-summary.base-url}")
+    private String allSummaryUrl;
+
+    // 第三方接口地址 登录接口URL
+    @Value("${third-party-login.base-url}")
+    private String loginUrl;
+
+    @Value("${third-party-user-name.base-url}")
+    private String userName;
+
+    @Value("${third-party-pass-word.base-url}")
+    private String passWord;
+
+    /**
+     * 拉取Ai服务标签主表数据
+     */
+    @XxlJob("getTagMainTask")
+    public String getTagMainTask() {
+        log.info("登录第三方服务获取token..." + loginUrl);
+        //构建请求参数
+        MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
+        formData.add("username", userName);    // 表单字段 1:用户名
+        formData.add("password", passWord);    // 表单字段 2:密码
+
+        //设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
+        ResponseEntity<String> postForEntity = null;
+        try {
+            postForEntity = restTemplate.postForEntity(loginUrl, requestEntity, String.class);
+        } catch (Exception e) {
+            log.error("类:PostMethod 方法:post", e);
+        }
+
+        if (postForEntity != null) {
+            if (postForEntity.getStatusCodeValue() == 200) {
+                log.info("postForEntity.getBody()\t" + postForEntity.getBody());
+                String responseBody = postForEntity.getBody();
+                JSONObject jsonObject = JSONObject.parseObject(responseBody);
+                JSONObject dataJson = jsonObject.getJSONObject("data");
+                String accessToken = dataJson.getString("access_token");
+                //调用 获取AI服务 标签主表get请求
+                getTagMainTaskInfo(accessToken);
+            } else {
+                log.error("请求AI服务 登录接口失败 http状态:" + postForEntity.getStatusCode());
+                return null;
+            }
+        }
+
+        return null;
+    }
+
+    public String getTagMainTaskInfo(String token) {
+        log.info("开始从第三方服务获取标签主表信息...");
+        log.info("restTemplate:" + restTemplate + "url:" + tagMainUrl);
+        // 1. 构建请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Authorization", "Bearer " + token); // Token 认证
+        headers.set("accept", "*/*");
+        headers.set("connection", "Keep-Alive");
+        headers.set("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+        // 2. 构建请求实体(仅包含头信息,GET 请求通常无请求体)
+        HttpEntity<?> requestEntity = new HttpEntity<>(headers);
+
+        // 发送 GET 请求,响应体为 String 类型
+        ResponseEntity<String> responseEntity = restTemplate.exchange(
+                tagMainUrl,
+                HttpMethod.GET,  // 指定请求方法为 GET
+                requestEntity,
+                String.class     // 响应体类型
+        );
+
+        // 解析响应
+        if (responseEntity.getStatusCodeValue() == 200) {
+            String responseBody = responseEntity.getBody();
+            JSONObject jsonObject = JSONObject.parseObject(responseBody);
+            Integer code = jsonObject.getInteger("code");
+            String message = jsonObject.getString("message");
+            JSONArray dataArray = jsonObject.getJSONArray("data");
+            List<TagsMain> tagsMainList = new ArrayList<>();
+            for(int i = 0; i<dataArray.size(); i++){
+                JSONObject tagObj = dataArray.getJSONObject(i);
+                TagsMain tagsMain = new TagsMain();
+                tagsMain.setId(tagObj.getInteger("id"));
+                tagsMain.setTagName(tagObj.getString("tag_name"));
+                tagsMain.setStoreId(tagObj.getInteger("store_id"));
+                tagsMain.setTagType(tagObj.getInteger("tag_type"));
+                tagsMain.setDeleteFlag(tagObj.getInteger("delete_flag"));
+                tagsMain.setCreatedTime(tagObj.getDate("created_time"));
+                tagsMain.setCreatedUserId(tagObj.getInteger("created_user_id"));
+                tagsMain.setUpdatedTime(tagObj.getDate("updated_time"));
+                tagsMain.setUpdatedUserId(tagObj.getInteger("updated_user_id"));
+                tagsMainList.add(tagsMain);
+            }
+            if(!CollectionUtils.isEmpty(tagsMainList)){
+                tagsMainMapper.insertBatchTagsMain(tagsMainList);
+            }
+
+        } else {
+            log.info("AI服务主表请求失败,状态码:" + responseEntity.getStatusCodeValue());
+        }
+        return null;
+    }
+
+
+    /**
+     * 拉取Ai服务标签数据
+     */
+    @XxlJob("getTagsSynonymTask")
+    public String getTagsSynonymTask() {
+        log.info("登录第三方服务获取token..." + loginUrl);
+        //构建请求参数
+        MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
+        formData.add("username", userName);    // 表单字段 1:用户名
+        formData.add("password", passWord);    // 表单字段 2:密码
+
+        //设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
+        ResponseEntity<String> postForEntity = null;
+        try {
+            postForEntity = restTemplate.postForEntity(loginUrl, requestEntity, String.class);
+        } catch (Exception e) {
+            log.error("类:PostMethod 方法:post", e);
+        }
+
+        if (postForEntity != null) {
+            if (postForEntity.getStatusCodeValue() == 200) {
+                log.info("postForEntity.getBody()\t" + postForEntity.getBody());
+                String responseBody = postForEntity.getBody();
+                JSONObject jsonObject = JSONObject.parseObject(responseBody);
+                JSONObject dataJson = jsonObject.getJSONObject("data");
+                String accessToken = dataJson.getString("access_token");
+                //调用 获取AI服务 标签子表get请求
+                getTagsSynonymTaskInfo(accessToken);
+            } else {
+                log.error("请求AI服务 登录接口失败 http状态:" + postForEntity.getStatusCode());
+                return null;
+            }
+        }
+
+        return null;
+    }
+
+    public String getTagsSynonymTaskInfo(String token) {
+        log.info("开始从第三方服务获取数据 获取所有标签子表信息...");
+        log.info("restTemplate:" + restTemplate + "url:" + tagsSynonymUrl);
+        // 1. 构建请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Authorization", "Bearer " + token); // Token 认证
+        headers.set("accept", "*/*");
+        headers.set("connection", "Keep-Alive");
+        headers.set("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+        // 2. 构建请求实体(仅包含头信息,GET 请求通常无请求体)
+        HttpEntity<?> requestEntity = new HttpEntity<>(headers);
+
+        // 发送 GET 请求,响应体为 String 类型
+        ResponseEntity<String> responseEntity = restTemplate.exchange(
+                tagsSynonymUrl,
+                HttpMethod.GET,  // 指定请求方法为 GET
+                requestEntity,
+                String.class     // 响应体类型
+        );
+
+        // 解析响应
+        if (responseEntity.getStatusCodeValue() == 200) {
+            String responseBody = responseEntity.getBody();
+            JSONObject jsonObject = JSONObject.parseObject(responseBody);
+            Integer code = jsonObject.getInteger("code");
+            String message = jsonObject.getString("message");
+            JSONArray dataArray = jsonObject.getJSONArray("data");
+            List<TagsSynonym> tagsSynonymList = new ArrayList<>();
+            for(int i = 0; i<dataArray.size(); i++){
+                JSONObject tagObj = dataArray.getJSONObject(i);
+                TagsSynonym tagsSynonym = new TagsSynonym();
+                tagsSynonym.setId(tagObj.getInteger("id"));
+                tagsSynonym.setMainTagId(tagObj.getInteger("main_tag_id"));
+                tagsSynonym.setCommentId(tagObj.getInteger("comment_id"));
+                tagsSynonym.setSynonymTag(tagObj.getString("synonym_tag"));
+                tagsSynonym.setTagType(tagObj.getInteger("tag_type"));
+                tagsSynonym.setTaskId(tagObj.getString("task_id"));
+                tagsSynonym.setDeleteFlag(tagObj.getInteger("delete_flag"));
+                tagsSynonym.setCreatedTime(tagObj.getDate("created_time"));
+                tagsSynonym.setCreatedUserId(tagObj.getInteger("created_user_id"));
+                tagsSynonym.setUpdatedTime(tagObj.getDate("updated_time"));
+                tagsSynonym.setUpdatedUserId(tagObj.getInteger("updated_user_id"));
+                tagsSynonymList.add(tagsSynonym);
+            }
+            if(!CollectionUtils.isEmpty(tagsSynonymList)){
+                tagsSynonymMapper.insertBatchTagsSynonym(tagsSynonymList);
+            }
+        } else {
+            log.info("AI服务子表请求失败,状态码:" + responseEntity.getStatusCodeValue());
+        }
+        return null;
+    }
+
+    /**
+     * 拉取Ai服务获取所有推荐信息数据
+     */
+    @XxlJob("getStoreCommentSummaryTask")
+    public String getStoreCommentSummaryTask() {
+        log.info("登录第三方服务获取token..." + loginUrl);
+        //构建请求参数
+        MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
+        formData.add("username", userName);    // 表单字段 1:用户名
+        formData.add("password", passWord);    // 表单字段 2:密码
+
+        //设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
+        ResponseEntity<String> postForEntity = null;
+        try {
+            postForEntity = restTemplate.postForEntity(loginUrl, requestEntity, String.class);
+        } catch (Exception e) {
+            log.error("类:PostMethod 方法:post", e);
+        }
+
+        if (postForEntity != null) {
+            if (postForEntity.getStatusCodeValue() == 200) {
+                log.info("postForEntity.getBody()\t" + postForEntity.getBody());
+                String responseBody = postForEntity.getBody();
+                JSONObject jsonObject = JSONObject.parseObject(responseBody);
+                JSONObject dataJson = jsonObject.getJSONObject("data");
+                String accessToken = dataJson.getString("access_token");
+                //调用 获取AI服务 获取所有推荐信表 get请求
+                getStoreCommentSummaryTaskInfo(accessToken);
+            } else {
+                log.error("请求AI服务 登录接口失败 http状态:" + postForEntity.getStatusCode());
+                return null;
+            }
+        }
+
+        return null;
+    }
+
+    public String getStoreCommentSummaryTaskInfo(String token) {
+        log.info("开始从第三方服务获取数据 获取推荐信息数据 店铺评论总结表...");
+        log.info("restTemplate:" + restTemplate + "url:" + allSummaryUrl);
+        // 1. 构建请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Authorization", "Bearer " + token); // Token 认证
+        headers.set("accept", "*/*");
+        headers.set("connection", "Keep-Alive");
+        headers.set("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+        // 2. 构建请求实体(仅包含头信息,GET 请求通常无请求体)
+        HttpEntity<?> requestEntity = new HttpEntity<>(headers);
+
+        // 发送 GET 请求,响应体为 String 类型
+        ResponseEntity<String> responseEntity = restTemplate.exchange(
+                allSummaryUrl,
+                HttpMethod.GET,  // 指定请求方法为 GET
+                requestEntity,
+                String.class     // 响应体类型
+        );
+
+        // 解析响应
+        if (responseEntity.getStatusCodeValue() == 200) {
+            String responseBody = responseEntity.getBody();
+            JSONObject jsonObject = JSONObject.parseObject(responseBody);
+            Integer code = jsonObject.getInteger("code");
+            String message = jsonObject.getString("message");
+            JSONArray dataArray = jsonObject.getJSONArray("data");
+            List<StoreCommentSummary> storeCommentSummaries = new ArrayList<>();
+            for(int i = 0; i<dataArray.size(); i++){
+                JSONObject tagObj = dataArray.getJSONObject(i);
+                StoreCommentSummary summary = new StoreCommentSummary();
+                summary.setId(tagObj.getInteger("id"));
+                summary.setStoreId(tagObj.getInteger("store_id"));
+                summary.setStoreName(tagObj.getString("store_name"));
+                summary.setSummary(tagObj.getString("summary"));
+                summary.setTaskId(tagObj.getString("task_id"));
+                summary.setIsShow(tagObj.getInteger("is_show"));
+                summary.setDeleteFlag(tagObj.getInteger("delete_flag"));
+                summary.setCreatedTime(tagObj.getDate("created_time"));
+                summary.setCreatedUserId(tagObj.getInteger("created_user_id"));
+                summary.setUpdatedTime(tagObj.getDate("updated_time"));
+                summary.setUpdatedUserId(tagObj.getInteger("updated_user_id"));
+                storeCommentSummaries.add(summary);
+            }
+            if(!CollectionUtils.isEmpty(storeCommentSummaries)){
+                storeCommentSummaryMapper.insertBatchStoreCommentSummary(storeCommentSummaries);
+            }
+        } else {
+            log.info("AI服务 推荐信息数据请求失败,状态码:" + responseEntity.getStatusCodeValue());
+        }
+        return null;
+    }
+
+}

+ 14 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreInfoController.java

@@ -17,6 +17,7 @@ import shop.alien.entity.store.StoreInfoDraft;
 import shop.alien.entity.store.dto.StoreInfoDto;
 import shop.alien.entity.store.vo.*;
 import shop.alien.mapper.StoreImgMapper;
+import shop.alien.mapper.TagsMainMapper;
 import shop.alien.store.service.StoreInfoService;
 
 import java.io.IOException;
@@ -43,6 +44,8 @@ public class StoreInfoController {
 
     private final StoreImgMapper storeImgMapper;
 
+    private final TagsMainMapper tagsMainMapper;
+
     @ApiOperation("获取所有门店")
     @ApiOperationSupport(order = 1)
     @GetMapping("/getAll")
@@ -707,4 +710,15 @@ public class StoreInfoController {
         return R.fail("审核失败 店铺不存在");
     }
 
+    @ApiOperation(value = "AI服务-门店评价标签")
+    @GetMapping("/getStoreEvaluateTags")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "int", paramType = "query")
+    })
+    public R<List<TagsMainVo>> getStoreEvaluateTags(int storeId) {
+        log.info("StoreInfoController.getStoreEvaluateTags?storeId={}", storeId);
+        List<TagsMainVo> voList = tagsMainMapper.getStoreEvaluateTags(storeId);
+        return R.data(voList);
+    }
+
 }