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