4 Commits 909d110c53 ... 2955252bc2

Autor SHA1 Mensaje Fecha
  kyle 2955252bc2 v0.2(提高skill命中率,删除合同模板的批注) hace 1 semana
  kyle 909d110c53 v0.1 hace 1 semana
  kyle f1af4569ae v0.2 hace 1 semana
  kyle 5be549f616 v0.1 hace 1 semana

BIN
assets/vehicle-sales-contract-template.docx


+ 41 - 7
SKILL.md → auto-generate-export-contracts/SKILL.md

@@ -1,6 +1,6 @@
 ---
 name: auto-generate-export-contracts
-description: 根据订单合同信息自动生成车辆出口销售合同(Word)和Proforma Invoice(Excel)。用于处理海外车辆出口业务,支持从订单文本解析买方信息、车型列表、贸易条款等,自动匹配车型价格配置表,生成标准格式的中英双语销售合同和PI表格。当用户提供订单信息、要求生成销售合同/PI/Proforma Invoice时触发。
+description: "根据订单合同信息自动生成车辆出口销售合同(Word)和Proforma Invoice(Excel)。用于处理海外车辆出口业务。触发词:生成合同、生成PI、生成Proforma Invoice、做合同、做PI、合同信息、订单信息、出口合同、销售合同、车辆出口、帮我做合同、做出口合同、生成销售合同、FCA合同、FOB合同、买方信息、目的港、意向车型、合同签约公司、车辆明细。当用户提供包含以下任意字段的订单信息时触发:姓名/联系人、意向车型/车辆型号(LZW开头)、合同签约公司、买方公司、出发港口、目的港、结算方式(FCA/FOB/EXW)。支持格式:编号列表(1.姓名 2.任职 3.意向车型...)或自然语言描述。"
 ---
 
 # 海外合同自动生成 Skill
@@ -13,9 +13,45 @@ description: 根据订单合同信息自动生成车辆出口销售合同(Word)
 
 ## 触发条件
 
-当用户:
-- 提供订单信息并要求生成销售合同/PI/Proforma Invoice
-- 提供包含车型、买方公司、贸易条款等信息的订单文本
+当用户提供合同/订单信息时触发,常见场景包括:
+
+**用户说以下任意关键词时应触发本skill:**
+- "生成合同"、"做合同"、"合同"、"销售合同"、"出口合同"
+- "生成PI"、"做PI"、"Proforma Invoice"、"形式发票"
+- "车辆出口"、"出口订单"
+- "FCA合同"、"FOB合同"、"EXW合同"
+
+**用户提供的信息包含以下任意字段组合时应触发:**
+- 联系人/姓名 + 任职位
+- 意向车型/车辆型号(LZW开头的型号代码)
+- 合同签约公司(中英文名称)
+- 买方公司/客户公司
+- 出发港口/起运港 + 目的港/目的地国家
+- 结算方式(FCA/FOB/EXW/CIF)
+
+**典型输入格式示例:**
+
+格式1 - 编号列表(最常见):
+```
+1. 姓名:张三;
+2. 任职:经理;
+3. 意向车型:五菱星光560 燃油版- 型号:LZW6470KHUA6 代码:VS03 5台蓝色
+4. 合同签约公司中文名称:xxx有限公司;
+5. 合同签约公司英文名称:xxx Co.,Ltd.
+6. 合同签约公司中文地址:xxx
+7. 合同签约公司英文地址:xxx
+8. 合同联系电话:138xxxx
+9. 国内出发港口:广州南沙新港;
+10. 目的地国家:xxx
+11. 目的地港口:xxx
+12. 结算方式:FCA
+```
+
+格式2 - 自然语言描述:
+```
+帮我做一份出口合同,买方是xxx公司,要5台五菱星光560,型号LZW6470KHUA6,
+发到贝宁科托努港,FCA条款,广州南沙出货
+```
 
 ## 工作流程
 
@@ -26,9 +62,7 @@ description: 根据订单合同信息自动生成车辆出口销售合同(Word)
   ```
   1. 姓名:xxx;
   2.任职:xxx;
-  3.意向车型:
-  (1) 车型中文名  英文名 - 型号:LZWxxxx
-  排放标准  代码:xxx  X台颜色
+  3.意向车型:五菱星光560 燃油版- 型号:LZW6470KHUA6 代码:VS03 5台蓝色
   4.合同签约公司中文名称:xxx;
   5.合同签约公司英文名称:xxx
   ...

+ 0 - 0
assets/proforma-invoice-template.xlsx → auto-generate-export-contracts/assets/proforma-invoice-template.xlsx


+ 0 - 0
assets/vehicle-price-config.xlsx → auto-generate-export-contracts/assets/vehicle-price-config.xlsx


BIN
auto-generate-export-contracts/assets/vehicle-sales-contract-template.docx


+ 0 - 0
assets/订单合同信息案例.txt → auto-generate-export-contracts/assets/订单合同信息案例.txt


+ 0 - 0
references/field-mapping.md → auto-generate-export-contracts/references/field-mapping.md


+ 0 - 0
scripts/generate_contracts.py → auto-generate-export-contracts/scripts/generate_contracts.py


+ 0 - 0
scripts/match_vehicle.py → auto-generate-export-contracts/scripts/match_vehicle.py


+ 0 - 0
scripts/number_to_words.py → auto-generate-export-contracts/scripts/number_to_words.py


+ 20 - 3
scripts/parse_order_info.py → auto-generate-export-contracts/scripts/parse_order_info.py

@@ -54,8 +54,19 @@ def parse_structured_order(text: str) -> dict:
     i = 0
     while i < len(lines):
         line = lines[i].strip()
-        # 匹配车型起始行: (数字)... 型号:XXX
+        # 匹配车型起始行: (数字)... 型号:XXX  或  N.意向车型:... 型号:XXX
         m = re.match(r'[((](\d+)[))]\s*(.+?)\s*型号[::]\s*(\w+)', line)
+        if not m:
+            m = re.match(r'\d+[..]\s*意向车型[::]\s*(.+?)\s*型号[::]\s*(\w+)', line)
+            if m:
+                # Convert to same groups: group(1)=name_part, group(2)=model_code, group(3) unused
+                # Rewrite as a 3-group match for downstream compatibility
+                class _M:
+                    def __init__(self, real_m):
+                        self._m = real_m
+                        # group(1)=name_part, group(2)=model_code → map to group(2), group(3)
+                        self.group = lambda n: ['', '', real_m.group(1), real_m.group(2)][n]
+                m = _M(m)
         if m:
             seq = m.group(1)
             name_part = m.group(2).strip()
@@ -64,13 +75,19 @@ def parse_structured_order(text: str) -> dict:
             # 解析车型名称(中英文分离)
             name_cn, name_en = split_name_cn_en(name_part)
             
-            # 下一行提取排放、发动机代码、数量、颜色
+            # 先从当前行提取代码/数量/颜色,再尝试下一行
             engine_code = ''
             emission = ''
             quantity = 1
             color = ''
             
-            if i + 1 < len(lines):
+            # 当前行可能包含: 代码:VS03    5台蓝色
+            m2 = re.search(r'代码[::]\s*(\w+)\s+(\d+)台(\w+)', line)
+            if m2:
+                engine_code = m2.group(1).strip()
+                quantity = int(m2.group(2))
+                color = m2.group(3).strip()
+            elif i + 1 < len(lines):
                 next_line = lines[i + 1].strip()
                 # 模式: 排放标准  代码:XXX  X台颜色
                 m2 = re.search(r'(.+?)\s+代码[::]\s*(\w+)\s+(\d+)台(\w+)', next_line)