From c099e6662b8a6e320ac314d31eda9b40455e5aa7 Mon Sep 17 00:00:00 2001
From: lyg <1543117173@qq.com>
Date: 星期四, 22 五月 2025 09:27:37 +0800
Subject: [PATCH] 修改指令json生成相关提示词和代码逻辑

---
 db_struct_flow.py |  535 ++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 291 insertions(+), 244 deletions(-)

diff --git a/db_struct_flow.py b/db_struct_flow.py
index 286a659..692b6fa 100644
--- a/db_struct_flow.py
+++ b/db_struct_flow.py
@@ -12,10 +12,12 @@
 import data_templates
 from knowledgebase import utils
 from knowledgebase.db.db_helper import create_project, create_device, create_data_stream, \
-    update_rule_enc, create_extend_info, create_ref_ds_rule_stream, create_ins_format
+    update_rule_enc, create_extend_info, create_ref_ds_rule_stream, create_ins_format, make_attr
 from knowledgebase.db.data_creator import create_prop_enc, create_enc_pkt, get_data_ty, create_any_pkt
 
 from knowledgebase.db.models import TProject
+
+from knowledgebase.db.doc_db_helper import doc_dbh
 
 # file_map = {
 #     # "閬ユ祴婧愬寘璁捐鎶ュ憡": "./doc/HY-4A鏁扮鍒嗙郴缁熼仴娴嬫簮鍖呰璁℃姤鍛� Z 240824 鏇存敼3(鍐呴儴) .docx.md",
@@ -105,9 +107,16 @@
 10. 浠� JSON 鏍煎紡缁勭粐杈撳嚭鍐呭锛岀‘淇濇暟鎹粨鏋勭殑瀹屾暣鎬у拰鍙鎬э紝娉ㄦ剰锛氱敓鎴愮殑JSON璇硶鏍煎紡蹇呴』绗﹀悎json瑙勮寖锛岄伩鍏嶅嚭鐜伴敊璇��
     
 ## 闄愬埗锛�
-- id鍜宑ode鐨勫懡鍚嶈鍒欙細鑻辨枃瀛楁瘝銆佹暟瀛椼�佷笅鍒掔嚎缁勬垚锛屼笖浠ヨ嫳鏂囧瓧姣嶆垨涓嬪垝绾垮紑澶淬��
 - 鎵�杈撳嚭鐨勫唴瀹瑰繀椤绘寜鐓SON鏍煎紡杩涜缁勭粐锛屼笉鑳藉亸绂绘鏋惰姹傦紝涓斾弗鏍奸伒寰枃妗e唴瀹硅繘琛岃緭鍑猴紝鍙緭鍑� JSON 锛屼笉瑕佽緭鍑哄叾瀹冩枃瀛椼��
 - 涓嶈緭鍑轰换浣曟敞閲婄瓑鎻忚堪鎬т俊鎭��
+"""
+
+tc_system_msg = """
+# 瑙掕壊
+浣犳槸涓�涓祫娣辫蒋浠跺伐绋嬪笀銆�
+# 绾︽潫
+- 杈撳嚭鍐呭蹇呴』鏍规嵁鏂囨。鍜岄棶棰樺洖绛旓紝涓嶈鍒涢�犲叾浠栧唴瀹癸紱
+- 杈撳嚭鍐呭蹇呴』鏄紝JSON鏍煎紡锛屼笉瑕佽緭鍑哄叾浠栨枃鏈��
 """
 
 g_completion = None
@@ -346,13 +355,21 @@
         self.gen_tc()
         return ''
 
-    def _gen(self, msgs, msg, files=None):
-        if files is None:
-            files = [file_map['鏂囨。鍚堝苟']]
+    def get_text_with_entity(self, entity_names: list[str]) -> str:
+        """
+        鏍规嵁瀹炰綋璇嶈幏鍙栨枃妗f枃鏈�
+        :param entity_names: str - 瀹炰綋璇嶅悕绉�
+        :return: str - 鏂囨湰鍐呭
+        """
+        return doc_dbh.get_text_with_entities(entity_names)
+
+    def _gen(self, msgs, msg, doc_text):
+        # if files is None:
+        #     files = [file_map['鏂囨。鍚堝苟']]
         messages = [] if msgs is None else msgs
-        doc_text = ''
-        for file in files:
-            doc_text += '\n' + read_from_file(file)
+        # doc_text = ''
+        # for file in files:
+        #     doc_text += '\n' + read_from_file(file)
         if len(messages) == 0:
             # 濡傛灉鏄涓�娆℃彁闂姞鍏ystem娑堟伅
             messages.append({'role': 'system', 'content': assistant_msg})
@@ -380,14 +397,14 @@
         g_completion = None
         return text
 
-    def generate_text(self, msg, cache_file, msgs=None, files=None, validation=None, try_cnt=5, json_text=False):
+    def generate_text(self, msg, cache_file, msgs=None, doc_text=None, validation=None, try_cnt=5, json_text=False):
         if msgs is None:
             msgs = []
         if USE_CACHE and os.path.isfile(cache_file):
             text = read_from_file(cache_file)
         else:
             s = time.time()
-            text = self._gen(msgs, msg, files)
+            text = self._gen(msgs, msg, doc_text)
             text = remove_think_tag(text)
             if json_text:
                 text = get_json_text(text)
@@ -398,39 +415,30 @@
                     print(e)
                     if try_cnt <= 0:
                         raise RuntimeError('鐢熸垚澶辫触锛岄噸璇曟鏁板お澶氾紝寮哄埗缁撴潫锛�')
-                    return self.generate_text_json(msg, cache_file, msgs, files, validation, try_cnt - 1)
+                    return self.generate_text_json(msg, cache_file, msgs, doc_text, validation, try_cnt - 1)
             if cache_file:
                 save_to_file(text, cache_file)
             print(f'鑰楁椂锛歿time.time() - s}')
         return text
 
-    def generate_text_json(self, msg, cache_file, msgs=None, files=None, validation=None, try_cnt=5):
-        return self.generate_text(msg, cache_file, msgs, files, validation, try_cnt, True)
+    def generate_text_json(self, msg, cache_file, msgs=None, doc_text=None, validation=None, try_cnt=5):
+        return self.generate_text(msg, cache_file, msgs, doc_text, validation, try_cnt, True)
 
-    def generate_tc_text(self, msg, cache_file, messages=None, files=None, validation=None, try_cnt=5):
-        if messages is None:
-            messages = []
-        doc_text = ''
-        for file in files:
-            doc_text += '\n' + read_from_file(file)
-        if len(messages) == 0:
-            # 濡傛灉鏄涓�娆℃彁闂姞鍏ystem娑堟伅
-            messages.append({'role': 'user', 'content': "浠ヤ笅鏄枃妗e唴瀹癸細\n" + doc_text})
-        return self.generate_text_json(msg, cache_file, messages, files, validation, try_cnt)
+    def generate_tc_text(self, msg, cache_file, msgs=None, doc_text=None, validation=None, try_cnt=5):
+        msgs = [
+            {'role': 'system', 'content': tc_system_msg},
+            {'role': 'user', 'content': "浠ヤ笅鏄枃妗e唴瀹癸細\n" + doc_text}]
+        return self.generate_text(msg, cache_file, msgs, doc_text, validation, try_cnt, True)
 
     def gen_project(self):
-        #         _msg = """
-        # 鏍规嵁鏂囨。杈撳嚭鍨嬪彿淇℃伅锛屽瀷鍙峰瓧娈靛寘鎷細鍚嶇О鍜屼唬鍙枫�備粎杈撳嚭鍨嬪彿杩欎竴绾с��
-        # 渚嬪锛歿"name":"xxx","id":"xxx"}
-        # """
-        #         print('鍨嬪彿淇℃伅锛�')
-        #         text = self.generate_text(_msg, 'out/鍨嬪彿淇℃伅.json', files=[file_map['搴旂敤杞欢鐢ㄦ埛闇�姹�']])
-        #         proj_dict = json.loads(text)
-        # 宸ョ▼淇℃伅浠庣郴缁熻幏鍙�
-        proj_dict = {
-            "id": "JB200001",
-            "name": "HY-4A"
-        }
+        _msg = """
+            鏍规嵁鏂囨。鍐呭杈撳嚭鍒嗙郴缁熶俊鎭紝鍒嗙郴缁熷瓧娈靛寘鎷細鍚嶇О鍜屽瀷鍙蜂唬鍙枫�備粎杈撳嚭鍒嗙郴缁熻繖涓�绾с�傚鏋滃瀷鍙蜂唬鍙蜂腑鏈夌鍙蜂篃瑕佽緭鍑猴紝淇濊瘉杈撳嚭瀹屾暣銆�
+            渚嬪锛歿"name":"xxx","id":"xxx"}
+        """
+        print('鍨嬪彿淇℃伅锛�')
+        doc_text = self.get_text_with_entity(['绯荤粺姒傝堪'])
+        text = self.generate_text_json(_msg, 'out/鍨嬪彿淇℃伅.json', doc_text=doc_text)
+        proj_dict = json.loads(text)
         code = proj_dict['id']
         name = proj_dict['name']
         proj = create_project(code, name, code, name, "", datetime.now())
@@ -495,7 +503,8 @@
             assert isinstance(_devs, list), '鏁版嵁缁撴瀯鏈�澶栧眰涓嶆槸鏁扮粍'
             assert next(filter(lambda it: it['name'].endswith('绠$悊鍗曞厓'), _devs), None), '鐢熸垚鐨勮澶囧垪琛ㄤ腑娌℃湁绠$悊鍗曞厓'
 
-        text = self.generate_text_json(_msg, cache_file, files=[file_map['搴旂敤杞欢鐢ㄦ埛闇�姹�']], validation=validation)
+        doc_text = self.get_text_with_entity(['绯荤粺姒傝堪', '鎬荤嚎绠$悊'])
+        text = self.generate_text_json(_msg, cache_file, doc_text=doc_text, validation=validation)
         devs = json.loads(text)
 
         # 绫籗MU璁惧锛屽寘鍚仴娴嬪拰閬ユ帶鍔熻兘锛屽悕绉扮粨灏句负鈥滅鐞嗗崟鍏冣��
@@ -550,9 +559,10 @@
 鍙傛暟淇℃伅瀛楁鍖呮嫭锛歯ame锛堝弬鏁板悕绉帮級銆乮d锛堝弬鏁颁唬鍙凤級銆乸os锛堝弬鏁拌捣濮媌it浣嶇疆锛夈�乴ength锛堝弬鏁癰it闀垮害锛夈�乼ype锛堢被鍨嬶細para锛夈��
 娉ㄦ剰锛�
 1涓瓧鑺傜殑闀垮害涓�8浣嶏紝浣跨敤B0-B7鏉ヨ〃绀猴紝璇风簿纭绠楀弬鏁伴暱搴︺��
-鏂囨。涓綅缃弿杩颁俊鎭彲鑳藉瓨鍦ㄨ法瀛楄妭鐨勬儏鍐碉紝渚嬪锛�"Byte1_B6~Byte2_B0":琛ㄧず浠庣1涓瓧鑺傜殑绗�7浣嶅埌绗�2涓瓧鑺傜殑绗�1浣嶏紝闀垮害鏄�3;"Byte27_B7~Byte28_B0":琛ㄧず浠庣27涓瓧鑺傜殑绗�8浣嶅埌绗�28涓瓧鑺傜殑绗�1浣嶏紝闀垮害鏄�2銆�
+鏂囨。涓綅缃弿杩颁俊鎭彲鑳藉瓨鍦ㄨ法瀛楄妭鐨勬儏鍐碉紝渚嬪锛�"Byte1_B6~Byte2_B0":琛ㄧず浠庣1涓瓧鑺傜殑绗�7浣嶅埌绗�2涓瓧鑺傜殑绗�1浣嶏紝闀垮害鏄�3;"Byte27_B7~Byte28_B0":琛ㄧず浠庣27涓瓧鑺傜殑绗�8浣嶅埌绗�28涓瓧鑺傜殑绗�1浣嶏紝闀垮害鏄�2;"Byte38~Byte74":琛ㄧず浠庣38涓瓧鑺傚埌绗�74涓瓧鑺傦紝涓棿鏈�37涓瓧鑺傦紝闀垮害鏄�298銆�
 #绾︽潫
 - 涓嶈閬楁紡浠讳綍鍙傛暟锛�
+- 濡傛灉鏈変唬鍙蜂弗鏍间緷鐓ф枃妗d腑鐨勪唬鍙凤紝鏂囨。涓殑浠e彿濡傛灉涓嶇鍚堜唬鍙峰懡鍚嶈鍒欏皢鐗规畩瀛楃杞崲涓轰笅鍒掔嚎锛屼緥濡傦細Rsv-1杞崲涓篟sv_1锛�
 - 鏁版嵁缁撴瀯鏈�澶栧眰涓烘暟缁勶紝鏁扮粍鍏冪礌涓哄弬鏁颁俊鎭璞★紱
 - 浠呰緭鍑篔SON鏂囨湰銆�
 #渚嬪瓙
@@ -567,14 +577,14 @@
 ]
 """
         print('鎻掑叆鍩熷弬鏁板垪琛細')
-        files = [file_map['閬ユ祴澶х翰']]
 
         def validation(gen_text):
             params = json.loads(gen_text)
             assert isinstance(params, list), '鎻掑叆鍩熷弬鏁板垪琛ㄦ暟鎹粨鏋勬渶澶栧眰蹇呴』鏄暟缁�'
             assert len(params), '鎻掑叆鍩熷弬鏁板垪琛ㄤ笉鑳戒负绌�'
 
-        text = self.generate_text_json(_msg, './out/鎻掑叆鍩熷弬鏁板垪琛�.json', files=files, validation=validation)
+        doc_text = self.get_text_with_entity(['鎻掑叆鍩�'])
+        text = self.generate_text_json(_msg, './out/鎻掑叆鍩熷弬鏁板垪琛�.json', doc_text=doc_text, validation=validation)
         return json.loads(text)
 
     def gen_tm_frame_data(self):
@@ -623,29 +633,31 @@
             _vc_pkts = filter(lambda it: it['vcs'].__contains__(vc['id']), self.vc_pkts)
             for _pkt in _vc_pkts:
                 # 鍒ゆ柇閬ユ祴鍖呮槸鍚︽湁璇︾粏瀹氫箟
-                if not next(filter(lambda it: it['name'] == _pkt['name'] and it['hasParams'], self.tm_pkts), None):
-                    continue
+                # if not next(filter(lambda it: it['name'] == _pkt['name'] and it['hasParams'], self.tm_pkts), None):
+                #     continue
                 # 鑾峰彇鍖呰鎯�
                 _pkt = self.gen_pkt_details(_pkt['name'], _pkt['id'])
                 epdu = next(filter(lambda it: it['name'] == '鏁版嵁鍩�', vc['children']), None)
                 if epdu and _pkt:
                     _pkt['children'] = _pkt['datas']
-                    _last_par = _pkt['children'][len(_pkt['children']) - 1]
-                    _pkt['length'] = (_last_par['pos'] + _last_par['length'])
-                    _pkt['pos'] = 0
-                    if 'children' not in epdu:
-                        epdu['children'] = []
-                    # 娣诲姞瑙f瀽瑙勫垯鍚庣紑闃叉閲嶅
-                    _pkt['id'] = _pkt['id'] + '_' + vc['VCID']
-                    # 缁欏寘鍚嶅姞浠e彿鍓嶇紑
-                    if not _pkt['name'].startswith(_pkt['id']):
-                        _pkt['name'] = _pkt['id'] + '_' + _pkt['name']
-                    epdu['children'].append(_pkt)
-                    apid_node = next(filter(lambda it: it['name'].__contains__('搴旂敤杩囩▼'), _pkt['headers']), None)
-                    ser_node = next(filter(lambda it: it['name'] == '鏈嶅姟', _pkt['headers']), None)
-                    sub_ser_node = next(filter(lambda it: it['name'] == '瀛愭湇鍔�', _pkt['headers']), None)
-                    _pkt['vals'] = \
-                        f"{apid_node['content']}/{int(ser_node['content'], 16)}/{int(sub_ser_node['content'], 16)}/"
+                    # todo 褰撴暟鎹寘鑾峰彇鍒颁笢瑗夸絾涓嶆槸鍙傛暟鏃讹紝鑾峰彇鍒扮殑鍖呯粨鏋勬湁闂锛岄渶瑕佽繃婊�
+                    if len(_pkt['children']) > 0:
+                        _last_par = _pkt['children'][len(_pkt['children']) - 1]
+                        _pkt['length'] = (_last_par['pos'] + _last_par['length'])
+                        _pkt['pos'] = 0
+                        if 'children' not in epdu:
+                            epdu['children'] = []
+                        # 娣诲姞瑙f瀽瑙勫垯鍚庣紑闃叉閲嶅
+                        _pkt['id'] = _pkt['id'] + '_' + vc['VCID']
+                        # 缁欏寘鍚嶅姞浠e彿鍓嶇紑
+                        if not _pkt['name'].startswith(_pkt['id']):
+                            _pkt['name'] = _pkt['id'] + '_' + _pkt['name']
+                        epdu['children'].append(_pkt)
+                        apid_node = next(filter(lambda it: it['name'].__contains__('搴旂敤杩囩▼'), _pkt['headers']), None)
+                        ser_node = next(filter(lambda it: it['name'] == '鏈嶅姟', _pkt['headers']), None)
+                        sub_ser_node = next(filter(lambda it: it['name'] == '瀛愭湇鍔�', _pkt['headers']), None)
+                        _pkt['vals'] = \
+                            f"{apid_node['content']}/{int(ser_node['content'], 16)}/{int(sub_ser_node['content'], 16)}/"
 
         # 閲嶆柊璁℃暟璧峰鍋忕Щ
         self.compute_length_pos(cadu['children'])
@@ -718,7 +730,8 @@
             assert next(filter(lambda it: re.match('^[0-1]+$', it['VCID']), vcs)), '鐢熸垚鐨刅CID蹇呴』鏄簩杩涘埗'
 
         print('铏氭嫙淇¢亾锛�')
-        text = self.generate_text_json(_msg, "out/铏氭嫙淇¢亾.json", files=[file_map['閬ユ祴澶х翰']], validation=validation)
+        doc_text = self.get_text_with_entity(['铏氭嫙淇¢亾瀹氫箟'])
+        text = self.generate_text_json(_msg, "out/铏氭嫙淇¢亾.json", doc_text=doc_text, validation=validation)
         vcs = json.loads(text)
         return vcs
 
@@ -743,131 +756,106 @@
         dev_pkts = json.loads(text)
         return dev_pkts
 
-    def pkt_in_tm_pkts(self, pkt_name):
-        cache_file = f'out/鏁版嵁鍖�-{pkt_name}.json'
-        if os.path.isfile(cache_file):
-            return True
-        files = [file_map['閬ユ祴婧愬寘璁捐鎶ュ憡']]
-        print(f'鏂囨。涓湁鏃犫�渰pkt_name}鈥濈殑瀛楁鎻忚堪锛�', end='')
-        _msg = f"""
-#瑙掕壊
-浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛��
-#鎸囦护
-鎴戦渶瑕佷粠鏂囨。涓垎鏋愬垽璇绘槸鍚︽湁鏌愪釜閬ユ祴鍖呯殑瀛楁琛ㄦ弿杩帮紝浣犺甯姪鎴戝垽鏂��
-#闂
-鏂囨。涓湁閬ユ祴鍖呪�渰pkt_name}鈥濈殑瀛楁琛ㄦ弿杩板悧锛�
-娉ㄦ剰锛氶仴娴嬪寘鐨勫瓧娈佃〃绱ф帴鐫�閬ユ祴鍖呯珷鑺傛爣棰橈紝濡傛灉绔犺妭鏍囬鍚庨潰鐪佺暐浜嗘垨鑰呰瑙亁xx鍒欐槸娌℃湁瀛楁琛ㄦ弿杩般��
-#绾︽潫
-- 鏍规嵁鏂囨。鍐呭杈撳嚭锛�
-- 閬ユ祴鍖呭悕绉板繀椤诲畬鍏ㄥ尮閰嶏紱
-- 杈撳嚭鈥滄棤鈥濇垨鈥滄湁鈥濓紝涓嶈杈撳嚭鍏朵粬浠讳綍鍐呭銆�
-#渚嬪瓙
-鏈�
-"""
-        text = self.generate_text(_msg, f'out/pkts/鏈夋棤鏁版嵁鍖�-{pkt_name}.txt', [], files)
-        return text == '鏈�'
-
     def gen_pkt_details(self, pkt_name, pkt_id):
         cache_file = f'out/鏁版嵁鍖�-{pkt_name}.json'
-        files = [file_map['閬ユ祴婧愬寘璁捐鎶ュ憡']]
-        if not os.path.isfile(cache_file):
-            # 鍏堥棶鏈�鍚庝竴涓弬鏁扮殑瀛楄妭浣嶇疆
-            print(f'閬ユ祴婧愬寘鈥渰pkt_name}鈥濅俊鎭細')
-            _msg = f"""
-#瑙掕壊
-浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛��
-#鎸囦护
-鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬫簮鍖呯殑鏈�鍚庝竴涓弬鏁扮殑bit浣嶇疆鍜屾暟鎹煙鍙傛暟涓暟锛屼綘瑕佸府鎴戝畬鎴愬弬鏁癰it浣嶇疆鍜屾暟鎹煙鍙傛暟涓暟鐨勬彁鍙栥��
-#闇�姹�
-杈撳嚭鏂囨。涓弿杩扮殑鍚嶇О涓衡�渰pkt_name}鈥濅唬鍙蜂负鈥渰pkt_id}鈥濋仴娴嬪寘鐨勬渶鍚庝竴涓弬鏁扮殑bit浣嶇疆鍜屾暟鎹煙鍙傛暟涓暟銆�
-""" + """
-#绾︽潫
-- 閬ユ祴婧愬寘鐨勫唴瀹瑰湪涓�涓〃鏍间腑瀹氫箟锛岃〃鏍肩粨鏉熷垯鍖呭唴瀹圭粨鏉燂紱
-- 鏁版嵁鍩熶腑姣忎竴琛屽搴斾竴涓弬鏁帮紱
-- 涓嶈璺ㄨ〃鏍兼彁鍙栵紱
-- 瀛楄妭浣嶇疆涓瓧鑺備綅缃槸浠�1寮�濮嬬殑锛宐it浣嶇疆鏄粠0寮�濮嬬殑锛�
-- bit浣嶇疆璁$畻鍏紡涓猴細(N-1)*8+B锛屽叾涓璑鏄瓧鑺傛暟锛孊鏄痓it鏁帮紱
-- 浠呰緭鍑簀son锛屼笉瑕佽緭鍑哄叾浠栦换浣曞瓧绗︺��
-#渚嬪瓙锛�
-{"last_par_pos":128, "par_num": 20}
-"""
-            text = self.generate_text_json(_msg, '', files=files)
-            result = json.loads(text)
-            last_par_pos = result['last_par_pos']
-            par_num = result['par_num']
 
-            _msg = f"""
-#瑙掕壊
-浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛��
-#鎸囦护
-鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬫簮鍖呬俊鎭垪琛紝浣犺甯垜瀹屾垚閬ユ祴婧愬寘淇℃伅鍒楄〃鐨勬彁鍙栥��
-#闇�姹�
-杈撳嚭鏂囨。涓弿杩扮殑鍚嶇О涓衡�渰pkt_name}鈥濅唬鍙蜂负鈥渰pkt_id}鈥濋仴娴嬪寘銆�
-娉ㄦ剰锛氭渶鍚庝竴涓弬鏁扮殑璧峰bit鍋忕Щ浣嶇疆涓簕last_par_pos}銆�
-""" + """
-閬ユ祴鍖呭瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id)銆佺被鍨�(type)銆佸寘澶村睘鎬у垪琛�(headers)銆佹暟鎹煙鍙傛暟鍒楄〃(datas)锛岀被鍨嬩负 linear锛�
-鍖呭ご鐨勫睘鎬х殑瀛楁鍖呮嫭锛氬悕绉�(name)銆佷唬鍙�(id)銆佷綅缃�(pos)銆佸畾涔�(content)銆侀暱搴�(length)銆佺被鍨�(type)锛岀被鍨嬩负 para锛�
-鏁版嵁鍩熷弬鏁板瓧娈靛寘鎷細鍙傛暟鍚嶇О(name)銆佸弬鏁颁唬鍙�(id)銆佷綅缃�(pos)銆侀暱搴�(length)銆佸瓧鑺傞『搴�(byteOrder)锛岀被鍨嬩负 para锛�
+        # _msg = f"""
+        #     #瑙掕壊
+        #     浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛��
+        #     #鎸囦护
+        #     鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬫簮鍖呯殑鏈�鍚庝竴涓弬鏁扮殑bit浣嶇疆鍜屾暟鎹煙鍙傛暟涓暟锛屼綘瑕佸府鎴戝畬鎴愬弬鏁癰it浣嶇疆鍜屾暟鎹煙鍙傛暟涓暟鐨勬彁鍙栥��
+        #     #闇�姹�
+        #     杈撳嚭鏂囨。涓弿杩扮殑鍚嶇О涓衡�渰pkt_name}鈥濅唬鍙蜂负鈥渰pkt_id}鈥濋仴娴嬪寘鐨勬渶鍚庝竴涓弬鏁扮殑bit浣嶇疆鍜屾暟鎹煙鍙傛暟涓暟銆�
+        #     """ + """
+        #     #绾︽潫
+        #     - 閬ユ祴婧愬寘鐨勫唴瀹瑰湪涓�涓〃鏍间腑瀹氫箟锛岃〃鏍肩粨鏉熷垯鍖呭唴瀹圭粨鏉燂紱
+        #     - 鏁版嵁鍩熶腑姣忎竴琛屽搴斾竴涓弬鏁帮紱
+        #     - 涓嶈璺ㄨ〃鏍兼彁鍙栵紱
+        #     - 瀛楄妭浣嶇疆涓瓧鑺備綅缃槸浠�1寮�濮嬬殑锛宐it浣嶇疆鏄粠0寮�濮嬬殑锛�
+        #     - bit浣嶇疆璁$畻鍏紡涓猴細(N-1)*8+B锛屽叾涓璑鏄瓧鑺傛暟锛孊鏄痓it鏁帮紱
+        #     - 浠呰緭鍑簀son锛屼笉瑕佽緭鍑哄叾浠栦换浣曞瓧绗︺��
+        #     #渚嬪瓙锛�
+        #     {"last_par_pos":128, "par_num": 20}
+        #     """
 
-鍖呭ご灞炴�у寘鎷細鍖呯増鏈彿銆佸寘绫诲瀷銆佸壇瀵煎ご鏍囪瘑銆佸簲鐢ㄨ繃绋嬫爣璇嗐�佸簭鍒楁爣璁般�佸寘搴忓垪璁℃暟銆佸寘闀裤�佹湇鍔°�佸瓙鏈嶅姟銆�
-鍖呭ご灞炴�х殑闀垮害锛氬寘鐗堟湰鍙凤紙3锛夈�佸寘绫诲瀷锛�1锛夈�佸壇瀵煎ご鏍囪瘑锛�1锛夈�佸簲鐢ㄨ繃绋嬫爣璇嗭紙11锛夈�佸簭鍒楁爣璁帮紙2锛夈�佸寘搴忓垪璁℃暟锛�14锛夈�佸寘闀匡紙16锛夈�佹湇鍔★紙8锛夈�佸瓙鏈嶅姟锛�8锛夈��
+        # text = self.generate_text_json(_msg, '', doc_text=doc_text)
+        # result = json.loads(text)
+        # last_par_pos = result['last_par_pos']
+        # par_num = result['par_num']
 
-琛ㄦ牸鍗曞厓鏍煎悎骞惰鏄庯細鍖呮牸涓瓨鍦ㄥ崟鍏冩牸鍚堝苟鐨勬儏鍐碉紝濡傛灉姘村钩鎴栧瀭鐩寸浉閭荤殑鍗曞厓鏍煎唴瀹逛竴鏍烽偅涔堣繖鍑犱釜鍐呭涓�鏍风殑鍗曞厓鏍兼湁鍙兘鏄竴涓悎骞跺崟鍏冩牸鍦ㄥ垎鏋愭椂搴旇褰撲綔鍚堝苟鍗曞厓鏍煎垎鏋愩��
-#绾︽潫
-- 浠e彿鍛藉悕瑙勫垯锛氭暟瀛椼�佽嫳鏂囧瓧姣嶅拰涓嬪垝绾跨粍鎴愪笖浠ヨ嫳鏂囧瓧姣嶅拰涓嬪垝绾垮紑澶达紱
-- 濡傛灉娌℃湁鍚嶇О鐢ㄤ唬鍙蜂唬鏇匡紝濡傛灉娌℃湁浠e彿鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧浠f浛锛岀炕璇戝敖閲忕畝鐭紱
-- 濡傛灉鏈変唬鍙蜂弗鏍间緷鐓ф枃妗d腑鐨勪唬鍙凤紝鏂囨。涓殑浠e彿濡傛灉涓嶇鍚堜唬鍙峰懡鍚嶈鍒欏皢鐗规畩瀛楃杞崲涓轰笅鍒掔嚎锛屼緥濡傦細Rsv-1杞崲涓篟sv_1锛�
-- 浣犻渶瑕佺悊瑙f暟鎹寘鐨勪綅缃俊鎭紝鐢变綅缃俊鎭緱鍒伴暱搴︼紝骞朵笖灏嗘墍鏈夎緭鍑哄崟浣嶇粺涓�杞崲涓� bits锛�
-- pos瀛楁锛氭暟鍊肩被鍨嬶紝浠�0寮�濮嬭绠楋紝鐢遍暱搴︼紙length锛夌疮鍔犲緱鍒帮紱
-- 搴旂敤杩囩▼鏍囪瘑锛氬鏋滀笉鏄崄鍏繘鍒惰浆鎹负鍗佸叚杩涘埗锛岃浆鎹㈠畬鎴愬悗瑕侀獙璇佹槸鍚︽纭紝浠�0x寮�澶达紝锛�
-- 鍖呭ご鍚庨潰鐨勬瘡涓�琛岄兘瀵瑰簲涓�涓弬鏁帮紝閫愯杈撳嚭鍙傛暟锛屼笉瑕侀仐婕忎换浣曞弬鏁帮紱
-- 绫讳技鈥濅繚鐣欙紙Rsv锛夆�滅殑琛屼篃瑕佸綋鍙傛暟鐢熸垚锛�
-- 閲嶅鐨勮涔熻鐢熸垚锛�
-- 娉ㄦ剰鍖呭唴瀹圭殑鑼冨洿锛屼笉瑕佹彁鍙栧埌鍏朵粬鍖呬腑鐨勫唴瀹癸紝鍖呭唴瀹归兘鍦ㄥ悓涓�涓〃鏍间腑锛�
-- 瀛楄妭椤哄簭锛氬�间负澶х鈥淏鈥濓紝灏忕鈥淟鈥濓紝榛樿涓衡�淏鈥濓紱
-- 杈撳嚭涓ユ牸鎸夌収鏂囨。涓殑鍐呭鐢熸垚锛屼笉瑕佸垱閫犳枃妗d腑涓嶅瓨鍦ㄧ殑鍐呭锛�
-- 浠呰緭鍑簀son锛屼笉瑕佽緭鍑轰换浣曞叾浠栧唴瀹广��
-#渚嬪瓙
-{
-  "name": "鏁扮缂撳彉閬ユ祴鍖�",
-  "id": "PMS003",
-  "type": "linear",
-  "headers": [
-    {
-      "name": "鍖呮爣璇�",
-      "id": "packetIdentifier",
-      "pos": 0,
-      "content": "000",
-      "length": 8,
-      "type": "para"
-    }
-  ],
-  "datas": [
-    {
-      "name": "XXX鍖�",
-      "id": "XXX",
-      "pos": 0,
-      "length": 8,
-      "byteOrder": ""
-    }
-  ]
-"""
-            print(f'閬ユ祴婧愬寘鈥渰pkt_name}鈥濅俊鎭細')
+        _msg = f"""
+            #瑙掕壊
+            浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛��
+            #鎸囦护
+            鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬫簮鍖呬俊鎭垪琛紝浣犺甯垜瀹屾垚閬ユ祴婧愬寘淇℃伅鍒楄〃鐨勬彁鍙栥��
+            #闇�姹�
+            杈撳嚭鏂囨。涓弿杩扮殑鍚嶇О涓衡�渰pkt_name}鈥濅唬鍙蜂负鈥渰pkt_id}鈥濋仴娴嬪寘銆�
+            """ + """
+            閬ユ祴鍖呭瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id)銆佺被鍨�(type)銆佸寘澶村睘鎬у垪琛�(headers)銆佹暟鎹煙鍙傛暟鍒楄〃(datas)锛岀被鍨嬩负 linear锛�
+            鍖呭ご鐨勫睘鎬х殑瀛楁鍖呮嫭锛氬悕绉�(name)銆佷唬鍙�(id)銆佷綅缃�(pos)銆佸畾涔�(content)銆侀暱搴�(length)銆佺被鍨�(type)锛岀被鍨嬩负 para锛�
+            鏁版嵁鍩熷弬鏁板瓧娈靛寘鎷細鍙傛暟鍚嶇О(name)銆佸弬鏁颁唬鍙�(id)銆佷綅缃�(pos)銆侀暱搴�(length)銆佸瓧鑺傞『搴�(byteOrder)锛岀被鍨嬩负 para锛�
 
-            def validation(gen_text):
-                _pkt = json.loads(gen_text)
-                with open(f'out/tmp/{time.time()}.json', 'w') as f:
-                    f.write(gen_text)
-                assert 'headers' in _pkt, '鍖呯粨鏋勪腑蹇呴』鍖呭惈headers瀛楁'
-                assert 'datas' in _pkt, '鍖呯粨鏋勪腑蹇呴』鍖呭惈datas瀛楁'
-                print(f'鍙傛暟涓暟锛歿len(_pkt["datas"])}')
-                # assert par_num == len(_pkt['datas']), f'鏁版嵁鍩熷弬鏁颁釜鏁颁笉瀵癸紒棰勮{par_num}涓紝瀹為檯{len(_pkt["datas"])}'
-                assert last_par_pos == _pkt['datas'][-1]['pos'], '鏈�鍚庝竴涓弬鏁扮殑瀛楄妭浣嶇疆涓嶅锛�'
+            鍖呭ご灞炴�у寘鎷細鍖呯増鏈彿銆佸寘绫诲瀷銆佸壇瀵煎ご鏍囪瘑銆佸簲鐢ㄨ繃绋嬫爣璇嗐�佸簭鍒楁爣璁般�佸寘搴忓垪璁℃暟銆佸寘闀裤�佹湇鍔°�佸瓙鏈嶅姟銆�
+            鍖呭ご灞炴�х殑闀垮害锛氬寘鐗堟湰鍙凤紙3锛夈�佸寘绫诲瀷锛�1锛夈�佸壇瀵煎ご鏍囪瘑锛�1锛夈�佸簲鐢ㄨ繃绋嬫爣璇嗭紙11锛夈�佸簭鍒楁爣璁帮紙2锛夈�佸寘搴忓垪璁℃暟锛�14锛夈�佸寘闀匡紙16锛夈�佹湇鍔★紙8锛夈�佸瓙鏈嶅姟锛�8锛夈��
 
-            text = self.generate_text_json(_msg, cache_file, [], files, validation)
-            pkt = json.loads(text)
-        else:
-            pkt = json.loads(read_from_file(cache_file))
+            琛ㄦ牸鍗曞厓鏍煎悎骞惰鏄庯細鍖呮牸涓瓨鍦ㄥ崟鍏冩牸鍚堝苟鐨勬儏鍐碉紝濡傛灉姘村钩鎴栧瀭鐩寸浉閭荤殑鍗曞厓鏍煎唴瀹逛竴鏍烽偅涔堣繖鍑犱釜鍐呭涓�鏍风殑鍗曞厓鏍兼湁鍙兘鏄竴涓悎骞跺崟鍏冩牸鍦ㄥ垎鏋愭椂搴旇褰撲綔鍚堝苟鍗曞厓鏍煎垎鏋愩��
+            #绾︽潫
+            - 浠e彿鍛藉悕瑙勫垯锛氭暟瀛椼�佽嫳鏂囧瓧姣嶅拰涓嬪垝绾跨粍鎴愪笖浠ヨ嫳鏂囧瓧姣嶅拰涓嬪垝绾垮紑澶达紱
+            - 濡傛灉娌℃湁鍚嶇О鐢ㄤ唬鍙蜂唬鏇匡紝濡傛灉娌℃湁浠e彿鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧浠f浛锛岀炕璇戝敖閲忕畝鐭紱
+            - 濡傛灉鏈変唬鍙蜂弗鏍间緷鐓ф枃妗d腑鐨勪唬鍙凤紝鏂囨。涓殑浠e彿濡傛灉涓嶇鍚堜唬鍙峰懡鍚嶈鍒欏皢鐗规畩瀛楃杞崲涓轰笅鍒掔嚎锛屼緥濡傦細Rsv-1杞崲涓篟sv_1锛�
+            - 浣犻渶瑕佺悊瑙f暟鎹寘鐨勪綅缃俊鎭紝鐢变綅缃俊鎭緱鍒伴暱搴︼紝骞朵笖灏嗘墍鏈夎緭鍑哄崟浣嶇粺涓�杞崲涓� bits锛�
+            - pos瀛楁锛氭暟鍊肩被鍨嬶紝浠�0寮�濮嬭绠楋紝鐢遍暱搴︼紙length锛夌疮鍔犲緱鍒帮紱
+            - 搴旂敤杩囩▼鏍囪瘑锛氬簲鐢ㄨ繃绋嬫爣璇嗙殑瀹氫箟濡傛灉涓嶆槸鍗佸叚杩涘埗杞崲涓哄崄鍏繘鍒讹紝杞崲瀹屾垚鍚庤楠岃瘉鏄惁姝g‘锛屼互0x寮�澶达紱
+            - 鍖呭ご鍚庨潰鐨勬瘡涓�琛岄兘瀵瑰簲涓�涓弬鏁帮紝閫愯杈撳嚭鍙傛暟锛屼笉瑕侀仐婕忎换浣曞弬鏁帮紱
+            - 绫讳技鈥濅繚鐣欙紙Rsv锛夆�滅殑琛屼篃瑕佸綋鍙傛暟鐢熸垚锛�
+            - 閲嶅鐨勮涔熻鐢熸垚锛�
+            - 娉ㄦ剰鍖呭唴瀹圭殑鑼冨洿锛屼笉瑕佹彁鍙栧埌鍏朵粬鍖呬腑鐨勫唴瀹癸紝鍖呭唴瀹归兘鍦ㄥ悓涓�涓〃鏍间腑锛�
+            - 瀛楄妭椤哄簭锛氬�间负澶х鈥淏鈥濓紝灏忕鈥淟鈥濓紝榛樿涓衡�淏鈥濓紱
+            - 杈撳嚭涓ユ牸鎸夌収鏂囨。涓殑鍐呭鐢熸垚锛屼笉瑕佸垱閫犳枃妗d腑涓嶅瓨鍦ㄧ殑鍐呭锛�
+            - 浠呰緭鍑簀son锛屼笉瑕佽緭鍑轰换浣曞叾浠栧唴瀹广��
+            #渚嬪瓙
+            {
+            "name": "鏁扮缂撳彉閬ユ祴鍖�",
+            "id": "PMS003",
+            "type": "linear",
+            "headers": [
+                {
+                "name": "鍖呮爣璇�",
+                "id": "packetIdentifier",
+                "pos": 0,
+                "content": "000",
+                "length": 8,
+                "type": "para"
+                }
+            ],
+            "datas": [
+                {
+                "name": "XXX鍖�",
+                "id": "XXX",
+                "pos": 0,
+                "length": 8,
+                "byteOrder": ""
+                }
+            ]
+            """
+
+        print(f'閬ユ祴婧愬寘鈥渰pkt_name}鈥濅俊鎭細')
+
+        def validation(gen_text):
+            _pkt = json.loads(gen_text)
+            with open(f'out/tmp/{time.time()}.json', 'w') as f:
+                f.write(gen_text)
+            assert 'headers' in _pkt, '鍖呯粨鏋勪腑蹇呴』鍖呭惈headers瀛楁'
+            assert 'datas' in _pkt, '鍖呯粨鏋勪腑蹇呴』鍖呭惈datas瀛楁'
+            # assert par_num == len(_pkt['datas']), f'鏁版嵁鍩熷弬鏁颁釜鏁颁笉瀵癸紒棰勮{par_num}涓紝瀹為檯{len(_pkt["datas"])}'
+            # assert last_par_pos == _pkt['datas'][-1]['pos'], '鏈�鍚庝竴涓弬鏁扮殑瀛楄妭浣嶇疆涓嶅锛�'
+
+        doc_text = self.get_text_with_entity([pkt_id])
+        if doc_text == '':
+            return None
+        text = self.generate_text_json(_msg, cache_file, [], doc_text, validation)
+        pkt = json.loads(text)
+
         pkt_len = 0
         for par in pkt['datas']:
             par['pos'] = pkt_len
@@ -882,14 +870,12 @@
 #鎸囦护
 鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬪寘鏁版嵁锛屼綘瑕佹牴鎹枃妗e唴瀹瑰府鎴戝畬鎴愰仴娴嬪寘鏁版嵁鐨勬彁鍙栥��
 #闇�姹�
-杈撳嚭鏂囨。涓弿杩扮殑閬ユ祴鍖呭垪琛紝閬ユ祴鍖呭瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id)銆佹槸鍚︽湁鍙傛暟(hasParams)銆�
+杈撳嚭鏂囨。涓弿杩扮殑閬ユ祴鍖呭垪琛紝閬ユ祴鍖呭瓧娈靛寘鎷細鍚嶇О(name)銆佷唬鍙�(id)銆�
 瀛楁鎻忚堪锛�
 1.鍚嶇О锛氶仴娴嬪寘鐨勫悕绉帮紱
 2.浠e彿锛氶仴娴嬪寘鐨勪唬鍙凤紱
-3.鏄惁鏈夊弬鏁帮細琛ㄧず褰撳墠閬ユ祴鍖呮槸鍚︽湁鍙傛暟鍒楄〃锛岄仴娴嬪寘鐨勫弬鏁拌〃绱ф帴鐫�閬ユ祴鍖呯珷鑺傛爣棰橈紝濡傛灉绔犺妭鏍囬鍚庨潰鐪佺暐浜嗘垨鑰呯被浼尖�濊瑙亁xx鈥滃垯鏄病鏈夊弬鏁拌〃銆�
 #绾︽潫
 - name锛氬悕绉颁腑涓嶈鍖呭惈浠e彿锛屼粎浠庢枃妗d腑鎻愬彇婧愬寘鍚嶇О锛�
-- hasParams锛氬�间负甯冨皵鍊硷紝true鎴杅alse锛�
 - 濡傛灉娌℃湁浠e彿锛屼娇鐢ㄩ仴娴嬪寘鍚嶇О鐨勮嫳鏂囩炕璇戜唬鏇匡紱
 - 濡傛灉娌℃湁鍚嶇О鐢ㄤ唬鍙蜂唬鏇匡紱
 - 涓嶈婕忔帀浠讳綍閬ユ祴鍖咃紱
@@ -899,13 +885,12 @@
     {
         "name": "鏁扮鏁板瓧閲忓揩閫熸簮鍖�",
         "id": "PMS001",
-        "hasParams": true
     }
 ]
 """
         print(f'閬ユ祴婧愬寘鍒楄〃锛�')
-        files = [file_map['閬ユ祴婧愬寘璁捐鎶ュ憡']]
-        text = self.generate_text_json(_msg, 'out/婧愬寘鍒楄〃.json', [], files)
+        doc_text = self.get_text_with_entity(['婧愬寘鍒楄〃'])
+        text = self.generate_text_json(_msg, 'out/婧愬寘鍒楄〃.json', doc_text=doc_text)
         pkt = json.loads(text)
         return pkt
 
@@ -914,11 +899,10 @@
 #瑙掕壊
 浣犳槸涓�鍚嶈祫娣辫蒋浠跺伐绋嬪笀銆�
 #鎸囦护
-鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬫簮鍖呬俊鎭紝浣犺甯姪鎴戝畬鎴愰仴娴嬫簮鍖呬俊鎭殑鎻愬彇銆�
+鎴戦渶瑕佷粠鏂囨。涓彁鍙栨墍鏈夐仴娴嬫簮鍖呬俊鎭紝浣犺甯姪鎴戝畬鎴愰仴娴嬫簮鍖呬俊鎭殑鎻愬彇銆�
 #闇�姹�
-鏍规嵁鈥濋仴娴嬫簮鍖呬笅浼犳椂鏈哄畾涔夆�滅珷鑺傜殑鍐呭杈撳嚭鍚勪釜閬ユ祴婧愬寘淇℃伅鍒楄〃锛岄《绾х粨鏋勪负鏁扮粍鍏冪礌涓洪仴娴嬫簮鍖咃紝婧愬寘瀛楁鍖呮嫭锛氬寘浠e彿(id)锛屽悕绉�(name)锛屾墍灞炶櫄鎷熶俊閬�(vcs)锛屼笅浼犳椂鏈猴紙timeTags锛夈��
+鏍规嵁鏂囨。鍐呭杈撳嚭閬ユ祴婧愬寘淇℃伅锛岄《绾х粨鏋勪负鏁扮粍锛屽厓绱犱负閬ユ祴婧愬寘锛屾簮鍖呭瓧娈靛寘鎷細鍖呬唬鍙�(id)锛屽悕绉�(name)锛屾墍灞炶櫄鎷熶俊閬�(vcs)锛屼笅浼犳椂鏈猴紙timeTags锛夈��
 #绾︽潫
-- 浠庘�濋仴娴嬫簮鍖呬笅浼犳椂鏈哄畾涔夆�滅珷鑺備腑鎻愬彇閬ユ祴婧愬寘淇℃伅锛�
 - 鎵�灞炶櫄鎷熶俊閬擄細蹇呴』鏄枃妗d腑鎻忚堪鐨勯仴娴嬭櫄鎷熶俊閬撲唬鍙凤紙搴忓彿锛夛紱
 - 涓嬩紶鏃舵満锛氫笌琛ㄦ牸涓畾涔夌殑涓�鑷达紱
 - 涓嶈閬楁紡浠讳綍閬ユ祴婧愬寘銆�
@@ -932,14 +916,14 @@
   },
 ]
         """
-        files = [file_map['閬ユ祴澶х翰']]
         print('閬ユ祴婧愬寘鎵�灞炶櫄鎷熶俊閬擄細')
 
         def validation(gen_text):
             pkts = json.loads(gen_text)
             assert len(pkts), 'VC婧愬寘鍒楄〃涓嶈兘涓虹┖'
 
-        text = self.generate_text_json(_msg, 'out/閬ユ祴VC婧愬寘.json', files=files, validation=validation)
+        doc_text = self.get_text_with_entity(['铏氭嫙淇¢亾瀹氫箟', '閬ユ祴婧愬寘涓嬩紶鏃舵満'])
+        text = self.generate_text_json(_msg, 'out/閬ユ祴VC婧愬寘.json', doc_text=doc_text, validation=validation)
         pkt_vcs = json.loads(text)
         return pkt_vcs
 
@@ -1044,7 +1028,8 @@
         def validation(gen_text):
             json.loads(gen_text)
 
-        text = self.generate_text_json(_msg, 'out/鎬荤嚎.json', files=[file_map['鎬荤嚎浼犺緭閫氫俊甯у垎閰�']],
+        doc_text = self.get_text_with_entity(['RT鍦板潃鍒嗛厤', '鍒嗙郴缁熸簮鍖�'])
+        text = self.generate_text_json(_msg, 'out/鎬荤嚎.json', doc_text=doc_text,
                                        validation=validation)
         pkts = json.loads(text)
         # 绛涢�夌粡鎬荤嚎鐨勬暟鎹寘
@@ -1053,11 +1038,7 @@
         # 绛涢�夋湁apid鐨勬暟鎹寘
         pkts = list(filter(lambda it: it['apid'], pkts))
 
-        pkts2 = []
         for pkt in pkts:
-            if self.pkt_in_tm_pkts(pkt["name"]):
-                pkts2.append(pkt)
-        for pkt in pkts2:
             _pkt = self.gen_pkt_details(pkt['name'], pkt['id'])
             if _pkt:
                 pkt['children'] = []
@@ -1148,18 +1129,18 @@
         # 閬ユ帶鍖呮牸寮�
         pkt_format = self.gen_tc_pkt_format()
         # 閬ユ帶鍖呭垪琛�
-        pkts = self.gen_tc_transfer_pkts()
-        for pkt in pkts:
-            # 閬ユ帶鍖呮暟鎹尯鍐呭
-            self.gen_tc_pkt_details(pkt)
-            pkt['type'] = 'insUnit'
+        instructions = self.gen_tc_transfer_pkts()
+        for inst in instructions:
+            # 閬ユ帶鎸囦护鏁版嵁鍖哄唴瀹�
+            self.gen_tc_pkt_details(inst)
+            inst['type'] = 'insUnit'
             format_text = json.dumps(pkt_format, ensure_ascii=False)
-            format_text = utils.replace_tpl_paras(format_text, pkt)
+            format_text = utils.replace_tpl_paras(format_text, inst)
             pf = json.loads(format_text)
-            pf['name'] = pkt['name']
-            pf['code'] = pkt['code']
+            pf['name'] = inst['name']
+            pf['code'] = inst['code']
             data_area = next(filter(lambda x: x['name'] == '搴旂敤鏁版嵁鍖�', pf['children']))
-            data_area['children'].append(pkt)
+            data_area['children'].append(inst)
             frame['subPkts'].append(pf)
         self.order = 0
 
@@ -1173,7 +1154,7 @@
             elif item['type'] == 'length':
                 return None
             elif item['type'] == 'checkSum':
-                return json.dumps({"ChecksumType": "CRC-CCITT"})
+                return json.dumps({"ChecksumType": item['value']['type']})
             elif item['type'] == 'subPkt':
                 return json.dumps({"CanInput": False})
             elif item['type'] in ['combPkt', 'insUnitList', 'input']:
@@ -1182,26 +1163,10 @@
                 return '{"MinLength":null,"MaxLength":null,"IsSubPackage":false,"InputParams":[],"OutPutParams":[],"MatchItems":[]}'
             elif item['type'] == 'pkt':
                 return '''{"MaxLength":1024,"IsSplit8":false,"Split8Start":null,"Split8End":null,"PadCode":null,"Alignment":null,"InputParams":[],"OutPutParams":[],"MatchItems":[]}'''
+            elif item['type'] == 'pktSeqCnt':
+                return json.dumps({"FirstPackValue":"PackCount","MiddlePackValue":"PackIndex","LastPackValue":"PackIndex","IndependPackValue":"InsUnitCount"})
             elif 'value' in item:
                 return item['value']
-
-        def make_attr(ty: str):
-            """
-            鑾峰彇瀛楁瀹氫箟鐨凙TTR銆�
-
-            浣嶆帺鐮侊紝鐢ㄤ簬鏍囪瘑鑺傜偣绫诲瀷銆�
-            绫诲瀷锛�0~2 BinaryType;
-                3~5 DataType;
-                6~8: InputFormat;
-                9 : IsSubPackage;
-                10: IsSendFlag锛�
-                11~13: ProcessMethod锛�
-                14~16: ExpressionType锛�
-                17~19: EnumType
-
-            :param ty:
-            :return:
-            """
 
         def create_tc_format(parent_pk, field, parent_parent_pk=None):
             """
@@ -1229,11 +1194,20 @@
             if 'length' in field:
                 field['bitWidth'] = field['length']
             field['bitOrder'] = None
-            field['attr'] = 0
+            field['attr'] = make_attr(field)
             if field['type'] == 'length' and 'value' in field and field['value']:
                 val = field['value']
                 field['range'] = val['start'] + "~" + val['end']
                 field['formula'] = val['formula']
+            # 鍗虫椂杈撳叆闀垮害涓簄ull鍒欐槸鍙橀暱瀛楁锛岄渶瑕佹妸绫诲瀷鏀逛负variableLength
+            if field['type'] == 'input' and field['length'] is None:
+                field['type'] = 'variableLength'
+            # 鏋氫妇鍊奸粯璁ゅ�艰缃�
+            if field['type'] == 'enum' and len(field['enums']) and not next(filter(lambda x: 'default' in x and x['default'], field['enums']), None):
+                field['enums'][0]['default'] = True
+            # 鏍¢獙鍜�
+            if field['type'] == 'checkSum':
+                field['range'] = f'{field["value"]["start"]}~{field["value"]["end"]}'
             ins_format = create_ins_format(self.proj.C_PROJECT_PK, parent_pk, field)
             ins_format_pk = ins_format.C_INS_FORMAT_PK
             if 'children' in field:
@@ -1272,11 +1246,12 @@
 - 閫氳繃鏍囧織锛歝onst锛屼簩杩涘埗锛屼互B缁撳熬锛�
 - 鎺у埗鍛戒护鏍囧織锛歝onst锛屼簩杩涘埗锛屼互B缁撳熬锛�
 - 绌洪棽浣嶏細const锛屼簩杩涘埗锛屼互B缁撳熬锛�
-- 鑸ぉ鍣ㄦ爣璇嗭細const锛屽崄鍏繘鍒讹紝浠�0x寮�澶达紱
+- 鑸ぉ鍣ㄦ爣璇嗭細const锛屽崄鍏繘鍒讹紝浠�0x寮�澶达紝濡傛灉鏄簩杩涘埗鎴栧崄杩涘埗闇�瑕佽浆鎹负鍗佸叚杩涘埗锛�
 - 铏氭嫙淇¢亾鏍囪瘑锛歴endFlag锛屽彂閫佹爣璁帮紝榛樿涓衡�滀换鍔℃敞鍏ュ抚鈥濓紝鎵�鏈夌殑鍊奸兘瑕佸垪涓惧嚭鏉ワ紱
 # 鏁版嵁绫诲瀷
 - const锛氬浐瀹氱爜瀛楋紝鏁板�硷紝浜岃繘鍒朵互B缁撳熬锛屽崄杩涘埗锛屽崄鍏繘鍒朵互0x寮�澶达紱
 - sendFlag锛氬彂閫佹爣璁帮紝绫讳技鏋氫妇锛屽畾涔夋牱渚嬶細[{"n":"name","v":"value","c":"code","default":true}]锛宯琛ㄧず鍚嶇О锛寁琛ㄧず鍊硷紝c琛ㄧずcode锛堟病鏈夌┖鐫�锛夛紝default琛ㄧず鏄粯璁ゅ�硷紱
+- checkSum锛氭牎楠屽拰锛屽鏋滄槸鏍¢獙鍜岀被鍨嬭繕闇�瑕佸垎鏋愭牎楠屽拰鐨勭畻娉曪紝骞朵繚瀛樺湪value涓紝鏍¢獙鍜岀畻娉曞寘鎷細瀛楄妭寮傛垨锛圔yteXOR锛夈�佺疮鍔犲拰鍙栧弽锛圫umNot锛夈�佺疮鍔犲拰锛圓ddSum锛夈�佸簲鐢ㄥ惊鐜啑浣欙紙CRC-CCITT锛夈�丆RC8锛圕RC8锛夈�両SO鍜屾牎楠岋紙ISOSum锛夈�佸鏍¢獙锛圤dd锛夈�佸伓鏍¢獙锛圗ven锛夈�佸叾浠栵紙Other锛�
 # 绾︽潫
 - 浠SON鏍煎紡杈撳嚭锛�
 - 浠呰緭鍑篔SON鏂囨湰锛屼笉瑕佽緭鍑轰换浣曞叾浠栨枃鏈��
@@ -1291,7 +1266,8 @@
         def validation(gen_text):
             json.loads(gen_text)
 
-        text = self.generate_tc_text(_msg, 'out/tc_transfer_frame.json', files=[file_map['鎸囦护鏍煎紡']],
+        doc_text = self.get_text_with_entity(['閬ユ帶甯ф牸寮�'])
+        text = self.generate_tc_text(_msg, 'out/tc_transfer_frame.json', doc_text=doc_text,
                                      validation=validation)
         result: dict = json.loads(text)
         format_text = utils.read_from_file('tpl/tc_transfer_frame.json')
@@ -1317,7 +1293,19 @@
 - 鍛戒护姝g‘搴旂瓟: const锛屼簩杩涘埗锛�
 - 婧愬湴鍧�: const锛屽崄鍏繘鍒躲��
 # 鏁版嵁绫诲瀷
-- const锛氬浐瀹氱爜瀛楋紝鏁板�硷紝浜岃繘鍒朵互B缁撳熬锛屽崄杩涘埗锛屽崄鍏繘鍒朵互0x寮�澶达紱
+- 鍥哄畾鐮佸瓧锛歝onst锛屾暟鍊硷紝浜岃繘鍒朵互B缁撳熬锛屽崄杩涘埗锛屽崄鍏繘鍒朵互0x寮�澶达紱
+- 闀垮害锛歭ength锛屽鏋滃瓧娈垫弿杩板唴瀹逛负鏁版嵁鍖哄煙鐨勯暱搴﹀垯琛ㄧず鏄暱搴︼紝闀垮害鐨剉alue涓烘暟鍊笺�乶ull鎴栬寖鍥村畾涔夛紝
+- 鏋氫妇鍊硷細enum锛�
+- 鏍¢獙鍜岋細checkSum锛屽鏋滄槸鏍¢獙鍜岀被鍨嬭繕闇�瑕佸垎鏋愭牎楠屽拰鐨勭畻娉曪紝骞朵繚瀛樺湪value涓紝鏍¢獙鍜岀畻娉曞寘鎷細瀛楄妭寮傛垨锛圔yteXOR锛夈�佺疮鍔犲拰鍙栧弽锛圫umNot锛夈�佺疮鍔犲拰锛圓ddSum锛夈�佸簲鐢ㄥ惊鐜啑浣欙紙CRC-CCITT锛夈�丆RC8锛圕RC8锛夈�両SO鍜屾牎楠岋紙ISOSum锛夈�佸鏍¢獙锛圤dd锛夈�佸伓鏍¢獙锛圗ven锛夈�佸叾浠栵紙Other锛�
+- 鍗虫椂杈撳叆锛歩nput銆�
+# 闀垮害绫诲瀷鐨勮寖鍥村畾涔夋弿杩�
+{"start": "璧峰瀛楁code", "end": "缁撴潫瀛楁code", "formula": "璁$畻鍏紡"}
+- start锛氳捣濮嬪瓧娈礳ode锛岄暱搴﹀寘鎷捣濮嬪瓧娈碉紝瀛楁鎻忚堪涓鏄庝簡璧峰瀛楁锛�
+- end锛氱粨鏉熷瓧娈礳ode锛岄暱搴﹀寘鎷粨鏉熷瓧娈碉紝瀛楁鎻忚堪涓鏄庝簡缁撴潫瀛楁锛�
+- formula锛氳绠楀叕寮忥紝濡傛灉娌℃湁璁$畻鐩稿叧鎻忚堪鍒欒〃绀轰笉闇�瑕佽绠楀叕寮忋��
+璁$畻鍏紡瀹氫箟锛�
+- BYTES锛氭寜瀛楄妭璁$畻锛�
+- N-x锛氭�诲瓧鑺傛暟鍑弜锛屼緥濡傛�诲瓧鑺傛暟鍑�1鐨勫叕寮忎负N-1銆�
 # 绾︽潫
 - 浠SON鏍煎紡杈撳嚭锛�
 - 浠呰緭鍑篔SON鏂囨湰锛屼笉瑕佽緭鍑轰换浣曞叾浠栨枃鏈��
@@ -1332,7 +1320,8 @@
         def validation(gen_text):
             json.loads(gen_text)
 
-        text = self.generate_tc_text(_msg, 'out/tc_transfer_pkt.json', files=[file_map['鎸囦护鏍煎紡']],
+        doc_text = self.get_text_with_entity(['閬ユ帶鍖呮牸寮�'])
+        text = self.generate_tc_text(_msg, 'out/tc_transfer_pkt.json', doc_text=doc_text,
                                      validation=validation)
         result = json.loads(text)
 
@@ -1346,21 +1335,27 @@
 # 瑙掕壊
 浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛��
 # 鎸囦护
-鍒嗘瀽鏂囨。鍒楀嚭鎵�鏈夌殑閬ユ帶婧愬寘銆�
+鍒嗘瀽鏂囨。鍒楀嚭鎵�鏈夌殑閬ユ帶鎸囦护銆�
+#  绾︽潫
+- 搴旂敤杩囩▼鏍囪瘑锛氬簲鐢ㄨ繃绋嬫爣璇嗗氨鏄疉PID锛屼竴鑸細鍦ㄥ悕绉板悗鐨勬嫭鍙蜂腑鍒楀嚭鏉ワ紱
+- code锛氭寚浠や唬鍙凤紝娌℃湁灏辩┖鐫�锛�
+- 搴旂敤鏁版嵁鍖猴細鎻愬彇琛ㄦ牸涓殑搴旂敤鏁版嵁鍖哄唴瀹广��
 # 杈撳嚭渚嬪瓙锛�
 [{
 "name": "xxx",
 "code":"pkt",
 "搴旂敤杩囩▼鏍囪瘑绗�":"0xAA",
 "鏈嶅姟绫诲瀷":"0x1",
-"鏈嶅姟瀛愮被鍨�":"0x2"
+"鏈嶅姟瀛愮被鍨�":"0x2",
+"搴旂敤鏁版嵁鍖�": ""
 }]
 '''
 
         def validation(gen_text):
             json.loads(gen_text)
 
-        text = self.generate_tc_text(_msg, 'out/tc_transfer_pkts.json', files=[file_map['鎸囦护鏍煎紡']],
+        doc_text = self.get_text_with_entity(['APID鍒嗛厤'])
+        text = self.generate_tc_text(_msg, 'out/tc_transfer_pkts.json', doc_text=doc_text,
                                      validation=validation)
         pkts = json.loads(text)
         return pkts
@@ -1376,28 +1371,43 @@
 
 # 鎸囦护
 鍒嗘瀽鏂囨。锛屼粠鏂囨。涓彁鍙栭仴鎺ф寚浠ゅ悕绉颁负鈥渰tc_name}鈥濅唬鍙蜂负鈥渰tc_code}鈥濈殑鎸囦护搴旂敤鏁版嵁鍖哄畾涔夈��
+
+鏈変簺鏂囨。鍐呭闈炲父绠�鍗曚粎浠呭寘鍚壒瀹氬瓧鑺傜殑鍐呭鎻忚堪锛屽鏋滄槸杩欑鏂囨。锛屽垯姣忎釜鐗瑰畾瀛楄妭鐨勫唴瀹规弿杩板畾涔変负涓�涓瓧娈碉紝瀛楁绫诲瀷鏍规嵁瀛楄妭鍐呭纭畾銆�
 """ + """
-# 绾︽潫
-- code 濡傛灉娌℃湁鏄庣‘瀹氫箟鍒欎娇鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧锛屽敖閲忕畝鐭紱
-- length 鑷姩杞崲涓篵it闀垮害锛屽繀椤绘槸鏁板�兼垨null锛屼笉鑳戒负0锛�
-- value 鏍规嵁瀛楁鎻忚堪鎻愬彇锛�
-- enums 鏈変簺瀛楁鏄灇涓惧�硷紝鏍规嵁瀛楁鎻忚堪鎻愬彇锛屾灇涓惧厓绱犵殑鏁版嵁缁撴瀯涓簕"n":"","v":"","c":""}锛�
-- 杈撳嚭鍐呭蹇呴』涓轰弗鏍肩殑json锛屼笉鑳借緭鍑洪櫎json浠ュ鐨勪换浣曞唴瀹广��
 
 # 瀛楁绫诲瀷
-- 鍥哄畾鐮佸瓧锛歝onst锛�
-- 闀垮害锛歭ength锛�
+- 鍥哄畾鐮佸瓧锛歝onst锛屾暟鍊硷紝浜岃繘鍒朵互B缁撳熬锛屽崄杩涘埗锛屽崄鍏繘鍒朵互0x寮�澶达紱
+- 闀垮害锛歭ength锛屽鏋滃瓧娈垫弿杩板唴瀹逛负鏁版嵁鍖哄煙鐨勯暱搴﹀垯琛ㄧず鏄暱搴︼紝闀垮害鐨剉alue涓烘暟鍊笺�乶ull鎴栬寖鍥村畾涔夛紝
 - 鏋氫妇鍊硷細enum锛�
-- 鏍¢獙鍜岋細checkSum锛�
-- 鍗虫椂杈撳叆锛歩nput銆�
+- 鏍¢獙鍜岋細checkSum锛屽鏋滄槸鏍¢獙鍜岀被鍨嬭繕闇�瑕佸垎鏋愭牎楠屽拰鐨勭畻娉曟槸浠�涔堬紝骞朵繚瀛樺湪value涓紝
+- 鍗虫椂杈撳叆锛歩nput锛屽鏋滄槸鍗虫椂杈撳叆value鐨勫�间负绌哄瓧绗︿覆銆�
+
+# 闀垮害绫诲瀷鐨勮寖鍥村畾涔夋弿杩�
+{"start": "璧峰瀛楁code", "end": "缁撴潫瀛楁code", "formula": "璁$畻鍏紡"}
+- start锛氳捣濮嬪瓧娈礳ode锛岄暱搴﹀寘鎷捣濮嬪瓧娈碉紝瀛楁鎻忚堪涓鏄庝簡璧峰瀛楁锛�
+- end锛氱粨鏉熷瓧娈礳ode锛岄暱搴﹀寘鎷粨鏉熷瓧娈碉紝瀛楁鎻忚堪涓鏄庝簡缁撴潫瀛楁锛�
+- formula锛氳绠楀叕寮忥紝濡傛灉娌℃湁璁$畻鐩稿叧鎻忚堪鍒欒〃绀轰笉闇�瑕佽绠楀叕寮忋��
+璁$畻鍏紡瀹氫箟锛�
+- BYTES锛氭寜瀛楄妭璁$畻锛�
+- N-x锛氭�诲瓧鑺傛暟鍑弜锛屼緥濡傛�诲瓧鑺傛暟鍑�1鐨勫叕寮忎负N-1銆�
 
 # 瀛楁绫诲瀷鍒嗘瀽鏂规硶
 - 鏍规嵁瀛楁鎻忚堪鍒嗘瀽瀛楁鐨勭被鍨嬶紱
 - 瀛楁鎻忚堪涓槑纭寚瀹氫簡瀛楁鍊肩殑锛岀被鍨嬩负const锛�
-- 瀛楁涓病鏈夋槑纭寚瀹氬瓧娈靛�硷紝浣嗘槸缃楀垪浜嗗彇鍊艰寖鍥寸殑锛岀被鍨嬩负enum锛�
+- 瀛楁鎻忚堪涓病鏈夋槑纭寚瀹氬瓧娈靛�硷紝浣嗘槸缃楀垪浜嗗彇鍊艰寖鍥寸殑锛岀被鍨嬩负enum锛�
+- 瀛楁鎻忚堪涓鏋滄病鏈夋槑纭寚瀹氬瓧娈靛�间篃娌℃湁缃楀垪鍙栧�艰寖鍥寸殑锛岀被鍨嬩负input锛�
 - 瀛楁濡傛灉鏄拰鈥滈暱搴︹�濇湁鍏筹紝绫诲瀷涓簂ength锛�
 - 濡傛灉鍜屾暟鎹煙鏈夊叧锛岀被鍨嬩负const锛�
-- 瀛楁濡傛灉鍜屾牎楠屽拰鏈夊叧锛岀被鍨嬩负checkSum銆�
+- 瀛楁濡傛灉鍜屾牎楠屽拰鏈夊叧锛岀被鍨嬩负checkSum锛屽垎鏋愭牎楠屽拰鐨勭畻娉曪紝骞朵繚瀛樺湪value涓紝鏍¢獙鍜岀畻娉曞寘鎷細瀛楄妭寮傛垨锛圔yteXOR锛夈�佺疮鍔犲拰鍙栧弽锛圫umNot锛夈�佺疮鍔犲拰锛圓ddSum锛夈�佸簲鐢ㄥ惊鐜啑浣欙紙CRC-CCITT锛夈�丆RC8锛圕RC8锛夈�両SO鍜屾牎楠岋紙ISOSum锛夈�佸鏍¢獙锛圤dd锛夈�佸伓鏍¢獙锛圗ven锛夈�佸叾浠栵紙Other锛夈��
+
+# 绾︽潫
+- code 濡傛灉娌℃湁鏄庣‘瀹氫箟鍒欎娇鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧锛屽敖閲忕畝鐭紱
+- length 鑷姩杞崲涓篵it闀垮害锛屽繀椤绘槸鏁板�笺�乶ull鎴栬寖鍥村畾涔夛紝涓嶈兘涓�0锛�
+- value 鏍规嵁瀛楁鎻忚堪鎻愬彇瀛楁鍊硷紝瀛楁鍊间竴鑸负鏁板�肩被鍨嬶紝闇�瑕佹牴鎹瓧娈电被鍨嬫潵鍒嗘瀽锛屽鏋滄槸length绫诲瀷value鐨勫�间负鑼冨洿瀹氫箟锛�
+- enums 鏋氫妇绫诲瀷鐨勫瓧娈靛繀椤昏鏈塭nums锛屾牴鎹瓧娈垫弿杩版彁鍙栵紝鏋氫妇鍏冪礌鐨勬暟鎹粨鏋勪负{"n":"","v":"","c":""}锛�
+- length绫诲瀷鐨勮寖鍥村畾涔変腑鐨剆tart鍜宔nd蹇呴』鏄敓鎴愮粨鏋滀腑鐨勫瓧娈礳ode锛�
+- 杈撳嚭鏁版嵁缁撴瀯涓烘暟缁勶紝鏁扮粍鍏冪礌涓哄瓧娈典俊鎭紱
+- 杈撳嚭鍐呭蹇呴』涓轰弗鏍肩殑json锛屼笉鑳借緭鍑洪櫎json浠ュ鐨勪换浣曞唴瀹广��
 
 # 杈撳嚭渚嬪瓙锛�
 [
@@ -1407,16 +1417,53 @@
         "length": 8,
         "type": "const",
         "value": "0xAA"
+    },
+    {
+        "name": "para2",
+        "code": "para2",
+        "length": 8,
+        "type": "length",
+        "value": {"start": "para1", "end": "data", "formula": "BYTES"}
+    },
+    {
+        "name": "鏁版嵁",
+        "code": "data",
+        "length": null,
+        "type": "input",
+        "value": ""
     }
-    ...
 ]
 """
 
         def validation(gen_text):
-            json.loads(gen_text)
+            fields = json.loads(gen_text)
+            for field in fields:
+                if field['type'] == 'length':
+                    if field['value'] is None:
+                        raise Exception('length绫诲瀷鐨剉alue涓嶈兘涓虹┖')
+                    if 'start' not in field['value'] or 'end' not in field['value']:
+                        raise Exception('length绫诲瀷鐨剉alue蹇呴』鍖呭惈start鍜宔nd')
+                    if field['value']['start'] not in [f['code'] for f in fields]:
+                        raise Exception('length绫诲瀷鐨剉alue鐨剆tart瀛楁蹇呴』鍦╢ields涓�')
+                    if field['value']['end'] not in [f['code'] for f in fields]:
+                        raise Exception('length绫诲瀷鐨剉alue鐨別nd瀛楁蹇呴』鍦╢ields涓�')
+                elif field['type'] == 'enum':
+                    if 'enums' not in field:
+                        raise Exception('enum绫诲瀷鐨刦ield蹇呴』鍖呭惈enums')
+                    if len(field['enums']) == 0:
+                        raise Exception('enum绫诲瀷鐨刦ield鐨別nums涓嶈兘涓虹┖')
+                    for enum in field['enums']:
+                        if 'n' not in enum or 'v' not in enum:
+                            raise Exception('enum绫诲瀷鐨刦ield鐨別nums鐨勫厓绱犲繀椤诲寘鍚玭銆乿銆乧')
+                        if enum['n'] == '' or enum['v'] == '':
+                            raise Exception('enum绫诲瀷鐨刦ield鐨別nums鐨勫厓绱犱笉鑳戒负绌�')
 
-        text = self.generate_tc_text(_msg, f'out/閬ユ帶鎸囦护鏁版嵁鍩�-{tc_code}-{utils.to_file_name(tc_name)}.json',
-                                     files=[file_map['鎸囦护鏍煎紡']],
+        doc_text = self.get_text_with_entity([tc_name])
+        if doc_text == '':
+            doc_text = pkt['搴旂敤鏁版嵁鍖�']
+        text = self.generate_tc_text(_msg,
+                                     f'out/閬ユ帶鎸囦护鏁版嵁鍩�-{tc_code}-{utils.to_file_name(tc_name)}.json',
+                                     doc_text=doc_text,
                                      validation=validation)
         result = json.loads(text)
         pkt['children'] = result

--
Gitblit v1.9.1