feat: 交叉评查后端优化 — 评查地区、文档评查统计、currentScore、错误提示
- GetUserTasks: 新增 task_regions CTE,从任务成员 sso_users.area 去重收集 evaluationRegion - GetTaskDocuments: 新增 es LATERAL 子查询聚合 leaudit_rule_results 的 pass_count/warning_count/error_count/score_percent;path/uploadTime 改为从 leaudit_document_files 获取;新增 fileExt - ReviewPointResultVO: 新增 currentScore 字段 - _loadReviewPointResults: SQL 新增 approved_delta LATERAL 子查询,currentScore = base_score + SUM(approved_deltas) - CrossReviewTaskItemVO: 新增 evaluationRegion - CrossReviewTaskDocumentVO: 新增 18 个评查统计字段 + path/uploadTime/fileExt - 文档更新:交叉评查核心模块业务逻辑文档补充评查地区、评查统计、版本号本地化等章节
This commit is contained in:
@@ -49,11 +49,13 @@
|
||||
|----|------|------|
|
||||
| `id` | INT PK | |
|
||||
| `task_id` | INT FK → tasks | 所属任务 |
|
||||
| `document_id` | INT | 关联的文档 ID |
|
||||
| `audit_status` | INT | 评查状态:`0`=未完成,`1`=已完成 |
|
||||
| `document_id` | INT | 关联的文档 ID(FK → `leaudit_documents.id`) |
|
||||
| `audit_status` | INT | 评查状态:`0`=未评查,`1`=已评查(**文档×任务级别**,非按人) |
|
||||
| `create_time` | TIMESTAMPTZ | |
|
||||
| `delete_time` | TIMESTAMPTZ | |
|
||||
|
||||
> **评查状态逻辑**:`CompleteTaskDocument` 将 `audit_status` 置为 1。当任务内全部文档的 `audit_status=1` 时,任务状态自动更新为 `completed`。
|
||||
|
||||
### 1.4 `leaudit_cross_review_proposals` — 交叉评查提案(意见)
|
||||
|
||||
| 列 | 类型 | 说明 |
|
||||
@@ -83,6 +85,25 @@
|
||||
| `create_time` | TIMESTAMPTZ | |
|
||||
| `delete_time` | TIMESTAMPTZ | |
|
||||
|
||||
### 1.6 依赖的外部表
|
||||
|
||||
任务列表和文档列表的查询依赖以下外部表(非交叉评查专属):
|
||||
|
||||
| 表 | 用途 |
|
||||
|----|------|
|
||||
| `sso_users` | 用户信息;`area` 字段用于收集任务成员的评查地区 |
|
||||
| `leaudit_documents` | 文档主表;含 `version_no`(全局版本号)、`version_group_key`、`current_run_id` |
|
||||
| `leaudit_document_files` | 文档文件;第一个文件的 `local_path` 和 `created_at` 作为文档路径和上传时间 |
|
||||
| `leaudit_rule_results` | 评查规则结果;聚合 `passed`/`risk`/`score`/`fail_message` 得出评查统计 |
|
||||
| `leaudit_audit_runs` | 评查运行记录;通过 `d.current_run_id` 关联 |
|
||||
|
||||
> **评查地区数据来源**:`GetUserTasks` 中 `task_regions` CTE 从 `leaudit_cross_review_task_members` JOIN `sso_users` 收集 `DISTINCT u.area`(排除 NULL 和空串),非从文档表获取。
|
||||
|
||||
> **评查统计数据来源**:`GetTaskDocuments` 中 `es` LATERAL 子查询聚合 `leaudit_rule_results`,按 `risk` 分级:
|
||||
> - `passed IS TRUE` → pass_count
|
||||
> - `passed IS FALSE AND risk = 'high'` → error_count
|
||||
> - `passed IS FALSE AND risk IN ('low','medium')` → warning_count
|
||||
|
||||
---
|
||||
|
||||
## 2. 后端 API 全景
|
||||
@@ -173,13 +194,45 @@ pendingProposals: list[PendingProposalVO]
|
||||
# PendingProposalVO: { evaluationPointName, pendingVotersNum }
|
||||
```
|
||||
|
||||
**`CrossReviewTaskItemVO`** — 任务列表项:
|
||||
```python
|
||||
taskId: int
|
||||
taskName: str
|
||||
taskType: str
|
||||
docTypeId: int | None
|
||||
docTypeCode: str | None
|
||||
status: str
|
||||
progress: float
|
||||
totalDocuments: int
|
||||
completedDocuments: int
|
||||
createdAt: datetime | None
|
||||
evaluationRegion: list[str] # 评查地区 — 从任务成员 sso_users.area 去重收集
|
||||
```
|
||||
|
||||
**`CrossReviewTaskDocumentVO`** — 任务文档列表项:
|
||||
```python
|
||||
documentId, name, documentNumber, typeId, typeName
|
||||
processingStatus, versionNo, isLatestVersion
|
||||
versionGroupKey, totalVersions
|
||||
auditStatus # 0=未完成, 1=已完成
|
||||
auditStatus # 0=未评查, 1=已评查(文档×任务级别)
|
||||
createdAt, fileSize
|
||||
path # 文件路径 — 来自 leaudit_document_files.local_path
|
||||
uploadTime # 上传时间 — 来自 leaudit_document_files.created_at
|
||||
# 以下为评查统计字段 — 聚合自 leaudit_rule_results
|
||||
totalEvaluationPoints: int # 总评查点数
|
||||
passCount: int # 通过数(passed IS TRUE)
|
||||
warningCount: int # 警告数(passed IS FALSE AND risk IN ('low','medium'))
|
||||
errorCount: int # 错误数(passed IS FALSE AND risk = 'high')
|
||||
manualCount: int # 人工审核数(暂为 0)
|
||||
issueCount: int # 问题总数
|
||||
warningMessages: list[str] # 警告消息
|
||||
errorMessages: list[str] # 错误消息
|
||||
issueMessages: list[str] # 问题消息(综合)
|
||||
manualMessages: list[str] # 人工审核消息(暂为空)
|
||||
finalScore: float # 最终得分(通过规则分数之和)
|
||||
fullScore: float # 满分(所有规则分数之和)
|
||||
scoreSummary: str # 得分摘要(如 "85.0/100.0")
|
||||
scorePercent: float # 得分百分比(0-100)
|
||||
```
|
||||
|
||||
---
|
||||
@@ -795,7 +848,7 @@ import { CrossCheckingOpinionsPanel } from "@/components/cross-checking/CrossChe
|
||||
|
||||
## 7. 前端 API 封装参考
|
||||
|
||||
全部位于 `lib/api/legacy/cross-checking/cross-file-result.ts`:
|
||||
### 7.1 交叉意见相关(`cross-file-result.ts`)
|
||||
|
||||
| 函数 | HTTP | 路径 | 用途 |
|
||||
|------|------|------|------|
|
||||
@@ -807,6 +860,45 @@ import { CrossCheckingOpinionsPanel } from "@/components/cross-checking/CrossChe
|
||||
| `updateCrossCheckingReviewResult` | PATCH | `/api/v3/review-points/{id}/audit` | 更新评查结果状态 |
|
||||
| `findIsProposer` | GET | `/api/v3/cross-review/tasks/{taskId}/can-confirm` | 检查是否负责人 |
|
||||
|
||||
### 7.2 任务列表与文档列表(`cross-files.ts`)
|
||||
|
||||
| 函数 | HTTP | 路径 | 用途 |
|
||||
|------|------|------|------|
|
||||
| `getUserTaskDocuments` | POST | `/api/v3/cross-review/tasks/query` | 获取用户任务列表(V3) |
|
||||
| `getTaskDocumentsWithVersions` | GET | `/api/v3/cross-review/tasks/{id}/documents` | 获取任务文档列表(含版本归纳) |
|
||||
| `getCrossCheckingDocumentTypes` | — | — | 获取可选文档类型 |
|
||||
| `getCrossCheckingTasks` | — | — | 任务列表包装(含前端筛选) |
|
||||
|
||||
### 7.3 版本号任务本地化
|
||||
|
||||
`d.version_no` 是文档的**全局**版本号(跨所有任务),前端在 `getTaskDocumentsWithVersions` 中做任务本地重映射:
|
||||
|
||||
```
|
||||
同一 version_group_key 内:
|
||||
1. 按原始 version_number 升序排列(保留全局先后顺序)
|
||||
2. 重新分配 version_number = 1, 2, 3...
|
||||
3. 同时更新 history_versions 中的 version_number
|
||||
```
|
||||
|
||||
**示例**:文档全局版本 v11 → 任务内第 1 次上传 → 显示 V1;v12 → 第 2 次 → 显示 V2。
|
||||
|
||||
### 7.4 评查统计数据映射
|
||||
|
||||
前端 `getTaskDocumentsWithVersions` 将后端 V3 返回的 camelCase 字段映射为内部使用的 snake_case:
|
||||
|
||||
```
|
||||
API 返回 (JSON) → 前端类型 (CrossReviewDocumentWithVersion)
|
||||
────────────────────────────────────────────────────────────
|
||||
passCount → pass_count
|
||||
warningCount → warning_count
|
||||
errorCount → error_count
|
||||
manualCount → manual_count
|
||||
scorePercent → score_percent
|
||||
warningMessages → warning_messages
|
||||
errorMessages → error_messages
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 补充:后端服务实现详解
|
||||
@@ -825,7 +917,12 @@ class CrossReviewServiceImpl(ICrossReviewService):
|
||||
|
||||
async def GetUserTasks(self, CurrentUserId: int, dto: CrossReviewTaskQueryDTO)
|
||||
-> CrossReviewTaskPageVO:
|
||||
"""分页查询当前用户参与的任务"""
|
||||
"""
|
||||
分页查询当前用户参与的任务。
|
||||
SQL 含两个 CTE:
|
||||
- doc_stats: 统计每任务 total_documents / completed_documents
|
||||
- task_regions: 从任务成员 JOIN sso_users 收集去重 area AS evaluationRegion
|
||||
"""
|
||||
|
||||
async def GetTaskProgress(self, CurrentUserId: int, TaskId: int)
|
||||
-> CrossReviewTaskProgressVO:
|
||||
@@ -834,7 +931,12 @@ class CrossReviewServiceImpl(ICrossReviewService):
|
||||
async def GetTaskDocuments(self, CurrentUserId: int, TaskId: int,
|
||||
dto: CrossReviewTaskDocumentQueryDTO)
|
||||
-> CrossReviewTaskDocumentPageVO:
|
||||
"""分页查询任务下的文档列表"""
|
||||
"""
|
||||
分页查询任务下的文档列表。
|
||||
含版本归纳:同一 version_group_key 的文档归为一组,totalVersions 为任务内计数。
|
||||
含评查统计 LATERAL 子查询 (es):聚合 leaudit_rule_results 的
|
||||
pass_count / warning_count / error_count / score_percent 等。
|
||||
"""
|
||||
|
||||
async def CanConfirmTaskDocument(self, CurrentUserId: int, TaskId: int)
|
||||
-> CrossReviewPermissionVO:
|
||||
|
||||
Reference in New Issue
Block a user