jianggs 4 päivää sitten
vanhempi
commit
c8c58ca20c

+ 1 - 1
web/src/config/constant/app.data.service.js

@@ -30,9 +30,9 @@ const serviceNameList = {
   mockExampleService: "/mock-example", // 通用Mock模拟示例服务,
 
   uaaService: "/base-uaa", // 用户认证微服务
+  appOcaService: "/base-oca", // 组织机构、菜单权限微服务
   gatewayService: "/base-gateway", // 网关
   appCommonService: "/base-common", // 基础服务
-  appOcaService: "/base-oca", // 组织机构、菜单权限微服务
   tagServer:"/tag-server",//智能打标服务
   
 

+ 216 - 0
web/src/views/content/aiTagging/externalPage/components/IntelligentRecommend.vue

@@ -0,0 +1,216 @@
+<template>
+  <div class="intelligent-recommend">
+    <!-- 智能推荐标题 -->
+    <div class="section-header">
+      <h3 class="section-title">智能推荐</h3>
+      <a href="javascript:void(0)" class="switch-to-manual" @click="$emit('switchToManual')">
+        以下都不合适?切换人工打标
+      </a>
+    </div>
+
+    <!-- 无推荐结果状态 -->
+    <div v-if="!hasRecommendations" class="no-recommendations">
+      <div class="no-data-icon">
+        <img src="https://trae-api-cn.mchost.guru/api/ide/v1/text_to_image?prompt=empty%20box%20with%20flying%20icons%2C%20blue%20color%2C%20simple%20illustration&image_size=square" alt="暂无数据" />
+      </div>
+      <div class="no-data-text">暂无数据</div>
+      <a href="javascript:void(0)" class="retry-btn" @click="$emit('retryIntelligentTagging')">
+        点击此处,再次发起智能打标
+      </a>
+    </div>
+
+    <!-- 有推荐结果状态 -->
+    <div v-else class="recommendation-list">
+      <div 
+        v-for="(tag, index) in recommendations" 
+        :key="index"
+        class="recommendation-item"
+        :class="{ 'selected': tag.selected }"
+        @click="handleTagSelect(index)"
+      >
+        <!-- 标签路径 -->
+        <div class="tag-path">
+          <span>{{ tag.path }}</span>
+          <i v-if="tag.selected" class="el-icon-check selected-icon"></i>
+        </div>
+        
+        <!-- 打标依据 -->
+        <div class="tag-basis">
+          <div class="basis-label">打标依据:</div>
+          <div class="basis-content">{{ tag.basis }}</div>
+        </div>
+        
+        <!-- 不准确反馈 -->
+        <div class="feedback-section">
+          <div class="feedback-label">不准确反馈:</div>
+          <el-input
+            v-model="tag.feedback"
+            type="textarea"
+            placeholder="请输入"
+            :rows="2"
+            class="feedback-input"
+          ></el-input>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'IntelligentRecommend',
+  props: {
+    recommendations: {
+      type: Array,
+      default: () => []
+    }
+  },
+  computed: {
+    // 检查是否有推荐结果
+    hasRecommendations() {
+      return this.recommendations.length > 0;
+    }
+  },
+  methods: {
+    // 选择标签
+    handleTagSelect(index) {
+      this.$emit('tagSelect', index);
+    }
+  }
+}
+</script>
+
+<style scoped>
+.intelligent-recommend {
+  padding: 20px;
+}
+
+.section-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 24px;
+}
+
+.section-title {
+  font-size: 16px;
+  font-weight: 500;
+  color: #303133;
+  margin: 0;
+}
+
+.switch-to-manual {
+  font-size: 14px;
+  color: #409EFF;
+  text-decoration: none;
+}
+
+.switch-to-manual:hover {
+  text-decoration: underline;
+}
+
+.no-recommendations {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 60px 20px;
+  text-align: center;
+}
+
+.no-data-icon {
+  margin-bottom: 20px;
+}
+
+.no-data-icon img {
+  width: 120px;
+  height: 120px;
+}
+
+.no-data-text {
+  font-size: 16px;
+  color: #909399;
+  margin-bottom: 20px;
+}
+
+.retry-btn {
+  font-size: 14px;
+  color: #409EFF;
+  text-decoration: none;
+}
+
+.retry-btn:hover {
+  text-decoration: underline;
+}
+
+.recommendation-list {
+  margin-top: 20px;
+}
+
+.recommendation-item {
+  border: 1px solid #E4E7ED;
+  border-radius: 4px;
+  padding: 16px;
+  margin-bottom: 16px;
+  cursor: pointer;
+  transition: all 0.3s ease;
+}
+
+.recommendation-item:hover {
+  border-color: #C0C4CC;
+  box-shadow: 0 2px 4px rgba(0,0,0,0.05);
+}
+
+.recommendation-item.selected {
+  border-color: #67C23A;
+  background-color: #F0F9EB;
+}
+
+.tag-path {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 16px;
+  font-size: 14px;
+  font-weight: 500;
+  color: #303133;
+}
+
+.selected-icon {
+  color: #67C23A;
+  font-size: 16px;
+}
+
+.tag-basis {
+  margin-bottom: 16px;
+}
+
+.basis-label {
+  font-size: 13px;
+  color: #909399;
+  margin-bottom: 8px;
+}
+
+.basis-content {
+  font-size: 13px;
+  color: #606266;
+  line-height: 1.5;
+  background-color: #F5F7FA;
+  padding: 10px;
+  border-radius: 4px;
+}
+
+.feedback-section {
+  margin-top: 12px;
+}
+
+.feedback-label {
+  font-size: 13px;
+  color: #909399;
+  margin-bottom: 8px;
+}
+
+.feedback-input {
+  width: 100%;
+}
+</style>

+ 132 - 0
web/src/views/content/aiTagging/externalPage/components/ManualTagging.vue

@@ -0,0 +1,132 @@
+<template>
+  <div class="manual-tagging">
+    <!-- 人工打标标题 -->
+    <div class="section-header">
+      <h3 class="section-title">人工打标</h3>
+      <a href="javascript:void(0)" class="switch-to-intelligent" @click="$emit('switchToIntelligent')">
+        切换智能打标
+      </a>
+    </div>
+
+    <!-- 搜索框 -->
+    <div class="search-box">
+      <el-input
+        v-model="searchKeyword"
+        placeholder="请输入"
+        class="search-input"
+        @input="handleSearch"
+      >
+        <i slot="prefix" class="el-input__icon el-icon-search"></i>
+      </el-input>
+    </div>
+
+    <!-- 标签树 -->
+    <div class="tag-tree">
+      <el-tree
+        :data="tagTreeData"
+        :props="defaultProps"
+        show-checkbox
+        node-key="id"
+        :check-strictly="true"
+        @check="handleTagCheck"
+        class="tag-tree-list"
+      ></el-tree>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'ManualTagging',
+  props: {
+    tagTreeData: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      searchKeyword: '',
+      defaultProps: {
+        children: 'children',
+        label: 'label'
+      }
+    }
+  },
+  methods: {
+    // 处理搜索
+    handleSearch() {
+      this.$emit('search', this.searchKeyword);
+    },
+    
+    // 处理标签勾选
+    handleTagCheck(data, checkedInfo) {
+      this.$emit('tagCheck', data, checkedInfo);
+    }
+  }
+}
+</script>
+
+<style scoped>
+.manual-tagging {
+  padding: 20px;
+}
+
+.section-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 24px;
+}
+
+.section-title {
+  font-size: 16px;
+  font-weight: 500;
+  color: #303133;
+  margin: 0;
+}
+
+.switch-to-intelligent {
+  font-size: 14px;
+  color: #409EFF;
+  text-decoration: none;
+}
+
+.switch-to-intelligent:hover {
+  text-decoration: underline;
+}
+
+.search-box {
+  margin-bottom: 20px;
+}
+
+.search-input {
+  width: 100%;
+  max-width: 400px;
+}
+
+.tag-tree {
+  max-height: 500px;
+  overflow-y: auto;
+  border: 1px solid #EBEEF5;
+  border-radius: 4px;
+  padding: 10px;
+}
+
+.tag-tree-list {
+  font-size: 14px;
+}
+
+.tag-tree-list .el-tree-node__content {
+  height: 32px;
+  line-height: 32px;
+}
+
+.tag-tree-list .el-tree-node.is-current > .el-tree-node__content {
+  background-color: #ECF5FF;
+}
+
+.tag-tree-list .el-tree-node.is-current > .el-tree-node__content:hover {
+  background-color: #ECF5FF;
+}
+</style>

+ 318 - 139
web/src/views/content/aiTagging/externalPage/index.vue

@@ -1,65 +1,79 @@
 <template>
   <div class="intelligent-tagging">
-    <!-- 标题和提示 -->
-    <div class="header">
-      <h2 class="title">智能打标</h2>
-      <div class="close-btn" @click="handleClose">
-        <i class="el-icon-close"></i>
-      </div>
-    </div>
-    
-    <!-- 系统提示 -->
-    <div class="system-tip">
+    <!-- 顶部通知栏 -->
+    <div class="top-notification">
       <i class="el-icon-info"></i>
       <span>系统已自动生成标签推荐结果,请您勾选确认准确标签,针对不符合标签可提交反馈内容以优化后续推荐服务;若无适用标签,可通过手动选标完成打标操作。</span>
+      <el-button type="primary" class="confirm-btn" @click="handleConfirmTagging" :disabled="!hasSelectedTag">确认打标</el-button>
     </div>
     
-    <!-- 标签推荐列表 -->
-    <div class="tag-list">
-      <div 
-        v-for="(tag, index) in tagRecommendations" 
-        :key="index"
-        class="tag-item"
-        :class="{ 'selected': tag.selected }"
-        @click="handleTagSelect(index)"
-      >
-        <!-- 标签路径 -->
-        <div class="tag-path">
-          <span>{{ tag.path }}</span>
-          <i v-if="tag.selected" class="el-icon-check selected-icon"></i>
-        </div>
-        
-        <!-- 推荐依据 -->
-        <div class="recommend-basis">
-          <div class="basis-label">推荐依据:</div>
-          <div class="basis-content">{{ tag.basis }}</div>
-        </div>
-        
-        <!-- 不准确反馈 -->
-        <div class="feedback">
-          <div class="feedback-label">不准确反馈:</div>
-          <el-input
-            v-model="tag.feedback"
-            type="textarea"
-            placeholder="请输入"
-            :rows="2"
-            class="feedback-input"
-          ></el-input>
-        </div>
+    <!-- 已选标签 -->
+    <div class="selected-tags">
+      <div class="tags-label">已选标签:</div>
+      <div class="tags-list">
+        <el-tag
+          v-for="(tag, index) in selectedTags"
+          :key="index"
+          :type="getTagType(index)"
+          class="selected-tag"
+        >
+          {{ tag }}
+        </el-tag>
       </div>
     </div>
     
-    <!-- 操作按钮 -->
-    <div class="dialog-footer">
-      <el-button @click="handleCancel">取消</el-button>
-      <el-button type="primary" @click="handleConfirmTagging" :disabled="!hasSelectedTag">确认打标</el-button>
+    <!-- 主体内容 -->
+    <div class="main-content">
+      <!-- 左侧标签体系导航 -->
+      <div class="tag-system-nav">
+        <h3 class="nav-title">标签体系</h3>
+        <div class="nav-list">
+          <div
+            v-for="(system, index) in tagSystems"
+            :key="index"
+            class="nav-item"
+            :class="{ 'active': currentSystem === system }"
+            @click="handleSystemSelect(system)"
+          >
+            {{ system }}
+          </div>
+        </div>
+      </div>
+      
+      <!-- 右侧内容区域 -->
+      <div class="content-area">
+        <!-- 智能推荐组件 -->
+        <IntelligentRecommend
+          v-if="currentMode === 'intelligent'"
+          :recommendations="tagRecommendations"
+          @tagSelect="handleTagSelect"
+          @switchToManual="switchToManual"
+          @retryIntelligentTagging="retryIntelligentTagging"
+        />
+        
+        <!-- 人工打标组件 -->
+        <ManualTagging
+          v-else
+          :tagTreeData="tagTreeData"
+          @search="handleSearch"
+          @tagCheck="handleTagCheck"
+          @switchToIntelligent="switchToIntelligent"
+        />
+      </div>
     </div>
   </div>
 </template>
 
 <script>
+import IntelligentRecommend from './components/IntelligentRecommend.vue';
+import ManualTagging from './components/ManualTagging.vue';
+
 export default {
   name: 'IntelligentTagging',
+  components: {
+    IntelligentRecommend,
+    ManualTagging
+  },
   props: {
     visible: {
       type: Boolean,
@@ -76,6 +90,18 @@ export default {
   },
   data() {
     return {
+      // 当前模式:intelligent(智能推荐)或 manual(人工打标)
+      currentMode: 'intelligent',
+      
+      // 当前选中的标签体系
+      currentSystem: '海洋经济',
+      
+      // 标签体系列表
+      tagSystems: ['海洋经济', '绿色金融', '养老产业', '科技创新', '乡村振兴'],
+      
+      // 已选标签
+      selectedTags: ['远洋捕捞', '绿色金融', '养老产业', '科技创新', '科技创新'],
+      
       // 标签推荐结果
       tagRecommendations: [
         {
@@ -89,12 +115,94 @@ export default {
           basis: '文本中明确提到"主要从事远洋捕捞业务"、"拥有5艘远洋捕捞船"、"购买新的远洋捕捞设备"等关键信息,直接指向"远洋捕捞"标签。企业名称"舟山远洋渔业有限公司"也包含"远洋渔业"关键词,进一步支持此标签。',
           feedback: '',
           selected: false
-        },
+        }
+      ],
+      
+      // 标签树数据
+      tagTreeData: [
         {
-          path: '海洋经济 / 海洋产业 / 海洋船舶工业 / 海洋船舶制造',
-          basis: '文本中明确提到"主要从事远洋捕捞业务"、"拥有5艘远洋捕捞船"、"购买新的远洋捕捞设备"等关键信息,直接指向"远洋捕捞"标签。企业名称"舟山远洋渔业有限公司"也包含"远洋渔业"关键词,进一步支持此标签。',
-          feedback: '',
-          selected: false
+          id: 1,
+          label: '海洋经济',
+          children: [
+            {
+              id: 2,
+              label: '海洋产业(A)',
+              children: [
+                {
+                  id: 3,
+                  label: '海洋渔业(A1)',
+                  children: [
+                    {
+                      id: 4,
+                      label: '海洋捕捞(A11)',
+                      children: [
+                        {
+                          id: 5,
+                          label: '远洋捕捞(A111)'
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            },
+            {
+              id: 6,
+              label: '海洋科研教育(B)',
+              children: [
+                {
+                  id: 7,
+                  label: '海洋科研(B1)'
+                }
+              ]
+            },
+            {
+              id: 8,
+              label: '海洋公共管理服务(C)',
+              children: [
+                {
+                  id: 9,
+                  label: '海洋管理(C18)'
+                },
+                {
+                  id: 10,
+                  label: '海洋技术服务(C20)'
+                },
+                {
+                  id: 11,
+                  label: '海洋信息服务(C21)'
+                },
+                {
+                  id: 12,
+                  label: '海洋生态环境保护修复(C22)'
+                },
+                {
+                  id: 13,
+                  label: '海洋地质勘查(C23)',
+                  children: [
+                    {
+                      id: 14,
+                      label: '海洋矿产地质勘查(C231)',
+                      children: [
+                        {
+                          id: 15,
+                          label: '海洋能源矿产地质勘查(C2311)'
+                        },
+                        {
+                          id: 16,
+                          label: '海洋固体矿产地质勘查(C2312)'
+                        },
+                        {
+                          id: 17,
+                          label: '其他海洋矿产地质勘查(C2319)'
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
         }
       ]
     }
@@ -102,7 +210,7 @@ export default {
   computed: {
     // 检查是否有选中的标签
     hasSelectedTag() {
-      return this.tagRecommendations.some(tag => tag.selected);
+      return this.selectedTags.length > 0;
     }
   },
   methods: {
@@ -124,8 +232,7 @@ export default {
       }
       
       // 获取选中的标签
-      const selectedTags = this.tagRecommendations.filter(tag => tag.selected);
-      console.log('确认打标:', selectedTags);
+      console.log('确认打标:', this.selectedTags);
       
       // 这里可以添加打标逻辑
       this.$message.success('打标成功');
@@ -135,6 +242,59 @@ export default {
     // 选择标签
     handleTagSelect(index) {
       this.tagRecommendations[index].selected = !this.tagRecommendations[index].selected;
+      
+      // 更新已选标签列表
+      this.updateSelectedTags();
+    },
+    
+    // 更新已选标签列表
+    updateSelectedTags() {
+      const selectedTagPaths = this.tagRecommendations
+        .filter(tag => tag.selected)
+        .map(tag => tag.path.split('/').pop().trim());
+      
+      // 去重并更新已选标签
+      this.selectedTags = [...new Set(selectedTagPaths)];
+    },
+    
+    // 切换到人工打标
+    switchToManual() {
+      this.currentMode = 'manual';
+    },
+    
+    // 切换到智能推荐
+    switchToIntelligent() {
+      this.currentMode = 'intelligent';
+    },
+    
+    // 重新发起智能打标
+    retryIntelligentTagging() {
+      this.$message.info('重新发起智能打标');
+      // 这里可以添加重新发起智能打标的逻辑
+    },
+    
+    // 选择标签体系
+    handleSystemSelect(system) {
+      this.currentSystem = system;
+      // 这里可以添加切换标签体系后重新加载数据的逻辑
+    },
+    
+    // 处理搜索
+    handleSearch(keyword) {
+      console.log('搜索标签:', keyword);
+      // 这里可以添加搜索标签的逻辑
+    },
+    
+    // 处理标签勾选
+    handleTagCheck(data, checkedInfo) {
+      console.log('勾选标签:', data, checkedInfo);
+      // 这里可以添加处理标签勾选的逻辑
+    },
+    
+    // 获取标签类型
+    getTagType(index) {
+      const types = ['', 'success', 'warning', 'danger', 'info'];
+      return types[index % types.length];
     }
   }
 }
@@ -142,136 +302,155 @@ export default {
 
 <style scoped>
 .intelligent-tagging {
-  padding: 20px;
-  max-height: 80vh;
+  padding: 0;
+  max-height: 90vh;
   overflow-y: auto;
 }
 
-.header {
+/* 顶部通知栏 */
+.top-notification {
   display: flex;
-  justify-content: space-between;
   align-items: center;
-  margin-bottom: 20px;
+  padding: 12px 20px;
+  background-color: #FFF9E6;
+  border-bottom: 1px solid #FFE7BA;
 }
 
-.title {
-  font-size: 18px;
-  font-weight: 500;
-  color: #303133;
-  margin: 0;
-}
-
-.close-btn {
-  cursor: pointer;
+.top-notification i {
+  color: #E6A23C;
+  margin-right: 12px;
   font-size: 16px;
-  color: #909399;
 }
 
-.close-btn:hover {
+.top-notification span {
+  flex: 1;
+  font-size: 14px;
   color: #606266;
+  line-height: 1.5;
 }
 
-.system-tip {
-  display: flex;
-  align-items: flex-start;
-  padding: 12px 16px;
-  background-color: #ECF5FF;
-  border-radius: 4px;
-  margin-bottom: 24px;
-  border-left: 4px solid #409EFF;
+.confirm-btn {
+  margin-left: 20px;
 }
 
-.system-tip i {
-  color: #409EFF;
-  margin-right: 12px;
-  margin-top: 2px;
-  font-size: 16px;
+/* 已选标签 */
+.selected-tags {
+  display: flex;
+  align-items: center;
+  padding: 16px 20px;
+  background-color: #F9FAFC;
+  border-bottom: 1px solid #EBEEF5;
 }
 
-.system-tip span {
-  flex: 1;
+.tags-label {
   font-size: 14px;
   color: #606266;
-  line-height: 1.5;
+  margin-right: 12px;
+  white-space: nowrap;
 }
 
-.tag-list {
-  margin-bottom: 30px;
+.tags-list {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
 }
 
-.tag-item {
-  border: 1px solid #E4E7ED;
-  border-radius: 4px;
-  padding: 16px;
-  margin-bottom: 16px;
-  cursor: pointer;
-  transition: all 0.3s ease;
+.selected-tag {
+  margin-right: 8px;
 }
 
-.tag-item:hover {
-  border-color: #C0C4CC;
-  box-shadow: 0 2px 4px rgba(0,0,0,0.05);
+/* 主体内容 */
+.main-content {
+  display: flex;
+  min-height: 600px;
 }
 
-.tag-item.selected {
-  border-color: #67C23A;
-  background-color: #F0F9EB;
+/* 左侧标签体系导航 */
+.tag-system-nav {
+  width: 180px;
+  background-color: #FFFFFF;
+  border-right: 1px solid #EBEEF5;
+  padding: 20px;
 }
 
-.tag-path {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 16px;
+.nav-title {
   font-size: 14px;
   font-weight: 500;
   color: #303133;
+  margin: 0 0 16px 0;
 }
 
-.selected-icon {
-  color: #67C23A;
-  font-size: 16px;
-}
-
-.recommend-basis {
-  margin-bottom: 16px;
+.nav-list {
+  list-style: none;
+  padding: 0;
+  margin: 0;
 }
 
-.basis-label {
-  font-size: 13px;
-  color: #909399;
+.nav-item {
+  padding: 8px 12px;
   margin-bottom: 8px;
-}
-
-.basis-content {
-  font-size: 13px;
-  color: #606266;
-  line-height: 1.5;
-  background-color: #F5F7FA;
-  padding: 10px;
   border-radius: 4px;
+  cursor: pointer;
+  font-size: 14px;
+  color: #606266;
+  transition: all 0.3s ease;
 }
 
-.feedback {
-  margin-top: 12px;
+.nav-item:hover {
+  background-color: #ECF5FF;
+  color: #409EFF;
 }
 
-.feedback-label {
-  font-size: 13px;
-  color: #909399;
-  margin-bottom: 8px;
+.nav-item.active {
+  background-color: #ECF5FF;
+  color: #409EFF;
+  font-weight: 500;
 }
 
-.feedback-input {
-  width: 100%;
+/* 右侧内容区域 */
+.content-area {
+  flex: 1;
+  background-color: #FFFFFF;
+  padding: 0;
 }
 
-.dialog-footer {
-  display: flex;
-  justify-content: flex-end;
-  gap: 12px;
-  margin-top: 24px;
-  padding-top: 20px;
-  border-top: 1px solid #EBEEF5;
+/* 响应式布局 */
+@media screen and (max-width: 768px) {
+  .main-content {
+    flex-direction: column;
+  }
+  
+  .tag-system-nav {
+    width: 100%;
+    border-right: none;
+    border-bottom: 1px solid #EBEEF5;
+  }
+  
+  .nav-list {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 8px;
+  }
+  
+  .nav-item {
+    margin-bottom: 0;
+  }
+  
+  .top-notification {
+    flex-direction: column;
+    align-items: flex-start;
+    gap: 12px;
+  }
+  
+  .confirm-btn {
+    margin-left: 0;
+    align-self: flex-end;
+  }
+  
+  .selected-tags {
+    flex-direction: column;
+    align-items: flex-start;
+    gap: 8px;
+  }
 }
 </style>

+ 56 - 101
web/src/views/content/aiTagging/taggingLogs/index.vue

@@ -30,7 +30,7 @@
           <el-table-column prop="userName" label="用户名称" min-width="120"></el-table-column>
           <el-table-column prop="userId" label="用户id" min-width="180"></el-table-column>
           <el-table-column prop="operationType" label="操作类型" min-width="120"></el-table-column>
-          <el-table-column prop="operationTime" label="操作时间" min-width="180"></el-table-column>
+          <el-table-column prop="createDate" label="操作时间" min-width="180"></el-table-column>
           <el-table-column prop="action" label="操作" min-width="100">
             <template slot-scope="scope">
               <el-button type="text" @click="handleViewDetail(scope.row)">查看详情</el-button>
@@ -78,91 +78,10 @@ export default {
       },
       
       // 日志列表
-      logs: [
-        {
-          userName: '张三',
-          userId: 'ks139914512123',
-          operationType: '用户登录',
-          operationTime: '2026-02-03 15:39:35',
-          input: '{"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}',
-          output: '{"Success"}'
-        },
-        {
-          userName: '张三',
-          userId: 'DKSQ20260203001',
-          operationType: '修改标签',
-          operationTime: '2023-01-01 11:11:11',
-          input: '{"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}',
-          output: '{"Success"}'
-        },
-        {
-          userName: '张三',
-          userId: 'DKSQ20260203001',
-          operationType: '删除标签',
-          operationTime: '2023-01-01 11:11:11',
-          input: '{"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}',
-          output: '{"Success"}'
-        },
-        {
-          userName: '张三',
-          userId: 'DKSQ20260203001',
-          operationType: '新建标签',
-          operationTime: '2023-01-01 11:11:11',
-          input: '{"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}',
-          output: '{"Success"}'
-        },
-        {
-          userName: '张三',
-          userId: 'DKSQ20260203001',
-          operationType: '标签查询',
-          operationTime: '2023-01-01 11:11:11',
-          input: '{"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}',
-          output: '{"Success"}'
-        },
-        {
-          userName: '张三',
-          userId: 'DKSQ20260203001',
-          operationType: '用户登录',
-          operationTime: '2023-01-01 11:11:11',
-          input: '{"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}',
-          output: '{"Success"}'
-        },
-        {
-          userName: '张三',
-          userId: 'DKSQ20260203001',
-          operationType: '修改标签',
-          operationTime: '2023-01-01 11:11:11',
-          input: '{"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}',
-          output: '{"Success"}'
-        },
-        {
-          userName: '张三',
-          userId: 'DKSQ20260203001',
-          operationType: '删除标签',
-          operationTime: '2023-01-01 11:11:11',
-          input: '{"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}',
-          output: '{"Success"}'
-        },
-        {
-          userName: '张三',
-          userId: 'DKSQ20260203001',
-          operationType: '新建标签',
-          operationTime: '2023-01-01 11:11:11',
-          input: '{"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}',
-          output: '{"Success"}'
-        },
-        {
-          userName: '张三',
-          userId: 'DKSQ20260203001',
-          operationType: '标签查询',
-          operationTime: '2023-01-01 11:11:11',
-          input: '{"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}',
-          output: '{"Success"}'
-        }
-      ],
+      logs: [],
       
       // 分页数据
-      totalCount: 120,
+      totalCount: 0,
       currentPage: 1,
       pageSize: 10,
       
@@ -171,14 +90,37 @@ export default {
       currentLogDetail: {}
     }
   },
+  mounted() {
+    // 初始加载日志列表
+    this.loadLogs();
+  },
   methods: {
+    // 加载日志列表
+    loadLogs() {
+      yufp.service.request({
+        url: backend.tagServer + "/api/aitag-apilog/list",
+        method: 'get',
+        data: {
+          callTime: this.searchForm.callTime,
+          page: this.currentPage,
+          pageSize: this.pageSize
+        },
+        callback: (code, error, response) => {
+          if (response.code == '0') {
+            this.logs = response.data || [];
+            this.totalCount = response.total || 0;
+          } else {
+            this.$message.error(response.message || '获取日志列表失败');
+          }
+        }
+      });
+    },
 
-    
     // 搜索日志
     handleSearch() {
       console.log('搜索日志:', this.searchForm)
-      // 这里可以调用后端接口进行搜索
-      this.$message.success('搜索成功')
+      this.currentPage = 1;
+      this.loadLogs();
     },
 
     // 重置搜索
@@ -187,42 +129,55 @@ export default {
         callTime: ''
       }
       console.log('重置搜索')
+      this.currentPage = 1;
+      this.loadLogs();
     },
 
     // 刷新日志
     handleRefresh() {
       console.log('刷新日志')
-      this.$message.success('刷新成功')
-      // 这里可以重新加载数据
+      this.loadLogs();
     },
 
     // 查看详情
     handleViewDetail(row) {
       console.log('查看详情:', row)
-      // 构建与LogDetailDrawer.vue期望结构一致的详情数据
-      this.currentLogDetail = {
-        userName: row.userName,
-        userId: row.userId,
-        operationType: row.operationType,
-        operationTime: row.operationTime,
-        input: row.input,
-        output: row.output
-      }
-      this.drawerVisible = true
+      
+      // 调用后端接口获取日志详情
+      yufp.service.request({
+        url: backend.tagServer + "/api/aitag-apilog/query/" + row.id,
+        method: 'get',
+        callback: (code, error, response) => {
+          if (response.code == '0') {
+            // 构建与LogDetailDrawer.vue期望结构一致的详情数据
+            this.currentLogDetail = {
+              userName: response.data.userName,
+              userId: response.data.userId,
+              operationType: response.data.operationType,
+              operationTime: response.data.createDate,
+              input: response.data.inputData,
+              output: response.data.outputData
+            }
+            this.drawerVisible = true
+          } else {
+            this.$message.error(response.message || '获取日志详情失败');
+          }
+        }
+      });
     },
 
     // 分页大小变化
     handleSizeChange(size) {
       console.log('每页条数:', size)
       this.pageSize = size
-      // 这里可以重新加载数据
+      this.loadLogs();
     },
 
     // 当前页码变化
     handleCurrentChange(current) {
       console.log('当前页码:', current)
       this.currentPage = current
-      // 这里可以重新加载数据
+      this.loadLogs();
     }
   }
 }

+ 63 - 5
web/src/views/content/aiTagging/taggingResults/components/Detail.vue

@@ -75,6 +75,14 @@ export default {
     detailPageSize: {
       type: Number,
       default: 10
+    },
+    searchParams: {
+      type: Object,
+      default: () => ({
+        dateRange: [],
+        tagSystem: '',
+        tagSort: 'desc'
+      })
     }
   },
   data() {
@@ -86,12 +94,58 @@ export default {
       }
     }
   },
+  watch: {
+    // 监听搜索参数变化,重新加载数据
+    searchParams: {
+      handler() {
+        this.loadDetailData()
+      },
+      deep: true
+    }
+  },
+
   methods: {
+    // 加载明细数据
+    loadDetailData() {
+      // 构建请求参数
+      const params = {
+        startTaggingTime: this.searchParams.dateRange[0] || '',
+        endTaggingTime: this.searchParams.dateRange[1] || '',
+        categoryCode: this.searchParams.tagSystem || '',
+        sort: this.searchParams.tagSort || 'desc',
+        page: this.searchParams.page || this.currentDetailPage,
+        size: this.searchParams.pageSize || this.detailPageSize,
+        loanApplicationNo: this.detailSearchForm.loanApplyNo || '',
+        contractNo: this.detailSearchForm.contractNo || ''
+      };
+      
+      // 调用后端接口
+      yufp.service.request({
+        url: backend.tagServer + "/api/aitagtaglog/taggingTransaction",
+        method: 'post',
+        data: params,
+        callback: (code, error, response) => {
+          if (response.code == '0') {
+            // 更新明细数据
+            this.detailList = response.data || [];
+            this.totalDetailCount = response.total || 0;
+          } else {
+            this.$message.error(response.message || '获取明细数据失败');
+          }
+        }
+      });
+    },
+    
     // 明细搜索
     handleDetailSearch() {
-      console.log('明细搜索:', this.detailSearchForm)
-      // 这里可以调用后端接口进行搜索
-      this.$emit('detail-search', this.detailSearchForm)
+      // 构建完整的搜索参数,包含顶部搜索栏的参数和明细搜索栏的参数
+      const searchParams = {
+        ...this.searchParams,
+        ...this.detailSearchForm
+      };
+      console.log('明细搜索:', searchParams)
+      // 调用接口获取明细数据
+      this.loadDetailData()
       this.$message.success('搜索成功')
     },
 
@@ -125,13 +179,17 @@ export default {
     // 明细分页大小变化
     handleDetailSizeChange(size) {
       console.log('每页条数:', size)
-      this.$emit('size-change', size)
+      this.detailPageSize = size
+      // 重新加载数据
+      this.loadDetailData()
     },
 
     // 明细当前页码变化
     handleDetailCurrentChange(current) {
       console.log('当前页码:', current)
-      this.$emit('current-change', current)
+      this.currentDetailPage = current
+      // 重新加载数据
+      this.loadDetailData()
     }
   }
 }

+ 253 - 40
web/src/views/content/aiTagging/taggingResults/components/Overview.vue

@@ -3,26 +3,26 @@
     <!-- 统计指标 -->
     <div class="stats-container">
       <div class="stat-item">
-        <div class="stat-value">1,356</div>
         <div class="stat-label">总打标数</div>
+        <div class="stat-value">{{ overviewData.countNum }}</div>
         <div class="stat-icon blue"><i class="el-icon-data-analysis"></i></div>
       </div>
       <div class="stat-item">
-        <div class="stat-value">1,124</div>
         <div class="stat-label">准确标签数</div>
-        <div class="stat-rate">准确率: 87.4%</div>
+        <div class="stat-value">{{ overviewData.accurateNum }}</div>
+        <div class="stat-rate">准确率: {{ overviewData.accurateRate }}</div>
         <div class="stat-icon green"><i class="el-icon-check"></i></div>
       </div>
       <div class="stat-item">
-        <div class="stat-value">202</div>
         <div class="stat-label">人工调整数</div>
-        <div class="stat-rate">调整率: 13.6%</div>
+        <div class="stat-value">{{ overviewData.manualAdjustCount }}</div>
+        <div class="stat-rate">调整率: {{ overviewData.manualAdjustRate }}</div>
         <div class="stat-icon yellow"><i class="el-icon-s-operation"></i></div>
       </div>
       <div class="stat-item">
-        <div class="stat-value">1,356</div>
-        <div class="stat-label">平均处理时长</div>
-        <div class="stat-icon purple"><i class="el-icon-time"></i></div>
+        <div class="stat-label">打标未确认</div>
+        <div class="stat-value">{{ overviewData.taggedUnconfirmed }}</div>
+        <div class="stat-icon purple"><i class="el-icon-question"></i></div>
       </div>
     </div>
 
@@ -35,7 +35,6 @@
           <div class="chart-period">
             <el-radio-group v-model="trendPeriod" size="small">
               <el-radio-button label="day">日</el-radio-button>
-              <el-radio-button label="week">周</el-radio-button>
               <el-radio-button label="month">月</el-radio-button>
             </el-radio-group>
           </div>
@@ -80,16 +79,246 @@ export default {
     return {
       // 图表实例
       trendChart: null,
-      distributionChart: null
+      distributionChart: null,
+      
+      // 统计数据
+      overviewData: {
+        countNum: 0,
+        accurateNum: 0,
+        accurateRate: '0%',
+        manualAdjustCount: 0,
+        manualAdjustRate: '0%',
+        taggedUnconfirmed: 0
+      }
+    }
+  },
+  props: {
+    trendPeriod: {
+      type: String,
+      default: 'month'
+    },
+    tagSort: {
+      type: String,
+      default: 'desc'
+    },
+    searchParams: {
+      type: Object,
+      default: () => ({
+        dateRange: [],
+        tagSystem: ''
+      })
     }
   },
   mounted() {
     // 使用nextTick确保DOM元素已渲染完成
     this.$nextTick(() => {
+      this.loadOverviewData()
       this.initCharts()
     })
   },
+  watch: {
+    // 监听搜索参数变化,重新加载数据
+    searchParams: {
+      handler() {
+        this.loadOverviewData()
+        this.loadTrendData()
+        this.loadDistributionData()
+      },
+      deep: true
+    },
+    // 监听趋势周期变化,重新加载趋势数据
+    trendPeriod() {
+      this.loadTrendData()
+    },
+    // 监听排序方式变化,重新加载分布数据
+    tagSort() {
+      this.loadDistributionData()
+    }
+  },
+
   methods: {
+    // 加载概览数据
+    loadOverviewData() {
+      // 构建请求参数
+      const params = {
+        startTaggingTime: this.searchParams.dateRange[0] || '',
+        endTaggingTime: this.searchParams.dateRange[1] || '',
+        categoryCode: this.searchParams.tagSystem || ''
+      };
+      console.log('加载概览数据参数:', params);
+      
+      // 调用后端接口
+      yufp.service.request({
+        url: backend.tagServer + "/api/aitagtaglog/dataOverview",
+        method: 'post',
+        data: params,
+        callback: (code, error, response) => {
+          if (response.code == '0') {
+            // 更新统计数据
+            this.overviewData = {
+              countNum: response.data.countNum || 0,
+              accurateNum: response.data.accurateNum || 0,
+              accurateRate: response.data.accurateRate || '0%',
+              manualAdjustCount: response.data.manualAdjustCount || 0,
+              manualAdjustRate: response.data.manualAdjustRate || '0%',
+              taggedUnconfirmed: response.data.taggedUnconfirmed || 0
+            };
+          } else {
+            this.$message.error(response.message || '获取概览数据失败');
+          }
+        }
+      });
+    },
+    
+    // 加载打标趋势数据
+    loadTrendData() {
+      // 构建请求参数
+      const params = {
+        startTaggingTime: this.searchParams.dateRange[0] || '',
+        endTaggingTime: this.searchParams.dateRange[1] || '',
+        categoryCode: this.searchParams.tagSystem || '',
+        statisticalPeriod: this.trendPeriod
+      };
+      console.log('加载打标趋势数据参数:', params);
+      
+      // 调用后端接口
+      yufp.service.request({
+        url: backend.tagServer + "/api/aitagtaglog/taggingTrend",
+        method: 'post',
+        data: params,
+        callback: (code, error, response) => {
+          if (response.code == '0') {
+            // 更新打标趋势图表
+            this.updateTrendChart(response.data || [])
+          } else {
+            this.$message.error(response.message || '获取打标趋势数据失败');
+          }
+        }
+      });
+    },
+    
+    // 加载标签分布统计数据
+    loadDistributionData() {
+      // 构建请求参数
+      const params = {
+        startTaggingTime: this.searchParams.dateRange[0] || '',
+        endTaggingTime: this.searchParams.dateRange[1] || '',
+        categoryCode: this.searchParams.tagSystem || '',
+        sort: this.tagSort
+      };
+      console.log('加载标签分布统计数据参数:', params);
+      
+      // 调用后端接口
+      yufp.service.request({
+        url: backend.tagServer + "/api/aitagtaglog/tagDistStats",
+        method: 'post',
+        data: params,
+        callback: (code, error, response) => {
+          if (response.code == '0') {
+            // 更新标签分布图表
+            this.updateDistributionChart(response.data || [])
+          } else {
+            this.$message.error(response.message || '获取标签分布统计数据失败');
+          }
+        }
+      });
+    },
+    
+    // 更新打标趋势图表
+    updateTrendChart(data) {
+      if (!this.trendChart || !data || data.length === 0) {
+        return
+      }
+      
+      const labels = data.map(item => item.label || '')
+      const values = data.map(item => item.value || 0)
+      
+      const option = {
+        tooltip: {
+          trigger: 'axis'
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          boundaryGap: false,
+          data: labels
+        },
+        yAxis: {
+          type: 'value'
+        },
+        series: [
+          {
+            name: '智能打标数',
+            type: 'line',
+            data: values,
+            lineStyle: {
+              color: '#1890ff'
+            },
+            itemStyle: {
+              color: '#1890ff'
+            }
+          }
+        ]
+      }
+      
+      this.trendChart.setOption(option)
+    },
+    
+    // 更新标签分布图表
+    updateDistributionChart(data) {
+      if (!this.distributionChart || !data || data.length === 0) {
+        return
+      }
+      
+      const names = data.map(item => item.name || '')
+      const values = data.map(item => item.value || 0)
+      
+      const option = {
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow'
+          }
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          data: names,
+          axisLabel: {
+            rotate: 45
+          }
+        },
+        yAxis: {
+          type: 'value'
+        },
+        series: [
+          {
+            name: '标签数量',
+            type: 'bar',
+            data: values,
+            itemStyle: {
+              color: function(params) {
+                const colors = ['#1890ff', '#36cfc9', '#52c41a', '#faad14', '#722ed1', '#eb2f96']
+                return colors[params.dataIndex % colors.length]
+              }
+            }
+          }
+        ]
+      }
+      
+      this.distributionChart.setOption(option)
+    },
+    
     // 初始化图表
     initCharts() {
       // 检查echarts是否正确加载
@@ -98,36 +327,14 @@ export default {
         return;
       }
 
-      // 模拟数据
-      const trendData = [
-        { month: '1月', value: 60 },
-        { month: '2月', value: 80 },
-        { month: '3月', value: 110 },
-        { month: '4月', value: 65 },
-        { month: '5月', value: 90 },
-        { month: '6月', value: 130 },
-        { month: '7月', value: 110 },
-        { month: '8月', value: 140 },
-        { month: '9月', value: 160 }
-      ]
-      
-      const distributionData = [
-        { name: '远洋捕捞', value: 150 },
-        { name: '船舶制造', value: 130 },
-        { name: '海水养殖', value: 100 },
-        { name: '海洋运输', value: 70 },
-        { name: '海洋旅游', value: 50 },
-        { name: '生物医药', value: 40 }
-      ]
-
       // 初始化打标趋势图表
-      this.initTrendChart(trendData)
+      this.initTrendChart()
       // 初始化标签分布图表
-      this.initDistributionChart(distributionData)
+      this.initDistributionChart()
     },
 
     // 初始化打标趋势图表
-    initTrendChart(data) {
+    initTrendChart() {
       if (!this.$refs.trendChart) {
         console.error('trendChart DOM element not found');
         return;
@@ -149,7 +356,7 @@ export default {
           xAxis: {
             type: 'category',
             boundaryGap: false,
-            data: data.map(item => item.month)
+            data: []
           },
           yAxis: {
             type: 'value'
@@ -158,7 +365,7 @@ export default {
             {
               name: '智能打标数',
               type: 'line',
-              data: data.map(item => item.value),
+              data: [],
               lineStyle: {
                 color: '#1890ff'
               },
@@ -170,13 +377,16 @@ export default {
         }
         
         this.trendChart.setOption(option)
+        
+        // 初始化后加载数据
+        this.loadTrendData()
       } catch (error) {
         console.error('Error initializing trend chart:', error);
       }
     },
 
     // 初始化标签分布图表
-    initDistributionChart(data) {
+    initDistributionChart() {
       if (!this.$refs.distributionChart) {
         console.error('distributionChart DOM element not found');
         return;
@@ -200,7 +410,7 @@ export default {
           },
           xAxis: {
             type: 'category',
-            data: data.map(item => item.name),
+            data: [],
             axisLabel: {
               rotate: 45
             }
@@ -212,7 +422,7 @@ export default {
             {
               name: '标签数量',
               type: 'bar',
-              data: data.map(item => item.value),
+              data: [],
               itemStyle: {
                 color: function(params) {
                   const colors = ['#1890ff', '#36cfc9', '#52c41a', '#faad14', '#722ed1', '#eb2f96']
@@ -224,6 +434,9 @@ export default {
         }
         
         this.distributionChart.setOption(option)
+        
+        // 初始化后加载数据
+        this.loadDistributionData()
       } catch (error) {
         console.error('Error initializing distribution chart:', error);
       }

+ 35 - 4
web/src/views/content/aiTagging/taggingResults/index.vue

@@ -37,18 +37,23 @@
       <!-- 数据概览标签页 -->
       <el-tab-pane label="数据概览" name="overview">
         <Overview 
+          ref="overviewRef"
           :trend-period="trendPeriod"
           :tag-sort="tagSort"
+          :search-params="searchForm"
         />
       </el-tab-pane>
 
       <!-- 打标明细标签页 -->
       <el-tab-pane label="打标明细" name="detail">
         <Detail 
+          ref="detailRef"
           :detail-data="detailData"
           :total-detail-count="totalDetailCount"
           :current-detail-page="currentDetailPage"
           :detail-page-size="detailPageSize"
+          :search-params="searchForm"
+          :tag-sort="tagSort"
           @detail-search="handleDetailSearch"
           @detail-reset="handleDetailReset"
           @view-detail="handleViewDetail"
@@ -186,7 +191,13 @@ export default {
     // 搜索
     handleSearch() {
       console.log('搜索:', this.searchForm)
-      // 这里可以调用后端接口进行搜索
+      // 手动触发子组件数据刷新
+      if (this.$refs.overviewRef) {
+        this.$refs.overviewRef.loadOverviewData();
+      }
+      if (this.$refs.detailRef) {
+        this.$refs.detailRef.handleDetailSearch();
+      }
       this.$message.success('搜索成功')
     },
 
@@ -195,6 +206,13 @@ export default {
       this.searchForm.dateRange = []
       this.searchForm.tagSystem = ''
       console.log('重置搜索')
+      // 手动触发子组件数据刷新
+      if (this.$refs.overviewRef) {
+        this.$refs.overviewRef.loadOverviewData();
+      }
+      if (this.$refs.detailRef) {
+        this.$refs.detailRef.handleDetailSearch();
+      }
     },
 
     // 初始化图表
@@ -228,7 +246,10 @@ export default {
     // 明细搜索
     handleDetailSearch() {
       console.log('明细搜索:', this.detailSearchForm)
-      // 这里可以调用后端接口进行搜索
+      // 调用子组件的 loadDetailData 方法刷新数据
+      if (this.$refs.detailRef) {
+        this.$refs.detailRef.loadDetailData();
+      }
       this.$message.success('搜索成功')
     },
 
@@ -237,6 +258,10 @@ export default {
       this.detailSearchForm.loanApplyNo = ''
       this.detailSearchForm.contractNo = ''
       console.log('重置明细搜索')
+      // 调用子组件的 loadDetailData 方法刷新数据
+      if (this.$refs.detailRef) {
+        this.$refs.detailRef.loadDetailData();
+      }
     },
 
     // 查看详情
@@ -257,14 +282,20 @@ export default {
     handleDetailSizeChange(size) {
       console.log('每页条数:', size)
       this.detailPageSize = size
-      // 这里可以重新加载数据
+      // 调用子组件的 loadDetailData 方法刷新数据
+      if (this.$refs.detailRef) {
+        this.$refs.detailRef.loadDetailData();
+      }
     },
 
     // 明细当前页码变化
     handleDetailCurrentChange(current) {
       console.log('当前页码:', current)
       this.currentDetailPage = current
-      // 这里可以重新加载数据
+      // 调用子组件的 loadDetailData 方法刷新数据
+      if (this.$refs.detailRef) {
+        this.$refs.detailRef.loadDetailData();
+      }
     }
   }
 }

+ 39 - 35
web/src/views/content/aiTagging/taggingSystemManage/index.vue

@@ -29,13 +29,13 @@
       <!-- 标签体系卡片 -->
       <div v-for="system in tagSystems" :key="system.id" class="tag-system-card">
         <div class="card-header">
-          <div class="system-name">{{ system.name }}</div>
+          <div class="system-name">{{ system.categoryNm }}</div>
           <div class="card-actions">
             <el-button type="text" icon="el-icon-edit" @click.stop="handleEditTagSystem(system)"></el-button>
             <el-dropdown trigger="click" @command="(command) => handleDropdownCommand(command, system)">
               <el-button type="text" icon="el-icon-more"></el-button>
               <el-dropdown-menu slot="dropdown">
-                <el-dropdown-item v-if="system.status === 'enabled'" command="disable">停用</el-dropdown-item>
+                <el-dropdown-item v-if="system.state === 1" command="disable">停用</el-dropdown-item>
                 <el-dropdown-item v-else command="enable">启用</el-dropdown-item>
                 <el-dropdown-item command="delete" divided>删除</el-dropdown-item>
               </el-dropdown-menu>
@@ -43,14 +43,14 @@
           </div>
         </div>
         <div class="system-status">
-          <el-tag :type="system.status === 'enabled' ? 'success' : 'info'">
-            {{ system.status === 'enabled' ? '已启用' : '未启用' }}
+          <el-tag :type="system.state === 1 ? 'success' : 'info'">
+            {{ system.state === 1 ? '已启用' : '未启用' }}
           </el-tag>
         </div>
-        <div class="system-desc">{{ system.description }}</div>
+        <div class="system-desc">{{ system.categoryDesc }}</div>
         <div class="system-meta">
-          <span class="tag-count">标签数量:{{ system.tagCount }}</span>
-          <span class="create-date">{{ system.createDate }}</span>
+          <span class="tag-count">标签数量:{{ system.tagNum || 0 }}</span>
+          <span class="create-date">{{ system.createDate || '' }}</span>
         </div>
         <div class="card-footer">
           <el-button type="text" @click.stop="handleViewTags(system)">
@@ -110,43 +110,43 @@ export default {
       // 标签体系列表
       tagSystems: [
         {
-          id: 1,
-          name: '海洋经济',
-          status: 'enabled',
-          description: '涵盖海洋渔业、海洋装备、海洋旅游等海洋经济相关产业的标签分类体系',
-          tagCount: 53,
+          id: '1',
+          categoryNm: '海洋经济',
+          state: 1,
+          categoryDesc: '涵盖海洋渔业、海洋装备、海洋旅游等海洋经济相关产业的标签分类体系',
+          tagNum: 53,
           createDate: '2026-02-01'
         },
         {
-          id: 2,
-          name: '绿色金融',
-          status: 'disabled',
-          description: '包含绿色能源、节能环保、清洁生产等绿色产业相关的标签分类体系',
-          tagCount: 53,
+          id: '2',
+          categoryNm: '绿色金融',
+          state: 0,
+          categoryDesc: '包含绿色能源、节能环保、清洁生产等绿色产业相关的标签分类体系',
+          tagNum: 53,
           createDate: '2026-02-01'
         },
         {
-          id: 3,
-          name: '养老产业',
-          status: 'enabled',
-          description: '涵盖养老服务、健康管理、老年用品等养老产业相关的标签分类体系',
-          tagCount: 53,
+          id: '3',
+          categoryNm: '养老产业',
+          state: 1,
+          categoryDesc: '涵盖养老服务、健康管理、老年用品等养老产业相关的标签分类体系',
+          tagNum: 53,
           createDate: '2026-02-01'
         },
         {
-          id: 4,
-          name: '科技创新',
-          status: 'enabled',
-          description: '包含人工智能、新一代信息技术、生物医药等科技创新领域的标签分类体系',
-          tagCount: 53,
+          id: '4',
+          categoryNm: '科技创新',
+          state: 1,
+          categoryDesc: '包含人工智能、新一代信息技术、生物医药等科技创新领域的标签分类体系',
+          tagNum: 53,
           createDate: '2026-02-01'
         },
         {
-          id: 5,
-          name: '乡村振兴',
-          status: 'enabled',
-          description: '暂无描述',
-          tagCount: 53,
+          id: '5',
+          categoryNm: '乡村振兴',
+          state: 1,
+          categoryDesc: '暂无描述',
+          tagNum: 53,
           createDate: '2026-02-01'
         }
       ],
@@ -172,7 +172,7 @@ export default {
     // 加载标签体系列表
     loadTagSystems() {
       yufp.service.request({
-        url: backend.tagServer + "/api/aitag-category/list",
+        url: backend.tagServer + "/api/aitag-tagcategory/list",
         method: 'get',
         data: {
           name: this.searchForm.name,
@@ -225,8 +225,12 @@ export default {
 
     // 编辑标签体系
     handleEditTagSystem(system) {
-      console.log('打开编辑标签体系对话框:', system.name)
-      this.currentEditSystem = { ...system }
+      console.log('打开编辑标签体系对话框:', system.categoryNm)
+      this.currentEditSystem = { 
+        id: system.id,
+        name: system.categoryNm,
+        description: system.categoryDesc
+      }
       this.editDialogVisible = true
     },
     

+ 3 - 1
web/src/views/content/workstation/workstation/workstation.vue

@@ -484,14 +484,16 @@
 				}
 			},
 			init(){
+				return
 				this.loading = true;
 				yufp.service.request({
-					url: backend.tagServer + "/api/tab-app/list",
+					url: this.url.getUserQuickMenu,
 					method: 'get',
 					data:{
 						sysId:yufp.session.logicSys.id,
 					},
 					callback: (code, error, response) => {
+						this.loading = false;
 						if (response.code == '0') {
 							this.list = response.data;
 						} else {