Ver código fonte

Merge branch 'master' of http://git.yangzhiqiang.tech/jiayq/ai-tagging

jiayongqiang 4 semanas atrás
pai
commit
b9abd46b47
27 arquivos alterados com 348 adições e 285 exclusões
  1. 6 8
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/config/DataDictionary.java
  2. 2 12
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagCategoryController.java
  3. 2 35
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagLogController.java
  4. 11 34
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/FastApiController.java
  5. 15 3
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingFeedbackRequestDto.java
  6. 5 11
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingQueryRequestDto.java
  7. 1 2
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingRequestDto.java
  8. 1 1
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagApp.java
  9. 1 1
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagDailyAggEntity.java
  10. 6 5
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagLogEntity.java
  11. 5 1
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/SmartTaggingResultVo.java
  12. 32 2
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/TagNodeVo.java
  13. 24 7
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/fastapivo/AiTaggingQueryResponseVo.java
  14. 9 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/AitagTagCategoryMapper.java
  15. 1 2
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/AitagTagCategoryService.java
  16. 7 1
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/AitagTagLogService.java
  17. 25 17
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/DistributedScheduledTask.java
  18. 0 1
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/TagImportListener.java
  19. 1 1
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagAppServiceImpl.java
  20. 4 7
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagCategoryServiceImpl.java
  21. 41 26
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagLogServiceImpl.java
  22. 91 70
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/FastApiServiceImpl.java
  23. 7 7
      server/yusp-tagging-core/src/main/resources/mapper/AitagAppMapper.xml
  24. 19 0
      server/yusp-tagging-core/src/main/resources/mapper/AitagTagCategoryMapper.xml
  25. 5 5
      server/yusp-tagging-core/src/main/resources/mapper/AitagTagDailyAggMapper.xml
  26. 21 21
      server/yusp-tagging-core/src/main/resources/mapper/AitagTagLogMapper.xml
  27. 6 5
      server/yusp-tagging-starter/pom.xml

+ 6 - 8
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/config/DataDictionary.java

@@ -49,16 +49,14 @@ public class DataDictionary {
 
 
 
+
     /**
-     *    统计值
-     *        day:日
-     *        week:周
-     *        month:月
+     *    标签范围 tag_scope:
+     *        day0正常数据; 1测试数据
+     *
      */
-    public static final String DAY = "day";
-
-    public static final String WEEK = "week";
+    public static final String TEST_DATA = "1";
 
-    public static final String MONTH = "month";
+    public static final String PROD_DATA = "0";
 
 }

+ 2 - 12
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagCategoryController.java

@@ -24,10 +24,11 @@ public class AitagTagCategoryController {
     @ApiOperationType("标签体系列表")
     @GetMapping("/list")
     public Result<List<AitagTagCategoryVo>> listCategories(
+            @RequestParam(required = false) String categoryNm,
             @RequestParam(defaultValue = "1") int page,
             @RequestParam(defaultValue = "5") int size) {
         try {
-            Page<AitagTagCategoryVo> pageResult = aiTagCategoryService.listCategories(page, size);
+            Page<AitagTagCategoryVo> pageResult = aiTagCategoryService.listCategories(categoryNm, page, size);
             return Result.pageSuccess(pageResult.getRecords(), pageResult.getTotal());
         } catch (Exception e) {
             return Result.error("500", "分页查询失败:" + e.getMessage());
@@ -56,17 +57,6 @@ public class AitagTagCategoryController {
         }
     }
 
-    @ApiOperationType("查询标签体系")
-    @GetMapping("/query")
-    public Result<List<AitagTagCategory>> searchByCategoryNm(@RequestParam String categoryNm) {
-        try {
-            List<AitagTagCategory> categories = aiTagCategoryService.searchByCategoryNm(categoryNm);
-            return Result.success(categories);
-        } catch (Exception e) {
-            return Result.error("500", "模糊查询失败:" + e.getMessage());
-        }
-    }
-
     @ApiOperationType("启用标签体系")
     @PostMapping("/enable")
     public Result<Void> enableCategory(@RequestParam String id) {

+ 2 - 35
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagLogController.java

@@ -5,6 +5,7 @@ import cn.com.yusys.yusp.commons.module.adapter.web.rest.ResultDto;
 import cn.com.yusys.yusp.domain.entity.AitagTagLogEntity;
 import cn.com.yusys.yusp.domain.vo.*;
 import cn.com.yusys.yusp.service.AitagTagLogService;
+import cn.com.yusys.yusp.service.DistributedScheduledTask;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -110,39 +111,6 @@ public class AitagTagLogController {
         return ResultDto.success(taggingDetailsResDTO);
     }
 
-//    /**
-//     * 导出数据
-//     *
-//     * @param transactionReqVo
-//     * @return ResultDto
-//     */
-//    @ApiOperation("导出数据")
-//    @PostMapping("/exportData")
-//    public void exportData(@RequestBody TaggingTransactionReqVo transactionReqVo,HttpServletResponse response) throws IOException {
-//        List<AitagTagLogEntity> aitagTagLogEntities = aitagTagLogService.queryList(transactionReqVo);
-//        List<ExportDataVo> exportDataVos = new ArrayList<>();
-//        for (AitagTagLogEntity aitagTagLog:aitagTagLogEntities) {
-//            ExportDataVo exportDataVo = JSONObject.parseObject(JSONObject.toJSONString(aitagTagLog), ExportDataVo.class);
-//            if(FEEDBACK_RESULT_REJECT.equals(aitagTagLog.getFeedback())){
-//                String feedbackResult = aitagTagLog.getFeedbackResult();
-//                exportDataVo.setResult(getTags(feedbackResult));
-//            }else{
-//                String result = aitagTagLog.getResult();
-//                exportDataVo.setResult(getTags(result));
-//            }
-//            exportDataVos.add(exportDataVo);
-//        }
-//        // 2. 设置响应头(防止中文乱码)
-//        response.reset();
-//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
-//        response.setCharacterEncoding("utf-8");
-//        String fileName = URLEncoder.encode("导出标签", "UTF-8").replaceAll("\\+", "%20");
-//        response.setHeader("Content-Disposition", "attachment; filename*=utf-8''" + fileName + ".xlsx");
-//        EasyExcel.write(response.getOutputStream(), ExportDataVo.class)
-//                .sheet("标签数据")
-//                .doWrite(exportDataVos);
-//    }
-
 
     /**
      * 导出数据
@@ -153,7 +121,7 @@ public class AitagTagLogController {
     @ApiOperationType("导出数据")
     @GetMapping("/exportData")
     public void exportData(TaggingTransactionReqVo transactionReqVo,HttpServletResponse response) throws IOException {
-        List<AitagTagLogEntity> aitagTagLogEntities = aitagTagLogService.queryList(transactionReqVo);
+        List<AitagTagLogEntity> aitagTagLogEntities = aitagTagLogService.queryConfirmedTagData(transactionReqVo);
         List<ExportDataVo> exportDataVos = new ArrayList<>();
         for (AitagTagLogEntity aitagTagLog:aitagTagLogEntities) {
             ExportDataVo exportDataVo = JSONObject.parseObject(JSONObject.toJSONString(aitagTagLog), ExportDataVo.class);
@@ -195,5 +163,4 @@ public class AitagTagLogController {
         return stringBuilder.toString();
     }
 
-
 }

+ 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={}, feedbackResult={}",
+                    request.getUserId(), request.getBusinessAttr(), request.getFeedback(), request.getFeedbackResult());
 
-            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());
         }
     }
 }

+ 15 - 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,40 @@ 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("feedback_result")
+    @ApiModelProperty(value = "用户反馈的打标结果详情,为空表示同意,不为空表示不同意并输入了反馈", required = false)
+    private String feedbackResult;
+
+    @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 - 2
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingRequestDto.java

@@ -19,7 +19,6 @@ public class AiTaggingRequestDto {
     @ApiModelProperty(value = "投向+用途+职业", required = true)
     private String phrase;
 
-    @NotBlank(message = "体系 ID 不能为空")
-    @ApiModelProperty(value = "体系 ID", required = true)
+    @ApiModelProperty(value = "体系 ID", required = false)
     private String tagCategoryId;
 }

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

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

@@ -36,7 +36,7 @@ public class AitagTagDailyAggEntity {
      * 类别名称
      **/
     @ApiModelProperty(value = "标签类别")
-    private String categoryCode;
+    private String categoryId;
 
     /**
      * 标签名称

+ 6 - 5
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagLogEntity.java

@@ -126,11 +126,6 @@ passr: true/false
     @ApiModelProperty(value = "打标耗时,秒")
     private String consumingTime;
 
-    /**
-     * 标签类别
-     **/
-    @ApiModelProperty(value = "标签类别")
-    private String categoryCode;
 
     /**
      * 合同编号
@@ -157,4 +152,10 @@ passr: true/false
      **/
     @ApiModelProperty(value = "网点")
     private String feedbackUserEndpoint;
+
+    /**
+     * 标签标识 0正常数据; 1测试数据
+     **/
+    @ApiModelProperty(value = "标签标识 0:正常数据; 1:测试数据")
+    private String tagScope;
 }

+ 5 - 1
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/SmartTaggingResultVo.java

@@ -30,9 +30,13 @@ public class SmartTaggingResultVo extends PageQuery {
     /**
      * 标签类别
      */
-    private String categoryCode;
+    private String categoryId;
 
 
+    public String getCategoryExp() {
+        return "[{\"category_id\": \""+categoryId+"\"}]";
+    }
+
     public String getStartTaggingTime() {
         return StringUtils.isBlank(startTaggingTime)? DateUtils.getCurrYear()+"-01-01 00:00:00":startTaggingTime;
     }

+ 32 - 2
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/TagNodeVo.java

@@ -12,11 +12,32 @@ import java.util.List;
 public class TagNodeVo {
 
 
+    /**
+     * 标签Id
+     */
     private String id;
 
+
+    /**
+     * 父标签Id
+     */
     private String parentId;
+
+    /**
+     * 标签名称
+     */
     private String tagNm;
+
+    /**
+     * 标签编码
+     */
     private String tagCode;
+
+    /**
+     * 标签体系Id
+     */
+    private String categoryId;
+
     private List<TagNodeVo> children = new ArrayList<>();
 
 
@@ -25,6 +46,15 @@ public class TagNodeVo {
         this.parentId = entity.getParentId();
         this.tagNm = entity.getTagNm();
         this.tagCode = entity.getTagCode();
+        this.categoryId = entity.getCategoryId();
+    }
+
+    public String getCategoryId() {
+        return categoryId;
+    }
+
+    public void setCategoryId(String categoryId) {
+        this.categoryId = categoryId;
     }
 
     public String getId() {
@@ -35,11 +65,11 @@ public class TagNodeVo {
         this.id = id;
     }
 
-    public String getparentId() {
+    public String getParentId() {
         return parentId;
     }
 
-    public void setparentId(String parentId) {
+    public void setParentId(String parentId) {
         this.parentId = parentId;
     }
 

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

+ 9 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/AitagTagCategoryMapper.java

@@ -12,6 +12,15 @@ public interface AitagTagCategoryMapper {
     // 分页查询(偏移量 + 限制)
     List<AitagTagCategory> selectPageCategories(@Param("offset") int offset, @Param("limit") int limit);
 
+    // 带模糊筛选的分页查询
+    List<AitagTagCategory> selectPageCategoriesWithFilter(
+            @Param("categoryNm") String categoryNm,
+            @Param("offset") int offset,
+            @Param("limit") int limit);
+
+    // 带模糊筛选的总数
+    long selectCountWithFilter(@Param("categoryNm") String categoryNm);
+
     // 模糊查询(按名称)
     List<AitagTagCategory> selectByCategoryNmLike(@Param("categoryNm") String categoryNm);
 

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

@@ -9,10 +9,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import java.util.List;
 
 public interface AitagTagCategoryService {
-    Page<AitagTagCategoryVo> listCategories(int page, int size); // ← 改为 VO
+    Page<AitagTagCategoryVo> listCategories(String categoryNm, int page, int size);
     AitagTagCategory createCategory(AitagTagCategoryCreateDto dto);
     AitagTagCategory updateCategory(AitagTagCategoryUpdateDto dto);
-    List<AitagTagCategory> searchByCategoryNm(String categoryNm);
     void enableCategory(String id);
     void disableCategory(String id);
     void deleteCategory(String id);

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

@@ -26,6 +26,12 @@ public interface AitagTagLogService extends IService<AitagTagLogEntity> {
 
     List<IconResVo> tagDistStats(TagDistStatsReqVo resultDTO);
 
-    List<AitagTagLogEntity> queryList(TaggingTransactionReqVo transactionReqVo);
+
+    /**
+     * 查询确认后的标签数据
+     * @param transactionReqVo
+     * @return 有效的标签数据
+     */
+    List<AitagTagLogEntity> queryConfirmedTagData(TaggingTransactionReqVo transactionReqVo);
 }
 

+ 25 - 17
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/DistributedScheduledTask.java

@@ -6,6 +6,7 @@ import cn.com.yusys.yusp.domain.entity.AitagTagDailyAggEntity;
 import cn.com.yusys.yusp.domain.entity.AitagTagLogEntity;
 import cn.com.yusys.yusp.mapper.AitagTagDailyAggDao;
 import cn.com.yusys.yusp.mapper.AitagTagLogDao;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.extern.slf4j.Slf4j;
@@ -23,14 +24,13 @@ import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
 import static cn.com.yusys.yusp.config.DataDictionary.FEEDBACK_RESULT_AGREE;
+import static cn.com.yusys.yusp.config.DataDictionary.FEEDBACK_RESULT_REJECT;
 
 @Component
 @Slf4j
 public class DistributedScheduledTask {
 
 
-    private static final String TASK_LOCK_KEY = "scheduled_task:sync_data";
-
 
     @Autowired
     private StringRedisTemplate redisTemplate;
@@ -75,14 +75,16 @@ public class DistributedScheduledTask {
             Map<String,Integer> count = new HashMap<>();
             for (AitagTagLogEntity aitagTagLog:aitagTagLogEntities){
                 String feedback = aitagTagLog.getFeedback();
-                String categoryCode = aitagTagLog.getCategoryCode();
-                if(FEEDBACK_RESULT_AGREE.equals(feedback)){
-                    String result = aitagTagLog.getResult();
-                    duCount(result, count,categoryCode);
+                String result = null;
+                if(FEEDBACK_RESULT_REJECT.equals(feedback)){
+                    result = aitagTagLog.getFeedbackResult();
                 }else{
-                    String result = aitagTagLog.getFeedbackResult();
-                    duCount(result, count,categoryCode);
+                    result = aitagTagLog.getResult();
+                }
+                if(StringUtils.isBlank(result)){
+                    continue;
                 }
+                duCount(result, count);
             }
             AitagTagDailyAggEntity aitagTagLog = new AitagTagDailyAggEntity();
             for (String key : count.keySet()){
@@ -90,22 +92,28 @@ public class DistributedScheduledTask {
                 aitagTagLog.setAggDate(yesterday);
                 aitagTagLog.setTagCount(count.get(key));
                 String[] split = key.split(":");
+                if(split.length==2){
+                    aitagTagLog.setCategoryId(split[1]);
+                }
                 aitagTagLog.setTagNm(split[0]);
-                aitagTagLog.setCategoryCode(split[1]);
                 aitagTagDailyAggDao.insert(aitagTagLog);
             }
 
         }
     }
 
-    private static void duCount(String result, Map<String, Integer> count,String categoryCode) {
-        JSONObject resultMap = JSONObject.parseObject(result);
-        String labe = resultMap.getString("labe")+":"+categoryCode;
-        if(count.containsKey(labe)){
-            Integer integer = count.get(labe);
-            count.put(labe,integer+1);
-        }else{
-            count.put(labe,1);
+    private static void duCount(String result, Map<String, Integer> count) {
+        List<Map> results = JSONArray.parseArray(result, Map.class);
+        for (int i = 0 ;i<results.size();i++){
+            Map resultMap = results.get(i);
+            String labe = resultMap.getOrDefault("tag_name","").toString()+":"
+                    + resultMap.getOrDefault("category_id","").toString();
+            if(count.containsKey(labe)){
+                Integer integer = count.get(labe);
+                count.put(labe,integer+1);
+            }else{
+                count.put(labe,1);
+            }
         }
     }
 

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

@@ -28,7 +28,6 @@ public class TagImportListener extends AnalysisEventListener<TagImportDto> {
         if (!StringUtils.isBlank(data.getParentName())) {
             data.setParentName(data.getParentName().trim());
         }
-
         // 生成临时 ID
         data.setId(UUID.randomUUID().toString().replace("-", ""));
         dataList.add(data);

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

+ 4 - 7
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagCategoryServiceImpl.java

@@ -21,10 +21,10 @@ public class AitagTagCategoryServiceImpl implements AitagTagCategoryService {
     private AitagTagCategoryMapper aiTagCategoryMapper;
 
     @Override
-    public Page<AitagTagCategoryVo> listCategories(int page, int size) {
+    public Page<AitagTagCategoryVo> listCategories(String categoryNm, int page, int size) {
         int offset = (page - 1) * size;
-        List<AitagTagCategory> records = aiTagCategoryMapper.selectPageCategories(offset, size);
-        long total = aiTagCategoryMapper.selectCountAll();
+        List<AitagTagCategory> records = aiTagCategoryMapper.selectPageCategoriesWithFilter(categoryNm, offset, size);
+        long total = aiTagCategoryMapper.selectCountWithFilter(categoryNm);
 
         // 转换为 VO 并动态计算 tagNum
         List<AitagTagCategoryVo> voList = records.stream().map(category -> {
@@ -89,10 +89,7 @@ public class AitagTagCategoryServiceImpl implements AitagTagCategoryService {
         return existing;
     }
 
-    @Override
-    public List<AitagTagCategory> searchByCategoryNm(String categoryNm) {
-        return aiTagCategoryMapper.selectByCategoryNmLike(categoryNm);
-    }
+
 
     @Override
     public void enableCategory(String id) {

+ 41 - 26
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagLogServiceImpl.java

@@ -11,11 +11,13 @@ import cn.com.yusys.yusp.mapper.AitagTagLogDao;
 import cn.com.yusys.yusp.domain.entity.AitagTagLogEntity;
 import cn.com.yusys.yusp.service.AitagTagLogService;
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -37,6 +39,7 @@ import static cn.com.yusys.yusp.config.DataDictionary.*;
  */
 
 @Service("aitagTagLogService")
+@Slf4j
 public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTagLogEntity> implements AitagTagLogService {
 
     @Autowired
@@ -48,34 +51,36 @@ public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTag
     @Override
     public DataOverviewVo dataOverview(SmartTaggingResultVo taggingResult) {
         DataOverviewVo dataOverview = new DataOverviewVo();
+
         Integer totalCnt = this.baseMapper.selectTagCount(taggingResult);
+        log.info("查询出符合条件的全部打标数据:{} 条",totalCnt);
         dataOverview.setCountNum(totalCnt);
 
-        LambdaQueryWrapper<AitagTagLogEntity> queryCount = new LambdaQueryWrapper<>();
-        LambdaQueryWrapper<AitagTagLogEntity> queryAgreeTags = new LambdaQueryWrapper<>();
-        if (StringUtils.isNotBlank(taggingResult.getCategoryCode())) {
-            queryCount.eq(AitagTagLogEntity::getCategoryCode, taggingResult.getCategoryCode());
-            queryAgreeTags.eq(AitagTagLogEntity::getCategoryCode, taggingResult.getCategoryCode());
+        LambdaQueryWrapper<AitagTagLogEntity> queryWrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(taggingResult.getCategoryId())) {
+            queryWrapper.apply("result @> '"+taggingResult.getCategoryExp()+"'");
         }
         if (StringUtils.isNotBlank(taggingResult.getStartTaggingTime())){
-            queryCount.ge(AitagTagLogEntity::getInsertTime, taggingResult.getStartTaggingTime());
-            queryAgreeTags.ge(AitagTagLogEntity::getInsertTime, taggingResult.getStartTaggingTime());
+            queryWrapper.ge(AitagTagLogEntity::getInsertTime, taggingResult.getStartTaggingTime());
         }
         if (StringUtils.isNotBlank(taggingResult.getEndTaggingTime())){
-            queryCount.le(AitagTagLogEntity::getInsertTime, taggingResult.getEndTaggingTime());
-            queryAgreeTags.le(AitagTagLogEntity::getInsertTime, taggingResult.getEndTaggingTime());
+            queryWrapper.le(AitagTagLogEntity::getInsertTime, taggingResult.getEndTaggingTime());
         }
-        queryCount.in(AitagTagLogEntity::getState, DataDictionary.RESULT_PUSHED,DataDictionary.MANAGER_CONFIRMED);
-        queryAgreeTags.in(AitagTagLogEntity::getState, DataDictionary.RESULT_PUSHED,DataDictionary.MANAGER_CONFIRMED);
+        queryWrapper.in(AitagTagLogEntity::getState, DataDictionary.RESULT_PUSHED,DataDictionary.MANAGER_CONFIRMED);
+        queryWrapper.eq(AitagTagLogEntity::getTagScope, PROD_DATA);
+        Integer totalConfirmedCnt = this.baseMapper.selectCount(queryWrapper);
+        log.info("查询出符合条件的打标完成数据:{} 条",totalConfirmedCnt);
 
-        Integer totalConfirmedCnt = this.baseMapper.selectCount(queryCount);
+        queryWrapper.eq(AitagTagLogEntity::getFeedback,FEEDBACK_RESULT_AGREE);
+        Integer agreeTagNum = this.baseMapper.selectCount(queryWrapper);
+        log.info("查询出符合条件的打标准确数据:{} 条",agreeTagNum);
+        dataOverview.setAccurateNum(agreeTagNum);
 
-        queryAgreeTags.eq(AitagTagLogEntity::getFeedback,FEEDBACK_RESULT_AGREE);
-        Integer agreeTagNum = this.baseMapper.selectCount(queryAgreeTags);
-        BigDecimal accurateRate = calculateAccuracy(agreeTagNum, totalConfirmedCnt);
 
-        dataOverview.setAccurateNum(totalConfirmedCnt);
+        BigDecimal accurateRate = calculateAccuracy(agreeTagNum, totalConfirmedCnt);
+        log.info("计算出准确率:{} 条",accurateRate);
         dataOverview.setAccurateRate(accurateRate+"%");
+
         if(totalConfirmedCnt == 0){
             dataOverview.setManualAdjustRate("0%");
         }else{
@@ -84,6 +89,7 @@ public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTag
         }
         dataOverview.setManualAdjustCount(totalConfirmedCnt-agreeTagNum);
         dataOverview.setTaggedUnconfirmed(totalCnt-totalConfirmedCnt);
+        log.info("准备返回数据为:{} ", JSONObject.toJSONString(dataOverview));
         return dataOverview;
     }
 
@@ -105,8 +111,8 @@ public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTag
     @Override
     public IPage<AitagTagLogEntity> taggingDetails(TaggingTransactionReqVo transactionReqVo) {
         LambdaQueryWrapper<AitagTagLogEntity> queryWrapper = new LambdaQueryWrapper<>();
-        if (StringUtils.isNotBlank(transactionReqVo.getCategoryCode())) {
-            queryWrapper.eq(AitagTagLogEntity::getCategoryCode, transactionReqVo.getCategoryCode());
+        if (StringUtils.isNotBlank(transactionReqVo.getCategoryId())) {
+            queryWrapper.apply("result @> '"+transactionReqVo.getCategoryExp()+"'");
         }
         if (StringUtils.isNotBlank(transactionReqVo.getStartTaggingTime())){
             queryWrapper.ge(AitagTagLogEntity::getInsertTime, transactionReqVo.getStartTaggingTime());
@@ -117,6 +123,7 @@ public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTag
         if (StringUtils.isNotBlank(transactionReqVo.getLoanApplicationNo())){
             queryWrapper.le(AitagTagLogEntity::getBusinessAttr, transactionReqVo.getLoanApplicationNo());
         }
+        queryWrapper.eq(AitagTagLogEntity::getTagScope, PROD_DATA);
 
         return this.page(new Page<>(transactionReqVo.getPage() == null?0:transactionReqVo.getPage(),
                 transactionReqVo.getSize() == null?10:transactionReqVo.getSize()),queryWrapper);
@@ -162,22 +169,30 @@ public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTag
         return aggDao.selectTagDistStats(resultVo);
     }
 
+
+    /**
+     * 查询确认后的标签数据
+     * @param transactionReqVo
+     * @return
+     */
     @Override
-    public List<AitagTagLogEntity> queryList(TaggingTransactionReqVo transactionReqVo) {
-        LambdaQueryWrapper<AitagTagLogEntity> queryCount = new LambdaQueryWrapper<>();
-        if (StringUtils.isNotBlank(transactionReqVo.getCategoryCode())) {
-            queryCount.eq(AitagTagLogEntity::getCategoryCode, transactionReqVo.getCategoryCode());
+    public List<AitagTagLogEntity> queryConfirmedTagData(TaggingTransactionReqVo transactionReqVo) {
+        LambdaQueryWrapper<AitagTagLogEntity> query = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(transactionReqVo.getCategoryId())) {
+            query.apply("result @> '"+transactionReqVo.getCategoryExp()+"'");
         }
         if (StringUtils.isNotBlank(transactionReqVo.getStartTaggingTime())){
-            queryCount.ge(AitagTagLogEntity::getInsertTime, transactionReqVo.getStartTaggingTime());
+            query.ge(AitagTagLogEntity::getInsertTime, transactionReqVo.getStartTaggingTime());
         }
         if (StringUtils.isNotBlank(transactionReqVo.getEndTaggingTime())){
-            queryCount.le(AitagTagLogEntity::getInsertTime, transactionReqVo.getEndTaggingTime());
+            query.le(AitagTagLogEntity::getInsertTime, transactionReqVo.getEndTaggingTime());
         }
         if (StringUtils.isNotBlank(transactionReqVo.getLoanApplicationNo())){
-            queryCount.le(AitagTagLogEntity::getBusinessAttr, transactionReqVo.getLoanApplicationNo());
+            query.eq(AitagTagLogEntity::getBusinessAttr, transactionReqVo.getLoanApplicationNo());
         }
-        return this.baseMapper.selectList(queryCount);
+        query.in(AitagTagLogEntity::getState, DataDictionary.RESULT_PUSHED,DataDictionary.MANAGER_CONFIRMED);
+        query.eq(AitagTagLogEntity::getTagScope, PROD_DATA);
+        return this.baseMapper.selectList(query);
     }
 
 

+ 91 - 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,126 @@ 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("feedback_result", request.getFeedbackResult());
+            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

+ 19 - 0
server/yusp-tagging-core/src/main/resources/mapper/AitagTagCategoryMapper.xml

@@ -9,6 +9,25 @@
             LIMIT #{offset}, #{limit}
     </select>
 
+    <!-- 带模糊筛选的分页查询 -->
+    <select id="selectPageCategoriesWithFilter" resultType="cn.com.yusys.yusp.domain.entity.AitagTagCategory">
+        SELECT * FROM aitag_tag_category
+        WHERE is_delete = 0
+        <if test="categoryNm != null and categoryNm != ''">
+            AND category_nm LIKE CONCAT('%', #{categoryNm}, '%')
+        </if>
+        LIMIT #{offset}, #{limit}
+    </select>
+
+    <!-- 带模糊筛选的总数 -->
+    <select id="selectCountWithFilter" resultType="long">
+        SELECT COUNT(*) FROM aitag_tag_category
+        WHERE is_delete = 0
+        <if test="categoryNm != null and categoryNm != ''">
+            AND category_nm LIKE CONCAT('%', #{categoryNm}, '%')
+        </if>
+    </select>
+
     <!-- 模糊查询 -->
     <select id="selectByCategoryNmLike" resultType="cn.com.yusys.yusp.domain.entity.AitagTagCategory">
         SELECT * FROM aitag_tag_category

+ 5 - 5
server/yusp-tagging-core/src/main/resources/mapper/AitagTagDailyAggMapper.xml

@@ -4,7 +4,7 @@
     <resultMap id="aitagTagDailyAgg" type="cn.com.yusys.yusp.domain.entity.AitagTagDailyAggEntity">
         <id column="id" jdbcType="VARCHAR" property="id"/>
         <result column="agg_date" jdbcType="VARCHAR" property="aggDate"/>
-        <result column="category_nm" jdbcType="VARCHAR" property="categoryNm"/>
+        <result column="category_id" jdbcType="VARCHAR" property="categoryId"/>
         <result column="tag_nm" jdbcType="VARCHAR" property="tagNm"/>
         <result column="tag_count" jdbcType="INTEGER" property="tagCount"/>
     </resultMap>
@@ -16,14 +16,14 @@
         tag_count AS val
         FROM aitag_tag_daily_agg
         <where>
-            <if test="startTaggingTime != null">
+            <if test="startTaggingTime != null and startTaggingTime != ''">
                 AND agg_date >= #{startTaggingTime}
             </if>
-            <if test="endTaggingTime != null">
+            <if test="endTaggingTime != null and endTaggingTime != ''">
                 AND #{endTaggingTime} >= agg_date
             </if>
-            <if test="categoryCode != null">
-                AND #{categoryCode} = category_code
+            <if test="categoryId != null and categoryId != '' ">
+                AND #{categoryId} = category_id
             </if>
             <if test="sort == 'ase'">
                 order by tag_count

+ 21 - 21
server/yusp-tagging-core/src/main/resources/mapper/AitagTagLogMapper.xml

@@ -17,7 +17,6 @@
         <result column="feedback_result" jdbcType="VARCHAR" property="feedbackResult"/>
         <result column="state" jdbcType="INTEGER" property="state"/>
         <result column="consuming_time" jdbcType="LONGVARCHAR" property="consumingTime"/>
-        <result column="category_code" jdbcType="VARCHAR" property="categoryCode"/>
         <result column="reg_result" jdbcType="VARCHAR" property="regResult"/>
         <result column="feedback_user_org" jdbcType="VARCHAR" property="feedbackUserOrg"/>
         <result column="feedback_user_endpoint" jdbcType="VARCHAR" property="feedbackUserEndpoint"/>
@@ -28,17 +27,17 @@
         SELECT
         COUNT(1) as totalCount
         FROM aitag_tag_log
-        <where>
+        WHERE
+            tag_scope = 0
             <if test="startTaggingTime != null and startTaggingTime != ''">
                 AND insert_time >= #{startTaggingTime}
             </if>
             <if test="endTaggingTime != null and endTaggingTime != ''">
                 AND #{endTaggingTime} >= insert_time
             </if>
-            <if test="categoryCode != null and categoryCode != ''">
-                AND #{categoryCode} = category_code
+            <if test="categoryId != null and categoryId != ''">
+                AND result @> #{categoryExp}::jsonb
             </if>
-        </where>
     </select>
 
     <select id="selectTagReportByDay" resultType="cn.com.yusys.yusp.domain.vo.IconResVo" parameterType="cn.com.yusys.yusp.domain.vo.SmartTaggingResultVo">
@@ -46,17 +45,17 @@
         DATE_FORMAT(insert_time, '%Y年%m月%d日') AS stat,
         COUNT(1) AS val
         FROM aitag_tag_log
-        <where>
+        WHERE
+        tag_scope = 0
             <if test="startTaggingTime != null and startTaggingTime != ''">
                 AND insert_time >= #{startTaggingTime}
             </if>
             <if test="endTaggingTime != null and endTaggingTime != ''">
                 AND #{endTaggingTime} >= insert_time
             </if>
-            <if test="categoryCode != null and categoryCode != ''">
-                AND #{categoryCode} = category_code
+            <if test="categoryId != null and categoryId != ''">
+                AND result @> #{categoryExp}::jsonb
             </if>
-        </where>
         GROUP BY DATE_FORMAT(insert_time, '%Y年%m月%d日')
         ORDER BY stat;
     </select>
@@ -66,17 +65,17 @@
         DATE_FORMAT(insert_time, '%Y年%m月') AS stat,
         COUNT(1) AS val
         FROM aitag_tag_log
-        <where>
+        WHERE
+        tag_scope = 0
             <if test="startTaggingTime != null and startTaggingTime != ''">
                 AND insert_time >= #{startTaggingTime}
             </if>
             <if test="endTaggingTime != null and endTaggingTime != ''">
                 AND #{endTaggingTime} >= insert_time
             </if>
-            <if test="categoryCode != null and categoryCode != ''">
-                AND #{categoryCode} = category_code
+            <if test="categoryId != null and categoryId != ''">
+                AND result @> #{categoryExp}::jsonb
             </if>
-        </where>
         GROUP BY DATE_FORMAT(insert_time, '%Y年%m月')
         ORDER BY stat;
     </select>
@@ -86,27 +85,28 @@
         YEARWEEK(insert_time, 1) AS stat,
         COUNT(1) AS val
         FROM aitag_tag_log
-        <where>
+        WHERE
+        tag_scope = 0
             <if test="startTaggingTime != null and  startTaggingTime != ''">
                 AND insert_time >= #{startTaggingTime}
             </if>
             <if test="endTaggingTime != null and  endTaggingTime != ''">
                 AND #{endTaggingTime} >= insert_time
             </if>
-            <if test="categoryCode != null and categoryCode != ''">
-                AND #{categoryCode} = category_code
+            <if test="categoryId != null and categoryId != ''">
+                AND result @> #{categoryExp}::jsonb
             </if>
-        </where>
         GROUP BY YEARWEEK(insert_time, 1)
         ORDER BY stat;
     </select>
 
     <select id="selectByInsertTime" resultType="cn.com.yusys.yusp.domain.entity.AitagTagLogEntity">
-        SELECT id, app_id, insert_time, business_attr, phrase, attachment, attachment_url, `result`, feedback_user_id, feedback_user_nm, feedback_time, feedback, feedback_result, state, consuming_time, category_code
+        SELECT id, app_id, insert_time, business_attr, phrase, attachment, attachment_url, `result`, feedback_user_id, feedback_user_nm, feedback_time, feedback, feedback_result, state, consuming_time
         FROM aitag_tag_log
-            where
-            DATE(insert_time) = #{insertTime}
-        AND state in ("2","3")
+        WHERE
+            tag_scope = 0
+        AND DATE(insert_time) = #{insertTime}
+        AND state in ('2','3')
     </select>
 
 </mapper>

+ 6 - 5
server/yusp-tagging-starter/pom.xml

@@ -14,6 +14,7 @@
     <version>1.0.0-SNAPSHOT</version>
     <packaging>jar</packaging>
 
+
     <dependencies>
         <!-- 依赖 core 模块 -->
         <dependency>
@@ -118,11 +119,11 @@
                     <version>5.2.24.RELEASE</version>
                 </dependency>-->
         <!-- MySQL JDBC Driver -->
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-            <version>8.0.33</version> <!-- 使用最新稳定版本 -->
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>mysql</groupId>-->
+<!--            <artifactId>mysql-connector-java</artifactId>-->
+<!--            <version>8.0.33</version> &lt;!&ndash; 使用最新稳定版本 &ndash;&gt;-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>cn.com.kingbase</groupId>