Browse Source

Merge remote-tracking branch 'origin/master'

2507040827 1 day ago
parent
commit
eff4dea69e

+ 11 - 34
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/FastApiController.java

@@ -38,68 +38,45 @@ public class FastApiController {
         }
     }
 
-    @ApiOperationType("AI打标查询")
+    @ApiOperationType("AI 打标查询")
     @GetMapping("/query")
     public Result<AiTaggingQueryResponseVo> query(
-            @RequestParam(required = false) String appId,
-            @RequestParam(required = false) String timestamp,
-            @RequestParam(required = false) String sign,
             @Valid @RequestParam String businessAttr) {
         try {
-            log.info("收到AI打标查询请求: appId={}, businessAttr={}", appId, businessAttr);
+            log.info("收到 AI 打标查询请求:businessAttr={}", businessAttr);
 
             AiTaggingQueryRequestDto request = new AiTaggingQueryRequestDto();
-            request.setAppId(appId);
-            request.setTimestamp(timestamp);
-            request.setSign(sign);
             request.setBusinessAttr(businessAttr);
 
             AiTaggingQueryResponseVo response = fastApiService.query(request);
             return Result.success(response);
         } catch (Exception e) {
-            log.error("AI打标查询接口调用失败", e);
-            return Result.error("500", "AI打标查询接口调用失败: " + e.getMessage());
+            log.error("AI 打标查询接口调用失败", e);
+            return Result.error("500", "AI 打标查询接口调用失败:" + e.getMessage());
         }
     }
 
-    @ApiOperationType("AI打标反馈")
+    @ApiOperationType("AI 打标反馈")
     @PostMapping("/feedback")
-    public Result<AiTaggingResponseVo> feedback(
-            @RequestParam(required = false) String userId,
-            @RequestParam(required = false) String userNm,
-            @RequestParam(required = true) String feedback,
-            @RequestParam(required = false) String contractNo,
-            @RequestParam(required = false) String userOrg,
-            @RequestParam(required = false) String userEndpoint,
-            @RequestParam(required = true) String businessAttr) {
+    public Result<AiTaggingResponseVo> feedback(@RequestBody AiTaggingFeedbackRequestDto request) {
         try {
-            log.info("收到AI打标反馈请求: userId={}, businessAttr={}, feedback={}", userId, businessAttr, feedback);
+            log.info("收到 AI 打标反馈请求:userId={}, businessAttr={}, feedback={}",
+                    request.getUserId(), request.getBusinessAttr(), request.getFeedback());
 
-            AiTaggingFeedbackRequestDto request = new AiTaggingFeedbackRequestDto();
-
-            // 设置用户信息 - 优先使用登录信息,否则使用默认值
+            // 如果未设置用户信息,使用登录信息
             String currentUserId = AuthContextUtil.getCurrentUser();
             String currentUserName = AuthContextUtil.getCurrentUserName();
 
             if (currentUserId != null && currentUserName != null) {
                 request.setUserId(currentUserId);
                 request.setUserNm(currentUserName);
-            } else {
-                request.setUserId(userId != null ? userId : "无登录测试ID");
-                request.setUserNm(userNm != null ? userNm : "无登录测试");
             }
 
-            request.setFeedback(feedback);
-            request.setContractNo(contractNo);
-            request.setUserOrg(userOrg);
-            request.setUserEndpoint(userEndpoint);
-            request.setBusinessAttr(businessAttr);
-
             AiTaggingResponseVo response = fastApiService.feedback(request);
             return Result.success(response);
         } catch (Exception e) {
-            log.error("AI打标反馈接口调用失败", e);
-            return Result.error("500", "AI打标反馈接口调用失败: " + e.getMessage());
+            log.error("AI 打标反馈接口调用失败", e);
+            return Result.error("500", "AI 打标反馈接口调用失败:" + e.getMessage());
         }
     }
 }

+ 11 - 3
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingFeedbackRequestDto.java

@@ -1,5 +1,6 @@
 package cn.com.yusys.yusp.domain.dto.fastapidto;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -7,29 +8,36 @@ import lombok.Data;
 import javax.validation.constraints.NotBlank;
 
 @Data
-@ApiModel("AI打标反馈请求")
+@ApiModel("AI 打标反馈请求")
 public class AiTaggingFeedbackRequestDto {
 
-    @ApiModelProperty(value = "用户ID", required = false)
+    @JsonProperty("user_id")
+    @ApiModelProperty(value = "用户 ID", required = false)
     private String userId;
 
+    @JsonProperty("user_nm")
     @ApiModelProperty(value = "用户姓名", required = false)
     private String userNm;
 
     @NotBlank(message = "反馈结果不能为空")
-    @ApiModelProperty(value = "反馈结果(agree/reject)", required = true)
+    @JsonProperty("feedback")
+    @ApiModelProperty(value = "反馈结果 (agree/reject)", required = true)
     private String feedback;
 
+    @JsonProperty("contract_no")
     @ApiModelProperty(value = "合同编号", required = false)
     private String contractNo;
 
+    @JsonProperty("user_org")
     @ApiModelProperty(value = "用户机构", required = false)
     private String userOrg;
 
+    @JsonProperty("user_endpoint")
     @ApiModelProperty(value = "用户终端", required = false)
     private String userEndpoint;
 
     @NotBlank(message = "业务属性不能为空")
+    @JsonProperty("business_attr")
     @ApiModelProperty(value = "业务属性", required = true)
     private String businessAttr;
 }

+ 5 - 11
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingQueryRequestDto.java

@@ -5,19 +5,13 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
+
 @Data
-@ApiModel("AI打标查询请求")
+@ApiModel("AI 打标查询请求")
 public class AiTaggingQueryRequestDto {
 
-    @ApiModelProperty(value = "后台分配的APPID", required = false)
-    private String appId;
-
-    @ApiModelProperty(value = "时间戳", required = false)
-    private String timestamp;
-
-    @ApiModelProperty(value = "签名", required = false)
-    private String sign;
-
+    @NotBlank(message = "业务属性不能为空")
     @ApiModelProperty(value = "业务属性", required = true)
     private String businessAttr;
-}
+}

+ 1 - 1
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagApp.java

@@ -77,5 +77,5 @@ public class AitagApp implements Serializable {
     @Size(max = 100, message = "编码长度不能超过100")
     @ApiModelProperty(value = "状态:0启用;1禁用", example = "0")
     @Length(max = 100, message = "编码长度不能超过100")
-    private String status;
+    private String state;
 }

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

@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
-@ApiModel("AI打标查询响应")
+@ApiModel("AI 打标查询响应")
 public class AiTaggingQueryResponseVo {
 
     @ApiModelProperty(value = "状态码 200(查询成功)/300(正在处理中)/500(处理失败)")
@@ -15,22 +15,39 @@ public class AiTaggingQueryResponseVo {
     private String message;
 
     @ApiModelProperty(value = "标签数据")
-    private AiTagDataVo[] data;
+    private AiTagDataWrapper data;
 
     @Data
-    @ApiModel("标签数据")
-    public static class AiTagDataVo {
+    @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;
+        private String tag_name;
 
         @ApiModelProperty(value = "标签代码")
-        private String tagcode;
+        private String tag_code;
+
+        @ApiModelProperty(value = "标签路径")
+        private String tag_path;
 
-        @ApiModelProperty(value = "是否AI推荐 true: AI推荐的标签, false: 算法筛选出来但是被LLM淘汰的候选标签")
+        @ApiModelProperty(value = "是否 AI 推荐 true: AI 推荐的标签,false: 算法筛选出来但是被 LLM 淘汰的候选标签")
         private Boolean passr;
 
         @ApiModelProperty(value = "解释说明")
         private String desc;
+
+        @ApiModelProperty(value = "分类 ID")
+        private String category_id;
     }
 }

+ 1 - 1
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagAppServiceImpl.java

@@ -53,7 +53,7 @@ public class AitagAppServiceImpl implements AitagAppService {
         app.setAppSecret(appSecret);
         // 使用 DataUtil 截断时间精度
         app.setCreateTime(DataUtil.truncateToSeconds(new Date()));
-        app.setStatus("0");
+        app.setState("0");
 
         aiTagAppMapper.insertApp(app);
         return app;

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

@@ -31,9 +31,9 @@ public class FastApiServiceImpl implements FastApiService {
     @Autowired
     private FastApiConfig fastApiConfig;
 
-    private static final String TAGGING_PATH = "/aitag/v1/tagging";
-    private static final String QUERY_PATH = "/aitag/v1/query";
-    private static final String FEEDBACK_PATH = "/aitag/v1/feedback";
+    private static final String TAGGING_PATH = "/api/aitag/v1/tagging";
+    private static final String QUERY_PATH = "/api/aitag/v1/query";
+    private static final String FEEDBACK_PATH = "/api/aitag/v1/feedback";
 
     @Override
     public AiTaggingResponseVo tagging(AiTaggingRequestDto request) {
@@ -65,105 +65,125 @@ public class FastApiServiceImpl implements FastApiService {
 
     @Override
     public AiTaggingQueryResponseVo query(AiTaggingQueryRequestDto request) {
-        StringBuilder urlBuilder = new StringBuilder(fastApiConfig.getUrl()).append(QUERY_PATH);
+        String url = fastApiConfig.getUrl() + QUERY_PATH + "?business_attr=" + encodeParam(request.getBusinessAttr());
 
-        // 只添加非空参数
-        boolean hasParams = false;
-
-        if (request.getAppId() != null && !request.getAppId().isEmpty()) {
-            urlBuilder.append(hasParams ? "&" : "?").append("appId=").append(encodeParam(request.getAppId()));
-            hasParams = true;
-        }
-
-        if (request.getTimestamp() != null && !request.getTimestamp().isEmpty()) {
-            urlBuilder.append(hasParams ? "&" : "?").append("timestamp=").append(encodeParam(request.getTimestamp()));
-            hasParams = true;
-        }
-
-        if (request.getSign() != null && !request.getSign().isEmpty()) {
-            urlBuilder.append(hasParams ? "&" : "?").append("sign=").append(encodeParam(request.getSign()));
-            hasParams = true;
-        }
-
-        // businessAttr是必填参数,直接添加
-        urlBuilder.append(hasParams ? "&" : "?").append("businessAttr=").append(encodeParam(request.getBusinessAttr()));
-
-        String url = urlBuilder.toString();
-        log.info("调用AI打标查询接口: {}", url);
+        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);
+                log.info("AI 打标查询接口响应:{}", responseBody);
 
                 return JSON.parseObject(responseBody, AiTaggingQueryResponseVo.class);
             }
         } catch (Exception e) {
-            log.error("调用AI打标查询接口失败", e);
+            log.error("调用 AI 打标查询接口失败", e);
             AiTaggingQueryResponseVo errorResponse = new AiTaggingQueryResponseVo();
             errorResponse.setCode("500");
-            errorResponse.setMessage("调用AI打标查询接口失败: " + e.getMessage());
+            errorResponse.setMessage("调用 AI 打标查询接口失败:" + e.getMessage());
             return errorResponse;
         }
     }
 
-    @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;
-        }
+//    @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;
+//        }
+//    }
 
-        // 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;
-        }
+    @Override
+    public AiTaggingResponseVo feedback(AiTaggingFeedbackRequestDto request) {
+        String url = fastApiConfig.getUrl() + FEEDBACK_PATH;
 
-        if (request.getUserOrg() != null && !request.getUserOrg().isEmpty()) {
-            urlBuilder.append(hasParams ? "&" : "?").append("user_org=").append(encodeParam(request.getUserOrg()));
-            hasParams = true;
-        }
+        log.info("调用 AI 打标反馈接口:{}", url);
 
-        if (request.getUserEndpoint() != null && !request.getUserEndpoint().isEmpty()) {
-            urlBuilder.append(hasParams ? "&" : "?").append("user_endpoint=").append(encodeParam(request.getUserEndpoint()));
-            hasParams = true;
-        }
+        try (CloseableHttpClient httpClient = createHttpClient()) {
+            HttpPost httpPost = new HttpPost(url);
+            httpPost.setHeader("Content-Type", "application/json");
 
-        // business_attr是必填参数
-        urlBuilder.append(hasParams ? "&" : "?").append("business_attr=").append(encodeParam(request.getBusinessAttr()));
+            // 手动构造符合 FastAPI 要求的 JSON 请求体(使用下划线格式)
+            com.alibaba.fastjson.JSONObject jsonBody = new com.alibaba.fastjson.JSONObject();
+            jsonBody.put("user_id", request.getUserId());
+            jsonBody.put("user_nm", request.getUserNm());
+            jsonBody.put("feedback", request.getFeedback());
+            jsonBody.put("contract_no", request.getContractNo());
+            jsonBody.put("user_org", request.getUserOrg());
+            jsonBody.put("user_endpoint", request.getUserEndpoint());
+            jsonBody.put("business_attr", request.getBusinessAttr());
 
-        String url = urlBuilder.toString();
-        log.info("调用AI打标反馈接口: {}", url);
+            String requestBody = jsonBody.toJSONString();
+            log.info("请求体:{}", requestBody);
 
-        try (CloseableHttpClient httpClient = createHttpClient()) {
-            HttpGet httpGet = new HttpGet(url);
+            httpPost.setEntity(new StringEntity(requestBody, "UTF-8"));
 
-            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
+            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                 String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
-                log.info("AI打标反馈接口响应: {}", responseBody);
+                log.info("AI 打标反馈接口响应:{}", responseBody);
 
                 return JSON.parseObject(responseBody, AiTaggingResponseVo.class);
             }
         } catch (Exception e) {
-            log.error("调用AI打标反馈接口失败", e);
+            log.error("调用 AI 打标反馈接口失败", e);
             AiTaggingResponseVo errorResponse = new AiTaggingResponseVo();
             errorResponse.setCode("500");
-            errorResponse.setMessage("调用AI打标反馈接口失败: " + e.getMessage());
+            errorResponse.setMessage("调用 AI 打标反馈接口失败:" + e.getMessage());
             return errorResponse;
         }
     }

+ 7 - 7
server/yusp-tagging-core/src/main/resources/mapper/AitagAppMapper.xml

@@ -13,7 +13,7 @@
             create_time,
             creater_nm,
             creater_id,
-            status
+            state
         FROM aitag_app
         ORDER BY create_time DESC
             LIMIT #{limit} OFFSET #{offset}
@@ -36,7 +36,7 @@
             create_time,
             creater_nm,
             creater_id,
-            status
+            state
         ) VALUES (
                      #{id},
                      #{appName},
@@ -45,7 +45,7 @@
                      #{createTime, jdbcType=TIMESTAMP},
                      #{createrNm},
                      #{createrId},
-                     #{status}
+                     #{state}
                  )
     </insert>
 
@@ -70,10 +70,10 @@
         WHERE id = #{id}
     </update>
 
-    <!-- 7. 禁用应用:更新 status = '1' -->
+    <!-- 7. 禁用应用:更新 state = '1' -->
     <update id="disableApp" parameterType="string">
         UPDATE aitag_app
-        SET status = '1'
+        SET state = '1'
         WHERE id = #{id}
     </update>
 
@@ -92,7 +92,7 @@
             create_time,
             creater_nm,
             creater_id,
-            status
+            state
         FROM aitag_app
         WHERE app_name LIKE CONCAT('%', #{appName}, '%')
     </select>
@@ -106,7 +106,7 @@
             create_time,
             creater_nm,
             creater_id,
-            status
+            state
         FROM aitag_app
         WHERE app_name LIKE CONCAT('%', #{appName}, '%')
         ORDER BY create_time DESC