外观
合同是如何自动生成的
了解合同从模板到 PDF 的完整过程,遇到问题时能快速定位是哪个环节出了状况。
一、整体流程
创建订单 → 审核通过 → 生成合同 → 客户签署 → 导出/预览 PDF
│
├─ 1. 找模板:按订单关联的产品,找到该产品绑定的合同模板
├─ 2. 填数据:把客户、车辆、产品、订单数据填入模板变量
├─ 3. 嵌公章:读取产品配置的公章图片,嵌入 {{company_seal_image}}
└─ 4. 存快照:渲染结果保存为合同快照,此后内容不再变化二、关键环节说明
1. 模板从哪里来
每个产品在系统中可关联一个合同模板(产品管理 → 合同模板)。生成合同时,系统按「订单 → 产品 → 模板」这条链路找到模板。产品没有关联启用的模板时,合同生成会失败,报「合同模板不存在或已停用」。
2. 变量替换
系统把模板中的 {{customer_name}}、{{license_plate}} 等变量逐一替换为真实业务数据。要点:
- 只识别标准变量名,写错、拼错、用旧写法的变量会原样保留在合同里。
- 金额大写(
{{amount_in_words}})、证件类型中文({{customer_id_type}})、付款方式中文({{payment_plan}})等由系统自动转换。 - 日期统一输出为
2026年6月10日这种中文格式。 - 车辆信息取自订单快照数据,而不是车辆档案——订单审核后修改车辆资料不影响已生成的合同。
3. 公章嵌入
公章图片配置在产品上。产品配置了公章,{{company_seal_image}} 会被替换为内嵌图片;未配置则替换为空白,不会报错。
4. 合同快照与锁定
- 渲染完成的内容会保存为合同快照(rendered snapshot)。之后修改模板、修改客户资料,都不会改变已生成的合同——这保证了合同内容不可篡改。
- 合同生成后订单会被锁定(contract locked)。要修改订单信息,需要先解锁/重新生成合同。
5. 客户签名
{{customer_signature}} 是特殊变量:合同生成时故意不替换,等客户在会员端完成电子签署后,导出 PDF 或预览时才动态注入签名图片。因此:
- 未签署的合同里签名区是空白的,这是正常现象;
- 已签署后重新导出 PDF,签名图片会自动出现;
- 签署日期
{{sign_date}}也会在签署后更新为实际签字日期。
三、数据流向图
客户资料 ──┐
订单信息 ──┤
车辆信息 ──┼──► 模板变量替换 ──► 合同快照 ──► PDF(Dompdf 渲染,A4)
产品信息 ──┤ │
自定义变量 ┘ ├─ 公章图片(产品配置)
└─ 客户签名(签署后注入)