File size: 4,916 Bytes
b4f2238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
"""
批量填充任务与填充记录模型

本模块定义 BatchFillTask (批量填充任务) 和 FillRecord (填充记录) 数据模型,
用于记录外部模板的填充操作历史.

Requirements: 14.6, 15.2, 15.4, 16.5, 18.1, 18.2
"""

from __future__ import annotations

import logging
from typing import ClassVar

from django.db import models
from django.utils.translation import gettext_lazy as _

from .external_template import ExternalTemplate

logger: logging.Logger = logging.getLogger(__name__)


class BatchFillTask(models.Model):
    """
    批量填充任务

    记录一次批量填充操作的元数据, 包含案件、选择的模板列表、
    操作者、时间、ZIP 文件路径和汇总报告.

    Requirements: 14.6, 16.5
    """

    id: int
    case = models.ForeignKey(
        "cases.Case",
        on_delete=models.CASCADE,
        verbose_name=_("关联案件"),
        help_text=_("批量填充关联的案件"),
    )
    templates = models.ManyToManyField(
        ExternalTemplate,
        verbose_name=_("选择的模板"),
        help_text=_("本次批量填充选择的外部模板"),
    )
    initiated_by = models.ForeignKey(
        "organization.Lawyer",
        on_delete=models.SET_NULL,
        null=True,
        verbose_name=_("操作者"),
        related_name="initiated_batch_fill_tasks",
    )
    started_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name=_("发起时间"),
    )
    finished_at = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name=_("完成时间"),
    )
    zip_file_path = models.CharField(
        max_length=500,
        blank=True,
        default="",
        verbose_name=_("ZIP文件路径"),
        help_text=_("批量填充生成的 ZIP 压缩包路径"),
    )
    summary_json = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_("汇总报告"),
        help_text=_("批量填充的汇总报告 JSON"),
    )

    class Meta:
        app_label = "documents"
        verbose_name = _("批量填充任务")
        verbose_name_plural = _("批量填充任务")
        ordering: ClassVar = ["-started_at"]

    def __str__(self) -> str:
        return f"BatchFillTask #{self.id}"


class FillRecord(models.Model):
    """
    填充记录

    记录单次填充操作的历史, 包含案件、模板、当事人、操作者、
    时间、生成文件路径、填充报告和自定义填充值.

    Requirements: 15.2, 15.4, 18.1, 18.2
    """

    id: int
    batch_task = models.ForeignKey(
        BatchFillTask,
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name="records",
        verbose_name=_("批量任务"),
        help_text=_("所属的批量填充任务, 单次填充时为空"),
    )
    case = models.ForeignKey(
        "cases.Case",
        on_delete=models.CASCADE,
        verbose_name=_("关联案件"),
    )
    template = models.ForeignKey(
        ExternalTemplate,
        on_delete=models.CASCADE,
        verbose_name=_("关联模板"),
    )
    party = models.ForeignKey(
        "cases.CaseParty",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_("关联当事人"),
    )
    filled_by = models.ForeignKey(
        "organization.Lawyer",
        on_delete=models.SET_NULL,
        null=True,
        verbose_name=_("操作者"),
        related_name="fill_records",
    )
    filled_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name=_("填充时间"),
    )
    file_path = models.CharField(
        max_length=500,
        verbose_name=_("生成文件路径"),
        help_text=_("填充生成的文件相对于 MEDIA_ROOT 的路径"),
    )
    original_output_name = models.CharField(
        max_length=255,
        verbose_name=_("输出文件名"),
        help_text=_("填充生成的文件原始名称"),
    )
    report_json = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_("填充报告"),
        help_text=_("填充操作的详细报告 JSON"),
    )
    custom_values = models.JSONField(
        default=dict,
        blank=True,
        verbose_name=_("自定义填充值"),
        help_text=_("用户手动输入的自定义字段值"),
    )
    file_available = models.BooleanField(
        default=True,
        verbose_name=_("文件是否可用"),
        help_text=_("生成的文件是否仍然可访问"),
    )

    class Meta:
        app_label = "documents"
        verbose_name = _("填充记录")
        verbose_name_plural = _("填充记录")
        ordering: ClassVar = ["-filled_at"]
        indexes: ClassVar = [
            models.Index(fields=["case", "-filled_at"]),
            models.Index(fields=["template", "-filled_at"]),
        ]

    def __str__(self) -> str:
        return f"FillRecord #{self.id}"