فهرست منبع

标签体系详情功能开发

2507040827 4 روز پیش
والد
کامیت
3aea9a4c88
23فایلهای تغییر یافته به همراه1429 افزوده شده و 130 حذف شده
  1. 15 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/config/DataDictionary.java
  2. 59 13
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagInfoController.java
  3. 107 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagInfoVersionController.java
  4. 3 3
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagLogController.java
  5. 114 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/TagInfoDto.java
  6. 114 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/TagInfoVersionDto.java
  7. 20 95
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagInfoEntity.java
  8. 232 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagInfoVersionEntity.java
  9. 5 5
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/AitagTagInfoQueryVo.java
  10. 210 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/AitagTagInfoVersionQueryVo.java
  11. 74 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/TagNodeVo.java
  12. 35 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/VersionRollbackVo.java
  13. 7 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/AitagTagInfoDao.java
  14. 17 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/AitagTagInfoVersionDao.java
  15. 19 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/AitagTagInfoService.java
  16. 25 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/AitagTagInfoVersionService.java
  17. 202 2
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagInfoServiceImpl.java
  18. 81 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagInfoVersionServiceImpl.java
  19. 5 8
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagLogServiceImpl.java
  20. 60 3
      server/yusp-tagging-core/src/main/resources/mapper/AitagTagInfoMapper.xml
  21. 21 0
      server/yusp-tagging-core/src/main/resources/mapper/AitagTagInfoVersionMapper.xml
  22. 2 1
      server/yusp-tagging-core/src/main/resources/messages/yusp_input_msg.properties
  23. 2 0
      server/yusp-tagging-starter/src/main/java/cn/com/yusys/yusp/detail/App.java

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

@@ -35,6 +35,21 @@ public class DataDictionary {
 
 
     /**
+     *标签启用	tag_enabled
+     * 标签停用	tag_disabled
+     * 标签删除	tag_deleted
+     * 标签未删除	tag_undeleted
+     */
+    public static final Integer TAG_ENABLED = 0;
+
+    public static final Integer TAG_DISABLED = 1;
+    public static final Integer TAG_DELETED = 1;
+
+    public static final Integer TAG_UNDELETED = 0;
+
+
+
+    /**
      *    统计值
      *        day:日
      *        week:周

+ 59 - 13
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagInfoController.java

@@ -1,10 +1,15 @@
 package cn.com.yusys.yusp.controller;
 
+import cn.com.yusys.yusp.commons.exception.BizException;
 import cn.com.yusys.yusp.commons.module.adapter.web.rest.ResultDto;
+import cn.com.yusys.yusp.domain.dto.TagInfoDto;
 import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
 import cn.com.yusys.yusp.domain.vo.AitagTagInfoQueryVo;
+import cn.com.yusys.yusp.domain.vo.TagNodeVo;
+import cn.com.yusys.yusp.domain.vo.VersionRollbackVo;
 import cn.com.yusys.yusp.service.AitagTagInfoService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,6 +22,7 @@ import org.springframework.web.bind.annotation.PathVariable;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 
@@ -24,7 +30,7 @@ import java.util.List;
  * @author 2507040827
  * @date 2026-02-26 14:34:56
  */
-@Api(tags = "")
+@Api(tags = "标签管理")
 @RestController
 @RequestMapping("/api/aitagtaginfo")
 public class AitagTagInfoController {
@@ -41,12 +47,41 @@ public class AitagTagInfoController {
      * @param aitagTagInfoQueryVo
      * @return ResultDto
      */
-    @ApiOperation("列表查询")
+    @ApiOperation("列表标签分页信息")
+    @GetMapping("/page")
+    public ResultDto<List<AitagTagInfoEntity>> page(AitagTagInfoQueryVo aitagTagInfoQueryVo) {
+        IPage<AitagTagInfoEntity> page = aitagTagInfoService.queryPage(aitagTagInfoQueryVo);
+        return ResultDto.success(page.getRecords()).total(page.getTotal());
+    }
+
+
+    /**
+     * 列表查询
+     *
+     * @param aitagTagInfoQueryVo
+     * @return ResultDto
+     */
+    @ApiOperation("标签列表查询")
     @GetMapping("/list")
     public ResultDto<List<AitagTagInfoEntity>> list(AitagTagInfoQueryVo aitagTagInfoQueryVo) {
-        IPage<AitagTagInfoEntity> page = aitagTagInfoService.queryPage(aitagTagInfoQueryVo);
+        List<AitagTagInfoEntity> page = aitagTagInfoService.queryList(aitagTagInfoQueryVo);
+        return ResultDto.success(page);
+    }
 
-        return ResultDto.success(page.getRecords()).total(page.getTotal());
+    /**
+     * 查询标签树
+     *
+     * @param aitagTagInfoQueryVo
+     * @return ResultDto
+     */
+    @ApiOperation("查询标签树")
+    @PostMapping("/queryTagTree")
+    public ResultDto<List<TagNodeVo>> queryTagTree(@RequestBody AitagTagInfoQueryVo aitagTagInfoQueryVo) {
+        if(StringUtils.isBlank(aitagTagInfoQueryVo.getCategoryId())){
+           throw BizException.of("E001");
+        }
+        List<TagNodeVo> tagNodeVos = aitagTagInfoService.queryTagTree(aitagTagInfoQueryVo);
+        return ResultDto.success(tagNodeVos);
     }
 
     /**
@@ -57,9 +92,8 @@ public class AitagTagInfoController {
      */
     @ApiOperation("详细")
     @GetMapping("/info/{id}")
-    public ResultDto<AitagTagInfoEntity> info(@PathVariable("id") String id) {
-        AitagTagInfoEntity aitagTagInfo = aitagTagInfoService.getById(id);
-
+    public ResultDto<TagInfoDto> info(@PathVariable("id") String id) {
+        TagInfoDto aitagTagInfo = aitagTagInfoService.getTagInfo(id);
         return ResultDto.success(aitagTagInfo);
     }
 
@@ -72,8 +106,7 @@ public class AitagTagInfoController {
     @ApiOperation("保存")
     @PostMapping("/save")
     public ResultDto save(@RequestBody AitagTagInfoEntity aitagTagInfoEntity) {
-        aitagTagInfoService.save(aitagTagInfoEntity);
-
+        aitagTagInfoService.saveTag(aitagTagInfoEntity);
         return ResultDto.success();
     }
 
@@ -86,11 +119,24 @@ public class AitagTagInfoController {
     @ApiOperation("修改")
     @PostMapping("/update")
     public ResultDto update(@RequestBody AitagTagInfoEntity aitagTagInfoEntity) {
-        aitagTagInfoService.updateById(aitagTagInfoEntity);
+        aitagTagInfoService.updateTag(aitagTagInfoEntity);
+        return ResultDto.success();
+    }
 
+    /**
+     * 修改
+     *
+     * @param versionRollbackVo
+     * @return ResultDto
+     */
+    @ApiOperation("版本回溯")
+    @PostMapping("/versionRollback")
+    public ResultDto versionRollback(@RequestBody VersionRollbackVo versionRollbackVo) {
+        aitagTagInfoService.versionRollback(versionRollbackVo);
         return ResultDto.success();
     }
 
+
     /**
      * 删除
      *
@@ -99,9 +145,9 @@ public class AitagTagInfoController {
      */
     @ApiOperation("删除")
     @PostMapping("/delete")
-    public ResultDto delete(@RequestBody String[] ids) {
-        aitagTagInfoService.removeByIds(Arrays.asList(ids));
-
+    public ResultDto delete(@RequestBody Map<String,List> ids) {
+        List<String> idsList = ids.get("ids");
+        aitagTagInfoService.removeTags(idsList);
         return ResultDto.success();
     }
 

+ 107 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagInfoVersionController.java

@@ -0,0 +1,107 @@
+package cn.com.yusys.yusp.controller;
+
+import cn.com.yusys.yusp.commons.module.adapter.web.rest.ResultDto;
+import cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity;
+import cn.com.yusys.yusp.domain.vo.AitagTagInfoVersionQueryVo;
+import cn.com.yusys.yusp.service.AitagTagInfoVersionService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 标签信息版本表
+ *
+ * @author 2507040827
+ * @date 2026-02-27 11:33:54
+ */
+@Api(tags = "标签信息版本表")
+@RestController
+@RequestMapping("/api/aitagtaginfoversion")
+public class AitagTagInfoVersionController {
+    /**
+     * AitagTagInfoVersionService
+     */
+    @Autowired
+    private AitagTagInfoVersionService aitagTagInfoVersionService;
+
+
+    /**
+     * 列表查询
+     *
+     * @param aitagTagInfoVersionQueryVo
+     * @return ResultDto
+     */
+    @ApiOperation("列表查询")
+    @GetMapping("/list")
+    public ResultDto<List<AitagTagInfoVersionEntity>> list(AitagTagInfoVersionQueryVo aitagTagInfoVersionQueryVo) {
+        IPage<AitagTagInfoVersionEntity> page = aitagTagInfoVersionService.queryPage(aitagTagInfoVersionQueryVo);
+
+        return ResultDto.success(page.getRecords()).total(page.getTotal());
+    }
+
+    /**
+     * 详细
+     *
+     * @param id
+     * @return ResultDto
+     */
+    @ApiOperation("详细")
+    @GetMapping("/info/{id}")
+    public ResultDto<AitagTagInfoVersionEntity> info(@PathVariable("id") String id) {
+        AitagTagInfoVersionEntity aitagTagInfoVersion = aitagTagInfoVersionService.getById(id);
+
+        return ResultDto.success(aitagTagInfoVersion);
+    }
+
+    /**
+     * 保存
+     *
+     * @param aitagTagInfoVersionEntity
+     * @return ResultDto
+     */
+    @ApiOperation("保存")
+    @PostMapping("/save")
+    public ResultDto save(@RequestBody AitagTagInfoVersionEntity aitagTagInfoVersionEntity) {
+        aitagTagInfoVersionService.save(aitagTagInfoVersionEntity);
+        return ResultDto.success();
+    }
+
+    /**
+     * 修改
+     *
+     * @param aitagTagInfoVersionEntity
+     * @return ResultDto
+     */
+    @ApiOperation("修改")
+    @PostMapping("/update")
+    public ResultDto update(@RequestBody AitagTagInfoVersionEntity aitagTagInfoVersionEntity) {
+        aitagTagInfoVersionService.updateById(aitagTagInfoVersionEntity);
+
+        return ResultDto.success();
+    }
+
+    /**
+     * 删除
+     *
+     * @param ids
+     * @return ResultDto
+     */
+    @ApiOperation("删除")
+    @PostMapping("/delete")
+    public ResultDto delete(@RequestBody String[] ids) {
+        aitagTagInfoVersionService.removeByIds(Arrays.asList(ids));
+
+        return ResultDto.success();
+    }
+
+}

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

@@ -93,7 +93,7 @@ public class AitagTagLogController {
     @PostMapping("/taggingTransaction")
     public ResultDto<IPage<AitagTagLogEntity>> taggingTransaction(@RequestBody TaggingTransactionReqVo transactionReqVo) {
         IPage<AitagTagLogEntity> page = aitagTagLogService.taggingDetails(transactionReqVo);
-        return ResultDto.success(page);
+        return ResultDto.success(page.getRecords()).total(page.getTotal());
     }
 
     /**
@@ -103,8 +103,8 @@ public class AitagTagLogController {
      * @return ResultDto
      */
     @ApiOperation("打标结果详情")
-    @PostMapping("/show")
-    public ResultDto<AitagTagLogEntity> show(@RequestBody String id) {
+    @GetMapping("/show/{id}")
+    public ResultDto<AitagTagLogEntity> show(@PathVariable("id") String id) {
         AitagTagLogEntity taggingDetailsResDTO = aitagTagLogService.show(id);
         return ResultDto.success(taggingDetailsResDTO);
     }

+ 114 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/TagInfoDto.java

@@ -0,0 +1,114 @@
+package cn.com.yusys.yusp.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 
+ *标签详情信息
+ * @author 2507040827
+ * @date 2026-02-26 14:34:56
+ */
+@Data
+public class TagInfoDto {
+
+    /**
+     * id
+     **/
+    @ApiModelProperty(value="id")
+    private String id;
+
+    /**
+     * 所属大类
+     **/
+    @ApiModelProperty(value = "所属大类")
+    private String categoryId;
+
+    /**
+     * 标签名称
+     **/
+    @ApiModelProperty(value = "标签名称")
+    private String tagNm;
+
+    /**
+     * 标签代码
+     **/
+    @ApiModelProperty(value = "标签代码")
+    private String tagCode;
+
+    /**
+     * 标签备注
+     **/
+    @ApiModelProperty(value = "标签备注")
+    private String tagRemark;
+
+    /**
+     * 父级ID
+     **/
+    @ApiModelProperty(value = "父级ID")
+    private String parentId;
+
+    /**
+     * 标签规则
+     **/
+    @ApiModelProperty(value = "标签规则")
+    private String reg;
+
+    /**
+     * 标签等级
+     **/
+    @ApiModelProperty(value = "标签等级")
+    private Integer level;
+
+    /**
+     * tag1/tag2/tag3/...
+     **/
+    @ApiModelProperty(value = "tag1/tag2/tag3/...")
+    private String tagPath;
+
+
+    /**
+     * 标签提示词
+     **/
+    @ApiModelProperty(value = "标签提示词")
+    private String tagPrompt;
+
+
+    /**
+     * 标签版本
+     **/
+    @ApiModelProperty(value = "标签版本")
+    private String tagVersion;
+
+    /**
+     * 修订时间
+     **/
+    @ApiModelProperty(value = "修订时间")
+    private String revisionTime;
+
+    /**
+     * 修订人
+     **/
+    @ApiModelProperty(value = "修订人")
+    private String reviser;
+
+
+    /**
+     * 标签历史版本信息
+     */
+    @ApiModelProperty(value = "标签历史版本信息")
+    private List<TagInfoVersionDto> tagInfoVersionDtos;
+
+
+    public String getTagVersionShow() {
+        return "版本V"+tagVersion;
+    }
+
+}

+ 114 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/TagInfoVersionDto.java

@@ -0,0 +1,114 @@
+package cn.com.yusys.yusp.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 标签信息版本详情信息
+ *
+ * @author 2507040827
+ * @date 2026-02-27 11:33:54
+ */
+@Data
+public class TagInfoVersionDto {
+
+    /**
+     * id
+     **/
+    @ApiModelProperty(value="id")
+    @TableId(type=IdType.UUID)
+    private String id;
+
+    /**
+     * 所属大类
+     **/
+    @ApiModelProperty(value = "所属大类")
+    private String categoryId;
+
+    /**
+     * 标签名称
+     **/
+    @ApiModelProperty(value = "标签名称")
+    private String tagNm;
+
+    /**
+     * 标签代码
+     **/
+    @ApiModelProperty(value = "标签代码")
+    private String tagCode;
+
+    /**
+     * 标签备注
+     **/
+    @ApiModelProperty(value = "标签备注")
+    private String tagRemark;
+
+    /**
+     * 父级ID
+     **/
+    @ApiModelProperty(value = "父级ID")
+    private String parentId;
+
+    /**
+     * 标签规则
+     **/
+    @ApiModelProperty(value = "标签规则")
+    private String reg;
+
+    /**
+     * 标签等级
+     **/
+    @ApiModelProperty(value = "标签等级")
+    private Integer level;
+
+    /**
+     * tag1/tag2/tag3/...
+     **/
+    @ApiModelProperty(value = "tag1/tag2/tag3/...")
+    private String tagPath;
+
+    /**
+     * 0未删除;1删除
+     **/
+    @ApiModelProperty(value = "0未删除;1删除")
+    private Integer isDelete;
+
+    /**
+     * 0 正常;1 停用
+     **/
+    @ApiModelProperty(value = "0 正常;1 停用")
+    private Integer state;
+
+    /**
+     * 标签提示词
+     **/
+    @ApiModelProperty(value = "标签提示词")
+    private String tagPrompt;
+
+    /**
+     * 标签版本
+     **/
+    @ApiModelProperty(value = "标签版本")
+    private String tagVersion;
+
+    /**
+     * 修订时间
+     **/
+    @ApiModelProperty(value = "修订时间")
+    private String revisionTime;
+
+    /**
+     * 修订人
+     **/
+    @ApiModelProperty(value = "修订人")
+    private String reviser;
+
+    public String getTagVersionShow() {
+        return "版本V"+tagVersion;
+    }
+}

+ 20 - 95
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagInfoEntity.java

@@ -5,16 +5,18 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.IdType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 
 /**
  * 
- *
+ *标签信息表
  * @author 2507040827
  * @date 2026-02-26 14:34:56
  */
 @TableName("aitag_tag_info")
-@ApiModel(value = "AitagTagInfoEntity", description = "")
+@ApiModel(value = "AitagTagInfoEntity", description = "标签信息表")
+@Data
 public class AitagTagInfoEntity {
 
     /**
@@ -52,7 +54,7 @@ public class AitagTagInfoEntity {
      * 父级ID
      **/
     @ApiModelProperty(value = "父级ID")
-    private String parentCode;
+    private String parentId;
 
     /**
      * 标签规则
@@ -91,100 +93,23 @@ public class AitagTagInfoEntity {
     private String tagPrompt;
 
 
-    public String getId() {
-        return this.id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getCategoryId() {
-        return this.categoryId;
-    }
-
-    public void setCategoryId(String categoryId) {
-        this.categoryId = categoryId;
-    }
-
-    public String getTagNm() {
-        return this.tagNm;
-    }
-
-    public void setTagNm(String tagNm) {
-        this.tagNm = tagNm;
-    }
-
-    public String getTagCode() {
-        return this.tagCode;
-    }
-
-    public void setTagCode(String tagCode) {
-        this.tagCode = tagCode;
-    }
-
-    public String getTagRemark() {
-        return this.tagRemark;
-    }
-
-    public void setTagRemark(String tagRemark) {
-        this.tagRemark = tagRemark;
-    }
-
-    public String getParentCode() {
-        return this.parentCode;
-    }
-
-    public void setParentCode(String parentCode) {
-        this.parentCode = parentCode;
-    }
-
-    public String getReg() {
-        return this.reg;
-    }
-
-    public void setReg(String reg) {
-        this.reg = reg;
-    }
-
-    public Integer getLevel() {
-        return this.level;
-    }
-
-    public void setLevel(Integer level) {
-        this.level = level;
-    }
-
-    public String getTagPath() {
-        return this.tagPath;
-    }
-
-    public void setTagPath(String tagPath) {
-        this.tagPath = tagPath;
-    }
-
-    public Integer getIsDelete() {
-        return this.isDelete;
-    }
-
-    public void setIsDelete(Integer isDelete) {
-        this.isDelete = isDelete;
-    }
-
-    public Integer getState() {
-        return this.state;
-    }
+    /**
+     * 标签版本
+     **/
+    @ApiModelProperty(value = "标签版本")
+    private String tagVersion;
 
-    public void setState(Integer state) {
-        this.state = state;
-    }
+    /**
+     * 修订时间
+     **/
+    @ApiModelProperty(value = "修订时间")
+    private String revisionTime;
 
-    public String getTagPrompt() {
-        return this.tagPrompt;
-    }
+    /**
+     * 修订人
+     **/
+    @ApiModelProperty(value = "修订人")
+    private String reviser;
 
-    public void setTagPrompt(String tagPrompt) {
-        this.tagPrompt = tagPrompt;
-    }
 
 }

+ 232 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagInfoVersionEntity.java

@@ -0,0 +1,232 @@
+package cn.com.yusys.yusp.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.IdType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+
+/**
+ * 标签信息版本表
+ *
+ * @author 2507040827
+ * @date 2026-02-27 11:33:54
+ */
+@TableName("aitag_tag_info_version")
+@ApiModel(value = "AitagTagInfoVersionEntity", description = "标签信息版本表")
+public class AitagTagInfoVersionEntity {
+
+    /**
+     * id
+     **/
+    @ApiModelProperty(value="id")
+    @TableId(type=IdType.UUID)
+    private String id;
+
+    /**
+     * 所属大类
+     **/
+    @ApiModelProperty(value = "所属大类")
+    private String categoryId;
+
+    /**
+     * 标签名称
+     **/
+    @ApiModelProperty(value = "标签名称")
+    private String tagNm;
+
+    /**
+     * 标签代码
+     **/
+    @ApiModelProperty(value = "标签代码")
+    private String tagCode;
+
+    /**
+     * 标签备注
+     **/
+    @ApiModelProperty(value = "标签备注")
+    private String tagRemark;
+
+    /**
+     * 父级ID
+     **/
+    @ApiModelProperty(value = "父级ID")
+    private String parentId;
+
+    /**
+     * 标签规则
+     **/
+    @ApiModelProperty(value = "标签规则")
+    private String reg;
+
+    /**
+     * 标签等级
+     **/
+    @ApiModelProperty(value = "标签等级")
+    private Integer level;
+
+    /**
+     * tag1/tag2/tag3/...
+     **/
+    @ApiModelProperty(value = "tag1/tag2/tag3/...")
+    private String tagPath;
+
+    /**
+     * 0未删除;1删除
+     **/
+    @ApiModelProperty(value = "0未删除;1删除")
+    private Integer isDelete;
+
+    /**
+     * 0 正常;1 停用
+     **/
+    @ApiModelProperty(value = "0 正常;1 停用")
+    private Integer state;
+
+    /**
+     * 标签提示词
+     **/
+    @ApiModelProperty(value = "标签提示词")
+    private String tagPrompt;
+
+    /**
+     * 标签版本
+     **/
+    @ApiModelProperty(value = "标签版本")
+    private String tagVersion;
+
+    /**
+     * 修订时间
+     **/
+    @ApiModelProperty(value = "修订时间")
+    private String revisionTime;
+
+    /**
+     * 修订人
+     **/
+    @ApiModelProperty(value = "修订人")
+    private String reviser;
+
+
+    public String getId() {
+        return this.id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getCategoryId() {
+        return this.categoryId;
+    }
+
+    public void setCategoryId(String categoryId) {
+        this.categoryId = categoryId;
+    }
+
+    public String getTagNm() {
+        return this.tagNm;
+    }
+
+    public void setTagNm(String tagNm) {
+        this.tagNm = tagNm;
+    }
+
+    public String getTagCode() {
+        return this.tagCode;
+    }
+
+    public void setTagCode(String tagCode) {
+        this.tagCode = tagCode;
+    }
+
+    public String getTagRemark() {
+        return this.tagRemark;
+    }
+
+    public void setTagRemark(String tagRemark) {
+        this.tagRemark = tagRemark;
+    }
+
+    public String getparentId() {
+        return this.parentId;
+    }
+
+    public void setparentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getReg() {
+        return this.reg;
+    }
+
+    public void setReg(String reg) {
+        this.reg = reg;
+    }
+
+    public Integer getLevel() {
+        return this.level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    public String getTagPath() {
+        return this.tagPath;
+    }
+
+    public void setTagPath(String tagPath) {
+        this.tagPath = tagPath;
+    }
+
+    public Integer getIsDelete() {
+        return this.isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getState() {
+        return this.state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getTagPrompt() {
+        return this.tagPrompt;
+    }
+
+    public void setTagPrompt(String tagPrompt) {
+        this.tagPrompt = tagPrompt;
+    }
+
+    public String getTagVersion() {
+        return this.tagVersion;
+    }
+
+    public void setTagVersion(String tagVersion) {
+        this.tagVersion = tagVersion;
+    }
+
+    public String getRevisionTime() {
+        return this.revisionTime;
+    }
+
+    public void setRevisionTime(String revisionTime) {
+        this.revisionTime = revisionTime;
+    }
+
+    public String getReviser() {
+        return this.reviser;
+    }
+
+    public void setReviser(String reviser) {
+        this.reviser = reviser;
+    }
+
+}

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

@@ -39,7 +39,7 @@ public class AitagTagInfoQueryVo extends PageQuery {
     /**
      * 父级ID
      **/
-    private String parentCode;
+    private String parentId;
 
     /**
      * 标签规则
@@ -112,12 +112,12 @@ public class AitagTagInfoQueryVo extends PageQuery {
         this.tagRemark = tagRemark;
     }
 
-    public String getParentCode() {
-        return this.parentCode;
+    public String getparentId() {
+        return this.parentId;
     }
 
-    public void setParentCode(String parentCode) {
-        this.parentCode = parentCode;
+    public void setparentId(String parentId) {
+        this.parentId = parentId;
     }
 
     public String getReg() {

+ 210 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/AitagTagInfoVersionQueryVo.java

@@ -0,0 +1,210 @@
+package cn.com.yusys.yusp.domain.vo;
+
+import cn.com.yusys.yusp.commons.module.adapter.query.PageQuery;
+
+
+/**
+ * 标签信息版本表
+ *
+ * @author 2507040827
+ * @date 2026-02-27 11:33:54
+ */
+public class AitagTagInfoVersionQueryVo extends PageQuery {
+
+    /**
+     * id
+     **/
+    private String id;
+
+    /**
+     * 所属大类
+     **/
+    private String categoryId;
+
+    /**
+     * 标签名称
+     **/
+    private String tagNm;
+
+    /**
+     * 标签代码
+     **/
+    private String tagCode;
+
+    /**
+     * 标签备注
+     **/
+    private String tagRemark;
+
+    /**
+     * 父级ID
+     **/
+    private String parentId;
+
+    /**
+     * 标签规则
+     **/
+    private String reg;
+
+    /**
+     * 标签等级
+     **/
+    private Integer level;
+
+    /**
+     * tag1/tag2/tag3/...
+     **/
+    private String tagPath;
+
+    /**
+     * 0未删除;1删除
+     **/
+    private Integer isDelete;
+
+    /**
+     * 0 正常;1 停用
+     **/
+    private Integer state;
+
+    /**
+     * 标签提示词
+     **/
+    private String tagPrompt;
+
+    /**
+     * 标签版本
+     **/
+    private String tagVersion;
+
+    /**
+     * 修订时间
+     **/
+    private String revisionTime;
+
+    /**
+     * 修订人
+     **/
+    private String reviser;
+
+
+    public String getId() {
+        return this.id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getCategoryId() {
+        return this.categoryId;
+    }
+
+    public void setCategoryId(String categoryId) {
+        this.categoryId = categoryId;
+    }
+
+    public String getTagNm() {
+        return this.tagNm;
+    }
+
+    public void setTagNm(String tagNm) {
+        this.tagNm = tagNm;
+    }
+
+    public String getTagCode() {
+        return this.tagCode;
+    }
+
+    public void setTagCode(String tagCode) {
+        this.tagCode = tagCode;
+    }
+
+    public String getTagRemark() {
+        return this.tagRemark;
+    }
+
+    public void setTagRemark(String tagRemark) {
+        this.tagRemark = tagRemark;
+    }
+
+    public String getparentId() {
+        return this.parentId;
+    }
+
+    public void setparentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getReg() {
+        return this.reg;
+    }
+
+    public void setReg(String reg) {
+        this.reg = reg;
+    }
+
+    public Integer getLevel() {
+        return this.level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    public String getTagPath() {
+        return this.tagPath;
+    }
+
+    public void setTagPath(String tagPath) {
+        this.tagPath = tagPath;
+    }
+
+    public Integer getIsDelete() {
+        return this.isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getState() {
+        return this.state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getTagPrompt() {
+        return this.tagPrompt;
+    }
+
+    public void setTagPrompt(String tagPrompt) {
+        this.tagPrompt = tagPrompt;
+    }
+
+    public String getTagVersion() {
+        return this.tagVersion;
+    }
+
+    public void setTagVersion(String tagVersion) {
+        this.tagVersion = tagVersion;
+    }
+
+    public String getRevisionTime() {
+        return this.revisionTime;
+    }
+
+    public void setRevisionTime(String revisionTime) {
+        this.revisionTime = revisionTime;
+    }
+
+    public String getReviser() {
+        return this.reviser;
+    }
+
+    public void setReviser(String reviser) {
+        this.reviser = reviser;
+    }
+
+}

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

@@ -0,0 +1,74 @@
+package cn.com.yusys.yusp.domain.vo;
+
+
+import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 智能标签数
+ */
+public class TagNodeVo {
+
+
+    private String id;
+
+    private String parentId;
+    private String tagNm;
+    private String tagCode;
+    private List<TagNodeVo> children = new ArrayList<>();
+
+
+    public TagNodeVo(AitagTagInfoEntity entity) {
+        this.id = entity.getId();
+        this.parentId = entity.getParentId();
+        this.tagNm = entity.getTagNm();
+        this.tagCode = entity.getTagCode();
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getparentId() {
+        return parentId;
+    }
+
+    public void setparentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getTagNm() {
+        return tagNm;
+    }
+
+    public void setTagNm(String tagNm) {
+        this.tagNm = tagNm;
+    }
+
+    public String getTagCode() {
+        return tagCode;
+    }
+
+    public void setTagCode(String tagCode) {
+        this.tagCode = tagCode;
+    }
+
+
+    public List<TagNodeVo> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<TagNodeVo> children) {
+        this.children = children;
+    }
+
+    public void addChild(TagNodeVo child) {
+        this.children.add(child);
+    }
+}

+ 35 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/VersionRollbackVo.java

@@ -0,0 +1,35 @@
+package cn.com.yusys.yusp.domain.vo;
+
+
+import lombok.Data;
+
+/**
+ * 版本回溯
+ */
+
+@Data
+public class VersionRollbackVo {
+
+
+
+    /**
+     * 标签主键
+     */
+    private String id;
+
+    /**
+     * 标签代码
+     */
+    private String tagCode;
+
+
+    /**
+     * 要回溯标签版本
+     */
+    private String version;
+
+    /**
+     * 修订人
+     */
+    private String reviser;
+}

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

@@ -1,8 +1,12 @@
 package cn.com.yusys.yusp.mapper;
 
 import cn.com.yusys.yusp.commons.mybatisplus.mapper.BaseMapper;
+import cn.com.yusys.yusp.domain.dto.TagInfoDto;
 import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 
@@ -14,4 +18,7 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface AitagTagInfoDao extends BaseMapper<AitagTagInfoEntity> {
 
+
+   TagInfoDto selectTagInfo(@Param("id") String id);
+
 }

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

@@ -0,0 +1,17 @@
+package cn.com.yusys.yusp.mapper;
+
+import cn.com.yusys.yusp.commons.mybatisplus.mapper.BaseMapper;
+import cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 标签信息版本表
+ *
+ * @author 2507040827
+ * @date 2026-02-27 11:33:54
+ */
+
+@Mapper
+public interface AitagTagInfoVersionDao extends BaseMapper<AitagTagInfoVersionEntity> {
+
+}

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

@@ -1,10 +1,15 @@
 package cn.com.yusys.yusp.service;
 
+import cn.com.yusys.yusp.domain.dto.TagInfoDto;
 import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
 import cn.com.yusys.yusp.domain.vo.AitagTagInfoQueryVo;
+import cn.com.yusys.yusp.domain.vo.TagNodeVo;
+import cn.com.yusys.yusp.domain.vo.VersionRollbackVo;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * 
  *
@@ -21,5 +26,19 @@ public interface AitagTagInfoService extends IService<AitagTagInfoEntity> {
      * @return IPage
      */
     IPage<AitagTagInfoEntity> queryPage(AitagTagInfoQueryVo aitagTagInfoQueryVo);
+
+    void saveTag(AitagTagInfoEntity aitagTagInfo);
+
+    List<TagNodeVo> queryTagTree(AitagTagInfoQueryVo aitagTagInfoQueryVo);
+
+    TagInfoDto getTagInfo(String id);
+
+    void updateTag(AitagTagInfoEntity aitagTagInfoEntity);
+
+    void removeTags(List<String> list);
+
+    void versionRollback(VersionRollbackVo versionRollbackVo);
+
+    List<AitagTagInfoEntity> queryList(AitagTagInfoQueryVo aitagTagInfoQueryVo);
 }
 

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

@@ -0,0 +1,25 @@
+package cn.com.yusys.yusp.service;
+
+import cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity;
+import cn.com.yusys.yusp.domain.vo.AitagTagInfoVersionQueryVo;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 标签信息版本表
+ *
+ * @author 2507040827
+ * @date 2026-02-27 11:33:54
+ */
+
+public interface AitagTagInfoVersionService extends IService<AitagTagInfoVersionEntity> {
+
+    /**
+     * 分页查询
+     *
+     * @param aitagTagInfoVersionQueryVo
+     * @return IPage
+     */
+    IPage<AitagTagInfoVersionEntity> queryPage(AitagTagInfoVersionQueryVo aitagTagInfoVersionQueryVo);
+}
+

+ 202 - 2
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagInfoServiceImpl.java

@@ -1,14 +1,30 @@
 package cn.com.yusys.yusp.service.impl;
 
+import cn.com.yusys.yusp.commons.util.StringUtils;
+import cn.com.yusys.yusp.commons.util.date.DateUtils;
+import cn.com.yusys.yusp.domain.vo.VersionRollbackVo;
+import cn.com.yusys.yusp.mapper.AitagTagInfoVersionDao;
+import cn.com.yusys.yusp.domain.dto.TagInfoDto;
+import cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity;
+import cn.com.yusys.yusp.domain.vo.TagNodeVo;
 import cn.com.yusys.yusp.mapper.AitagTagInfoDao;
 import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
 import cn.com.yusys.yusp.domain.vo.AitagTagInfoQueryVo;
 import cn.com.yusys.yusp.service.AitagTagInfoService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+import static cn.com.yusys.yusp.config.DataDictionary.*;
 
 /**
  * 
@@ -20,6 +36,10 @@ import org.springframework.stereotype.Service;
 @Service("aitagTagInfoService")
 public class AitagTagInfoServiceImpl extends ServiceImpl<AitagTagInfoDao, AitagTagInfoEntity> implements AitagTagInfoService {
 
+
+    @Autowired
+    private AitagTagInfoVersionDao aitagTagInfoVersionDao;
+
     /**
      * 分页查询
      *
@@ -44,8 +64,8 @@ public class AitagTagInfoServiceImpl extends ServiceImpl<AitagTagInfoDao, AitagT
         if (aitagTagInfoQueryVo.getTagRemark() != null) {
             queryWrapper.eq(AitagTagInfoEntity::getTagRemark, aitagTagInfoQueryVo.getTagRemark());
         }
-        if (aitagTagInfoQueryVo.getParentCode() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getParentCode, aitagTagInfoQueryVo.getParentCode());
+        if (aitagTagInfoQueryVo.getparentId() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getParentId, aitagTagInfoQueryVo.getparentId());
         }
         if (aitagTagInfoQueryVo.getReg() != null) {
             queryWrapper.eq(AitagTagInfoEntity::getReg, aitagTagInfoQueryVo.getReg());
@@ -69,4 +89,184 @@ public class AitagTagInfoServiceImpl extends ServiceImpl<AitagTagInfoDao, AitagT
         IPage<AitagTagInfoEntity> page = this.page(new Page<>(aitagTagInfoQueryVo.getPage(), aitagTagInfoQueryVo.getSize()), queryWrapper);
         return page;
     }
+
+
+    @Override
+    public void saveTag(AitagTagInfoEntity aitagTagInfo){
+        aitagTagInfo.setId(StringUtils.getUUID());
+        String parentId = aitagTagInfo.getParentId();
+        if(!StringUtils.isBlank(parentId)){
+            LambdaQueryWrapper<AitagTagInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(AitagTagInfoEntity::getParentId,parentId);
+            queryWrapper.eq(AitagTagInfoEntity::getIsDelete,TAG_UNDELETED);
+            List<AitagTagInfoEntity> aitagTagInfoEntities = this.baseMapper.selectList(queryWrapper);
+            if(!aitagTagInfoEntities.isEmpty()){
+                AitagTagInfoEntity aitagTagInfoEntity = aitagTagInfoEntities.get(0);
+                aitagTagInfo.setTagPath(aitagTagInfoEntity.getTagPath()+"/"+aitagTagInfo.getTagNm());
+                aitagTagInfo.setLevel(aitagTagInfoEntity.getLevel()+1);
+            }else{
+                aitagTagInfo.setTagPath(aitagTagInfo.getTagNm());
+                aitagTagInfo.setLevel(1);
+            }
+        }else{
+            aitagTagInfo.setTagPath(aitagTagInfo.getTagNm());
+            aitagTagInfo.setLevel(1);
+        }
+        aitagTagInfo.setRevisionTime(DateUtils.getCurrDateTimeStr());
+        aitagTagInfo.setTagVersion("0.1");
+        aitagTagInfo.setIsDelete(TAG_UNDELETED);
+        aitagTagInfo.setState(TAG_ENABLED);
+        this.save(aitagTagInfo);
+    }
+
+    /**
+     * 列表查询
+     *
+     * @param aitagTagInfoQueryVo
+     * @return List<TagNodeVo>
+     */
+    @Override
+    public List<TagNodeVo> queryTagTree(AitagTagInfoQueryVo aitagTagInfoQueryVo) {
+        LambdaQueryWrapper<AitagTagInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
+        if (aitagTagInfoQueryVo.getId() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getId, aitagTagInfoQueryVo.getId());
+        }
+        queryWrapper.eq(AitagTagInfoEntity::getCategoryId, aitagTagInfoQueryVo.getCategoryId());
+        if (aitagTagInfoQueryVo.getTagNm() != null) {
+            queryWrapper.like(AitagTagInfoEntity::getTagNm, aitagTagInfoQueryVo.getTagNm());
+        }
+        queryWrapper.eq(AitagTagInfoEntity::getIsDelete, TAG_UNDELETED);
+        List<AitagTagInfoEntity> aitagTagInfoEntities = this.baseMapper.selectList(queryWrapper);
+        return this.buildTree(aitagTagInfoEntities);
+    }
+
+    @Override
+    public TagInfoDto getTagInfo(String id) {
+        return this.baseMapper.selectTagInfo(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateTag(AitagTagInfoEntity aitagTagInfoEntity) {
+        AitagTagInfoEntity tagInfo = this.baseMapper.selectById(aitagTagInfoEntity.getId());
+        AitagTagInfoVersionEntity aitagTagInfoVersionEntity = JSON.parseObject(JSON.toJSONString(tagInfo), AitagTagInfoVersionEntity.class);
+        aitagTagInfoVersionEntity.setId(StringUtils.getUUID());
+        this.aitagTagInfoVersionDao.insert(aitagTagInfoVersionEntity);
+        aitagTagInfoEntity.setRevisionTime(DateUtils.getCurrDateTimeStr());
+        aitagTagInfoEntity.setTagVersion(Double.parseDouble(tagInfo.getTagVersion())+0.1+"");
+        this.baseMapper.updateById(aitagTagInfoEntity);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void removeTags(List<String> list) {
+        AitagTagInfoEntity aitagTagInfoEntity = new AitagTagInfoEntity();
+        for (String id:list){
+            aitagTagInfoEntity.setId(id);
+            aitagTagInfoEntity.setIsDelete(TAG_DELETED);
+            this.baseMapper.updateById(aitagTagInfoEntity);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void versionRollback(VersionRollbackVo versionRollback) {
+        LambdaQueryWrapper<AitagTagInfoVersionEntity> queryTagVersionWrapper = new LambdaQueryWrapper<>();
+        queryTagVersionWrapper.eq(AitagTagInfoVersionEntity::getTagCode,versionRollback.getTagCode());
+        queryTagVersionWrapper.eq(AitagTagInfoVersionEntity::getTagVersion,versionRollback.getVersion());
+        List<AitagTagInfoVersionEntity> versionEntities = this.aitagTagInfoVersionDao.selectList(queryTagVersionWrapper);
+        if(versionEntities !=null && !versionEntities.isEmpty()){
+            AitagTagInfoVersionEntity tagInfoVersion = versionEntities.get(0);
+            AitagTagInfoEntity aitagTagInfoEntity = JSON.parseObject(JSONObject.toJSONString(tagInfoVersion), AitagTagInfoEntity.class);
+            aitagTagInfoEntity.setId(versionRollback.getId());
+            aitagTagInfoEntity.setRevisionTime(DateUtils.getCurrDateTimeStr());
+            aitagTagInfoEntity.setReviser(versionRollback.getReviser());
+            this.baseMapper.updateById(aitagTagInfoEntity);
+            LambdaUpdateWrapper<AitagTagInfoVersionEntity> updateTagVersion = new LambdaUpdateWrapper<>();
+            updateTagVersion.eq(AitagTagInfoVersionEntity::getTagCode,versionRollback.getTagCode());
+            updateTagVersion.ge(AitagTagInfoVersionEntity::getTagVersion,versionRollback.getVersion());
+            AitagTagInfoVersionEntity aitagTagInfoVersionEntity = new AitagTagInfoVersionEntity();
+            aitagTagInfoVersionEntity.setIsDelete(TAG_DELETED);
+            this.aitagTagInfoVersionDao.update(aitagTagInfoVersionEntity,updateTagVersion);
+        }
+    }
+
+    @Override
+    public List<AitagTagInfoEntity> queryList(AitagTagInfoQueryVo aitagTagInfoQueryVo) {
+        LambdaQueryWrapper<AitagTagInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
+        if (aitagTagInfoQueryVo.getId() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getId, aitagTagInfoQueryVo.getId());
+        }
+        if (aitagTagInfoQueryVo.getCategoryId() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getCategoryId, aitagTagInfoQueryVo.getCategoryId());
+        }
+        if (aitagTagInfoQueryVo.getTagNm() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getTagNm, aitagTagInfoQueryVo.getTagNm());
+        }
+        if (aitagTagInfoQueryVo.getTagCode() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getTagCode, aitagTagInfoQueryVo.getTagCode());
+        }
+        if (aitagTagInfoQueryVo.getTagRemark() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getTagRemark, aitagTagInfoQueryVo.getTagRemark());
+        }
+        if (aitagTagInfoQueryVo.getparentId() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getParentId, aitagTagInfoQueryVo.getparentId());
+        }
+        if (aitagTagInfoQueryVo.getReg() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getReg, aitagTagInfoQueryVo.getReg());
+        }
+        if (aitagTagInfoQueryVo.getLevel() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getLevel, aitagTagInfoQueryVo.getLevel());
+        }
+        if (aitagTagInfoQueryVo.getTagPath() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getTagPath, aitagTagInfoQueryVo.getTagPath());
+        }
+        if (aitagTagInfoQueryVo.getIsDelete() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getIsDelete, aitagTagInfoQueryVo.getIsDelete());
+        }
+        if (aitagTagInfoQueryVo.getState() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getState, aitagTagInfoQueryVo.getState());
+        }
+        if (aitagTagInfoQueryVo.getTagPrompt() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getTagPrompt, aitagTagInfoQueryVo.getTagPrompt());
+        }
+        queryWrapper.select(AitagTagInfoEntity::getId,AitagTagInfoEntity::getTagNm,AitagTagInfoEntity::getParentId);
+        return this.baseMapper.selectList(queryWrapper);
+    }
+
+    /**
+     * 将AitagTagInfoEntity列表转换为树形结构
+     * @param entities AitagTagInfoEntity列表
+     * @return 树形结构的根节点列表
+     */
+    private List<TagNodeVo> buildTree(List<AitagTagInfoEntity> entities) {
+        List<TagNodeVo> rootNodes = new ArrayList<>();
+        Map<String, TagNodeVo> nodeMap = new HashMap<>();
+
+        // 首先创建所有节点并放入map
+        for (AitagTagInfoEntity entity : entities) {
+            TagNodeVo node = new TagNodeVo(entity);
+            nodeMap.put(entity.getId(), node);
+        }
+
+        // 构建树形结构
+        for (AitagTagInfoEntity entity : entities) {
+            TagNodeVo currentNode = nodeMap.get(entity.getId());
+            String parentId = entity.getParentId();
+
+            // 如果parentId为null或空,则为根节点
+            if (parentId == null || parentId.isEmpty()) {
+                rootNodes.add(currentNode);
+            } else {
+                // 查找父节点并添加为子节点
+                TagNodeVo parentNode = nodeMap.get(parentId);
+                if (parentNode != null) {
+                    parentNode.addChild(currentNode);
+                }else{
+                    rootNodes.add(currentNode);
+                }
+            }
+        }
+        return rootNodes;
+    }
 }

+ 81 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagInfoVersionServiceImpl.java

@@ -0,0 +1,81 @@
+package cn.com.yusys.yusp.service.impl;
+
+import cn.com.yusys.yusp.mapper.AitagTagInfoVersionDao;
+import cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity;
+import cn.com.yusys.yusp.domain.vo.AitagTagInfoVersionQueryVo;
+import cn.com.yusys.yusp.service.AitagTagInfoVersionService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 标签信息版本表
+ *
+ * @author 2507040827
+ * @date 2026-02-27 11:33:54
+ */
+
+@Service("aitagTagInfoVersionService")
+public class AitagTagInfoVersionServiceImpl extends ServiceImpl<AitagTagInfoVersionDao, AitagTagInfoVersionEntity> implements AitagTagInfoVersionService {
+
+    /**
+     * 分页查询
+     *
+     * @param aitagTagInfoVersionQueryVo
+     * @return IPage
+     */
+    @Override
+    public IPage<AitagTagInfoVersionEntity> queryPage(AitagTagInfoVersionQueryVo aitagTagInfoVersionQueryVo) {
+        LambdaQueryWrapper<AitagTagInfoVersionEntity> queryWrapper = new LambdaQueryWrapper<>();
+        if (aitagTagInfoVersionQueryVo.getId() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getId, aitagTagInfoVersionQueryVo.getId());
+        }
+        if (aitagTagInfoVersionQueryVo.getCategoryId() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getCategoryId, aitagTagInfoVersionQueryVo.getCategoryId());
+        }
+        if (aitagTagInfoVersionQueryVo.getTagNm() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getTagNm, aitagTagInfoVersionQueryVo.getTagNm());
+        }
+        if (aitagTagInfoVersionQueryVo.getTagCode() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getTagCode, aitagTagInfoVersionQueryVo.getTagCode());
+        }
+        if (aitagTagInfoVersionQueryVo.getTagRemark() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getTagRemark, aitagTagInfoVersionQueryVo.getTagRemark());
+        }
+        if (aitagTagInfoVersionQueryVo.getparentId() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getparentId, aitagTagInfoVersionQueryVo.getparentId());
+        }
+        if (aitagTagInfoVersionQueryVo.getReg() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getReg, aitagTagInfoVersionQueryVo.getReg());
+        }
+        if (aitagTagInfoVersionQueryVo.getLevel() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getLevel, aitagTagInfoVersionQueryVo.getLevel());
+        }
+        if (aitagTagInfoVersionQueryVo.getTagPath() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getTagPath, aitagTagInfoVersionQueryVo.getTagPath());
+        }
+        if (aitagTagInfoVersionQueryVo.getIsDelete() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getIsDelete, aitagTagInfoVersionQueryVo.getIsDelete());
+        }
+        if (aitagTagInfoVersionQueryVo.getState() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getState, aitagTagInfoVersionQueryVo.getState());
+        }
+        if (aitagTagInfoVersionQueryVo.getTagPrompt() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getTagPrompt, aitagTagInfoVersionQueryVo.getTagPrompt());
+        }
+        if (aitagTagInfoVersionQueryVo.getTagVersion() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getTagVersion, aitagTagInfoVersionQueryVo.getTagVersion());
+        }
+        if (aitagTagInfoVersionQueryVo.getRevisionTime() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getRevisionTime, aitagTagInfoVersionQueryVo.getRevisionTime());
+        }
+        if (aitagTagInfoVersionQueryVo.getReviser() != null) {
+            queryWrapper.eq(AitagTagInfoVersionEntity::getReviser, aitagTagInfoVersionQueryVo.getReviser());
+        }
+
+        IPage<AitagTagInfoVersionEntity> page = this.page(new Page<>(aitagTagInfoVersionQueryVo.getPage(), aitagTagInfoVersionQueryVo.getSize()), queryWrapper);
+        return page;
+    }
+}

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

@@ -117,8 +117,8 @@ public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTag
         if (StringUtils.isNotBlank(transactionReqVo.getLoanApplicationNo())){
             queryWrapper.le(AitagTagLogEntity::getBusinessAttr, transactionReqVo.getLoanApplicationNo());
         }
-        return this.baseMapper.selectPage(new Page<>(transactionReqVo.getPage(),
-                transactionReqVo.getSize()),queryWrapper);
+        return this.baseMapper.selectPage(new Page<>(transactionReqVo.getPage() == null?0:transactionReqVo.getPage(),
+                transactionReqVo.getSize() == null?10:transactionReqVo.getSize()),queryWrapper);
     }
 
     @Override
@@ -143,12 +143,9 @@ public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTag
     private String getTagPath(String result) {
         List<Map> results = JSONArray.parseArray(result, Map.class);
         for (Map resultMap: results){
-            String tagCode = resultMap.getOrDefault("tag_code","").toString();
-            LambdaQueryWrapper<AitagTagInfoEntity> queryCount = new LambdaQueryWrapper<>();
-            queryCount.eq(AitagTagInfoEntity::getTagCode,tagCode);
-            List<AitagTagInfoEntity> aitagTagInfoEntities = tagInfoDao.selectList(queryCount);
-            if(!aitagTagInfoEntities.isEmpty()){
-                AitagTagInfoEntity aitagTagInfoEntity = aitagTagInfoEntities.get(0);
+            String tagId = resultMap.getOrDefault("id","").toString();
+            AitagTagInfoEntity aitagTagInfoEntity = tagInfoDao.selectById(tagId);
+            if(aitagTagInfoEntity!=null){
                 resultMap.put("tag_path",aitagTagInfoEntity.getTagPath());
             }
         }

+ 60 - 3
server/yusp-tagging-core/src/main/resources/mapper/AitagTagInfoMapper.xml

@@ -7,12 +7,69 @@
         <result column="tag_nm" jdbcType="VARCHAR" property="tagNm"/>
         <result column="tag_code" jdbcType="VARCHAR" property="tagCode"/>
         <result column="tag_remark" jdbcType="VARCHAR" property="tagRemark"/>
-        <result column="parent_code" jdbcType="VARCHAR" property="parentCode"/>
+        <result column="parent_id" jdbcType="VARCHAR" property="parentId"/>
         <result column="reg" jdbcType="VARCHAR" property="reg"/>
         <result column="level" jdbcType="INTEGER" property="level"/>
         <result column="tag_path" jdbcType="VARCHAR" property="tagPath"/>
-        <result column="is_delete" jdbcType="INTEGER" property="isDelete"/>
-        <result column="state" jdbcType="INTEGER" property="state"/>
         <result column="tag_prompt" jdbcType="VARCHAR" property="tagPrompt"/>
+        <result column="tag_version" jdbcType="VARCHAR" property="tagVersion"/>
+        <result column="revision_time" jdbcType="VARCHAR" property="revisionTime"/>
+        <result column="reviser" jdbcType="VARCHAR" property="reviser"/>
     </resultMap>
+
+
+    <resultMap id="tagInfo" type="cn.com.yusys.yusp.domain.dto.TagInfoDto" extends="aitagTagInfo">
+        <collection property="tagInfoVersionDtos" ofType="cn.com.yusys.yusp.domain.dto.TagInfoVersionDto">
+            <id property="id" column="version_id"/>
+            <result property="categoryId" column="version_category_id"/>
+            <result property="tagNm" column="version_tag_nm"/>
+            <result property="tagCode" column="version_tag_code"/>
+            <result property="tagRemark" column="version_tag_remark"/>
+            <result property="parentId" column="version_parent_id"/>
+            <result property="reg" column="version_reg"/>
+            <result property="level" column="version_level"/>
+            <result property="tagPath" column="version_tag_path"/>
+            <result property="tagPrompt" column="version_tag_prompt"/>
+            <result property="tagVersion" column="version_tag_version"/>
+            <result property="revisionTime" column="version_revision_time"/>
+            <result property="reviser" column="version_reviser"/>
+        </collection>
+    </resultMap>
+
+
+    <select id="selectTagInfo" resultMap="tagInfo">
+        SELECT
+            ti.id,
+            ti.category_id,
+            ti.tag_nm,
+            ti.tag_code,
+            ti.tag_remark,
+            ti.parent_id,
+            ti.reg,
+            ti.level,
+            ti.tag_path,
+            ti.tag_prompt,
+            ti.tag_version,
+            ti.revision_time,
+            ti.reviser,
+            tiv.id AS version_id,
+            tiv.category_id AS version_category_id,
+            tiv.tag_nm AS version_tag_nm,
+            tiv.tag_code AS version_tag_code,
+            tiv.tag_remark AS version_tag_remark,
+            tiv.parent_id AS version_parent_id,
+            tiv.reg AS version_reg,
+            tiv.level AS version_level,
+            tiv.tag_path AS version_tag_path,
+            tiv.tag_prompt AS version_tag_prompt,
+            tiv.tag_version AS version_tag_version,
+            tiv.revision_time AS version_revision_time,
+            tiv.reviser AS version_reviser
+        FROM aitag_tag_info ti
+                 LEFT JOIN (SELECT *
+                            FROM aitag_tag_info_version
+                            WHERE is_delete = '0')  tiv ON ti.tag_code = tiv.tag_code
+        where ti.id= #{id}
+    </select>
+
 </mapper>

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

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.yusys.yusp.mapper.AitagTagInfoVersionDao">
+    <resultMap id="aitagTagInfoVersion" type="cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity">
+        <id column="id" jdbcType="VARCHAR" property="id"/>
+        <result column="category_id" jdbcType="VARCHAR" property="categoryId"/>
+        <result column="tag_nm" jdbcType="VARCHAR" property="tagNm"/>
+        <result column="tag_code" jdbcType="VARCHAR" property="tagCode"/>
+        <result column="tag_remark" jdbcType="LONGVARCHAR" property="tagRemark"/>
+        <result column="parent_id" jdbcType="VARCHAR" property="parentId"/>
+        <result column="reg" jdbcType="LONGVARCHAR" property="reg"/>
+        <result column="level" jdbcType="INTEGER" property="level"/>
+        <result column="tag_path" jdbcType="VARCHAR" property="tagPath"/>
+        <result column="is_delete" jdbcType="INTEGER" property="isDelete"/>
+        <result column="state" jdbcType="INTEGER" property="state"/>
+        <result column="tag_prompt" jdbcType="VARCHAR" property="tagPrompt"/>
+        <result column="tag_version" jdbcType="VARCHAR" property="tagVersion"/>
+        <result column="revision_time" jdbcType="VARCHAR" property="revisionTime"/>
+        <result column="reviser" jdbcType="VARCHAR" property="reviser"/>
+    </resultMap>
+</mapper>

+ 2 - 1
server/yusp-tagging-core/src/main/resources/messages/yusp_input_msg.properties

@@ -97,4 +97,5 @@ REQUEST_PARAMETER_CANNOT_BE_EMPTY=\u8BF7\u6C42\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A
 EXTENSION_FIELD_CANNOT_BE_EMPTY=\u6269\u5C55\u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A
 SUPPLEMENTAL_TABLE_CONFIG_NOT_EXIST=\u8865\u5F55\u8868\u914D\u7F6E\u4E0D\u5B58\u5728,\u8BF7\u786E\u8BA4\u540E\u518D\u64CD\u4F5C
 DATA_SOURCE_INFO_NOT_EXIST=\u5F53\u524D\u8868\u6570\u636E\u6E90\u4FE1\u606F\u4E0D\u5B58\u5728
-NO_DATA_PERIOD=\u8BE5\u7EDF\u8BA1\u5468\u671F\u6682\u672A\u5B9E\u73B0
+NO_DATA_PERIOD=\u8BE5\u7EDF\u8BA1\u5468\u671F\u6682\u672A\u5B9E\u73B0
+E001=\u6240\u5C5E\u5927\u7C7B\u4E0D\u80FD\u4E3A\u7A7A

+ 2 - 0
server/yusp-tagging-starter/src/main/java/cn/com/yusys/yusp/detail/App.java

@@ -7,6 +7,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 import java.net.URL;
 
@@ -14,6 +15,7 @@ import java.net.URL;
 @SpringBootApplication(scanBasePackages = {"cn.com.yusys.yusp"})
 @MapperScan("cn.com.yusys.yusp.mapper")
 @EnableScheduling
+@EnableTransactionManagement
 public class App {
     public static void main(String[] args) {
         SpringApplication.run(App.class, args);