68 lines
3.1 KiB
Markdown
68 lines
3.1 KiB
Markdown
# 移植workflow修订到同名不同版本合同 (2026-07-08)
|
|
|
|
## 场景
|
|
邱律师同日发了两份同名文件(如"2026年华新镇公立中小学生健康体检服务合同.docx"),内容有实质差异(不同版本/条款)。第一份被workflow正常审查交付,第二份因queue-runner同名跳过逻辑被遗漏。Doro要求"把workflow第1份的修订内容直接修订到第2份里,但要注意相关修订在第2份里是否合理"。
|
|
|
|
## 操作步骤
|
|
|
|
### 1. 提取第1份的WB修订清单
|
|
从已交付文件提取所有 `author=WB` 的 `w:ins` 和 `w:del`:
|
|
```python
|
|
from zipfile import ZipFile
|
|
from lxml import etree
|
|
|
|
with ZipFile(delivered_path, 'r') as z:
|
|
content = z.read('word/document.xml').decode('utf-8')
|
|
root = etree.fromstring(content.encode('utf-8'))
|
|
# 遍历所有 WB INS/DEL,记录:段落索引、INS文本、DEL文本、上下文
|
|
```
|
|
|
|
### 2. 对比两份合同差异
|
|
用 `difflib` 对比两版全文,定位哪些段落内容不同。特别关注:
|
|
- 修订涉及的段落在第2份中是否存在
|
|
- 如果存在,文本是否与第1份中的"修订前"文本一致
|
|
|
|
### 3. 逐条判断修订是否适用于第2份
|
|
| 修订类型 | 判断方法 |
|
|
|---------|---------|
|
|
| 术语统一(如"协议"→"合同") | 在第2份中搜索同一术语,存在则同样修改 |
|
|
| 新增保护条款(如数据归属、转包连带责任) | 检查第2份对应位置是否缺同样的保护,缺则加 |
|
|
| 金额/支付相关修订 | 第2份的支付条款可能完全不同(如本案),需独立判断是否需要新的修订 |
|
|
| 合同期限相关修订 | 第2份期限可能不同,独立判断 |
|
|
|
|
### 4. 对第2份执行修订
|
|
使用ContractEditor库,与正常审查相同流程:
|
|
```python
|
|
ed = ContractEditor(second_file)
|
|
ed.tracked_replace(old, new) # 逐条适用的修订
|
|
errors = ed.validate()
|
|
ed.save(output)
|
|
```
|
|
|
|
### 5. 字体验证 + 上传
|
|
- `wb-ins-font-verify.py` 必须PASS
|
|
- 上传替换NC任务交付目录中的同名文件
|
|
- 同时确保第2份原始文件在待审查目录
|
|
|
|
## 2026-07-08 华新镇体检合同实证
|
|
|
|
**两版差异:**
|
|
| 条款 | 第1份 (11:05) | 第2份 (16:04) |
|
|
|------|--------------|--------------|
|
|
| 项目内容 | "公立中小学生健康检查工作" | "华新镇公立中小学生健康体检工作" |
|
|
| 支付方式 | 按实际人数结算,无金额上限 | 按实际完成人数+考核表结算,费用上限17万 |
|
|
| 合同期限 | 9月10日起 | 9月1日起 |
|
|
|
|
**移植的修订(全部适用):**
|
|
1. 保密条款:数据归属+合同期满扩大+协议→合同统一 ✅ 第2份保密条款内容相同
|
|
2. 转包限制:增加甲方书面同意+连带责任 ✅ 第2份P44文本相同
|
|
3. 效力条款:本协议→本合同 ✅ 第2份P51文本相同
|
|
|
|
**不需要额外修订的原因:**
|
|
- 第2份的支付条款已更完善(有上限、有考核、有一次性付清约定)
|
|
- 违约责任、争议解决条款相同且已足够
|
|
|
|
## 注意事项
|
|
- 第2份被上传后会**替换**第1份的交付文件(同名),tracker中seq=262的记录对应的实际内容变了
|
|
- hint mismatch 在 tracked_replace 生成的长INS文本中常见(库不自动加hint到多段INS),需post-fix
|