From 37c40c84aa27ff68f6dc7325fb45c9a8c7b70fe8 Mon Sep 17 00:00:00 2001
From: lyg <1543117173@qq.com>
Date: 星期三, 14 五月 2025 14:21:40 +0800
Subject: [PATCH] 修改大模型生成json逻辑

---
 knowledgebase/gen_base_db/json_generate.py |  474 ++++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 306 insertions(+), 168 deletions(-)

diff --git a/knowledgebase/gen_base_db/json_generate.py b/knowledgebase/gen_base_db/json_generate.py
index 52084bb..ab7076a 100644
--- a/knowledgebase/gen_base_db/json_generate.py
+++ b/knowledgebase/gen_base_db/json_generate.py
@@ -9,15 +9,32 @@
 import time
 import json
 
+import data_templates
+from knowledgebase.db.doc_db_helper import doc_dbh
 from knowledgebase.llm import llm
 from knowledgebase import utils
 
 from langchain_core.prompts import ChatPromptTemplate
-from langchain_core.messages import HumanMessage,SystemMessage
+from langchain_core.messages import HumanMessage, SystemMessage
+import textwrap
+
+from knowledgebase.log import Log
 
 USE_CACHE = True
 
+
 class JsonGenerate:
+    project: dict
+    devs: list[dict]
+    cadu: dict
+    vcs: list[dict]
+    tm_pkts: list[dict]
+    vc_pkts: list[dict]
+    bus_pkts: list[dict]
+    tc_frame: dict
+    tc_pkt_format: dict
+    tc_pkts: dict
+
     def __init__(self):
         self.llm = llm
         self.systemPrompt = """
@@ -68,9 +85,18 @@
             - 鎵�杈撳嚭鐨勫唴瀹瑰繀椤绘寜鐓SON鏍煎紡杩涜缁勭粐锛屼笉鑳藉亸绂绘鏋惰姹傦紝涓斾弗鏍奸伒寰枃妗e唴瀹硅繘琛岃緭鍑猴紝鍙緭鍑� JSON 锛屼笉瑕佽緭鍑哄叾瀹冩枃瀛椼��
             - 涓嶈緭鍑轰换浣曟敞閲婄瓑鎻忚堪鎬т俊鎭��
         """
-        
+
     # 妯″瀷璋冪敤
-    def call_model(self, msg, cache_file, doc, validation=None, try_cnt=3):
+    def call_model(self, msg: str, cache_file: str, doc: str, validation=None, try_cnt=3) -> str:
+        """
+        璋冪敤澶фā鍨�
+        :param msg: 闂
+        :param cache_file: 鐢熸垚缁撴灉缂撳瓨鏂囦欢
+        :param doc: 鏂囨。鏂囨湰
+        :param validation: 鏍¢獙鍑芥暟锛�(text: str)-> None
+        :param try_cnt: 澶辫触閲嶈瘯娆℃暟
+        :return: 鐢熸垚鐨勬枃鏈�
+        """
         if USE_CACHE and os.path.isfile(cache_file):
             with open(cache_file, 'r', encoding='utf-8') as f:
                 text = f.read()
@@ -81,44 +107,55 @@
                 messages.append(HumanMessage(info))
             prompt = ChatPromptTemplate.from_messages(messages)
             chain = prompt | self.llm
+            # 鍘婚櫎澶氫綑鐨勭缉杩�
+            msg = textwrap.dedent(msg).strip()
             resp = chain.invoke({"msg": msg})
             text = resp.content
             if validation:
                 try:
                     validation(text)
                 except BaseException as e:
-                    print(e)
+                    Log.error(e)
                     if try_cnt <= 0:
                         raise RuntimeError('鐢熸垚澶辫触锛岄噸璇曟鏁板お澶氾紝寮哄埗缁撴潫锛�')
                     return self.call_model(msg, cache_file, validation, try_cnt - 1)
             if cache_file:
                 with open(cache_file, 'w', encoding='utf-8') as f:
                     f.write(text)
-            print(f'鑰楁椂锛歿time.time() - s}')
+            Log.info(f'鑰楁椂锛歿time.time() - s}')
         return text
 
-    # :param type: int - None 鍏ㄩ儴銆�1 閬ユ祴銆�2 閬ユ帶
-    def run(self,type):
+    @staticmethod
+    def get_text_with_entity(entity_names: list[str]) -> str:
+        """
+        鏍规嵁瀹炰綋璇嶈幏鍙栨枃妗f枃鏈�
+        :param entity_names: str - 瀹炰綋璇嶅悕绉�
+        :return: str - 鏂囨湰鍐呭
+        """
+        return doc_dbh.get_text_with_entities(entity_names)
+
+    def run(self):
         # 鏍规嵁鏂囨。锛岀敓鎴愮粨鏋勫寲鏁版嵁
-        if type is not None:
-            if type == 1:
-                self.handle_yc_structured_data()
-            if type == 2:
-                self.handle_yk_structured_data()
-        else:
-            self.handle_yc_structured_data()
-            self.handle_yk_structured_data()
-    
-    # 閬ユ祴-start
-    def handle_yc_structured_data(self):
+        self.handle_tm_structured_data()
+        self.handle_tc_structured_data()
+
+    # region start 閬ユ祴
+    def handle_tm_structured_data(self):
         self.gen_project()
         self.gen_device()
 
     # 鑾峰彇椤圭洰淇℃伅
     def gen_project(self):
-        _msg = '鏍规嵁鏂囨。杈撳嚭鍨嬪彿淇℃伅锛屽瀷鍙峰瓧娈靛寘鎷細鍚嶇О鍜屼唬鍙枫�備粎杈撳嚭鍨嬪彿杩欎竴绾с�備緥濡傦細{"name":"xxx","id":"xxx"}'
-        result = self.call_model(_msg, 'out/鍨嬪彿淇℃伅.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'])
-        print('鍨嬪彿淇℃伅锛�' + result)
+        _msg = """
+        # 鎸囦护
+        鏍规嵁鏂囨。鍐呭鍒嗘瀽鍨嬪彿淇℃伅锛屽瀷鍙峰瓧娈靛寘鎷細鍚嶇О鍜屼唬鍙枫��
+        # 渚嬪瓙
+        {"name":"xxx","id":"xxx"}
+        """
+        doc_text = self.get_text_with_entity(['绯荤粺姒傝堪'])
+        text = self.call_model(_msg, 'out/鍨嬪彿淇℃伅.json', doc_text)
+        self.project = json.loads(text)
+        Log.info('鍨嬪彿淇℃伅锛�' + self.project)
 
     # 鑾峰彇璁惧淇℃伅
     def gen_device(self):
@@ -155,39 +192,100 @@
                 }
             ]
         """
-        result = self.call_model(_msg, 'out/璁惧鍒楄〃.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'])
-        print('璁惧鍒楄〃锛�' + result)
+        doc_text = self.get_text_with_entity(['绯荤粺姒傝堪', '鎬荤嚎绠$悊'])
+        text = self.call_model(_msg, 'out/璁惧鍒楄〃.json', doc_text)
+        Log.info('璁惧鍒楄〃锛�' + text)
 
-        devs = json.loads(result)
+        self.devs = json.loads(text)
         # 绫籗MU璁惧锛屽寘鍚仴娴嬪拰閬ユ帶鍔熻兘锛屽悕绉扮粨灏句负鈥滅鐞嗗崟鍏冣��
-        like_smu_devs = list(filter(lambda it: it['hasTcTm'] and it['name'].endswith('绠$悊鍗曞厓'), devs))
+        like_smu_devs = list(filter(lambda it: it['hasTcTm'] and it['name'].endswith('绠$悊鍗曞厓'), self.devs))
         for dev in like_smu_devs:
             self.gen_tm_frame(dev)
         # 鎬荤嚎
-        self.gen_bus()
+        hasBus = any(d['hasBus'] for d in self.devs)
+        if hasBus:
+            self.gen_bus()
 
-    def gen_tm_frame(self,dev):
+    def gen_tm_frame(self, dev):
         # 鎻掑叆鍩熷弬鏁板垪琛�
-        self.gen_insert_domain_params(dev)
+        insert_domain = self.gen_insert_domain_params(dev)
+        # VC婧愬寘鏍煎紡
+        vc_pkt_fields = data_templates.vc_pkt_fields
         # 鑾峰彇铏氭嫙淇¢亾 vc
-        vcs = self.gen_vc(dev)
+        self.vcs = self.gen_vc(dev)
+        for vc in self.vcs:
+            vc['children'] = []
+            vc['VCID'] = str(int(vc['VCID'], 2))
+            for field in vc_pkt_fields:
+                if field['name'] == '鏁版嵁鍩�':
+                    field['children'] = []
+                vc['children'].append(dict(field))
+
+        def build_vcid_content(vcs):
+            _vcs = []
+            for _vc in vcs:
+                _vcs.append(_vc['name'] + ',' + _vc['VCID'])
+            return ' '.join(_vcs)
+
+        # VCID 瀛楁鍐呭
+        vcid_content = build_vcid_content(self.vcs)
+        # 閬ユ祴甯х粨鏋勭敱妯℃澘鐢熸垚锛屽彧闇�鎻愪緵鐗瑰畾鍙傛暟
+        tm_data = {
+            "vcidContent": vcid_content,
+            'insertDomain': insert_domain,
+        }
+        self.cadu = data_templates.get_tm_frame(tm_data)
+
         # 鑾峰彇vc婧愬寘
-        vc_pkts = self.gen_pkt_vc(dev)
+        self.vc_pkts = self.gen_pkt_vc(dev)
         # 鑾峰彇婧愬寘鍒楄〃
-        tm_pkts = self.gen_pkts(dev)
+        self.tm_pkts = self.gen_pkts(dev)
 
         # 鑾峰彇VC涓嬮潰鐨勯仴娴嬪寘鏁版嵁
-        for vc in vcs:
+        for vc in self.vcs:
             # 姝C涓嬬殑閬ユ祴鍖呰繃婊�
-            _vc_pkts = filter(lambda it: it['vcs'].__contains__(vc['id']), vc_pkts)
+            _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'], tm_pkts), None):
+                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)}/"
+        # 閲嶆柊璁℃暟璧峰鍋忕Щ
+        self.compute_length_pos(self.cadu['children'])
 
-    def gen_insert_domain_params(self,dev):
+    def compute_length_pos(self, items: list):
+        length = 0
+        pos = 0
+        for child in items:
+            if 'children' in child:
+                self.compute_length_pos(child['children'])
+            child['pos'] = pos
+            if 'length' in child and isinstance(child['length'], int):
+                length = length + child['length']
+                pos = pos + child['length']
+        # node['length'] = length
+
+    def gen_insert_domain_params(self, dev):
         _msg = """
             # 鎸囦护
             鎴戦渶瑕佷粠鏂囨。涓彁鍙栨彃鍏ュ煙鐨勫弬鏁板垪琛紝浣犺甯姪鎴戝畬鎴愭彃鍏ュ煙鍙傛暟鍒楄〃鐨勬彁鍙栥��
@@ -203,23 +301,28 @@
             - 浠呰緭鍑篔SON鏂囨湰銆�
             # 渚嬪瓙
             [
-            {
-                "name": "閬ユ祴妯″紡瀛�",
-                "id": "TMS215",
-                "pos": 0,
-                "length": 8,
-                "type": "para"
-            }
+                {
+                    "name": "閬ユ祴妯″紡瀛�",
+                    "id": "TMS215",
+                    "pos": 0,
+                    "length": 8,
+                    "type": "para"
+                }
             ]
         """
+
         def validation(gen_text):
             params = json.loads(gen_text)
             assert isinstance(params, list), '鎻掑叆鍩熷弬鏁板垪琛ㄦ暟鎹粨鏋勬渶澶栧眰蹇呴』鏄暟缁�'
             assert len(params), '鎻掑叆鍩熷弬鏁板垪琛ㄤ笉鑳戒负绌�'
-        result = self.call_model(_msg, 'out/'+dev.code+'_鎻掑叆鍩熷弬鏁板垪琛�.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'], validation)
-        print('鎻掑叆鍩熷弬鏁板垪琛細' + result)
-    
-    def gen_vc(self,dev):
+
+        doc_text = self.get_text_with_entity(['鎻掑叆鍩�'])
+        result = self.call_model(_msg, 'out/' + dev.code + '_鎻掑叆鍩熷弬鏁板垪琛�.json', doc_text,
+                                 validation)
+        Log.info('鎻掑叆鍩熷弬鏁板垪琛細' + result)
+        return json.loads(result)
+
+    def gen_vc(self, dev):
         _msg = """
             # 鎸囦护
             鎴戦渶瑕佷粠鏂囨。涓彁鍙栬櫄鎷熶俊閬撳垪琛紝浣犺甯姪鎴戝畬鎴愯櫄鎷熶俊閬撳垪琛ㄧ殑鎻愬彇銆�
@@ -246,11 +349,12 @@
         def validation(gen_text):
             vcs = json.loads(gen_text)
             assert next(filter(lambda it: re.match('^[0-1]+$', it['VCID']), vcs)), '鐢熸垚鐨刅CID蹇呴』鏄簩杩涘埗'
-        result = self.call_model(_msg, 'out/'+dev.code+'_铏氭嫙淇¢亾.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'], validation)
-        print('铏氭嫙淇¢亾锛�' + result)
+        doc_text = self.get_text_with_entity(['铏氭嫙淇¢亾瀹氫箟'])
+        result = self.call_model(_msg, 'out/' + dev.code + '_铏氭嫙淇¢亾.json', doc_text, validation)
+        Log.info('铏氭嫙淇¢亾锛�' + result)
         return json.loads(result)
-        
-    def gen_pkt_vc(self,dev):
+
+    def gen_pkt_vc(self, dev):
         _msg = """
             # 鎸囦护
             鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬫簮鍖呬俊鎭紝浣犺甯姪鎴戝畬鎴愰仴娴嬫簮鍖呬俊鎭殑鎻愬彇銆�
@@ -263,22 +367,24 @@
             - 涓嶈閬楁紡浠讳綍閬ユ祴婧愬寘銆�
             # 渚嬪瓙锛�
             [
-            {
-                "id": "PMS001",
-                "name": "鏁扮鏁板瓧閲忓揩閫熸簮鍖�",
-                "vcs": ["VC1"],
-                "timeTags": ["瀹炴椂"]
-            },
+                {
+                    "id": "PMS001",
+                    "name": "鏁扮鏁板瓧閲忓揩閫熸簮鍖�",
+                    "vcs": ["VC1"],
+                    "timeTags": ["瀹炴椂"]
+                },
             ]
         """
+
         def validation(gen_text):
             pkts = json.loads(gen_text)
             assert len(pkts), 'VC婧愬寘鍒楄〃涓嶈兘涓虹┖'
-        result = self.call_model(_msg, 'out/'+dev.code+'_閬ユ祴VC婧愬寘.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'], validation)
-        print('閬ユ祴婧愬寘鎵�灞炶櫄鎷熶俊閬擄細' + result)
-        return json.loads(result)
 
-    def gen_pkts(self,dev):
+        text = self.call_model(_msg, 'out/' + dev.code + '_閬ユ祴婧愬寘涓嬩紶鏃舵満.json', ['閬ユ祴婧愬寘涓嬩紶鏃舵満'], validation)
+        Log.info('閬ユ祴婧愬寘鎵�灞炶櫄鎷熶俊閬擄細' + text)
+        return json.loads(text)
+
+    def gen_pkts(self, dev):
         _msg = """
             # 鎸囦护
             鎴戦渶瑕佷粠鏂囨。涓彁鍙栭仴娴嬪寘鏁版嵁锛屼綘瑕佹牴鎹枃妗e唴瀹瑰府鎴戝畬鎴愰仴娴嬪寘鏁版嵁鐨勬彁鍙栥��
@@ -304,99 +410,111 @@
                 }
             ]
         """
-        result = self.call_model(_msg, 'out/'+dev.code+'_婧愬寘鍒楄〃.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'])
-        print('閬ユ祴婧愬寘鍒楄〃锛�' + result)
+        result = self.call_model(_msg, 'out/' + dev.code + '_婧愬寘鍒楄〃.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'])
+        Log.info('閬ユ祴婧愬寘鍒楄〃锛�' + result)
         return json.loads(result)
-    
+
     def gen_pkt_details(self, pkt_name, pkt_id):
-        _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.call_model(_msg, '', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'])
-        result = json.loads(text)
-        last_par_pos = result['last_par_pos']
-        par_num = result['par_num']
+        cache_file = f'out/鏁版嵁鍖�-{pkt_name}.json'
+        if not os.path.isfile(cache_file):
+            # 鍏堥棶鏈�鍚庝竴涓弬鏁扮殑瀛楄妭浣嶇疆
+            Log.info(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.call_model(_msg, '', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'])
+            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锛�
-
-            鍖呭ご灞炴�у寘鎷細鍖呯増鏈彿銆佸寘绫诲瀷銆佸壇瀵煎ご鏍囪瘑銆佸簲鐢ㄨ繃绋嬫爣璇嗐�佸簭鍒楁爣璁般�佸寘搴忓垪璁℃暟銆佸寘闀裤�佹湇鍔°�佸瓙鏈嶅姟銆�
-            鍖呭ご灞炴�х殑闀垮害锛氬寘鐗堟湰鍙凤紙3锛夈�佸寘绫诲瀷锛�1锛夈�佸壇瀵煎ご鏍囪瘑锛�1锛夈�佸簲鐢ㄨ繃绋嬫爣璇嗭紙11锛夈�佸簭鍒楁爣璁帮紙2锛夈�佸寘搴忓垪璁℃暟锛�14锛夈�佸寘闀匡紙16锛夈�佹湇鍔★紙8锛夈�佸瓙鏈嶅姟锛�8锛夈��
-
-            琛ㄦ牸鍗曞厓鏍煎悎骞惰鏄庯細鍖呮牸涓瓨鍦ㄥ崟鍏冩牸鍚堝苟鐨勬儏鍐碉紝濡傛灉姘村钩鎴栧瀭鐩寸浉閭荤殑鍗曞厓鏍煎唴瀹逛竴鏍烽偅涔堣繖鍑犱釜鍐呭涓�鏍风殑鍗曞厓鏍兼湁鍙兘鏄竴涓悎骞跺崟鍏冩牸鍦ㄥ垎鏋愭椂搴旇褰撲綔鍚堝苟鍗曞厓鏍煎垎鏋愩��
-            # 绾︽潫
-            - 浠e彿鍛藉悕瑙勫垯锛氭暟瀛椼�佽嫳鏂囧瓧姣嶅拰涓嬪垝绾跨粍鎴愪笖浠ヨ嫳鏂囧瓧姣嶅拰涓嬪垝绾垮紑澶达紱
-            - 濡傛灉娌℃湁鍚嶇О鐢ㄤ唬鍙蜂唬鏇匡紝濡傛灉娌℃湁浠e彿鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧浠f浛锛岀炕璇戝敖閲忕畝鐭紱
-            - 濡傛灉鏈変唬鍙蜂弗鏍间緷鐓ф枃妗d腑鐨勪唬鍙凤紝鏂囨。涓殑浠e彿濡傛灉涓嶇鍚堜唬鍙峰懡鍚嶈鍒欏皢鐗规畩瀛楃杞崲涓轰笅鍒掔嚎锛屼緥濡傦細Rsv-1杞崲涓篟sv_1锛�
-            - 浣犻渶瑕佺悊瑙f暟鎹寘鐨勪綅缃俊鎭紝鐢变綅缃俊鎭緱鍒伴暱搴︼紝骞朵笖灏嗘墍鏈夎緭鍑哄崟浣嶇粺涓�杞崲涓� bits锛�
-            - pos瀛楁锛氭暟鍊肩被鍨嬶紝浠�0寮�濮嬭绠楋紝鐢遍暱搴︼紙length锛夌疮鍔犲緱鍒帮紱
-            - 搴旂敤杩囩▼鏍囪瘑锛氬鏋滀笉鏄崄鍏繘鍒惰浆鎹负鍗佸叚杩涘埗锛岃浆鎹㈠畬鎴愬悗瑕侀獙璇佹槸鍚︽纭紝浠�0x寮�澶达紝锛�
-            - 鍖呭ご鍚庨潰鐨勬瘡涓�琛岄兘瀵瑰簲涓�涓弬鏁帮紝閫愯杈撳嚭鍙傛暟锛屼笉瑕侀仐婕忎换浣曞弬鏁帮紱
-            - 绫讳技鈥濅繚鐣欙紙Rsv锛夆�滅殑琛屼篃瑕佸綋鍙傛暟鐢熸垚锛�
-            - 閲嶅鐨勮涔熻鐢熸垚锛�
-            - 娉ㄦ剰鍖呭唴瀹圭殑鑼冨洿锛屼笉瑕佹彁鍙栧埌鍏朵粬鍖呬腑鐨勫唴瀹癸紝鍖呭唴瀹归兘鍦ㄥ悓涓�涓〃鏍间腑锛�
-            - 瀛楄妭椤哄簭锛氬�间负澶х鈥淏鈥濓紝灏忕鈥淟鈥濓紝榛樿涓衡�淏鈥濓紱
-            - 杈撳嚭涓ユ牸鎸夌収鏂囨。涓殑鍐呭鐢熸垚锛屼笉瑕佸垱閫犳枃妗d腑涓嶅瓨鍦ㄧ殑鍐呭锛�
-            - 浠呰緭鍑簀son锛屼笉瑕佽緭鍑轰换浣曞叾浠栧唴瀹广��
-            # 渚嬪瓙
-            {
-            "name": "鏁扮缂撳彉閬ユ祴鍖�",
-            "id": "PMS003",
-            "type": "linear",
-            "headers": [
+            _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锛�
+    
+                鍖呭ご灞炴�у寘鎷細鍖呯増鏈彿銆佸寘绫诲瀷銆佸壇瀵煎ご鏍囪瘑銆佸簲鐢ㄨ繃绋嬫爣璇嗐�佸簭鍒楁爣璁般�佸寘搴忓垪璁℃暟銆佸寘闀裤�佹湇鍔°�佸瓙鏈嶅姟銆�
+                鍖呭ご灞炴�х殑闀垮害锛氬寘鐗堟湰鍙凤紙3锛夈�佸寘绫诲瀷锛�1锛夈�佸壇瀵煎ご鏍囪瘑锛�1锛夈�佸簲鐢ㄨ繃绋嬫爣璇嗭紙11锛夈�佸簭鍒楁爣璁帮紙2锛夈�佸寘搴忓垪璁℃暟锛�14锛夈�佸寘闀匡紙16锛夈�佹湇鍔★紙8锛夈�佸瓙鏈嶅姟锛�8锛夈��
+    
+                琛ㄦ牸鍗曞厓鏍煎悎骞惰鏄庯細鍖呮牸涓瓨鍦ㄥ崟鍏冩牸鍚堝苟鐨勬儏鍐碉紝濡傛灉姘村钩鎴栧瀭鐩寸浉閭荤殑鍗曞厓鏍煎唴瀹逛竴鏍烽偅涔堣繖鍑犱釜鍐呭涓�鏍风殑鍗曞厓鏍兼湁鍙兘鏄竴涓悎骞跺崟鍏冩牸鍦ㄥ垎鏋愭椂搴旇褰撲綔鍚堝苟鍗曞厓鏍煎垎鏋愩��
+                # 绾︽潫
+                - 浠e彿鍛藉悕瑙勫垯锛氭暟瀛椼�佽嫳鏂囧瓧姣嶅拰涓嬪垝绾跨粍鎴愪笖浠ヨ嫳鏂囧瓧姣嶅拰涓嬪垝绾垮紑澶达紱
+                - 濡傛灉娌℃湁鍚嶇О鐢ㄤ唬鍙蜂唬鏇匡紝濡傛灉娌℃湁浠e彿鐢ㄥ悕绉扮殑鑻辨枃缈昏瘧浠f浛锛岀炕璇戝敖閲忕畝鐭紱
+                - 濡傛灉鏈変唬鍙蜂弗鏍间緷鐓ф枃妗d腑鐨勪唬鍙凤紝鏂囨。涓殑浠e彿濡傛灉涓嶇鍚堜唬鍙峰懡鍚嶈鍒欏皢鐗规畩瀛楃杞崲涓轰笅鍒掔嚎锛屼緥濡傦細Rsv-1杞崲涓篟sv_1锛�
+                - 浣犻渶瑕佺悊瑙f暟鎹寘鐨勪綅缃俊鎭紝鐢变綅缃俊鎭緱鍒伴暱搴︼紝骞朵笖灏嗘墍鏈夎緭鍑哄崟浣嶇粺涓�杞崲涓� bits锛�
+                - pos瀛楁锛氭暟鍊肩被鍨嬶紝浠�0寮�濮嬭绠楋紝鐢遍暱搴︼紙length锛夌疮鍔犲緱鍒帮紱
+                - 搴旂敤杩囩▼鏍囪瘑锛氬鏋滀笉鏄崄鍏繘鍒惰浆鎹负鍗佸叚杩涘埗锛岃浆鎹㈠畬鎴愬悗瑕侀獙璇佹槸鍚︽纭紝浠�0x寮�澶达紝锛�
+                - 鍖呭ご鍚庨潰鐨勬瘡涓�琛岄兘瀵瑰簲涓�涓弬鏁帮紝閫愯杈撳嚭鍙傛暟锛屼笉瑕侀仐婕忎换浣曞弬鏁帮紱
+                - 绫讳技鈥濅繚鐣欙紙Rsv锛夆�滅殑琛屼篃瑕佸綋鍙傛暟鐢熸垚锛�
+                - 閲嶅鐨勮涔熻鐢熸垚锛�
+                - 娉ㄦ剰鍖呭唴瀹圭殑鑼冨洿锛屼笉瑕佹彁鍙栧埌鍏朵粬鍖呬腑鐨勫唴瀹癸紝鍖呭唴瀹归兘鍦ㄥ悓涓�涓〃鏍间腑锛�
+                - 瀛楄妭椤哄簭锛氬�间负澶х鈥淏鈥濓紝灏忕鈥淟鈥濓紝榛樿涓衡�淏鈥濓紱
+                - 杈撳嚭涓ユ牸鎸夌収鏂囨。涓殑鍐呭鐢熸垚锛屼笉瑕佸垱閫犳枃妗d腑涓嶅瓨鍦ㄧ殑鍐呭锛�
+                - 浠呰緭鍑簀son锛屼笉瑕佽緭鍑轰换浣曞叾浠栧唴瀹广��
+                # 渚嬪瓙
                 {
-                "name": "鍖呮爣璇�",
-                "id": "packetIdentifier",
-                "pos": 0,
-                "content": "000",
-                "length": 8,
-                "type": "para"
-                }
-            ],
-            "datas": [
-                {
-                "name": "XXX鍖�",
-                "id": "XXX",
-                "pos": 0,
-                "length": 8,
-                "byteOrder": ""
-                }
-            ]
-        """
-        
+                "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": ""
+                    }
+                ]
+            """
 
-        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'], '鏈�鍚庝竴涓弬鏁扮殑瀛楄妭浣嶇疆涓嶅锛�'
+            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瀛楁'
+                Log.info(f'鍙傛暟涓暟锛歿len(_pkt["datas"])}')
+                # assert par_num == len(_pkt['datas']), f'鏁版嵁鍩熷弬鏁颁釜鏁颁笉瀵癸紒棰勮{par_num}涓紝瀹為檯{len(_pkt["datas"])}'
+                assert last_par_pos == _pkt['datas'][-1]['pos'], '鏈�鍚庝竴涓弬鏁扮殑瀛楄妭浣嶇疆涓嶅锛�'
 
-        result = self.call_model(_msg, f'out/鏁版嵁鍖�-{pkt_name}.json', [], ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'], validation)
-        print(f'鏁版嵁鍖呪�渰pkt_name}鈥濅俊鎭細'+result)
+            result = self.call_model(_msg, f'out/鏁版嵁鍖�-{pkt_name}.json', [], ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'], validation)
+            Log.info(f'鏁版嵁鍖呪�渰pkt_name}鈥濅俊鎭細' + result)
+            pkt = json.loads(result)
+        else:
+            pkt = json.loads(utils.read_from_file(cache_file))
+        pkt_len = 0
+        for par in pkt['datas']:
+            par['pos'] = pkt_len
+            pkt_len += par['length']
+        pkt['length'] = pkt_len
+        return pkt
 
     def gen_bus(self):
         _msg = """
@@ -441,8 +559,8 @@
             json.loads(gen_text)
 
         result = self.call_model(_msg, 'out/鎬荤嚎.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'], validation)
-        print('鎬荤嚎鏁版嵁鍖咃細' + result)
-        
+        Log.info('鎬荤嚎鏁版嵁鍖咃細' + result)
+
         pkts = json.loads(result)
         # 绛涢�夌粡鎬荤嚎鐨勬暟鎹寘
         pkts = list(filter(lambda it: it['throughBus'], pkts))
@@ -450,11 +568,18 @@
         pkts = list(filter(lambda it: it['apid'], pkts))
 
         pkts2 = []
+        # todo 杩欎竴姝ュ簲璇ラ�氳繃鏁版嵁搴撶瓫閫夛紝鏁版嵁搴撲腑宸茬粡鏈夋墍鏈夐仴娴嬪寘浠ュ強閬ユ祴鍖呭搴旂殑瀹氫箟娈佃惤鏂囨湰
         for pkt in pkts:
             if self.pkt_in_tm_pkts(pkt["name"]):
                 pkts2.append(pkt)
         for pkt in pkts2:
             self.gen_pkt_details(pkt['name'], pkt['id'])
+            _pkt = self.gen_pkt_details(pkt['name'], pkt['id'])
+            if _pkt:
+                pkt['children'] = []
+                pkt['children'].extend(_pkt['datas'])
+                pkt['length'] = _pkt['length']
+        self.bus_pkts = pkts
 
     def pkt_in_tm_pkts(self, pkt_name):
         _msg = f"""
@@ -471,23 +596,23 @@
             鏈�
         """
         text = self.call_model(_msg, f'out/pkts/鏈夋棤鏁版嵁鍖�-{pkt_name}.txt', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'])
-        print(f'鏂囨。涓湁鏃犫�渰pkt_name}鈥濈殑瀛楁鎻忚堪锛�'+ text)
+        Log.info(f'鏂囨。涓湁鏃犫�渰pkt_name}鈥濈殑瀛楁鎻忚堪锛�' + text)
         return text == '鏈�'
 
-    # 閬ユ祴-end
+    # endregion 閬ユ祴-end
 
-    # 閬ユ帶-start
-    def handle_yk_structured_data(self):
+    # region start 閬ユ帶
+    def handle_tc_structured_data(self):
         # 鏁版嵁甯ф牸寮�
-        self.gen_tc_transfer_frame_format()
+        self.tc_frame = self.gen_tc_transfer_frame_format()
         # 閬ユ帶鍖呮牸寮�
-        self.gen_tc_pkt_format()
+        self.tc_pkt_format = self.gen_tc_pkt_format()
         # 閬ユ帶鍖呭垪琛�
-        pkts = self.gen_tc_transfer_pkts()
-        for pkt in pkts:
+        self.tc_pkts = self.gen_tc_transfer_pkts()
+        for pkt in self.tc_pkts:
             # 閬ユ帶鍖呮暟鎹尯鍐呭
             self.gen_tc_pkt_details(pkt)
-    
+
     def gen_tc_transfer_frame_format(self):
         _msg = '''
             # 鎸囦护
@@ -517,8 +642,13 @@
         def validation(gen_text):
             json.loads(gen_text)
 
-        result = self.call_model(_msg, 'out/tc_transfer_frame.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'],validation)
-        print('閬ユ帶甯ф牸寮忥細' + result)
+        text = self.call_model(_msg, 'out/tc_transfer_frame.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'], validation)
+        result: dict = json.loads(text)
+        format_text = utils.read_from_file('tpl/tc_transfer_frame.json')
+        format_text = utils.replace_tpl_paras(format_text, result)
+        frame = json.loads(format_text)
+        Log.info('閬ユ帶甯ф牸寮忥細' + format_text)
+        return frame
 
     def gen_tc_pkt_format(self):
         _msg = '''
@@ -551,9 +681,15 @@
         def validation(gen_text):
             json.loads(gen_text)
 
-        result = self.call_model(_msg, 'out/tc_transfer_pkt.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'],validation)
-        print('閬ユ帶鍖呮牸寮忥細' + result)
-        
+        text = self.call_model(_msg, 'out/tc_transfer_pkt.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'], validation)
+        result = json.loads(text)
+
+        format_text = utils.read_from_file('tpl/tc_pkt_format.json')
+        format_text = utils.replace_tpl_paras(format_text, result)
+        pkt_format = json.loads(format_text)
+        Log.info('閬ユ帶鍖呮牸寮忥細' + format_text)
+        return pkt_format
+
     def gen_tc_transfer_pkts(self):
         _msg = '''
             # 鎸囦护
@@ -571,8 +707,9 @@
         def validation(gen_text):
             json.loads(gen_text)
 
-        result = self.call_model(_msg, 'out/tc_transfer_pkts.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'],validation)
-        print('閬ユ帶鍖呭垪琛細' + result)
+        text = self.call_model(_msg, 'out/tc_transfer_pkts.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'], validation)
+        Log.info('閬ユ帶鍖呭垪琛細' + text)
+        return json.loads(text)
 
     def gen_tc_pkt_details(self, pkt):
         tc_name = pkt['name']
@@ -620,7 +757,8 @@
         def validation(gen_text):
             json.loads(gen_text)
 
-        result = self.call_model(_msg, f'out/閬ユ帶鎸囦护鏁版嵁鍩�-{tc_code}-{utils.to_file_name(tc_name)}.json', ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'],validation)
-        print('閬ユ帶鎸囦护鏁版嵁鍩燂細' + result)
+        result = self.call_model(_msg, f'out/閬ユ帶鎸囦护鏁版嵁鍩�-{tc_code}-{utils.to_file_name(tc_name)}.json',
+                                 ['杩欓噷鏄枃妗d腑鎶藉彇鐨勫唴瀹�'], validation)
+        Log.info('閬ユ帶鎸囦护鏁版嵁鍩燂細' + result)
 
-    # 閬ユ帶-end
\ No newline at end of file
+    # endregion 閬ユ帶-end

--
Gitblit v1.9.1