Просмотр исходного кода

打标结果查询接口更新

2643616413 1 день назад
Родитель
Сommit
8b0c6f7474

+ 117 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/fastapivo/AiTaggingQueryResponseVo.java

@@ -21,8 +21,71 @@ public class AiTaggingQueryResponseVo {
     @ApiModel("标签数据包装")
     public static class AiTagDataWrapper {
 
+        @ApiModelProperty(value = "记录 ID")
+        private String id;
+
+        @ApiModelProperty(value = "应用 ID")
+        private String app_id;
+
+        @ApiModelProperty(value = "插入时间")
+        private String insert_time;
+
+        @ApiModelProperty(value = "业务属性")
+        private String business_attr;
+
+        @ApiModelProperty(value = "短语描述")
+        private String phrase;
+
+        @ApiModelProperty(value = "附件")
+        private String attachment;
+
+        @ApiModelProperty(value = "附件 URL")
+        private String attachment_url;
+
         @ApiModelProperty(value = "标签结果列表")
         private AiTagResultVo[] result;
+
+        @ApiModelProperty(value = "反馈用户 ID")
+        private String feedback_user_id;
+
+        @ApiModelProperty(value = "反馈用户名")
+        private String feedback_user_nm;
+
+        @ApiModelProperty(value = "反馈时间")
+        private String feedback_time;
+
+        @ApiModelProperty(value = "反馈内容")
+        private String feedback;
+
+        @ApiModelProperty(value = "反馈结果")
+        private String feedback_result;
+
+        @ApiModelProperty(value = "状态")
+        private Integer state;
+
+        @ApiModelProperty(value = "耗时")
+        private String consuming_time;
+
+        @ApiModelProperty(value = "合同号")
+        private String contract_no;
+
+        @ApiModelProperty(value = "正则匹配结果")
+        private String reg_result;
+
+        @ApiModelProperty(value = "反馈用户机构")
+        private String feedback_user_org;
+
+        @ApiModelProperty(value = "反馈用户端点")
+        private String feedback_user_endpoint;
+
+        @ApiModelProperty(value = "删除标记")
+        private Integer is_delete;
+
+        @ApiModelProperty(value = "标签范围")
+        private Integer tag_scope;
+
+        @ApiModelProperty(value = "分类 ID")
+        private String category_id;
     }
 
     @Data
@@ -51,3 +114,57 @@ public class AiTaggingQueryResponseVo {
         private String category_id;
     }
 }
+
+
+//
+//import io.swagger.annotations.ApiModel;
+//import io.swagger.annotations.ApiModelProperty;
+//import lombok.Data;
+//
+//@Data
+//@ApiModel("AI 打标查询响应")
+//public class AiTaggingQueryResponseVo {
+//
+//    @ApiModelProperty(value = "状态码 200(查询成功)/300(正在处理中)/500(处理失败)")
+//    private String code;
+//
+//    @ApiModelProperty(value = "消息内容")
+//    private String message;
+//
+//    @ApiModelProperty(value = "标签数据")
+//    private AiTagDataWrapper data;
+//
+//    @Data
+//    @ApiModel("标签数据包装")
+//    public static class AiTagDataWrapper {
+//
+//        @ApiModelProperty(value = "标签结果列表")
+//        private AiTagResultVo[] result;
+//    }
+//
+//    @Data
+//    @ApiModel("标签结果")
+//    public static class AiTagResultVo {
+//
+//        @ApiModelProperty(value = "标签 ID")
+//        private String id;
+//
+//        @ApiModelProperty(value = "标签名称")
+//        private String tag_name;
+//
+//        @ApiModelProperty(value = "标签代码")
+//        private String tag_code;
+//
+//        @ApiModelProperty(value = "标签路径")
+//        private String tag_path;
+//
+//        @ApiModelProperty(value = "是否 AI 推荐 true: AI 推荐的标签,false: 算法筛选出来但是被 LLM 淘汰的候选标签")
+//        private Boolean passr;
+//
+//        @ApiModelProperty(value = "解释说明")
+//        private String desc;
+//
+//        @ApiModelProperty(value = "分类 ID")
+//        private String category_id;
+//    }
+//}

+ 24 - 20
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagApiLogServiceImpl.java

@@ -18,6 +18,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
 @Service
@@ -37,6 +38,8 @@ public class AitagApiLogServiceImpl implements AitagApiLogService {
     // 当前缓存的日期
     private volatile String cachedDate = "";
 
+    private static final ReentrantLock sequenceLock = new ReentrantLock();
+
     @Override
     public void recordApiLog(AitagApiLog apiLog) {
         try {
@@ -50,31 +53,32 @@ public class AitagApiLogServiceImpl implements AitagApiLogService {
 
     @Override
     public String generateLogId() {
-        String currentDate = DATE_FORMAT.format(new Date());
-
-        // 检查是否需要刷新缓存(跨天了)
-        if (!currentDate.equals(cachedDate)) {
-            refreshCache(currentDate);
-        }
+        sequenceLock.lock();
+        try {
+            String currentDate = DATE_FORMAT.format(new Date());
 
-        // 从缓存获取并递增序列号
-        Long currentSequence = DATE_SEQUENCE_CACHE.get(currentDate);
-        if (currentSequence == null) {
-            // 缓存中没有数据,从数据库查询
-            loadFromDatabase(currentDate);
-            currentSequence = DATE_SEQUENCE_CACHE.get(currentDate);
-        }
+            if (!currentDate.equals(cachedDate)) {
+                refreshCache(currentDate);
+            }
 
-        currentSequence++;
-        DATE_SEQUENCE_CACHE.put(currentDate, currentSequence);
+            Long currentSequence = DATE_SEQUENCE_CACHE.get(currentDate);
+            if (currentSequence == null) {
+                loadFromDatabase(currentDate);
+                currentSequence = DATE_SEQUENCE_CACHE.get(currentDate);
+            }
 
-        // 重置序列号(超过6位数限制)
-        if (currentSequence > 999999) {
-            currentSequence = 1L;
+            currentSequence++;
             DATE_SEQUENCE_CACHE.put(currentDate, currentSequence);
-        }
 
-        return String.format("API%s%06d", currentDate, currentSequence);
+            if (currentSequence > 999999) {
+                currentSequence = 1L;
+                DATE_SEQUENCE_CACHE.put(currentDate, currentSequence);
+            }
+
+            return String.format("API%s%06d", currentDate, currentSequence);
+        } finally {
+            sequenceLock.unlock();
+        }
     }
 
     @Override

+ 35 - 68
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/FastApiServiceImpl.java

@@ -9,6 +9,7 @@ import cn.com.yusys.yusp.domain.vo.fastapivo.AiTaggingResponseVo;
 import cn.com.yusys.yusp.service.FastApiService;
 import com.alibaba.fastjson.JSON;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
@@ -23,7 +24,6 @@ import org.springframework.stereotype.Service;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 
-
 @Slf4j
 @Service
 public class FastApiServiceImpl implements FastApiService {
@@ -38,6 +38,7 @@ public class FastApiServiceImpl implements FastApiService {
     @Override
     public AiTaggingResponseVo tagging(AiTaggingRequestDto request) {
         String url = fastApiConfig.getUrl() + TAGGING_PATH;
+        log.info("收到 AI 打标请求:businessAttr={}, tagCategoryId={}", request.getBusinessAttr(), request.getTagCategoryId());
         log.info("调用 AI 打标接口:{}", url);
 
         try (CloseableHttpClient httpClient = createHttpClient()) {
@@ -49,8 +50,17 @@ public class FastApiServiceImpl implements FastApiService {
             httpPost.setEntity(new StringEntity(requestBody, "UTF-8"));
 
             try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
+                int statusCode = response.getStatusLine().getStatusCode();
                 String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
-                log.info("AI 打标接口响应:{}", responseBody);
+                log.info("AI 打标接口响应:状态码={}, 响应内容={}", statusCode, responseBody);
+
+                if (statusCode != 200) {
+                    log.error("AI 打标接口调用失败,HTTP 状态码:{}, 响应内容:{}", statusCode, responseBody);
+                    AiTaggingResponseVo errorResponse = new AiTaggingResponseVo();
+                    errorResponse.setCode(String.valueOf(statusCode));
+                    errorResponse.setMessage("AI 打标接口调用失败:" + (responseBody.isEmpty() ? "服务器内部错误" : responseBody));
+                    return errorResponse;
+                }
 
                 return JSON.parseObject(responseBody, AiTaggingResponseVo.class);
             }
@@ -72,8 +82,17 @@ public class FastApiServiceImpl implements FastApiService {
             HttpGet httpGet = new HttpGet(url);
 
             try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
+                int statusCode = response.getStatusLine().getStatusCode();
                 String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
-                log.info("AI 打标查询接口响应:{}", responseBody);
+                log.info("AI 打标查询接口响应:状态码={}, 响应内容={}", statusCode, responseBody);
+
+                if (statusCode != 200) {
+                    log.error("AI 打标查询接口调用失败,HTTP 状态码:{}, 响应内容:{}", statusCode, responseBody);
+                    AiTaggingQueryResponseVo errorResponse = new AiTaggingQueryResponseVo();
+                    errorResponse.setCode(String.valueOf(statusCode));
+                    errorResponse.setMessage("AI 打标查询接口调用失败:" + (responseBody.isEmpty() ? "服务器内部错误" : responseBody));
+                    return errorResponse;
+                }
 
                 return JSON.parseObject(responseBody, AiTaggingQueryResponseVo.class);
             }
@@ -87,67 +106,6 @@ public class FastApiServiceImpl implements FastApiService {
     }
 
 
-//    @Override
-//    public AiTaggingResponseVo feedback(AiTaggingFeedbackRequestDto request) {
-//        StringBuilder urlBuilder = new StringBuilder(fastApiConfig.getUrl()).append(FEEDBACK_PATH);
-//
-//        // 构造 GET 请求参数
-//        boolean hasParams = false;
-//
-//        if (request.getUserId() != null && !request.getUserId().isEmpty()) {
-//            urlBuilder.append(hasParams ? "&" : "?").append("user_id=").append(encodeParam(request.getUserId()));
-//            hasParams = true;
-//        }
-//
-//        if (request.getUserNm() != null && !request.getUserNm().isEmpty()) {
-//            urlBuilder.append(hasParams ? "&" : "?").append("user_nm=").append(encodeParam(request.getUserNm()));
-//            hasParams = true;
-//        }
-//
-//        // feedback 是必填参数
-//        urlBuilder.append(hasParams ? "&" : "?").append("feedback=").append(encodeParam(request.getFeedback()));
-//        hasParams = true;
-//
-//        if (request.getContractNo() != null && !request.getContractNo().isEmpty()) {
-//            urlBuilder.append(hasParams ? "&" : "?").append("contract_no=").append(encodeParam(request.getContractNo()));
-//            hasParams = true;
-//        }
-//
-//        if (request.getUserOrg() != null && !request.getUserOrg().isEmpty()) {
-//            urlBuilder.append(hasParams ? "&" : "?").append("user_org=").append(encodeParam(request.getUserOrg()));
-//            hasParams = true;
-//        }
-//
-//        if (request.getUserEndpoint() != null && !request.getUserEndpoint().isEmpty()) {
-//            urlBuilder.append(hasParams ? "&" : "?").append("user_endpoint=").append(encodeParam(request.getUserEndpoint()));
-//            hasParams = true;
-//        }
-//
-//        // business_attr 是必填参数
-//        urlBuilder.append(hasParams ? "&" : "?").append("business_attr=").append(encodeParam(request.getBusinessAttr()));
-//
-//        String url = urlBuilder.toString();
-//        log.info("调用 AI 打标反馈接口:{}", url);
-//
-//        try (CloseableHttpClient httpClient = createHttpClient()) {
-//            HttpGet httpGet = new HttpGet(url);
-//
-//            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
-//                String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
-//                log.info("AI 打标反馈接口响应:{}", responseBody);
-//
-//                return JSON.parseObject(responseBody, AiTaggingResponseVo.class);
-//            }
-//        } catch (Exception e) {
-//            log.error("调用 AI 打标反馈接口失败", e);
-//            AiTaggingResponseVo errorResponse = new AiTaggingResponseVo();
-//            errorResponse.setCode("500");
-//            errorResponse.setMessage("调用 AI 打标反馈接口失败:" + e.getMessage());
-//            return errorResponse;
-//        }
-//    }
-
-
     @Override
     public AiTaggingResponseVo feedback(AiTaggingFeedbackRequestDto request) {
         String url = fastApiConfig.getUrl() + FEEDBACK_PATH;
@@ -175,8 +133,17 @@ public class FastApiServiceImpl implements FastApiService {
             httpPost.setEntity(new StringEntity(requestBody, "UTF-8"));
 
             try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
+                int statusCode = response.getStatusLine().getStatusCode();
                 String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
-                log.info("AI 打标反馈接口响应:{}", responseBody);
+                log.info("AI 打标反馈接口响应:状态码={}, 响应内容={}", statusCode, responseBody);
+
+                if (statusCode != 200) {
+                    log.error("AI 打标反馈接口调用失败,HTTP 状态码:{}, 响应内容:{}", statusCode, responseBody);
+                    AiTaggingResponseVo errorResponse = new AiTaggingResponseVo();
+                    errorResponse.setCode(String.valueOf(statusCode));
+                    errorResponse.setMessage("AI 打标反馈接口调用失败:" + (responseBody.isEmpty() ? "服务器内部错误" : responseBody));
+                    return errorResponse;
+                }
 
                 return JSON.parseObject(responseBody, AiTaggingResponseVo.class);
             }
@@ -190,18 +157,18 @@ public class FastApiServiceImpl implements FastApiService {
     }
 
 
-    // 辅助方法用于URL编码
+    // 辅助方法用于 URL 编码
     private String encodeParam(String param) {
         try {
             return URLEncoder.encode(param, "UTF-8");
         } catch (UnsupportedEncodingException e) {
-            log.warn("URL编码失败,使用原始值: {}", param);
+            log.warn("URL 编码失败,使用原始值:{}", param);
             return param;
         }
     }
 
     /**
-     * 创建HTTP客户端
+     * 创建 HTTP 客户端
      */
     private CloseableHttpClient createHttpClient() {
         RequestConfig requestConfig = RequestConfig.custom()