瀏覽代碼

修复测试中的发现的问题

jiayongqiang 5 天之前
父節點
當前提交
ee8c1a5bc6

二進制
agent/data/20260512对公贷款数据(含65条测试数据).xlsx


二進制
agent/logs/aitagging-app.2026-04-01_18-03-48_385635.log.zip


二進制
agent/logs/aitagging-app.2026-05-08_09-57-47_624813.log.zip


+ 103 - 36
agent/src/agent/agent.py

@@ -60,42 +60,109 @@ async def reflect_check(context: str,is_marine: bool, labels: list):
     )
     prompt = f"""
     一、角色与职责
-    你是一名银行智能标签平台中的语义判定模型,负责基于贷款信息文本内容,对候选标签进行相关性判断和筛选。
-    你的核心职责是判断现有文本内容是否足以支撑在本笔贷款层面打上某个产业标签,而非识别企业的整体行业属性或主营业务。
-    换言之,你的任务是从**“贷款打标”的视角**,评估文本中所描述的资产、项目、合同、用途或相关经济活动,是否与标签定义所描述的产业活动在语义上存在明确或合理的关联,并且文本是否提供了可引用的具体内容能够作为支持该产业标签命中的依据。
-
-    二、基本工作原则
-    在整个判定过程中,你必须遵循以下原则:
-        1.仅依据所提供的文本内容进行判断,不得引入外部资料
-        2.不要求文本构成完整的行业介绍或业务说明
-        3.不要求覆盖标签定义的全部要素
-        4.允许基于文本上下文进行合理的语义理解
-        5.所有结论必须能够回溯到具体文本证据
-        6.若存在不确定性,应通过置信度和不确定性说明体现,而非直接否定命中
-
-    三、候选标签
-    以下是本次判定所依据的产业标签定义信息:
-    {labels}
-
-    四、贷款信息
-    {context}
-    {"请注意:该笔贷款涉及海洋产业相关内容。" if is_marine else ""}
-    
-    五、语义判定任务说明(核心)
-    请你基于以上信息,从**“贷款打标”的视角**完成语义判定,重点判断以下问题:
-        1.关联性判断
-        2.文本中所描述的资产、项目、合同、用途或相关经济活动,是否与标签定义所描述的产业活动在语义上存在明确或合理的关联。证据支持性判断
-        3.文本是否提供了可引用的具体内容(如资产类型、项目性质、合同内容、资金用途、建设或生产活动等),能够作为支持该产业标签命中的依据。隐含语义识别
-        4.若文本未直接使用标签定义中的标准术语,但通过具体对象、行为、交易或技术特征,能够合理指向该产业语义,可视为有效支持,不应仅因术语缺失而否定。排除情形核验若文本内容明确符合标签排除说明中的情形,应判定为不命中;
-        5.不要求文本信息完整、闭环或覆盖全部定义要素。避免过度保守
-        6.“信息不完整”或“未完全覆盖标签定义”不等同于“不应命中”。
-        7.对于存在合理支持但存在信息缺口的情况,应允许命中,并不确定性说明体现风险。
-
-    六、判定风格约束
-        1.不将“未明确说明”等同于“不支持”
-        2.不将“不能完全确认”等同于“不应命中”
-        3.不以企业整体行业属性替代对贷款具体内容的判断
-        4.所有判断应服务于产业打标的可用性与可解释性
+你是一名银行智能标签平台中的语义判定模型,负责基于贷款信息文本内容,对候选标签进行相关性判断和筛选。
+你的核心职责是判断现有文本内容是否足以支撑在本笔贷款层面打上某个产业标签,而非识别企业整体行业属性或主营业务。
+你的任务是从“贷款打标”的视角,评估文本中所描述的资产、项目、合同、用途、消费场景或相关经济活动,是否与标签定义所描述的产业活动在语义上存在明确、合理或可延伸的关联,并判断文本是否提供了可引用的内容作为标签命中的依据。
+二、机构属性信息
+本次请求包含机构涉海属性标识:
+是否沿海行社:{is_marine}
+其中:
+- is_marine = 1:
+表示当前请求来自沿海行社,需要启用“涉海宽泛推荐策略”
+- is_marine = 0:
+表示当前请求为普通标准推荐请求,应保持标准语义匹配策略
+
+三、基本工作原则
+在整个判定过程中,你必须遵循以下原则:
+1.仅依据所提供的文本内容进行判断,不得引入外部资料
+2.不要求文本构成完整行业介绍或业务说明
+3.不要求覆盖标签定义全部要素
+4.允许基于上下文进行合理语义理解
+5.所有结论必须能够回溯到具体文本证据
+6.若存在不确定性,应通过置信度和不确定性说明体现,而非直接否定命中
+7.判定目标应服务于产业标签推荐的可用性、覆盖性与可解释性
+
+四、沿海宽泛打标策略(仅沿海行社生效)
+若“是否沿海行社”为“是”,则在海洋经济相关标签判定时,需要采用宽泛匹配策略。
+宽泛匹配策略定义如下:
+1.允许基于沿海区域经济特征进行场景级语义延伸
+即:若文本描述的消费、建设、经营、配套或服务场景,与海洋经济产业链存在合理关联,即使未直接出现“海洋”“海产”“港口”“渔业”等关键词,也可视为有效关联。
+
+2.允许识别涉海间接场景
+例如但不限于:
+- 民宿装修
+- 酒店装修
+- 景区建设
+- 旅游消费
+- 餐饮配套
+- 冷链仓储
+- 物流运输
+- 文旅服务
+
+上述场景在沿海区域可能与:
+- 海洋旅游
+- 涉海消费
+- 海产品流通
+- 海洋文旅
+- 海洋服务产业
+等存在产业关联。
+
+3.允许采用“最相近涉海标签”推荐策略
+对于中性文本,若无法形成严格语义命中,但能够与海洋经济场景形成合理关联,可优先推荐海洋经济标签体系中语义最相近的标签。
+例如:
+- “民宿装修” → “涉海旅游消费”
+- “酒店改造” → “海洋文旅服务”
+- “冷链仓储” → “海产品流通配套”
+
+4.宽泛推荐并不等于无条件命中
+即使采用宽泛策略,仍需满足:
+- 存在合理产业关联
+- 存在可解释的场景链路
+- 能够说明推荐逻辑
+- 不得对明显无关内容强行推荐涉海标签
+
+5.对于宽泛关联场景
+可通过:
+- “弱关联”
+- “场景延伸关联”
+- “区域产业关联”
+等方式体现不确定性。
+
+五、非沿海行社策略
+若“是否沿海行社”为“否”,则:
+- 不进行区域产业延伸
+- 不进行涉海宽泛推荐
+- 保持原有标准语义匹配逻辑
+- 仅依据文本与标签定义之间的直接语义关联进行判定
+六、候选标签
+以下是本次判定所依据的产业标签定义信息:
+{labels}
+
+七、贷款信息
+{context}
+
+八、语义判定任务说明(核心)
+请你基于以上信息,从“贷款打标”的视角完成语义判定,重点判断以下问题:
+
+1.关联性判断
+文本中描述的资产、项目、合同、用途、消费或经营场景,是否与标签定义存在明确、合理或可延伸的产业关联。
+2.证据支持性判断
+文本是否提供了可引用的具体内容(如项目性质、消费场景、建设行为、资产类型、经营活动等),能够作为标签推荐依据。
+3.隐含语义识别
+若文本未直接使用标签术语,但通过对象、行为、交易或场景特征能够合理指向产业语义,可视为有效支持。
+4.沿海场景延伸识别(仅沿海行社)
+对于中性消费、装修、建设、服务类文本,需要结合沿海区域经济特征,识别其是否可能属于海洋经济延伸场景。
+5.排除情形核验
+若文本明确符合标签排除情形,应判定为不命中。
+6.避免过度保守
+“信息不完整”“未完全覆盖定义”不等同于“不应命中”。
+对于存在合理支持但存在信息缺口的情况,应允许命中,并通过不确定性说明体现风险。
+九、判定风格约束
+1.不将“未明确说明”等同于“不支持”
+2.不将“不能完全确认”等同于“不应命中”
+3.不以企业整体行业属性替代对贷款具体内容的判断
+4.沿海场景下,应适度提高海洋经济标签覆盖率
+5.所有判断应服务于产业打标的可用性、覆盖性与可解释性
     """
     uid = uuid.uuid4().hex
     l1 = datetime.now().isoformat()

+ 55 - 34
agent/src/agent/api_outter.py

@@ -1,10 +1,9 @@
 import re
 from fastapi import APIRouter , UploadFile 
-from pydantic import BaseModel,Field
+from pydantic import BaseModel,Field, field_validator
 from requests import request
 from agent.core.sign_check import check
 import agent.core.dao as dao
-from asyncer import asyncify
 from agent.core.vector import get_embeddings
 from agent.core.es import hybrid_search
 from agent.agent import reflect_check
@@ -36,8 +35,8 @@ class TaggingRequest(BaseModel):
     tag_category_id: Optional[str] = Field(None, description="指定标签类别ID,默认为空表示不指定")
     esb_seq_no: Optional[str] = Field(None,description="ESB流水号")
     instucde:Optional[str] = Field(None, description="法人行社代码")
-    contract_no:Optional[str] = Field(None,description="合同编号")
     instucde_nm:Optional[str] = Field(None,description="法人行社名称")
+    contract_no:Optional[str] = Field(None,description="合同编号")
     company_nm:Optional[str] = Field(None,description="企业名称")
     company_code:Optional[str]=Field(None,description="企业统一社会信用代码")
     user_id:Optional[str] = Field(None,description="发起人ID")
@@ -45,6 +44,19 @@ class TaggingRequest(BaseModel):
     user_org:Optional[str] = Field(None,description="发起人所属机构")
     user_endpoint:Optional[str] = Field(None,description="发起人所属网点")
 
+    class Config:
+        extra = "ignore"
+        populate_by_name = True
+    
+    @field_validator('business_attr', 'phrase', 'tag_category_id', 'esb_seq_no', 
+                     'instucde', 'instucde_nm', 'contract_no', 'company_nm', 
+                     'company_code', 'user_id', 'user_nm', 'user_org', 'user_endpoint', 
+                     mode='before')
+    def convert_to_str(cls, v):
+        if v is None:
+            return None
+        return str(v)
+
 async def execute_reg(log_id:str,tag_category_id:str,phrase: str)-> list:
     sql = f"""select 
                     tti.id,
@@ -52,26 +64,26 @@ async def execute_reg(log_id:str,tag_category_id:str,phrase: str)-> list:
                     from aitag_tag_info tti left join aitag_tag_category  ttc 
                     on tti.category_id = ttc.id 
                     where ttc.is_delete=0 and tti.is_delete=0 and ttc.state =  0 and tti.state = 0 and tti.tag_level = ttc.visibility_level
+                    and '{phrase}' ~ tti.reg
                     """    
     if tag_category_id:
         sql += f""" and ttc.id = '{tag_category_id}'"""
     labels = dao.query(sql)
     # 循环调用reg匹配phrase,匹配成功则返回标签id
-    result = []
-    try:
-        for label in labels:
-            reg = label[1]
-            if reg is not None:
-                pattern = re.compile(reg, re.VERBOSE)
-                # logger.info(f"Executing regex for label_id {label[0]}: {reg}")
-                if pattern.match(phrase):
-                    logger.info(f"Executing regex for label_id {label[0]}: {reg} true")
-                    result.append(label[0])
-            else:
-                result.append(label[0])
-    except Exception as e:
-        logger.error(f"Regex execution failed: {e}")
-    # logger.info(f"Regex filtering candidates: {result}")
+    result = [label[0] for label in labels]
+    # try:
+        # for label in labels:
+        #     reg = label[1]
+        #     if reg is not None:
+        #         pattern = re.compile(reg, re.VERBOSE)
+        #         # logger.info(f"Executing regex for label_id {label[0]}: {reg}")
+        #         if pattern.match(phrase):
+        #             logger.info(f"Executing regex for label_id {label[0]}: {reg} true")
+        #             result.append(label[0])
+        #     else:
+        #         result.append(label[0])
+    # except Exception as e:
+    #     logger.error(f"Regex execution failed: {e}")
     dao.execute(
             """UPDATE aitag_tag_log SET reg_result = %s WHERE id = %s""",
             (str(result), log_id)
@@ -131,22 +143,31 @@ def start_tagging(id:str, instucde: Optional[str] = None):
 
 # 定义预设规则匹配函数
 def defined_rule_match(phrase: str):
-    sql = """select tag_type,tag_nm from ai_tagging.ai_tagging.aitag_predefined_rules where %s ~ defined_rule """
-    rules = dao.query(sql, (phrase,))
-    if rules and len(rules) > 0:
-        matched = rules[0]
-        logger.info(f"Predefined rule matched: {matched}")
-        tag_info = dao.query("""select ati.id,ati.category_id, ati.tag_nm, ati.tag_path,ati.tag_code from aitag_tag_info ati left join aitag_tag_category atc on ati.category_id = atc.id where ati.tag_nm = %s and ati.is_delete = 0 and atc.category_code = %s""", (matched[1], matched[0]))
-        return [{
-            "id": tag_info[0][0],
-            "desc": "",
-            "passr": True,
-            "tag_code": tag_info[0][4],
-            "tag_name": tag_info[0][2],
-            "tag_path": tag_info[0][3],
-            "category_id": tag_info[0][1]
-        }]
-    return None
+    result = []
+    try:
+        sql = """select tag_type,tag_nm,defined_rule from aitag_predefined_rules where %s ~ defined_rule """
+        rules = dao.query(sql, (phrase,))
+        print(rules)
+        if rules and len(rules) > 0:
+            for matched in rules:
+                tag_info = dao.query("""select ati.id,ati.category_id, ati.tag_nm, ati.tag_path,ati.tag_code from aitag_tag_info ati left join aitag_tag_category atc on ati.category_id = atc.id where ati.tag_nm = %s and ati.is_delete = 0 and atc.category_code = %s""", (matched[1], matched[0]))
+                # 安全检查:只有当 tag_info 有数据时才加入结果
+                if tag_info and len(tag_info) > 0:
+                    result.append({
+                        "id": tag_info[0][0],
+                        "desc": f"映射文本【{phrase}】与映射规则【{matched[2]}】匹配,映射为标签【{tag_info[0][2]}】",
+                        "passr": True,
+                        "tag_code": tag_info[0][4],
+                        "tag_name": tag_info[0][2],
+                        "tag_path": tag_info[0][3],
+                        "category_id": tag_info[0][1]
+                    })
+                else:
+                    logger.warning(f"预设规则匹配成功,但找不到对应的标签记录: tag_nm={matched[1]}, category_code={matched[0]}")
+    except Exception as e:
+        logger.error(f"Defined rule match failed: {e}")
+        result = []
+    return result
 
 def end_tagging_predefined_rule(id:str, result:str):
     dao.execute(

+ 29 - 0
agent/tests/test_tagging_0512.py

@@ -0,0 +1,29 @@
+import requests
+import uuid
+from openpyxl import load_workbook
+
+wb = load_workbook('./data/20260512对公贷款数据(含65条测试数据).xlsx')
+ws = wb.active
+idx = 0
+for row in ws.iter_rows(min_row=2, values_only=True):
+    idx += 1
+    instucde = row[0] if row[0] is not None else ""
+    instucde_nm = row[1] if row[1] is not None else ""
+    concat_no = row[3] if row[3] is not None else ""
+    zhiye = row[6] if row[6] is not None else ""
+    touxiang = row[8] if row[8] is not None else ""
+    yongtu = row[10] if row[10] is not None else ""
+    phrase = f"职业:{zhiye}; 投向:{touxiang}; 用途:{yongtu}"
+    print(f"{instucde}, {instucde_nm} , {concat_no},{phrase}" )
+    # requests.post("http://10.192.72.13:9876/api/aitag/v1/tagging", json={
+    #     "esb_seq_no": is_sea,
+    #     "business_attr": concat_no,
+    #     "phrase": phrase
+    # })
+    requests.post("http://localhost:9876/api/aitag/v1/tagging", json={
+        "business_attr": concat_no,
+        "phrase": phrase,
+        "instucde":instucde,
+        "instucde_nm":instucde_nm
+    })
+    break

+ 0 - 1
agent/update.md

@@ -1 +0,0 @@
-1. 打标接口 /api/fastapi/tagging 增加参数:instucde(行社代码)

+ 10 - 1
agent/update.sql

@@ -131,4 +131,13 @@ COMMENT ON TABLE  ai_tagging.aitag_company_whitelist_detail IS '企业白名单
 COMMENT ON COLUMN ai_tagging.aitag_company_whitelist_detail.aitag_company_whitelist_id is '外键';
 COMMENT ON COLUMN ai_tagging.aitag_company_whitelist_detail.tag_code is '标签代码';
 COMMENT ON COLUMN ai_tagging.aitag_company_whitelist_detail.company_name is '企业名称';
-COMMENT ON COLUMN ai_tagging.aitag_company_whitelist_detail.company_code is '企业统一社会信用代码';
+COMMENT ON COLUMN ai_tagging.aitag_company_whitelist_detail.company_code is '企业统一社会信用代码';
+
+-------- 20260512 -------
+
+ALTER TABLE ai_tagging.aitag_predefined_rules add COLUMN remark varchar(100);
+COMMENT on column ai_tagging.aitag_predefined_rules.remark is '备注';
+
+
+ALTER TABLE ai_tagging.aitag_predefined_rules modify defined_rule varchar(5000);
+ALTER TABLE ai_tagging.aitag_tag_log modify reg_result varchar(5000);

+ 38 - 0
agent/二期需求进度.md

@@ -0,0 +1,38 @@
+# 1 需求:
+  
+增加直接映射打标:21项映射及特例文本(如鲍鱼养殖、海鲜零售等)按照映射关系优先直接打标,无需客户经理确认。打标结果给出映射标识,便于后续进行统计。
+
+* 目前进度:
+    1. 已完成直接映射打标功能,java和python程序已完成。
+    2. 打标完成后通过ESB向下游画像系统推送打标结果,程序在现场,需要和现场同事确认。
+# 2 需求:
+  
+  沿海行社宽泛打标:智能打标中对于属于23家沿海行社发起的打标请求,增加涉海标识用于模型宽泛推荐标签,增加标签覆盖面。例如,对于“民宿装修”“酒店装修”等文本,可将推荐海洋经济83个标签中最相近的标签(如“涉海旅游消费”);对于非沿海行社打标请求,仍按照模型语义理解进行标签推荐。
+  
+* 目前进度:
+    1. 已完成
+# 3 需求:
+  
+  对于打标结果中false状态的标签,不再展示到客户经理确认界面,仅true状态推送客户经理确认,便于客户经理聚焦确认标签。
+  
+* 目前进度:
+    1. 已完成
+# 4 需求:
+  
+  标签最大推荐个数调整:智能打标中每个体系标签推荐最大个数由2调整至3。
+  
+* 目前进度:
+    1. 调整配置文件即可,已完成
+# 5 需求:
+  
+  多体系打标:智能打标系统支持多体系打标,根据打标文本推荐相应体系标签,比如养老产业+海洋经济。
+  
+* 目前进度:
+    1. 已完成
+# 6 需求:
+  
+  打标结果数据权限过滤:智能打标结果的数据概览界面和打标明细界面,数据展示及数据导出均需要按照用户所属行社进行权限管控。
+  
+* 目前进度:
+    1. 已完成
+    2. 需要发布到现场环境测试验证

+ 18 - 0
agent/文档提示词.prompt

@@ -0,0 +1,18 @@
+请根据以下项目信息帮我总结一份技术文档:
+    1. 项目核心功能:根据客户的输入信息包括职业,投向,用途短语进行AI打标,判断输出所属标签
+    2. 核心打标逻辑有三个流程:
+        1. 输入短语--》打标异常
+        2. 输入短语--》预设规则匹配--》如果匹配成功--》直接输出匹配标签
+        3. 输入短语--》预设规则没有匹配成功--》进入主打标流程--》关键字匹配--》向量检索--》大模型审核--》输出匹配标签
+    3. 打标接口采用异步工作方式,不阻塞调用方的主流程
+        1. 接口1,智能打标接口,异步架构
+        2. 接口2,打标结果查询接口
+        3. 接口3,客户反馈接口,客户经理可以看到打标结果,对打标结果进行确认,如果客户经理不认同打标结果,可以选择新的标签替代AI打标结果,后台系统会记录此反馈结果
+    4. 关键技术栈:
+        1. 关键字匹配采用正则表达式方式
+        2. 向量检索使用QwenEmbedding模型将标签信息向量化存储在ES中,将用户输入短语也通过QwenEmbedding转为向量,通过ES的向量检索匹配到相似标签,取Top3
+        3. 将向量检索结果和输入短语输入LLM,让LLM做最后的审核
+    5. 本项目主要是面向农信银行,对尽调系统的客户信息进行智能打标
+技术文档的要求:
+    1. 输出docx文档
+    2. 文档目录包括:项目背景,业务需求,技术栈,技术实现,worflow(流程用workflow实现)

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

@@ -16,4 +16,7 @@ public class AitagTagCategoryCreateDto {
 
     @ApiModelProperty(value = "标签体系描述")
     private String categoryDesc;
+
+    @ApiModelProperty(value="标签体系代码")
+    private String categoryCode;
 }

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

@@ -20,4 +20,7 @@ public class AitagTagCategoryUpdateDto {
 
     @ApiModelProperty(value = "标签体系描述")
     private String categoryDesc;
+
+    @ApiModelProperty(value="代码")
+    private String categoryCode;
 }

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

@@ -64,6 +64,7 @@ public class AitagTagCategoryServiceImpl implements AitagTagCategoryService {
         category.setId(UUID.randomUUID().toString());
         category.setCategoryNm(dto.getCategoryNm());
         category.setCategoryDesc(dto.getCategoryDesc());
+        category.setCategoryCode(dto.getCategoryCode());
         category.setState(1); // 默认停用
         category.setIsDelete(0); // 未删除
         Date now = new Date();
@@ -91,6 +92,7 @@ public class AitagTagCategoryServiceImpl implements AitagTagCategoryService {
         existing.setCategoryNm(dto.getCategoryNm());
         existing.setCategoryDesc(dto.getCategoryDesc());
         existing.setUpdateTime(new Date());
+        existing.setCategoryCode(dto.getCategoryCode());
 
         aiTagCategoryMapper.updateCategory(existing);
         return existing;

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

@@ -30,8 +30,8 @@
 
     <!-- 新增 -->
     <insert id="insertCategory">
-        INSERT INTO aitag_tag_category (id, category_nm, category_desc, state, is_delete, create_time, update_time)
-        VALUES (#{id}, #{categoryNm}, #{categoryDesc}, 1, 0, #{createTime}, #{updateTime})
+        INSERT INTO aitag_tag_category (id, category_nm, category_desc,category_code, state, is_delete, create_time, update_time)
+        VALUES (#{id}, #{categoryNm}, #{categoryDesc},#{categoryCode}, 1, 0, #{createTime}, #{updateTime})
     </insert>
 
     <!-- 按 ID 查询 -->
@@ -42,7 +42,7 @@
     <!-- 更新 -->
     <update id="updateCategory">
         UPDATE aitag_tag_category
-        SET category_nm = #{categoryNm}, category_desc = #{categoryDesc}, update_time = #{updateTime}
+        SET category_nm = #{categoryNm}, category_desc = #{categoryDesc},category_code=#{categoryCode}, update_time = #{updateTime}
         WHERE id = #{id}
     </update>
 

+ 1 - 1
web/src/views/aiTagging/externalPage/externalEdit.vue

@@ -9,7 +9,7 @@
         <el-button 
           type="primary" 
           class="confirm-btn" 
-          :disabled="selectedTags.length === 0"
+          :disabled="taggingState != 1"
           @click="handleConfirmTagging"
         >确认打标</el-button>
       </div>

+ 9 - 2
web/src/views/aiTagging/taggingSystemManage/components/CreateTagSystem.vue

@@ -14,6 +14,9 @@
         </template>
         <el-input v-model="form.name" placeholder="请输入标签体系名称,如'海洋经济'" />
       </el-form-item>
+      <el-form-item label="标签体系代码" prop="code" >
+        <el-input v-model="form.code" placeholder="请输入标签体系代码" />
+      </el-form-item>
       
       <!-- 标签体系描述 -->
       <el-form-item label="标签体系描述" prop="description">
@@ -60,6 +63,7 @@ export default {
       form: {
         id: '',
         name: '',
+        code: '',
         description: ''
       },
       // 表单验证规则
@@ -124,10 +128,12 @@ export default {
           const requestData = this.isEditMode ? {
             id: this.form.id,
             categoryNm: this.form.name,
-            categoryDesc: this.form.description
+            categoryDesc: this.form.description,
+            categoryCode: this.form.code
           } : {
             categoryNm: this.form.name,
-            categoryDesc: this.form.description
+            categoryDesc: this.form.description,
+            categoryCode: this.form.code
           };
           
           // 调用后端接口
@@ -169,6 +175,7 @@ export default {
     resetForm() {
       this.form = {
         name: '',
+        code: '',
         description: ''
       };
       

+ 2 - 1
web/src/views/aiTagging/taggingSystemManage/index.vue

@@ -208,7 +208,8 @@ export default {
       this.currentEditSystem = { 
         id: system.id,
         name: system.categoryNm,
-        description: system.categoryDesc
+        description: system.categoryDesc,
+        code: system.categoryCode
       }
       this.editDialogVisible = true
     },