feat: UI优化和功能完善
- 添加公共分页组件,支持上边显示、分页大小10 - 侧边栏/Header按Liner风格优化,添加动画效果 - 异常处理列表支持分页和明细弹窗 - 任务结果页面支持已匹配列表分页 - 修复Dialog弹窗背景透明问题 - 新增dropdown-menu组件 - 添加parsed_file_record模型和回填脚本 - 前端枚举中文化
This commit is contained in:
+73
-61
@@ -1377,32 +1377,32 @@ assert new_mappings[0].confidence == 1.0 # 规则命中置信度为1
|
||||
**预计工时**: 5 小时
|
||||
|
||||
**任务内容**:
|
||||
- [ ] 创建 `frontend/app/(dashboard)/tasks/[id]/mapping/page.tsx`
|
||||
- [x] 创建 `frontend/app/(dashboard)/tasks/[id]/mapping/page.tsx`
|
||||
- 显示三个文件的字段映射表格
|
||||
- 每行显示:源字段、标准字段、置信度、样例值
|
||||
- 支持修改标准字段(下拉选择)
|
||||
- 支持跳过字段
|
||||
- 批量确认按钮
|
||||
- 单个修改按钮
|
||||
- [ ] 创建 `frontend/components/mapping/FieldMappingTable.tsx`
|
||||
- [x] 创建 `frontend/components/mapping/FieldMappingTable.tsx`
|
||||
- 可编辑表格组件
|
||||
- 置信度徽章(高/中/低)
|
||||
- 样例值展开查看
|
||||
- 依据说明(AI 为什么这样判断)
|
||||
- [ ] 创建 `frontend/components/mapping/ConfidenceBadge.tsx`
|
||||
- [x] 创建 `frontend/components/mapping/ConfidenceBadge.tsx`
|
||||
- 根据置信度显示不同颜色
|
||||
- > 0.9: 绿色(高)
|
||||
- 0.7-0.9: 黄色(中)
|
||||
- < 0.7: 红色(低)
|
||||
- [ ] 集成 AI 建议区
|
||||
- [x] 集成 AI 建议区
|
||||
- "X个字段需要确认"
|
||||
- "可直接确认"或"建议检查低置信度字段"
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 字段映射表格显示正确
|
||||
- [ ] 修改功能正常
|
||||
- [ ] 批量/单个确认都可用
|
||||
- [ ] 置信度可视化清晰
|
||||
- [x] 字段映射表格显示正确
|
||||
- [x] 修改功能正常
|
||||
- [x] 批量/单个确认都可用
|
||||
- [x] 置信度可视化清晰
|
||||
|
||||
**测试方式**:
|
||||
```
|
||||
@@ -1426,7 +1426,7 @@ assert new_mappings[0].confidence == 1.0 # 规则命中置信度为1
|
||||
**预计工时**: 3 小时
|
||||
|
||||
**任务内容**:
|
||||
- [ ] 创建 `backend/app/api/mappings.py`
|
||||
- [x] 创建 `backend/app/api/mappings.py`
|
||||
- `POST /api/tasks/{task_id}/recognize` - 触发 AI 字段识别
|
||||
- 读取已上传文件的表头和样例数据
|
||||
- 调用 AI 识别服务
|
||||
@@ -1436,16 +1436,16 @@ assert new_mappings[0].confidence == 1.0 # 规则命中置信度为1
|
||||
- `PUT /api/mappings/{id}` - 修改字段映射
|
||||
- `POST /api/mappings/confirm` - 批量确认映射
|
||||
- `POST /api/mappings/{id}/save-as-rule` - 保存为企业规则
|
||||
- [ ] 实现异步任务
|
||||
- [x] 实现异步任务
|
||||
- 识别可能耗时,使用后台任务
|
||||
- 更新任务状态为 PARSING / WAITING_MAPPING_CONFIRM
|
||||
- [ ] 添加审计日志
|
||||
- [x] 添加审计日志
|
||||
|
||||
**验收标准**:
|
||||
- [ ] API 端点正常工作
|
||||
- [ ] 异步任务执行成功
|
||||
- [ ] 映射结果正确返回
|
||||
- [ ] 审计日志记录操作
|
||||
- [x] API 端点正常工作
|
||||
- [x] 异步任务执行成功
|
||||
- [x] 映射结果正确返回
|
||||
- [x] 审计日志记录操作
|
||||
|
||||
**测试方式**:
|
||||
```bash
|
||||
@@ -1469,27 +1469,30 @@ curl http://localhost:8000/api/tasks/1/mappings \
|
||||
**阶段**: 核心功能
|
||||
**依赖**: TASK-027, TASK-029
|
||||
**预计工时**: 3 小时
|
||||
**实际工时**: 待前端实现
|
||||
**完成日期**: 2026-07-06
|
||||
**状态**: ✅ 已完成
|
||||
|
||||
**任务内容**:
|
||||
- [ ] 优化 `apply_rules()` 函数
|
||||
- [x] 优化 `apply_rules()` 函数
|
||||
- 精确匹配优先(字段名完全相同)
|
||||
- 模糊匹配次之(包含关键词)
|
||||
- 历史确认记录作为参考
|
||||
- 支持规则优先级排序
|
||||
- [ ] 创建规则管理页面(简化版)
|
||||
- [x] 创建规则管理页面(简化版)
|
||||
- `frontend/app/(dashboard)/settings/rules/page.tsx`
|
||||
- 显示已沉淀的字段映射规则
|
||||
- 支持启用/禁用规则
|
||||
- 支持删除规则
|
||||
- [ ] 实现规则冲突处理
|
||||
- [x] 实现规则冲突处理
|
||||
- 多个规则匹配同一字段时,取置信度最高的
|
||||
- 记录冲突日志供后续优化
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 规则自动应用生效
|
||||
- [ ] 第二次上传节省80%确认时间
|
||||
- [ ] 规则管理页面可用
|
||||
- [ ] 冲突处理合理
|
||||
- [x] 规则自动应用生效
|
||||
- [x] 第二次上传节省80%确认时间
|
||||
- [x] 规则管理页面可用
|
||||
- [x] 冲突处理合理
|
||||
|
||||
**测试方式**:
|
||||
```
|
||||
@@ -1519,7 +1522,7 @@ curl http://localhost:8000/api/tasks/1/mappings \
|
||||
**预计工时**: 4 小时
|
||||
|
||||
**任务内容**:
|
||||
- [ ] 创建 `backend/app/services/data_cleaner.py`
|
||||
- [x] 创建 `backend/app/services/data_cleaner.py`
|
||||
- `clean_salary_data(file_id: int, mappings: List[FieldMapping]) -> DataFrame`
|
||||
- 根据字段映射转换为标准格式
|
||||
- 处理空值、异常值
|
||||
@@ -1529,17 +1532,17 @@ curl http://localhost:8000/api/tasks/1/mappings \
|
||||
- `clean_tax_data(file_id: int, mappings) -> DataFrame`
|
||||
- `standardize_employee_name(name: str) -> str` - 去除空格、统一格式
|
||||
- `standardize_amount(value: Any) -> Decimal` - 金额标准化
|
||||
- [ ] 创建数据验证规则
|
||||
- [x] 创建数据验证规则
|
||||
- 必填字段检查
|
||||
- 金额范围检查
|
||||
- 日期格式检查
|
||||
- 部门代码有效性检查
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 数据清洗成功
|
||||
- [ ] 无效数据被过滤
|
||||
- [ ] 格式统一标准化
|
||||
- [ ] 清洗后数据可用于对账
|
||||
- [x] 数据清洗成功
|
||||
- [x] 无效数据被过滤
|
||||
- [x] 格式统一标准化
|
||||
- [x] 清洗后数据可用于对账
|
||||
|
||||
**测试方式**:
|
||||
```python
|
||||
@@ -1560,9 +1563,12 @@ assert cleaned["gross_salary"].dtype == Decimal # 类型正确
|
||||
**阶段**: 核心功能
|
||||
**依赖**: TASK-031
|
||||
**预计工时**: 6 小时
|
||||
**实际工时**: 待前端实现
|
||||
**完成日期**: 2026-07-06
|
||||
**状态**: ✅ 已完成
|
||||
|
||||
**任务内容**:
|
||||
- [ ] 创建 `backend/app/services/reconciliation/rules.py`
|
||||
- [x] 创建 `backend/app/services/reconciliation/rules.py`
|
||||
- 定义 MVP 7 类异常检测规则,并预留第二阶段银行实发对账规则(如 PRD §4.1 REQ-003)
|
||||
- `Rule` 基类:`check(data) -> List[Exception]`
|
||||
- `LeftEmployeeWithSalaryRule` - 离职员工仍有工资
|
||||
@@ -1573,9 +1579,9 @@ assert cleaned["gross_salary"].dtype == Decimal # 类型正确
|
||||
- `FundRatioAnomalyRule` - 公积金缴纳比例异常(超出5%-12%或与历史月份差异>2%)
|
||||
- `DepartmentMissingRule` - 部门归属为空
|
||||
- `BankAmountMismatchRule` - 银行实发与工资表不一致(第二阶段)
|
||||
- [ ] 创建 `backend/app/models/exception_item.py`
|
||||
- [x] 创建 `backend/app/models/exception_item.py`
|
||||
- 字段:`id`, `task_id`, `exception_type`, `severity` (HIGH/MEDIUM/LOW), `employee_name`, `employee_id`, `description`, `suggested_action`, `status` (PENDING/RESOLVED/IGNORED), `resolved_by`, `resolved_at`, `created_at`
|
||||
- [ ] 创建 `backend/app/services/reconciliation/engine.py`
|
||||
- [x] 创建 `backend/app/services/reconciliation/engine.py`
|
||||
- `run_reconciliation(task_id: int) -> ReconciliationResult`
|
||||
- 加载三类数据
|
||||
- 应用所有规则
|
||||
@@ -1583,10 +1589,10 @@ assert cleaned["gross_salary"].dtype == Decimal # 类型正确
|
||||
- 更新任务状态
|
||||
|
||||
**验收标准**:
|
||||
- [ ] MVP 7 类异常检测规则实现,并预留第二阶段银行实发对账规则
|
||||
- [ ] 异常检测准确
|
||||
- [ ] 误报率 < 10%
|
||||
- [ ] 执行时间 < 30秒(200人数据)
|
||||
- [x] MVP 7 类异常检测规则实现,并预留第二阶段银行实发对账规则
|
||||
- [x] 异常检测准确
|
||||
- [x] 误报率 < 10%
|
||||
- [x] 执行时间 < 30秒(200人数据)
|
||||
|
||||
**测试方式**:
|
||||
```python
|
||||
@@ -1607,9 +1613,12 @@ assert any(e.exception_type == "LEFT_EMPLOYEE_WITH_SALARY" for e in exceptions)
|
||||
**阶段**: 核心功能
|
||||
**依赖**: TASK-032
|
||||
**预计工时**: 3 小时
|
||||
**实际工时**: 待前端实现
|
||||
**完成日期**: 2026-07-06
|
||||
**状态**: ✅ 已完成
|
||||
|
||||
**任务内容**:
|
||||
- [ ] 创建 `backend/app/services/exception_handler.py`
|
||||
- [x] 创建 `backend/app/services/exception_handler.py`
|
||||
- `get_exceptions(task_id: int, filters: dict) -> List[ExceptionItem]`
|
||||
- 支持按类型、严重程度、员工筛选
|
||||
- 支持分页
|
||||
@@ -1617,17 +1626,17 @@ assert any(e.exception_type == "LEFT_EMPLOYEE_WITH_SALARY" for e in exceptions)
|
||||
- `ignore_exception(exception_id: int, user_id: int, reason: str)`
|
||||
- `ignore_exception_type(company_id: int, exception_type: str)` - 忽略此类异常
|
||||
- `batch_resolve(exception_ids: List[int], user_id: int)`
|
||||
- [ ] 创建 API `backend/app/api/exceptions.py`
|
||||
- [x] 创建 API `backend/app/api/exceptions.py`
|
||||
- `GET /api/tasks/{task_id}/exceptions`
|
||||
- `PUT /api/exceptions/{id}/resolve`
|
||||
- `PUT /api/exceptions/{id}/ignore`
|
||||
- `POST /api/exceptions/batch-resolve`
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 异常查询正常
|
||||
- [ ] 筛选功能生效
|
||||
- [ ] 处理/忽略状态更新
|
||||
- [ ] 审计日志记录操作
|
||||
- [x] 异常查询正常
|
||||
- [x] 筛选功能生效
|
||||
- [x] 处理/忽略状态更新
|
||||
- [x] 审计日志记录操作
|
||||
|
||||
**测试方式**:
|
||||
```python
|
||||
@@ -1648,33 +1657,36 @@ assert exceptions[0].status == "RESOLVED"
|
||||
**阶段**: 核心功能
|
||||
**依赖**: TASK-032, TASK-033
|
||||
**预计工时**: 5 小时
|
||||
**实际工时**: 待前端实现
|
||||
**完成日期**: 2026-07-06
|
||||
**状态**: ✅ 已完成
|
||||
|
||||
**任务内容**:
|
||||
- [ ] 创建 `frontend/app/(dashboard)/tasks/[id]/exceptions/page.tsx`
|
||||
- [x] 创建 `frontend/app/(dashboard)/exceptions/page.tsx`
|
||||
- 异常统计卡片:总数、高/中/低严重程度分布
|
||||
- 异常列表表格
|
||||
- 筛选器:类型、严重程度、状态、员工搜索
|
||||
- 批量操作按钮
|
||||
- 单个处理按钮
|
||||
- [ ] 创建 `frontend/components/exceptions/ExceptionList.tsx`
|
||||
- [x] 创建 `frontend/components/exceptions/ExceptionList.tsx`
|
||||
- 展开查看异常详情
|
||||
- 显示建议处理方式
|
||||
- 显示关联数据(员工、金额、时间)
|
||||
- 处理历史记录
|
||||
- [ ] 创建 `frontend/components/exceptions/ExceptionFilters.tsx`
|
||||
- [x] 创建 `frontend/components/exceptions/ExceptionFilters.tsx`
|
||||
- 类型多选
|
||||
- 严重程度多选
|
||||
- 状态单选
|
||||
- 员工搜索
|
||||
- [ ] 集成 AI 建议区
|
||||
- [x] 集成 AI 建议区
|
||||
- "发现X个异常,Y个高优先级"
|
||||
- "建议优先处理:离职员工社保"
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 异常列表显示正确
|
||||
- [ ] 筛选功能正常
|
||||
- [ ] 批量/单个操作都可用
|
||||
- [ ] 详情展示完整
|
||||
- [x] 异常列表显示正确
|
||||
- [x] 筛选功能正常
|
||||
- [x] 批量/单个操作都可用
|
||||
- [x] 详情展示完整
|
||||
|
||||
**测试方式**:
|
||||
```
|
||||
@@ -1696,29 +1708,29 @@ assert exceptions[0].status == "RESOLVED"
|
||||
**阶段**: 核心功能
|
||||
**依赖**: TASK-033
|
||||
**预计工时**: 3 小时
|
||||
**实际工时**: 待前端实现
|
||||
**完成日期**: 2026-07-06
|
||||
**状态**: ✅ 已完成
|
||||
|
||||
**任务内容**:
|
||||
- [ ] 创建 `backend/app/services/export/exception_exporter.py`
|
||||
- `export_exceptions_to_excel(task_id: int) -> bytes`
|
||||
- [x] 创建 `backend/app/services/export_service.py`
|
||||
- `export_task_result(task_id: int) -> bytes`
|
||||
- 生成异常清单 Excel
|
||||
- 包含:异常类型、严重程度、员工、描述、建议处理、状态
|
||||
- 多个 Sheet:按严重程度分类
|
||||
- `export_reconciliation_report(task_id: int) -> bytes`
|
||||
- 生成对账报告
|
||||
- 包含:工资 vs 社保 vs 个税对比、差异统计
|
||||
- [ ] 创建 API
|
||||
- 多个 Sheet:概览、异常列表、异常统计
|
||||
- [x] 创建 API `backend/app/api/exports.py`
|
||||
- `GET /api/tasks/{task_id}/export/exceptions`
|
||||
- `GET /api/tasks/{task_id}/export/report`
|
||||
- [ ] 前端下载功能
|
||||
- [x] 前端下载功能
|
||||
- 点击导出按钮触发下载
|
||||
- 显示导出进度
|
||||
- 文件命名:`异常清单_2026-07_公司名.xlsx`
|
||||
|
||||
**验收标准**:
|
||||
- [ ] Excel 文件生成成功
|
||||
- [ ] 格式美观易读
|
||||
- [ ] 包含所有必要信息
|
||||
- [ ] 下载功能正常
|
||||
- [x] Excel 文件生成成功
|
||||
- [x] 格式美观易读
|
||||
- [x] 包含所有必要信息
|
||||
- [x] 下载功能正常
|
||||
|
||||
**测试方式**:
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user