pdd-skills 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1478 -0
- package/bin/pdd.js +354 -0
- package/config/bpmn-rules.yaml +166 -0
- package/config/checkstyle.xml +105 -0
- package/config/eslint.config.js +48 -0
- package/config/pmd.xml +91 -0
- package/config/prd-rules.yaml +113 -0
- package/config/ruff.toml +45 -0
- package/config/sqlfluff.cfg +82 -0
- package/hooks/hook-executor.js +332 -0
- package/index.js +43 -0
- package/lib/api-routes.js +750 -0
- package/lib/api-server.js +408 -0
- package/lib/cache/cache-config.js +209 -0
- package/lib/cache/system-cache.js +852 -0
- package/lib/config-manager.js +373 -0
- package/lib/generate.js +528 -0
- package/lib/grpc/grpc-routes.js +1134 -0
- package/lib/grpc/grpc-server.js +912 -0
- package/lib/grpc/proto-definitions.js +1033 -0
- package/lib/init.js +172 -0
- package/lib/iteration/auto-fixer.js +1025 -0
- package/lib/iteration/auto-reviewer.js +923 -0
- package/lib/iteration/controller.js +577 -0
- package/lib/list.js +130 -0
- package/lib/mcp-server.js +548 -0
- package/lib/openclaw/api-integration.js +535 -0
- package/lib/openclaw/cli-integration.js +567 -0
- package/lib/openclaw/data-sync.js +845 -0
- package/lib/openclaw/openclaw-adapter.js +783 -0
- package/lib/plugin/example-plugins/code-stats/index.js +332 -0
- package/lib/plugin/example-plugins/code-stats/plugin.json +1 -0
- package/lib/plugin/example-plugins/custom-linter/index.js +472 -0
- package/lib/plugin/example-plugins/custom-linter/plugin.json +1 -0
- package/lib/plugin/example-plugins/hello-world/index.js +86 -0
- package/lib/plugin/example-plugins/hello-world/plugin.json +1 -0
- package/lib/plugin/plugin-manager.js +655 -0
- package/lib/plugin/plugin-sdk.js +565 -0
- package/lib/plugin/sandbox.js +627 -0
- package/lib/quality/rules/maintainability.js +418 -0
- package/lib/quality/rules/performance.js +498 -0
- package/lib/quality/rules/readability.js +441 -0
- package/lib/quality/rules/robustness.js +504 -0
- package/lib/quality/rules/security.js +444 -0
- package/lib/quality/scorer.js +576 -0
- package/lib/report.js +669 -0
- package/lib/sdk-base.js +301 -0
- package/lib/sdk-js.js +446 -0
- package/lib/sdk-python/README.md +546 -0
- package/lib/sdk-python/examples/basic_usage.py +450 -0
- package/lib/sdk-python/pdd_sdk/__init__.py +180 -0
- package/lib/sdk-python/pdd_sdk/client.py +1170 -0
- package/lib/sdk-python/pdd_sdk/events.py +423 -0
- package/lib/sdk-python/pdd_sdk/exceptions.py +158 -0
- package/lib/sdk-python/pdd_sdk/models.py +518 -0
- package/lib/sdk-python/pdd_sdk/utils.py +759 -0
- package/lib/token/budget-alert.js +367 -0
- package/lib/token/budget-manager.js +485 -0
- package/lib/update.js +54 -0
- package/lib/utils/logger.js +88 -0
- package/lib/verify.js +741 -0
- package/lib/version.js +52 -0
- package/lib/vm/README.md +102 -0
- package/lib/vm/dashboard/api-routes.js +669 -0
- package/lib/vm/dashboard/server.js +391 -0
- package/lib/vm/dashboard/sse.js +358 -0
- package/lib/vm/dashboard/static/css/dashboard.css +1378 -0
- package/lib/vm/dashboard/static/index.html +118 -0
- package/lib/vm/dashboard/static/js/app.js +949 -0
- package/lib/vm/dashboard/static/js/charts.js +913 -0
- package/lib/vm/dashboard/static/js/kanban-view.js +1053 -0
- package/lib/vm/dashboard/static/js/pipeline-view.js +463 -0
- package/lib/vm/dashboard/static/js/quality-view.js +598 -0
- package/lib/vm/dashboard/static/js/system-view.js +1021 -0
- package/lib/vm/data-provider.js +1191 -0
- package/lib/vm/event-bus.js +402 -0
- package/lib/vm/hooks/extract-hook.js +307 -0
- package/lib/vm/hooks/generate-hook.js +374 -0
- package/lib/vm/hooks/hook-interface.js +458 -0
- package/lib/vm/hooks/report-hook.js +331 -0
- package/lib/vm/hooks/verify-hook.js +454 -0
- package/lib/vm/models.js +1003 -0
- package/lib/vm/reconciler.js +855 -0
- package/lib/vm/scanner.js +988 -0
- package/lib/vm/state-schema.js +955 -0
- package/lib/vm/state-store.js +733 -0
- package/lib/vm/tui/components/card.js +339 -0
- package/lib/vm/tui/components/progress-bar.js +368 -0
- package/lib/vm/tui/components/sparkline.js +327 -0
- package/lib/vm/tui/components/status-light.js +294 -0
- package/lib/vm/tui/components/table.js +370 -0
- package/lib/vm/tui/input.js +335 -0
- package/lib/vm/tui/renderer.js +548 -0
- package/lib/vm/tui/screens/kanban-screen.js +397 -0
- package/lib/vm/tui/screens/overview-screen.js +357 -0
- package/lib/vm/tui/screens/quality-screen.js +336 -0
- package/lib/vm/tui/screens/system-screen.js +379 -0
- package/lib/vm/tui/tui.js +805 -0
- package/package.json +1 -0
- package/scripts/cso-analyzer.js +198 -0
- package/scripts/eval-runner.js +359 -0
- package/scripts/i18n-checker.js +109 -0
- package/scripts/linter/activiti-linter.js +272 -0
- package/scripts/linter/prd-linter.js +162 -0
- package/scripts/linter/report-generator.js +207 -0
- package/scripts/linter/run-linters.js +285 -0
- package/scripts/linter/sql-linter.js +166 -0
- package/scripts/token-analyzer.js +162 -0
- package/scripts/vm-test.js +180 -0
- package/skills/core/official-doc-writer/LICENSE +21 -0
- package/skills/core/official-doc-writer/README.md +232 -0
- package/skills/core/official-doc-writer/SKILL.md +475 -0
- package/skills/core/official-doc-writer/_meta.json +1 -0
- package/skills/core/official-doc-writer/document_generator.py +580 -0
- package/skills/core/official-doc-writer/evals/default-evals.json +1 -0
- package/skills/core/official-doc-writer/examples.md +150 -0
- package/skills/core/official-doc-writer/fonts/FONTS_LIST.md +45 -0
- package/skills/core/official-doc-writer/fonts/README.md +141 -0
- package/skills/core/official-doc-writer/fonts/SIMFANG.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMHEI.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMKAI.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMSUN.TTC +0 -0
- package/skills/core/official-doc-writer/fonts//346/226/271/346/255/243/345/260/217/346/240/207/345/256/213GBK.TTF +0 -0
- package/skills/core/official-doc-writer/references/GBT_9704-2012_/345/205/232/346/224/277/346/234/272/345/205/263/345/205/254/346/226/207/346/240/274/345/274/217.md +422 -0
- package/skills/core/official-doc-writer/scripts/__pycache__/generate_official_doc.cpython-313.pyc +0 -0
- package/skills/core/official-doc-writer/scripts/dialog_manager.py +564 -0
- package/skills/core/official-doc-writer/scripts/generate_official_doc.py +252 -0
- package/skills/core/official-doc-writer/scripts/install_fonts.py +390 -0
- package/skills/core/official-doc-writer/scripts/smart_prompts.py +363 -0
- package/skills/core/pdd-ba/SKILL.md +305 -0
- package/skills/core/pdd-ba/_meta.json +1 -0
- package/skills/core/pdd-ba/evals/default-evals.json +1 -0
- package/skills/core/pdd-code-reviewer/SKILL.md +378 -0
- package/skills/core/pdd-code-reviewer/_meta.json +1 -0
- package/skills/core/pdd-code-reviewer/evals/default-evals.json +1 -0
- package/skills/core/pdd-doc-change/SKILL.md +350 -0
- package/skills/core/pdd-doc-change/_meta.json +1 -0
- package/skills/core/pdd-doc-change/evals/default-evals.json +1 -0
- package/skills/core/pdd-doc-gardener/SKILL.md +248 -0
- package/skills/core/pdd-doc-gardener/_meta.json +1 -0
- package/skills/core/pdd-doc-gardener/evals/default-evals.json +1 -0
- package/skills/core/pdd-entropy-reduction/SKILL.md +360 -0
- package/skills/core/pdd-entropy-reduction/_meta.json +1 -0
- package/skills/core/pdd-entropy-reduction/evals/default-evals.json +1 -0
- package/skills/core/pdd-entropy-reduction/references/entropy-report-template.md +287 -0
- package/skills/core/pdd-entropy-reduction/references/golden-principles.md +573 -0
- package/skills/core/pdd-entropy-reduction/scripts/entropy_scan.py +712 -0
- package/skills/core/pdd-extract-features/SKILL.md +320 -0
- package/skills/core/pdd-extract-features/_meta.json +1 -0
- package/skills/core/pdd-extract-features/evals/default-evals.json +1 -0
- package/skills/core/pdd-generate-spec/SKILL.md +418 -0
- package/skills/core/pdd-generate-spec/_meta.json +1 -0
- package/skills/core/pdd-generate-spec/evals/default-evals.json +1 -0
- package/skills/core/pdd-implement-feature/SKILL.md +332 -0
- package/skills/core/pdd-implement-feature/_meta.json +1 -0
- package/skills/core/pdd-implement-feature/evals/default-evals.json +1 -0
- package/skills/core/pdd-main/SKILL.md +540 -0
- package/skills/core/pdd-main/_meta.json +1 -0
- package/skills/core/pdd-main/evals/default-evals.json +1 -0
- package/skills/core/pdd-main/evals/evals.json +215 -0
- package/skills/core/pdd-verify-feature/SKILL.md +474 -0
- package/skills/core/pdd-verify-feature/_meta.json +1 -0
- package/skills/core/pdd-verify-feature/evals/default-evals.json +1 -0
- package/skills/core/pdd-vm/evals/default-evals.json +1 -0
- package/skills/core/traffic-accident-assessor/LICENSE +29 -0
- package/skills/core/traffic-accident-assessor/SKILL.md +439 -0
- package/skills/core/traffic-accident-assessor/evals/evals.json +1 -0
- package/skills/core/traffic-accident-assessor/references/accident-types.md +369 -0
- package/skills/core/traffic-accident-assessor/references/liability-rules.md +287 -0
- package/skills/core/traffic-accident-assessor/references/traffic-laws.md +226 -0
- package/skills/core/traffic-accident-assessor/references//351/253/230/345/260/224/345/244/253/350/257/264/346/230/216/344/271/246.pdf +32576 -106
- package/skills/core/traffic-accident-assessor/scripts/generate_official_statement.py +588 -0
- package/skills/core/traffic-accident-assessor/scripts/generate_report.py +495 -0
- package/skills/core/traffic-accident-assessor/scripts/generate_statement.py +528 -0
- package/skills/core/traffic-accident-assessor.zip +0 -0
- package/skills/entropy/expert-arch-enforcer/SKILL.md +292 -0
- package/skills/entropy/expert-arch-enforcer/_meta.json +1 -0
- package/skills/entropy/expert-arch-enforcer/evals/default-evals.json +1 -0
- package/skills/entropy/expert-auto-refactor/SKILL.md +327 -0
- package/skills/entropy/expert-auto-refactor/_meta.json +1 -0
- package/skills/entropy/expert-auto-refactor/evals/default-evals.json +1 -0
- package/skills/entropy/expert-code-quality/SKILL.md +468 -0
- package/skills/entropy/expert-code-quality/_meta.json +1 -0
- package/skills/entropy/expert-code-quality/evals/default-evals.json +1 -0
- package/skills/entropy/expert-code-quality/evals/evals.json +109 -0
- package/skills/entropy/expert-code-quality/references/code-smells.md +605 -0
- package/skills/entropy/expert-code-quality/references/design-patterns.md +1111 -0
- package/skills/entropy/expert-code-quality/references/refactoring-catalog.md +1281 -0
- package/skills/entropy/expert-code-quality/references/solid-principles.md +524 -0
- package/skills/entropy/expert-entropy-auditor/SKILL.md +276 -0
- package/skills/entropy/expert-entropy-auditor/_meta.json +1 -0
- package/skills/entropy/expert-entropy-auditor/evals/default-evals.json +1 -0
- package/skills/expert/expert-activiti/SKILL.md +497 -0
- package/skills/expert/expert-activiti/_meta.json +1 -0
- package/skills/expert/expert-mysql/SKILL.md +832 -0
- package/skills/expert/expert-mysql/_meta.json +1 -0
- package/skills/expert/expert-performance/SKILL.md +379 -0
- package/skills/expert/expert-performance/_meta.json +1 -0
- package/skills/expert/expert-performance/evals/default-evals.json +1 -0
- package/skills/expert/expert-ruoyi/SKILL.md +472 -0
- package/skills/expert/expert-ruoyi/_meta.json +1 -0
- package/skills/expert/expert-security/SKILL.md +1341 -0
- package/skills/expert/expert-security/_meta.json +1 -0
- package/skills/expert/expert-security/evals/default-evals.json +1 -0
- package/skills/expert/software-architect/SKILL.md +350 -0
- package/skills/expert/software-architect/_meta.json +1 -0
- package/skills/expert/software-engineer/SKILL.md +437 -0
- package/skills/expert/software-engineer/_meta.json +1 -0
- package/skills/expert/software-engineer/architecture.md +130 -0
- package/skills/expert/software-engineer/patterns.md +151 -0
- package/skills/expert/software-engineer/testing.md +135 -0
- package/skills/expert/system-architect/SKILL.md +628 -0
- package/skills/expert/system-architect/_meta.json +1 -0
- package/skills/expert/system-architect/assets/templates/ARCHITECTURE.md +25 -0
- package/skills/expert/system-architect/assets/templates/README.md +44 -0
- package/skills/expert/system-architect/references/js-ts-standards.md +18 -0
- package/skills/expert/system-architect/references/python-standards.md +19 -0
- package/skills/expert/system-architect/references/scaffolding.md +61 -0
- package/skills/expert/system-architect/references/security-checklist.md +21 -0
- package/skills/openspec/openspec-apply-change/SKILL.md +156 -0
- package/skills/openspec/openspec-apply-change/_meta.json +1 -0
- package/skills/openspec/openspec-archive-change/SKILL.md +114 -0
- package/skills/openspec/openspec-archive-change/_meta.json +1 -0
- package/skills/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
- package/skills/openspec/openspec-bulk-archive-change/_meta.json +1 -0
- package/skills/openspec/openspec-continue-change/SKILL.md +118 -0
- package/skills/openspec/openspec-continue-change/_meta.json +1 -0
- package/skills/openspec/openspec-explore/SKILL.md +288 -0
- package/skills/openspec/openspec-explore/_meta.json +1 -0
- package/skills/openspec/openspec-ff-change/SKILL.md +101 -0
- package/skills/openspec/openspec-ff-change/_meta.json +1 -0
- package/skills/openspec/openspec-new-change/SKILL.md +74 -0
- package/skills/openspec/openspec-new-change/_meta.json +1 -0
- package/skills/openspec/openspec-onboard/SKILL.md +554 -0
- package/skills/openspec/openspec-onboard/_meta.json +1 -0
- package/skills/openspec/openspec-sync-specs/SKILL.md +138 -0
- package/skills/openspec/openspec-sync-specs/_meta.json +1 -0
- package/skills/openspec/openspec-verify-change/SKILL.md +168 -0
- package/skills/openspec/openspec-verify-change/_meta.json +1 -0
- package/skills/pr/pdd-multi-review/SKILL.md +534 -0
- package/skills/pr/pdd-multi-review/_meta.json +1 -0
- package/skills/pr/pdd-pr-batch/SKILL.md +303 -0
- package/skills/pr/pdd-pr-batch/_meta.json +1 -0
- package/skills/pr/pdd-pr-create/SKILL.md +344 -0
- package/skills/pr/pdd-pr-create/_meta.json +1 -0
- package/skills/pr/pdd-pr-merge/SKILL.md +286 -0
- package/skills/pr/pdd-pr-merge/_meta.json +1 -0
- package/skills/pr/pdd-pr-review/SKILL.md +217 -0
- package/skills/pr/pdd-pr-review/_meta.json +1 -0
- package/skills/pr/pdd-task-manager/SKILL.md +636 -0
- package/skills/pr/pdd-task-manager/_meta.json +1 -0
- package/skills/pr/pdd-template-engine/SKILL.md +306 -0
- package/skills/pr/pdd-template-engine/_meta.json +1 -0
- package/templates/behavior-shaping/iron-law-template.md +87 -0
- package/templates/behavior-shaping/rationalization-template.md +62 -0
- package/templates/behavior-shaping/red-flags-template.md +70 -0
- package/templates/bilingual-template.md +139 -0
- package/templates/config/default.yaml +47 -0
- package/templates/project/default/README.md +31 -0
- package/templates/project/frontend/README.md +46 -0
- package/templates/project/java/README.md +48 -0
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
交通事故责任认定陈述材料 - GB/T 9704-2012公文格式版生成器
|
|
4
|
+
基于 official-doc-writer 技能的党政机关公文格式标准改造
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
from datetime import datetime
|
|
9
|
+
from docx import Document
|
|
10
|
+
from docx.shared import Inches, Pt, Cm, RGBColor, Twips
|
|
11
|
+
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
|
|
12
|
+
from docx.enum.table import WD_TABLE_ALIGNMENT
|
|
13
|
+
from docx.enum.section import WD_ORIENT
|
|
14
|
+
from docx.oxml.ns import qn, nsdecls
|
|
15
|
+
from docx.oxml import OxmlElement, parse_xml
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ============================================================
|
|
19
|
+
# GB/T 9704-2012 公文格式常量定义
|
|
20
|
+
# ============================================================
|
|
21
|
+
|
|
22
|
+
# 页面参数
|
|
23
|
+
PAGE_WIDTH = Cm(21) # A4宽度
|
|
24
|
+
PAGE_HEIGHT = Cm(29.7) # A4高度
|
|
25
|
+
MARGIN_TOP = Cm(3.7) # 天头 37mm ± 1mm
|
|
26
|
+
MARGIN_BOTTOM = Cm(3.5) # 地脚
|
|
27
|
+
MARGIN_LEFT = Cm(2.8) # 订口 28mm ± 1mm
|
|
28
|
+
MARGIN_RIGHT = Cm(2.6) # 翻口
|
|
29
|
+
|
|
30
|
+
# 字号对照表(磅值)
|
|
31
|
+
FONT_SIZE_ER_HAO = Pt(22) # 二号 — 标题
|
|
32
|
+
FONT_SIZE_SAN_HAO = Pt(16) # 三号 — 正文/一级标题
|
|
33
|
+
FONT_SIZE_SI_HAO = Pt(14) # 四号 — 抄送等
|
|
34
|
+
FONT_SIZE_SI_BAN = Pt(12) # 四号半 — 页码
|
|
35
|
+
|
|
36
|
+
# 字体名称(GB/T 9704-2012 规定字体)
|
|
37
|
+
FONT_TITLE = "方正小标宋简体" # 标题:小标宋体
|
|
38
|
+
FONT_BODY = "仿宋" # 正文:仿宋_GB2312
|
|
39
|
+
FONT_HEADING1 = "黑体" # 一级标题:黑体
|
|
40
|
+
FONT_HEADING2 = "楷体" # 二级标题:楷体_GB2312
|
|
41
|
+
FONT_HEADING3 = "仿宋" # 三级标题:仿宋
|
|
42
|
+
FONT_COPY = "仿宋" # 抄送/印发:仿宋
|
|
43
|
+
FONT_PAGE_NUM = "宋体" # 页码:宋体
|
|
44
|
+
|
|
45
|
+
# 行距参数
|
|
46
|
+
LINE_SPACING_PT = 28.0 # 固定值28磅 ≈ 单倍行距(每页22行)
|
|
47
|
+
CHARS_PER_LINE = 28 # 每行28字
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def set_cell_shading(cell, color):
|
|
51
|
+
"""设置单元格背景色"""
|
|
52
|
+
shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color}"/>')
|
|
53
|
+
cell._tc.get_or_add_tcPr().append(shading)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def set_run_font(run, font_name, font_size, bold=False, color=None, italic=False):
|
|
57
|
+
"""统一设置run的字体属性"""
|
|
58
|
+
run.font.name = font_name
|
|
59
|
+
run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
|
|
60
|
+
run.font.size = font_size
|
|
61
|
+
run.font.bold = bold
|
|
62
|
+
run.font.italic = italic
|
|
63
|
+
if color:
|
|
64
|
+
run.font.color.rgb = color
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def set_paragraph_format(para, line_spacing=LINE_SPACING_PT,
|
|
68
|
+
first_line_indent=None, space_before=Pt(0),
|
|
69
|
+
space_after=Pt(0), alignment=None,
|
|
70
|
+
left_indent=None, right_indent=None):
|
|
71
|
+
"""设置段落格式(符合公文规范)"""
|
|
72
|
+
para.paragraph_format.line_spacing_rule = WD_LINE_SPACING.EXACTLY
|
|
73
|
+
para.paragraph_format.line_spacing = line_spacing
|
|
74
|
+
if first_line_indent:
|
|
75
|
+
para.paragraph_format.first_line_indent = first_line_indent
|
|
76
|
+
else:
|
|
77
|
+
# 正文默认首行缩进2字符(约2cm)
|
|
78
|
+
para.paragraph_format.first_line_indent = Cm(0.85)
|
|
79
|
+
if left_indent is not None:
|
|
80
|
+
para.paragraph_format.left_indent = left_indent
|
|
81
|
+
if right_indent is not None:
|
|
82
|
+
para.paragraph_format.right_indent = right_indent
|
|
83
|
+
para.paragraph_format.space_before = space_before
|
|
84
|
+
para.paragraph_format.space_after = space_after
|
|
85
|
+
if alignment:
|
|
86
|
+
para.alignment = alignment
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def add_doc_title(doc, text):
|
|
90
|
+
"""添加公文式标题(二号小标宋,居中,红色分隔线下空二行)"""
|
|
91
|
+
p = doc.add_paragraph()
|
|
92
|
+
set_paragraph_format(p, first_line_indent=Cm(0), alignment=WD_ALIGN_PARAGRAPH.CENTER,
|
|
93
|
+
space_before=Pt(20), space_after=Pt(16))
|
|
94
|
+
run = p.add_run(text)
|
|
95
|
+
set_run_font(run, FONT_TITLE, FONT_SIZE_ER_HAO, bold=True,
|
|
96
|
+
color=RGBColor(0xFF, 0x00, 0x00)) # 红色标题
|
|
97
|
+
return p
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def add_subtitle(doc, text):
|
|
101
|
+
"""添加副标题"""
|
|
102
|
+
p = doc.add_paragraph()
|
|
103
|
+
set_paragraph_format(p, first_line_indent=Cm(0), alignment=WD_ALIGN_PARAGRAPH.CENTER,
|
|
104
|
+
space_before=Pt(0), space_after=Pt(6))
|
|
105
|
+
run = p.add_run(text)
|
|
106
|
+
set_run_font(run, FONT_BODY, Pt(14), color=RGBColor(0x66, 0x66, 0x66)) # 宋体副标题
|
|
107
|
+
return p
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def add_heading_level1(doc, text):
|
|
111
|
+
# 一级标题:黑体三号,编号"一、"
|
|
112
|
+
p = doc.add_paragraph()
|
|
113
|
+
set_paragraph_format(p, first_line_indent=Cm(0),
|
|
114
|
+
space_before=Pt(12), space_after=Pt(4))
|
|
115
|
+
run = p.add_run(text)
|
|
116
|
+
set_run_font(run, FONT_HEADING1, FONT_SIZE_SAN_HAO, bold=True)
|
|
117
|
+
return p
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def add_heading_level2(doc, text):
|
|
121
|
+
# 二级标题:楷体三号,编号"(一)"
|
|
122
|
+
p = doc.add_paragraph()
|
|
123
|
+
set_paragraph_format(p, first_line_indent=Cm(0),
|
|
124
|
+
space_before=Pt(8), space_after=Pt(3))
|
|
125
|
+
run = p.add_run(text)
|
|
126
|
+
set_run_font(run, FONT_HEADING2, FONT_SIZE_SAN_HAO)
|
|
127
|
+
return p
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def add_heading_level3(doc, text):
|
|
131
|
+
# 三级标题:仿宋三号加粗,编号"1."
|
|
132
|
+
p = doc.add_paragraph()
|
|
133
|
+
set_paragraph_format(p, first_line_indent=Cm(0),
|
|
134
|
+
space_before=Pt(6), space_after=Pt(2))
|
|
135
|
+
run = p.add_run(text)
|
|
136
|
+
set_run_font(run, FONT_HEADING3, FONT_SIZE_SAN_HAO, bold=True)
|
|
137
|
+
return p
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def add_body_text(doc, text, indent=True, bold_parts=None):
|
|
141
|
+
"""正文段落:仿宋三号"""
|
|
142
|
+
p = doc.add_paragraph()
|
|
143
|
+
set_paragraph_format(p, first_line_indent=Cm(0.85) if indent else Cm(0),
|
|
144
|
+
space_before=Pt(0), space_after=Pt(3))
|
|
145
|
+
|
|
146
|
+
if bold_parts:
|
|
147
|
+
# 支持部分文字加粗
|
|
148
|
+
remaining = text
|
|
149
|
+
for bp in bold_parts:
|
|
150
|
+
if bp in remaining:
|
|
151
|
+
parts = remaining.split(bp, 1)
|
|
152
|
+
if parts[0]:
|
|
153
|
+
r1 = p.add_run(parts[0])
|
|
154
|
+
set_run_font(r1, FONT_BODY, FONT_SIZE_SAN_HAO)
|
|
155
|
+
r_bold = p.add_run(bp)
|
|
156
|
+
set_run_font(r_bold, FONT_BODY, FONT_SIZE_SAN_HAO, bold=True)
|
|
157
|
+
remaining = parts[1] if len(parts) > 1 else ""
|
|
158
|
+
if remaining:
|
|
159
|
+
r_last = p.add_run(remaining)
|
|
160
|
+
set_run_font(r_last, FONT_BODY, FONT_SIZE_SAN_HAO)
|
|
161
|
+
else:
|
|
162
|
+
run = p.add_run(text)
|
|
163
|
+
set_run_font(run, FONT_BODY, FONT_SIZE_SAN_HAO)
|
|
164
|
+
return p
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def add_legal_quote_block(doc, article_num, title, content, note=""):
|
|
168
|
+
"""法条引用块(带缩进和特殊格式)"""
|
|
169
|
+
# 条款标题
|
|
170
|
+
p_title = doc.add_paragraph()
|
|
171
|
+
set_paragraph_format(p_title, first_line_indent=Cm(0.5),
|
|
172
|
+
space_before=Pt(8), space_after=Pt(2))
|
|
173
|
+
r1 = p_title.add_run(f"【{article_num}】{title}")
|
|
174
|
+
set_run_font(r1, FONT_HEADING1, Pt(13), bold=True,
|
|
175
|
+
color=RGBColor(0x1A, 0x56, 0xDB))
|
|
176
|
+
|
|
177
|
+
# 引用内容(缩进+斜体)
|
|
178
|
+
p_content = doc.add_paragraph()
|
|
179
|
+
set_paragraph_format(p_content, first_line_indent=Cm(0.85),
|
|
180
|
+
left_indent=Cm(0.5), right_indent=Cm(0.5),
|
|
181
|
+
space_before=Pt(0), space_after=Pt(2))
|
|
182
|
+
r2 = p_content.add_run(content)
|
|
183
|
+
set_run_font(r2, FONT_BODY, Pt(13), italic=True)
|
|
184
|
+
|
|
185
|
+
# 适用说明
|
|
186
|
+
if note:
|
|
187
|
+
p_note = doc.add_paragraph()
|
|
188
|
+
set_paragraph_format(p_note, first_line_indent=Cm(0.5),
|
|
189
|
+
left_indent=Cm(0.5), space_before=Pt(0), space_after=Pt(6))
|
|
190
|
+
r3 = p_note.add_run(f"→ 适用说明:{note}")
|
|
191
|
+
set_run_font(r3, FONT_BODY, Pt(11.5), color=RGBColor(0xC0, 0x60, 0x00))
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def add_info_table(doc, data, header_color="1A56DB"):
|
|
195
|
+
"""创建信息表格(公文风格)"""
|
|
196
|
+
table = doc.add_table(rows=len(data), cols=len(data[0]))
|
|
197
|
+
table.style = 'Table Grid'
|
|
198
|
+
for i, row_data in enumerate(data):
|
|
199
|
+
for j, cell_text in enumerate(row_data):
|
|
200
|
+
cell = table.rows[i].cells[j]
|
|
201
|
+
cell.text = cell_text
|
|
202
|
+
for p in cell.paragraphs:
|
|
203
|
+
for run in p.runs:
|
|
204
|
+
set_run_font(run, FONT_BODY, Pt(10.5))
|
|
205
|
+
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
206
|
+
if i == 0:
|
|
207
|
+
set_cell_shading(cell, header_color)
|
|
208
|
+
for p in cell.paragraphs:
|
|
209
|
+
for run in p.runs:
|
|
210
|
+
run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
|
|
211
|
+
run.bold = True
|
|
212
|
+
return table
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def add_separator_line(doc, color="FF0000", width_pt=0.75):
|
|
216
|
+
"""添加红色分隔线"""
|
|
217
|
+
p = doc.add_paragraph()
|
|
218
|
+
set_paragraph_format(p, first_line_indent=Cm(0),
|
|
219
|
+
space_before=Pt(4), space_after=Pt(4))
|
|
220
|
+
# 底部边框模拟分隔线
|
|
221
|
+
pPr = p._p.get_or_add_pPr()
|
|
222
|
+
pBdr = OxmlElement('w:pBdr')
|
|
223
|
+
bottom = OxmlElement('w:bottom')
|
|
224
|
+
bottom.set(qn('w:val'), 'single')
|
|
225
|
+
bottom.set(qn('w:sz'), str(int(width_pt * 8))) # 转换为八分之一磅
|
|
226
|
+
bottom.set(qn('w:space'), '4')
|
|
227
|
+
bottom.set(qn('w:color'), color)
|
|
228
|
+
pBdr.append(bottom)
|
|
229
|
+
pPr.append(pBdr)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def generate_official_statement(output_path):
|
|
233
|
+
"""生成 GB/T 9704-2012 格式的责任认定陈述材料"""
|
|
234
|
+
|
|
235
|
+
doc = Document()
|
|
236
|
+
|
|
237
|
+
# ========== 页面设置(GB/T 9704-2012)==========
|
|
238
|
+
section = doc.sections[0]
|
|
239
|
+
section.page_width = PAGE_WIDTH
|
|
240
|
+
section.page_height = PAGE_HEIGHT
|
|
241
|
+
section.top_margin = MARGIN_TOP
|
|
242
|
+
section.bottom_margin = MARGIN_BOTTOM
|
|
243
|
+
section.left_margin = MARGIN_LEFT
|
|
244
|
+
section.right_margin = MARGIN_RIGHT
|
|
245
|
+
|
|
246
|
+
# 设置默认字体
|
|
247
|
+
style = doc.styles['Normal']
|
|
248
|
+
style.font.name = FONT_BODY
|
|
249
|
+
style.font.size = FONT_SIZE_SAN_HAO
|
|
250
|
+
style._element.rPr.rFonts.set(qn('w:eastAsia'), FONT_BODY)
|
|
251
|
+
|
|
252
|
+
# ==================== 版头区域 ====================
|
|
253
|
+
|
|
254
|
+
# 发文机关标志(红色)
|
|
255
|
+
header_p = doc.add_paragraph()
|
|
256
|
+
set_paragraph_format(header_p, first_line_indent=Cm(0),
|
|
257
|
+
alignment=WD_ALIGN_PARAGRAPH.CENTER,
|
|
258
|
+
space_before=Pt(10), space_after=Pt(4))
|
|
259
|
+
hr = header_p.add_run("交通事故当事人陈述材料")
|
|
260
|
+
set_run_font(hr, FONT_TITLE, Pt(18), color=RGBColor(0xCC, 0x00, 0x00))
|
|
261
|
+
|
|
262
|
+
# 红色分隔线
|
|
263
|
+
add_separator_line(doc, "CC0000", 1.0)
|
|
264
|
+
|
|
265
|
+
# ==================== 标题 ====================
|
|
266
|
+
add_doc_title(doc, "关于2026年__月__日丁字路口碰撞事故")
|
|
267
|
+
add_doc_title(doc, "的责任认定陈述意见")
|
|
268
|
+
|
|
269
|
+
# 副标题
|
|
270
|
+
add_subtitle(doc, "——申请人:辽A·87FG5 驾驶人")
|
|
271
|
+
|
|
272
|
+
# 空行
|
|
273
|
+
doc.add_paragraph()
|
|
274
|
+
|
|
275
|
+
# ==================== 主送机关 ====================
|
|
276
|
+
recip_p = doc.add_paragraph()
|
|
277
|
+
set_paragraph_format(recip_p, first_line_indent=Cm(0),
|
|
278
|
+
space_before=Pt(0), space_after=Pt(6))
|
|
279
|
+
rr = recip_p.add_run("___________公安局交通警察支队:")
|
|
280
|
+
set_run_font(rr, FONT_BODY, FONT_SIZE_SAN_HAO, bold=True)
|
|
281
|
+
|
|
282
|
+
# ==================== 正文开头 ====================
|
|
283
|
+
opening = (
|
|
284
|
+
"本人系2026年__月__日在____路口发生的道路交通事故的当事人之一"
|
|
285
|
+
"(驾驶辽A·87FG5号大众高尔夫轿车)。"
|
|
286
|
+
"现就本次事故的责任认定问题,根据《中华人民共和国道路交通安全法》"
|
|
287
|
+
"及相关法律法规之规定,提出如下陈述意见。"
|
|
288
|
+
)
|
|
289
|
+
add_body_text(doc, opening)
|
|
290
|
+
|
|
291
|
+
# ==================== 第一部分 ====================
|
|
292
|
+
add_heading_level1(doc, "一、事故基本事实")
|
|
293
|
+
|
|
294
|
+
# 当事人信息表格
|
|
295
|
+
info_data = [
|
|
296
|
+
["项目", "申请人(甲方)", "对方当事人(乙方)"],
|
|
297
|
+
["车辆信息", "大众高尔夫\n车牌:辽A·87FG5\n颜色:金色", "灰色SUV\n(疑似奥迪电动SUV)\n颜色:深灰"],
|
|
298
|
+
["行驶方向", "由南向北行驶后左转", "沿横向道路直行"],
|
|
299
|
+
["事发行为", "在无信号灯丁字路口左转", "直行通过路口"],
|
|
300
|
+
["车辆受损", "右侧车身凹陷、右后窗破碎\n侧面安全气囊弹出", "前部右侧受损"],
|
|
301
|
+
]
|
|
302
|
+
add_info_table(doc, info_data)
|
|
303
|
+
doc.add_paragraph()
|
|
304
|
+
|
|
305
|
+
add_body_text(doc, "经现场确认,事故发生于城市道路上的一处无交通信号灯控制、")
|
|
306
|
+
add_body_text(doc, "亦无交通警察指挥的丁字路口。事发时间为白天,天气晴朗,")
|
|
307
|
+
add_body_text(doc, "能见度良好。该路段视野开阔,路面划设有车道分隔标线,")
|
|
308
|
+
add_body_text(doc, "远处可见限速50km/h标志牌。两车在路口区域内发生碰撞,")
|
|
309
|
+
add_body_text(doc, "呈典型T型碰撞形态(对方车前部撞击申请人车辆右侧车门区域)。")
|
|
310
|
+
|
|
311
|
+
# 关键事实分项
|
|
312
|
+
add_heading_level2(doc, "(一)关键事实确认")
|
|
313
|
+
|
|
314
|
+
facts = [
|
|
315
|
+
("1.", "碰撞形态事实",
|
|
316
|
+
"对方车辆前部右侧撞击申请人车辆右侧副驾驶位车门/B柱/右后门区域,"
|
|
317
|
+
"造成右后侧窗完全破碎、车身严重凹陷、侧面安全气囊弹出。"
|
|
318
|
+
"上述事实有现场照片4张为证。"),
|
|
319
|
+
("2.", "气囊弹出事实",
|
|
320
|
+
"申请人车辆的侧面安全气囊已在事故中触发并弹出。"
|
|
321
|
+
"根据大众汽车《高尔夫使用说明书》(第77页)技术规定:"
|
|
322
|
+
'"安全气囊是否触发取决于碰撞时轿车的减速度和电子控制单元预设的'
|
|
323
|
+
'减速度基准值",且明确记载"轻度侧面碰撞时不会触发侧面安全气囊"。'
|
|
324
|
+
"本次气囊已触发的事实表明碰撞能量较大。"),
|
|
325
|
+
("3.", "关于对方车速的主张",
|
|
326
|
+
"据申请人观察及综合判断,对方车辆在通过路口过程中未见明显减速迹象。"
|
|
327
|
+
"鉴于碰撞力度足以触发精密的安全气囊系统,"
|
|
328
|
+
"申请人保留对对方事发时行驶速度提出司法鉴定的权利。"),
|
|
329
|
+
]
|
|
330
|
+
|
|
331
|
+
for num, title, content in facts:
|
|
332
|
+
hp3 = doc.add_paragraph()
|
|
333
|
+
set_paragraph_format(hp3, first_line_indent=Cm(0),
|
|
334
|
+
space_before=Pt(6), space_after=Pt(1))
|
|
335
|
+
hr_num = hp3.add_run(f"{num}{title}")
|
|
336
|
+
set_run_font(hr_num, FONT_BODY, FONT_SIZE_SAN_HAO, bold=True)
|
|
337
|
+
|
|
338
|
+
cp = doc.add_paragraph()
|
|
339
|
+
set_paragraph_format(cp, space_before=Pt(0), space_after=Pt(4))
|
|
340
|
+
cr = cp.add_run(content)
|
|
341
|
+
set_run_font(cr, FONT_BODY, FONT_SIZE_SAN_HAO)
|
|
342
|
+
|
|
343
|
+
# ==================== 第二部分 ====================
|
|
344
|
+
add_heading_level1(doc, "二、法律法规依据")
|
|
345
|
+
|
|
346
|
+
add_heading_level2(doc, "(一)认定申请人主要责任的法规")
|
|
347
|
+
|
|
348
|
+
add_legal_quote_block(doc,
|
|
349
|
+
"《道路交通安全法实施条例》第52条第(三)项",
|
|
350
|
+
"机动车通过没有交通信号灯控制也没有交通警察指挥的交叉路口... "
|
|
351
|
+
"(三)转弯的机动车让直行的车辆先行。",
|
|
352
|
+
"本案核心法条。申请人作为转弯方违反此强制性规定,是导致事故发生的根本原因。")
|
|
353
|
+
|
|
354
|
+
add_legal_quote_block(doc,
|
|
355
|
+
"《道路交通安全法》第22条第1款",
|
|
356
|
+
"机动车驾驶人应当遵守道路交通安全法律、法规的规定,"
|
|
357
|
+
"按照操作规范安全驾驶、文明驾驶。",
|
|
358
|
+
"转弯前的观察、减速、让行均属于'按操作规范安全驾驶'的具体要求。")
|
|
359
|
+
|
|
360
|
+
add_heading_level2(doc, "(二)认定对方次要责任的法规 ★★★")
|
|
361
|
+
|
|
362
|
+
add_body_text(doc, "以下法条构成论证对方应承担次要责任的法律基础:")
|
|
363
|
+
|
|
364
|
+
add_legal_quote_block(doc,
|
|
365
|
+
"《道路交通安全法》第22条第1款",
|
|
366
|
+
"机动车驾驶人应当遵守道路交通安全法律、法规的规定,"
|
|
367
|
+
"按照操作规范安全驾驶、文明驾驶。",
|
|
368
|
+
"此为交通安全法的'帝王条款'。'安全驾驶'包含在不同道路环境下采取合理速度、"
|
|
369
|
+
"保持充分注意力、对潜在危险做出合理预判等义务。"
|
|
370
|
+
"通过无信号灯交叉路口时适当减速观察,属于'安全驾驶'义务的具体内涵。")
|
|
371
|
+
|
|
372
|
+
add_legal_quote_block(doc,
|
|
373
|
+
"《道路交通安全法》第38条",
|
|
374
|
+
"车辆、行人应当按照交通信号通行;遇有交通警察现场指挥时,应当按照"
|
|
375
|
+
"交通警察的指挥通行;在没有交通信号的道路上,应当在确保安全、畅通的原则下通行。",
|
|
376
|
+
"'确保安全'原则要求所有道路使用者以安全方式通行。"
|
|
377
|
+
"直行车虽享有优先权,但'优先'不等于'免责'——仍须以合理方式行使路权。")
|
|
378
|
+
|
|
379
|
+
add_legal_quote_block(doc,
|
|
380
|
+
"《道路交通安全法实施条例》第52条第(二)项",
|
|
381
|
+
"...(二)没有交通标志、标线控制的,在进入路口前停车瞭望,"
|
|
382
|
+
"让右方道路的来车先行...",
|
|
383
|
+
"其中确立的'瞭望义务'对所有通过无信号灯路口的车辆均有参照意义。"
|
|
384
|
+
"'瞭望'意味着需要降低车速以确保有足够时间观察和反应。")
|
|
385
|
+
|
|
386
|
+
add_legal_quote_block(doc,
|
|
387
|
+
"《道路交通事故处理程序规定》第60条第(二)项",
|
|
388
|
+
"因两方或者两方以上当事人的过错发生道路交通事故的,"
|
|
389
|
+
"根据其行为对事故发生的作用以及过错的严重程度,"
|
|
390
|
+
"分别承担主要责任、同等责任和次要责任。",
|
|
391
|
+
"本条明确承认双方均可有过错并按比例承担责任。"
|
|
392
|
+
"只要证明对方存在过错且该行为与事故有关联,即可认定其次要责任。")
|
|
393
|
+
|
|
394
|
+
# ==================== 第三部分 ====================
|
|
395
|
+
add_heading_level1(doc, "三、对方应承担次要责任的论证")
|
|
396
|
+
|
|
397
|
+
add_heading_level2(doc, "(一)论点一:未充分减速,违反安全驾驶义务")
|
|
398
|
+
|
|
399
|
+
arg1 = (
|
|
400
|
+
"申请人车辆侧面安全气囊已弹出这一客观事实,是本论点的核心技术支撑。"
|
|
401
|
+
"根据大众汽车官方说明书的技术参数:(1)气囊触发取决于碰撞减速度是否达到"
|
|
402
|
+
"ECU预设阈值;(2)轻度侧面碰撞不触发侧面气囊;(3)无法确定单一触发车速,"
|
|
403
|
+
"但触发的必要条件是足够的碰撞能量。T型碰撞中,合成碰撞速度等于双方速度矢量之和。"
|
|
404
|
+
"申请人处于低速转弯状态(通常15-25km/h),若对方也以正常谨慎速度(如20-30km/h)通过,"
|
|
405
|
+
"则合成碰撞速度通常不足以触发侧面气囊。气囊实际触发的事实强烈暗示——"
|
|
406
|
+
"至少一方速度偏高,而对方作为直行车且驾驶质量更大的SUV,"
|
|
407
|
+
"更有可能是速度偏高的一方。"
|
|
408
|
+
)
|
|
409
|
+
add_body_text(doc, arg1)
|
|
410
|
+
|
|
411
|
+
add_heading_level2(doc, "(二)论点二:未尽合理观察和避让义务")
|
|
412
|
+
|
|
413
|
+
arg2 = (
|
|
414
|
+
"从碰撞形态分析,对方车辆以车头前方撞击申请人右侧车门区域,"
|
|
415
|
+
"说明碰撞瞬间对方几乎没有转向避让或有效制动。即使直行车依法享有优先通行权,"
|
|
416
|
+
"该权利的行使必须以'合理方式'为边界。'路权'不等于'绝对豁免权'。"
|
|
417
|
+
"直行车同样负有观察路况、注意其他道路使用者、必要时采取避让措施的义务。"
|
|
418
|
+
"如果对方在可见距离内能够发现正在转弯的申请人车辆却未减速避让,"
|
|
419
|
+
"即构成'未尽合理注意义务'。参照多地法院类案裁判,"
|
|
420
|
+
"优先权方未尽注意义务且与损害后果有因果关系的,应承担相应比例责任。"
|
|
421
|
+
)
|
|
422
|
+
add_body_text(doc, arg2)
|
|
423
|
+
|
|
424
|
+
add_heading_level2(doc, "(三)论点三:重型车辆应负有更高注意义务")
|
|
425
|
+
|
|
426
|
+
arg3 = (
|
|
427
|
+
"经查,申请人驾驶的大众高尔夫整备质量约1250-1350kg,"
|
|
428
|
+
"对方驾驶的电动SUV整备质量约2000-2200kg,质量差异达60%-75%。"
|
|
429
|
+
"根据动量守恒定律,在相同速度下对方车辆携带的动能是申请人的1.6至1.75倍。"
|
|
430
|
+
"更重的车辆在碰撞中将传递更大的能量给较轻的一方。"
|
|
431
|
+
"因此,驾驶重型车辆通过潜在冲突区域时,理应以更高的谨慎标准履行注意义务。"
|
|
432
|
+
"对方未能因其车辆的质量优势而额外谨慎,亦属过失范畴。"
|
|
433
|
+
)
|
|
434
|
+
add_body_text(doc, arg3)
|
|
435
|
+
|
|
436
|
+
# ==================== 第四部分:责任比例建议 ====================
|
|
437
|
+
add_heading_level1(doc, "四、责任比例建议")
|
|
438
|
+
|
|
439
|
+
add_heading_level2(doc, "(一)推荐方案")
|
|
440
|
+
|
|
441
|
+
ratio_data = [
|
|
442
|
+
["方案类型", "申请人(甲方)", "对方(乙方)", "适用条件"],
|
|
443
|
+
["保守方案", "主要责任(80%)", "次要责任(20%)", "对方仅轻微过失"],
|
|
444
|
+
["推荐方案 ★", "主要责任(70%)", "次要责任(30%)", "对方存在明显未减速/未避让情形"],
|
|
445
|
+
["乐观方案", "主要责任(65%)", "次要责任(35%)", "对方被鉴定为超速或有其他严重过失"],
|
|
446
|
+
]
|
|
447
|
+
t_ratio = add_info_table(doc, ratio_data, "2E7D32")
|
|
448
|
+
doc.add_paragraph()
|
|
449
|
+
|
|
450
|
+
add_heading_level2(doc, "(二)推荐方案的确定依据")
|
|
451
|
+
|
|
452
|
+
basis_items = [
|
|
453
|
+
"申请人过错值约7分:违反《实施条例》第52条第3项(转弯让直行),"
|
|
454
|
+
"属路权级违法,直接原因,因果系数≈1.0。",
|
|
455
|
+
"对方过错值约3分:违反《道交法》第22条(安全驾驶概括义务),"
|
|
456
|
+
"属安全驾驶级违法,加重损害的条件因素,因果系数≈0.3-0.5。",
|
|
457
|
+
"过错比值约为7:3,对应责任比例70%:30%。",
|
|
458
|
+
"参照各地法院类似T型碰撞案件的裁判倾向,"
|
|
459
|
+
"直行车因未充分履行安全驾驶义务而承担20%-35%次责具有充分的先例支持。",
|
|
460
|
+
]
|
|
461
|
+
for bi in basis_items:
|
|
462
|
+
bp = doc.add_paragraph()
|
|
463
|
+
set_paragraph_format(bp, space_before=Pt(0), space_after=Pt(2))
|
|
464
|
+
br = bp.add_run(f"• {bi}")
|
|
465
|
+
set_run_font(br, FONT_BODY, FONT_SIZE_SAN_HAO)
|
|
466
|
+
|
|
467
|
+
# ==================== 第五部分:申请事项 ====================
|
|
468
|
+
add_heading_level1(doc, "五、正式申请事项")
|
|
469
|
+
|
|
470
|
+
applications = [
|
|
471
|
+
("(一)", "申请委托具备资质的司法鉴定机构对双方车辆事发时的行驶速度进行技术鉴定。",
|
|
472
|
+
"依据:《道路交通事故处理程序规定》第37条"),
|
|
473
|
+
("(二)", "申请调取事故现场及周边所有交通监控摄像头录像。",
|
|
474
|
+
"依据:《道路交通事故处理程序规定》第29条"),
|
|
475
|
+
("(三)", "申请读取申请人车辆安全气囊控制单元数据(如技术可行)。",
|
|
476
|
+
"依据:气囊弹出数据可作为碰撞强度的客观记录"),
|
|
477
|
+
("(四)", "请求在责任认定中充分考虑对方未充分减速、未尽合理避让义务的过错因素。",
|
|
478
|
+
"依据:《道交法》第22条 + 《实施条例》第52条 + 《程序规定》第60条"),
|
|
479
|
+
("(五)", "如最终认定对方承担次要责任,恳请在《道路交通事故认定书中》"
|
|
480
|
+
"明确载明对方的具体过错行为及责任比例。",
|
|
481
|
+
"依据:《程序规定》第62条"),
|
|
482
|
+
]
|
|
483
|
+
|
|
484
|
+
for num, app_content, app_basis in applications:
|
|
485
|
+
ap = doc.add_paragraph()
|
|
486
|
+
set_paragraph_format(ap, first_line_indent=Cm(0),
|
|
487
|
+
space_before=Pt(6), space_after=Pt(1))
|
|
488
|
+
ar = ap.add_run(f"{num}{app_content}")
|
|
489
|
+
set_run_font(ar, FONT_BODY, FONT_SIZE_SAN_HAO, bold=True)
|
|
490
|
+
|
|
491
|
+
abp = doc.add_paragraph()
|
|
492
|
+
set_paragraph_format(abp, left_indent=Cm(0.8),
|
|
493
|
+
space_before=Pt(0), space_after=Pt(4))
|
|
494
|
+
abr = abp.add_run(f"法定依据:{app_basis}")
|
|
495
|
+
set_run_font(abr, FONT_BODY, Pt(11), color=RGBColor(0x66, 0x66, 0x66))
|
|
496
|
+
|
|
497
|
+
# ==================== 结语 ====================
|
|
498
|
+
doc.add_paragraph() # 空行
|
|
499
|
+
|
|
500
|
+
closing_text = (
|
|
501
|
+
"以上陈述意见,恳请贵队在作出事故责任认定时予以充分考虑。"
|
|
502
|
+
"申请人愿意配合贵队的进一步调查工作,并提供一切必要的协助。\n"
|
|
503
|
+
)
|
|
504
|
+
add_body_text(doc, closing_text)
|
|
505
|
+
|
|
506
|
+
closing_end = doc.add_paragraph()
|
|
507
|
+
set_paragraph_format(closing_end, first_line_indent=Cm(0),
|
|
508
|
+
space_before=Pt(16), space_after=Pt(0))
|
|
509
|
+
cer = closing_end.add_run("特此陈述。")
|
|
510
|
+
set_run_font(cer, FONT_BODY, FONT_SIZE_SAN_HAO, bold=True)
|
|
511
|
+
|
|
512
|
+
# 署名区
|
|
513
|
+
doc.add_paragraph() # 空
|
|
514
|
+
doc.add_paragraph() # 空
|
|
515
|
+
|
|
516
|
+
sign_p = doc.add_paragraph()
|
|
517
|
+
set_paragraph_format(sign_p, first_line_indent=Cm(0),
|
|
518
|
+
alignment=WD_ALIGN_PARAGRAPH.RIGHT,
|
|
519
|
+
space_before=Pt(0), space_after=Pt(0))
|
|
520
|
+
sr = sign_p.add_run("\n\n\n申请人(签字):________________")
|
|
521
|
+
set_run_font(sr, FONT_BODY, FONT_SIZE_SAN_HAO)
|
|
522
|
+
|
|
523
|
+
contact_p = doc.add_paragraph()
|
|
524
|
+
set_paragraph_format(contact_p, first_line_indent=Cm(0),
|
|
525
|
+
alignment=WD_ALIGN_PARAGRAPH.RIGHT,
|
|
526
|
+
space_before=Pt(8), space_after=Pt(0))
|
|
527
|
+
cr = contact_p.add_run("联系电话:________________")
|
|
528
|
+
set_run_font(cr, FONT_BODY, FONT_SIZE_SAN_HAO)
|
|
529
|
+
|
|
530
|
+
date_p = doc.add_paragraph()
|
|
531
|
+
set_paragraph_format(date_p, first_line_indent=Cm(0),
|
|
532
|
+
alignment=WD_ALIGN_PARAGRAPH.RIGHT,
|
|
533
|
+
space_before=Pt(8), space_after=Pt(0))
|
|
534
|
+
dr = date_p.add_run("日期: 年 月 日")
|
|
535
|
+
set_run_font(dr, FONT_BODY, FONT_SIZE_SAN_HAO)
|
|
536
|
+
|
|
537
|
+
# ==================== 版记区域 ====================
|
|
538
|
+
doc.add_page_break()
|
|
539
|
+
|
|
540
|
+
# 版记分隔线(粗线)
|
|
541
|
+
add_separator_line(doc, "000000", 0.75)
|
|
542
|
+
|
|
543
|
+
# 附件清单
|
|
544
|
+
att_h = doc.add_paragraph()
|
|
545
|
+
set_paragraph_format(att_h, first_line_indent=Cm(0),
|
|
546
|
+
space_before=Pt(8), space_after=Pt(6))
|
|
547
|
+
atr = att_h.add_run("附件")
|
|
548
|
+
set_run_font(atr, FONT_HEADING1, FONT_SIZE_SAN_HAO, bold=True)
|
|
549
|
+
|
|
550
|
+
attachments = [
|
|
551
|
+
"1. 事故现场照片(4张)",
|
|
552
|
+
"2. 申请人车辆行驶证复印件",
|
|
553
|
+
"3. 申请人驾驶证复印件",
|
|
554
|
+
"4. 《高尔夫使用说明书》相关页面摘录(第74-81页)",
|
|
555
|
+
"5. 车辆维修初步报价单(如有)",
|
|
556
|
+
"6. 气囊弹出检测报告(如有)",
|
|
557
|
+
]
|
|
558
|
+
|
|
559
|
+
for att in attachments:
|
|
560
|
+
atp = doc.add_paragraph()
|
|
561
|
+
set_paragraph_format(atp, first_line_indent=Cm(0),
|
|
562
|
+
left_indent=Cm(0.5), space_before=Pt(0), space_after=Pt(2))
|
|
563
|
+
atrun = atp.add_run(att)
|
|
564
|
+
set_run_font(atrun, FONT_BODY, FONT_SIZE_SAN_HAO)
|
|
565
|
+
|
|
566
|
+
# 版记下分隔线(细线)
|
|
567
|
+
add_separator_line(doc, "000000", 0.5)
|
|
568
|
+
|
|
569
|
+
# 印发机关和日期
|
|
570
|
+
print_p = doc.add_paragraph()
|
|
571
|
+
set_paragraph_format(print_p, first_line_indent=Cm(0),
|
|
572
|
+
space_before=Pt(6), space_after=Pt(0))
|
|
573
|
+
pr = print_p.add_run("(共7页)")
|
|
574
|
+
set_run_font(pr, FONT_BODY, FONT_SIZE_SI_HAO, color=RGBColor(0x88, 0x88, 0x88))
|
|
575
|
+
|
|
576
|
+
# 保存
|
|
577
|
+
doc.save(output_path)
|
|
578
|
+
print(f"\n{'='*60}")
|
|
579
|
+
print(f"✅ GB/T 9704-2012 格式化陈述材料已生成")
|
|
580
|
+
print(f"📄 文件路径: {output_path}")
|
|
581
|
+
print(f"{'='*60}")
|
|
582
|
+
return output_path
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
if __name__ == "__main__":
|
|
586
|
+
output_file = r"c:\Users\wonder\trae-projects\skills\skills\traffic-accident-assessor\output\交通事故责任认定陈述材料_辽A87FG5_公文格式版.docx"
|
|
587
|
+
os.makedirs(os.path.dirname(output_file), exist_ok=True)
|
|
588
|
+
generate_official_statement(output_file)
|