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

---
 knowledgebase/doc/doc_processor.py |   45 ++++++
 db_struct_flow.py                  |  188 +++++++++++++++++++++----------
 tpl/tc_transfer_frame.json         |    5 
 knowledgebase/db/db_helper.py      |   75 ++++++++++++
 tpl/tc_pkt_format.json             |    7 
 testcases/test_doc_processor.py    |    2 
 6 files changed, 251 insertions(+), 71 deletions(-)

diff --git a/db_struct_flow.py b/db_struct_flow.py
index 2cf6608..692b6fa 100644
--- a/db_struct_flow.py
+++ b/db_struct_flow.py
@@ -12,7 +12,7 @@
 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
@@ -111,7 +111,16 @@
 - 涓嶈緭鍑轰换浣曟敞閲婄瓑鎻忚堪鎬т俊鎭��
 """
 
+tc_system_msg = """
+# 瑙掕壊
+浣犳槸涓�涓祫娣辫蒋浠跺伐绋嬪笀銆�
+# 绾︽潫
+- 杈撳嚭鍐呭蹇呴』鏍规嵁鏂囨。鍜岄棶棰樺洖绛旓紝涓嶈鍒涢�犲叾浠栧唴瀹癸紱
+- 杈撳嚭鍐呭蹇呴』鏄紝JSON鏍煎紡锛屼笉瑕佽緭鍑哄叾浠栨枃鏈��
+"""
+
 g_completion = None
+
 
 def read_from_file(cache_file):
     with open(cache_file, 'r', encoding='utf-8') as f:
@@ -345,7 +354,7 @@
 
         self.gen_tc()
         return ''
-    
+
     def get_text_with_entity(self, entity_names: list[str]) -> str:
         """
         鏍规嵁瀹炰綋璇嶈幏鍙栨枃妗f枃鏈�
@@ -416,6 +425,9 @@
         return self.generate_text(msg, cache_file, msgs, doc_text, validation, try_cnt, True)
 
     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):
@@ -491,7 +503,7 @@
             assert isinstance(_devs, list), '鏁版嵁缁撴瀯鏈�澶栧眰涓嶆槸鏁扮粍'
             assert next(filter(lambda it: it['name'].endswith('绠$悊鍗曞厓'), _devs), None), '鐢熸垚鐨勮澶囧垪琛ㄤ腑娌℃湁绠$悊鍗曞厓'
 
-        doc_text = self.get_text_with_entity(['绯荤粺姒傝堪','鎬荤嚎绠$悊'])
+        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)
 
@@ -746,7 +758,7 @@
 
     def gen_pkt_details(self, pkt_name, pkt_id):
         cache_file = f'out/鏁版嵁鍖�-{pkt_name}.json'
-        
+
         # _msg = f"""
         #     #瑙掕壊
         #     浣犳槸涓�鍚嶈祫娣辩殑杞欢宸ョ▼甯堛��
@@ -765,7 +777,7 @@
         #     #渚嬪瓙锛�
         #     {"last_par_pos":128, "par_num": 20}
         #     """
-        
+
         # text = self.generate_text_json(_msg, '', doc_text=doc_text)
         # result = json.loads(text)
         # last_par_pos = result['last_par_pos']
@@ -843,7 +855,7 @@
             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
@@ -905,11 +917,12 @@
 ]
         """
         print('閬ユ祴婧愬寘鎵�灞炶櫄鎷熶俊閬擄細')
+
         def validation(gen_text):
             pkts = json.loads(gen_text)
             assert len(pkts), 'VC婧愬寘鍒楄〃涓嶈兘涓虹┖'
 
-        doc_text = self.get_text_with_entity(['铏氭嫙淇¢亾瀹氫箟','閬ユ祴婧愬寘涓嬩紶鏃舵満'])
+        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
@@ -1015,9 +1028,7 @@
         def validation(gen_text):
             json.loads(gen_text)
 
-        
-
-        doc_text = self.get_text_with_entity(['RT鍦板潃鍒嗛厤','鍒嗙郴缁熸簮鍖�'])
+        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)
@@ -1118,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
 
@@ -1143,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']:
@@ -1152,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):
             """
@@ -1199,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:
@@ -1242,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鏂囨湰锛屼笉瑕佽緭鍑轰换浣曞叾浠栨枃鏈��
@@ -1288,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鏂囨湰锛屼笉瑕佽緭鍑轰换浣曞叾浠栨枃鏈��
@@ -1320,15 +1337,17 @@
 # 鎸囦护
 鍒嗘瀽鏂囨。鍒楀嚭鎵�鏈夌殑閬ユ帶鎸囦护銆�
 #  绾︽潫
-- 搴旂敤杩囩▼鏍囪瘑锛氬簲鐢ㄨ繃绋嬫爣璇嗗氨鏄疉PID锛屼竴鑸細鍦ㄥ悕绉板悗鐨勬嫭鍙蜂腑鍒楀嚭鏉�
-- code鏄寚浠や唬鍙凤紝娌℃湁灏辩┖鐫�
+- 搴旂敤杩囩▼鏍囪瘑锛氬簲鐢ㄨ繃绋嬫爣璇嗗氨鏄疉PID锛屼竴鑸細鍦ㄥ悕绉板悗鐨勬嫭鍙蜂腑鍒楀嚭鏉ワ紱
+- code锛氭寚浠や唬鍙凤紝娌℃湁灏辩┖鐫�锛�
+- 搴旂敤鏁版嵁鍖猴細鎻愬彇琛ㄦ牸涓殑搴旂敤鏁版嵁鍖哄唴瀹广��
 # 杈撳嚭渚嬪瓙锛�
 [{
 "name": "xxx",
 "code":"pkt",
 "搴旂敤杩囩▼鏍囪瘑绗�":"0xAA",
 "鏈嶅姟绫诲瀷":"0x1",
-"鏈嶅姟瀛愮被鍨�":"0x2"
+"鏈嶅姟瀛愮被鍨�":"0x2",
+"搴旂敤鏁版嵁鍖�": ""
 }]
 '''
 
@@ -1352,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浠ュ鐨勪换浣曞唴瀹广��
 
 # 杈撳嚭渚嬪瓙锛�
 [
@@ -1383,18 +1417,52 @@
         "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鐨勫厓绱犱笉鑳戒负绌�')
 
         doc_text = self.get_text_with_entity([tc_name])
         if doc_text == '':
-            return None
-        text = self.generate_tc_text(_msg, f'out/閬ユ帶鎸囦护鏁版嵁鍩�-{tc_code}-{utils.to_file_name(tc_name)}.json',
+            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)
diff --git a/knowledgebase/db/db_helper.py b/knowledgebase/db/db_helper.py
index c394644..4f193d1 100644
--- a/knowledgebase/db/db_helper.py
+++ b/knowledgebase/db/db_helper.py
@@ -1,4 +1,5 @@
 import uuid
+from enum import Enum
 
 from sqlalchemy.orm import sessionmaker, scoped_session
 
@@ -384,10 +385,82 @@
     "checkSum": 20,
     "insUnit": 4,
     "insUnitList": 11,
-    "input": 19
+    "input": 19,
+    "pktSeqCnt": 25,
+    "variableLength": 14
 }
 
 
+class BinaryType(Enum):
+    Integer = 0 # 鏁村瀷
+    Float = 1 # 娴偣鍨�
+    Ascii = 2 # ASCII
+
+
+class NumberDataType(Enum):
+    Unsigned = 0 # 鏃犵鍙锋暣鍨�
+    SignInteger = 1 # 鏈夌鍙锋暣鍨�
+    Phy = 2 # 鐗╃悊閲�
+    Bytes = 3 # 澶氬瓧鑺傜爜
+
+
+class InputFormat(Enum):
+    Binary = 0 # 浜岃繘鍒�
+    Decimal = 1 # 鍗佽繘鍒�
+    Hex = 2 # 鍗佸叚杩涘埗
+
+
+class ProcessMethod(Enum):
+    Dirct = 0 # 鐩磋
+    Equivalent = 1 # 褰撻噺
+    Formula = 2 # 鍏紡
+    Script = 3 # 鑴氭湰
+
+
+class ExpressionType(Enum):
+    Count = 0 # 涓暟璁$畻
+    Formula = 1 # 鏁板�艰绠�
+
+
+class EnumType(Enum):
+    NameValue = 0 # 鍚嶅�煎鏋氫妇
+    Range = 1 # 鑼冨洿鏋氫妇
+    Classify = 2 # 澶氱骇鍒嗙被
+    InsCategory = 3 # 鎸囦护绫诲埆鏋氫妇
+    InsUnit = 4 # 鎸囦护鍗曞厓鏋氫妇
+    InsFormat = 5 # 鎸囦护鏍煎紡鏋氫妇
+
+
+def make_attr(field: dict):
+    """
+    鑾峰彇瀛楁瀹氫箟鐨凙TTR銆�
+
+    浣嶆帺鐮侊紝鐢ㄤ簬鏍囪瘑鑺傜偣绫诲瀷銆�
+    绫诲瀷锛�0~2 BinaryType;
+        3~5 DataType;
+        6~8: InputFormat;
+        9 : IsSubPackage;
+        10: IsSendFlag锛�
+        11~13: ProcessMethod锛�
+        14~16: ExpressionType锛�
+        17~19: EnumType
+
+    :param field: 瀛楁淇℃伅
+    :return:
+    """
+    attr = 0
+    # 鍗虫椂杈撳叆锛屾棤绗﹀彿鏁存暟锛屽崄杩涘埗锛岀洿璇�
+    if field['type'] == ins_ty['input']:
+        attr |= (NumberDataType.Unsigned.value << 3) | (InputFormat.Decimal.value << 6) | (ProcessMethod.Dirct.value << 11)
+    # 鏄惁鏄瓙鍖�
+    attr |= (1 << 9) if field['type']==ins_ty['subPkt'] else 0
+    # 鏄惁鏄彂閫佹爣璁�
+    attr |= (1 << 10) if field['type']==ins_ty['sendFlag'] else 0
+    # 璁$畻绫诲瀷
+    # 鏋氫妇绫诲瀷
+
+    return attr
+
 def create_ins_format(proj_pk: str, parent_pk: str, info: dict) -> TInsFormat:
     ins_format = TInsFormat(
         C_INS_FORMAT_PK=get_pk(),
diff --git a/knowledgebase/doc/doc_processor.py b/knowledgebase/doc/doc_processor.py
index 866246b..28092ed 100644
--- a/knowledgebase/doc/doc_processor.py
+++ b/knowledgebase/doc/doc_processor.py
@@ -50,7 +50,33 @@
         resp = llm.invoke([msg])
         Log.info(f'璇嗗埆缁撴灉锛歿resp.content}')
         return resp.content
-
+    def get_tc_info(self,  paragraph: ParagraphInfo):
+        if self.doc_type not in [DocType.tc_format]:
+            return ''
+        prompt = HumanMessagePromptTemplate.from_template('''
+# 鎸囦护
+璇蜂粠涓嬮潰鐨勬枃鏈腑璇嗗埆鎸囦护淇℃伅锛屽鏋滆瘑鍒け璐ヤ笉瑕佽緭鍑轰换浣曞瓧绗︺��
+鎸囦护淇℃伅鍖呮嫭锛氭寚浠ゅ悕绉般��
+# 璇嗗埆瑙勫垯
+- 鏂囨湰鍐呭涓洪仴鎺ф寚浠ゆ暟鎹煙鎴栭仴鎺ф寚浠ゅ簲鐢ㄦ暟鎹殑瀹氫箟鎻忚堪銆�
+# 绾︽潫
+- 濡傛灉鏂囨湰鍐呭鏄洰褰曞垯涓嶈杈撳嚭浠讳綍瀛楃锛�
+- 鎸囦护鍚嶇О鍦ㄧ珷鑺傛爣棰樹腑锛屾彁鍙栨寚浠ゅ悕绉拌鍜屾枃鏈腑鐨勪弗鏍间竴鑷达紱
+- 濡傛灉娌℃湁璇嗗埆鍒版寚浠や俊鎭笉瑕佽緭鍑轰换浣曞瓧绗︼紱
+- 璇嗗埆澶辫触锛屼笉瑕佽緭鍑轰换浣曞唴瀹癸紝鍖呮嫭瑙i噴鎬ф枃鏈紱
+- 杈撳嚭json鏍煎紡銆�
+# 绀轰緥 - 璇嗗埆鍒版寚浠�
+{{
+    "name": "xxx"
+}}
+# 绀轰緥 - 鏈瘑鍒埌鏁版嵁鍖�
+""
+# 鏂囨湰鍐呭锛�
+{text}
+''')
+        chain = prompt.prompt | llm | JsonOutputParser()
+        resp = chain.invoke({"text": paragraph.full_text})
+        return resp
     def get_tm_pkt_info(self, paragraph: ParagraphInfo):
         if self.doc_type not in [DocType.tm_outline, DocType.tm_pkt_design]:
             return ''
@@ -99,9 +125,20 @@
             e = doc_dbh.get_entity(entity)
             if e:
                 entity.id = e.id
-                return e
-            doc_dbh.add_entity(entity)
-            Log.info(f"鏂板Entity锛歿entity.name}锛宨d锛歿entity.id}")
+            else:
+                doc_dbh.add_entity(entity)
+                Log.info(f"鏂板Entity锛歿entity.name}锛宨d锛歿entity.id}")
+            paragraph.entities.append(entity)
+        # 鑾峰彇鎸囦护淇℃伅
+        cmd = self.get_tc_info(paragraph)
+        if cmd:
+            entity = TEntity(name=cmd['name'], type='鎸囦护鏍煎紡閰嶇疆', prompts='', doc_type='')
+            e = doc_dbh.get_entity(entity)
+            if e:
+                entity.id = e.id
+            else:
+                doc_dbh.add_entity(entity)
+                Log.info(f"鏂板Entity锛歿entity.name}锛宨d锛歿entity.id}")
             paragraph.entities.append(entity)
 
     def process(self):
diff --git a/testcases/test_doc_processor.py b/testcases/test_doc_processor.py
index ecad70a..23eb4f2 100644
--- a/testcases/test_doc_processor.py
+++ b/testcases/test_doc_processor.py
@@ -22,7 +22,7 @@
         doc_processor = DocProcessor(file)
         doc_processor.process()
 def test_get_text_by_entity():
-    text = doc_dbh.get_text_with_entities(['鍒嗙郴缁熸簮鍖�'])
+    text = doc_dbh.get_text_with_entities(['鎸囦护缁勫唴瀹逛笅浼�'])
     print(text)
 if __name__ == '__main__':
     # test_process()
diff --git a/tpl/tc_pkt_format.json b/tpl/tc_pkt_format.json
index 5b0c64f..73c812f 100644
--- a/tpl/tc_pkt_format.json
+++ b/tpl/tc_pkt_format.json
@@ -61,7 +61,7 @@
               "name": "鍖呭簭鍒楄鏁�",
               "code": "packetSequenceCount",
               "length": 14,
-              "type": "const",
+              "type": "pktSeqCnt",
               "value": "0"
             }
           ]
@@ -73,7 +73,7 @@
           "type": "length",
           "value": {
             "start": "secondaryHeader",
-            "end": "packetDataEnd",
+            "end": "data",
             "formula": "N-1"
           }
         }
@@ -140,7 +140,8 @@
       "name": "鍖呭樊閿欐帶鍒跺煙",
       "code": "pktCheckSum",
       "length": 16,
-      "type": "checkSum"
+      "type": "checkSum",
+      "value": {"start": "START", "end": "PREV", "type": "ISOSum"}
     }
   ],
   "subPkts": []
diff --git a/tpl/tc_transfer_frame.json b/tpl/tc_transfer_frame.json
index f12853e..a78f2bb 100644
--- a/tpl/tc_transfer_frame.json
+++ b/tpl/tc_transfer_frame.json
@@ -47,7 +47,7 @@
                     "name": "铏氭嫙淇¢亾鏍囪瘑",
                     "code": "vcid",
                     "length": 6,
-                    "type": "enum",
+                    "type": "sendFlag",
                     "enums": "{{铏氭嫙淇¢亾鏍囪瘑}}"
                 },
                 {
@@ -76,7 +76,8 @@
             "name": "甯у樊閿欐帶鍒跺煙",
             "code": "frameCRC",
             "length": 16,
-            "type": "checkSum"
+            "type": "checkSum",
+            "value": {"start": "START", "end": "PREV", "type": "CRC-CCITT"}
         }
     ],
     "subPkts": []

--
Gitblit v1.9.1