fix: 修复多个关键问题

- 修复前端路由守卫:未登录时不显示提示,直接跳转登录页
- 修复API拦截器:401错误不显示提示,直接跳转
- 增强验证码显示:图片尺寸从120x40增加到200x80
- 增大验证码字体:从28号增加到48号
- 优化验证码字符:排除易混淆的0和1
- 减少干扰线:从5条减少到3条,添加背景色优化
- 增强登录API日志:添加详细的调试日志
- 增强验证码生成和验证日志
- 优化异常处理和错误追踪

影响文件:
- src/router/index.ts
- src/api/request.ts
- app/services/auth_service.py
- app/api/v1/auth.py
- app/schemas/user.py

测试状态:
- 前端构建通过
- 后端语法检查通过
- 验证码显示效果优化完成

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-01-25 00:26:21 +08:00
commit e71181f0a3
150 changed files with 39549 additions and 0 deletions

304
ALLOCATIONS_API.md Normal file
View File

@@ -0,0 +1,304 @@
# 资产分配管理API使用说明
> **版本**: v1.0.0
> **作者**: 后端API扩展组
> **创建时间**: 2025-01-24
---
## 📋 目录
1. [概述](#概述)
2. [单据类型说明](#单据类型说明)
3. [API端点](#api端点)
4. [业务流程](#业务流程)
5. [状态说明](#状态说明)
6. [错误码](#错误码)
---
## 概述
资产分配管理API提供资产分配、调拨、回收、维修分配和报废分配等功能。支持完整的审批流程和执行流程。
---
## 单据类型说明
| 类型 | 代码 | 说明 |
|------|------|------|
| 资产分配 | allocation | 从仓库分配资产给网点 |
| 资产调拨 | transfer | 网点间资产调拨 |
| 资产回收 | recovery | 从使用中回收资产 |
| 维修分配 | maintenance | 分配资产进行维修 |
| 报废分配 | scrap | 分配资产进行报废 |
---
## API端点
### 1. 获取分配单列表
**接口**: `GET /api/v1/allocation-orders`
**查询参数**:
```
skip: 跳过条数默认0
limit: 返回条数默认20最大100
order_type: 单据类型
approval_status: 审批状态
execute_status: 执行状态
applicant_id: 申请人ID
target_organization_id: 目标网点ID
keyword: 搜索关键词
```
**响应示例**:
```json
[
{
"id": 1,
"order_code": "AL202501240001",
"order_type": "allocation",
"title": "天河网点资产分配",
"approval_status": "pending",
"execute_status": "pending",
"target_organization": {
"id": 3,
"org_name": "天河网点"
},
"applicant": {
"id": 1,
"real_name": "张三"
},
"items": [
{
"asset_code": "ASSET-20250124-0001",
"asset_name": "联想台式机",
"execute_status": "pending"
}
],
"created_at": "2025-01-24T10:00:00Z"
}
]
```
---
### 2. 创建分配单
**接口**: `POST /api/v1/allocation-orders`
**请求体**:
```json
{
"order_type": "allocation",
"title": "天河网点资产分配",
"target_organization_id": 3,
"asset_ids": [1, 2, 3, 4, 5],
"expect_execute_date": "2025-01-25",
"remark": "业务需要"
}
```
**字段说明**:
- `order_type`: 单据类型(必填)
- `title`: 标题(必填)
- `source_organization_id`: 调出网点ID调拨时必填
- `target_organization_id`: 调入网点ID必填
- `asset_ids`: 资产ID列表必填至少1个
- `expect_execute_date`: 预计执行日期(可选)
- `remark`: 备注(可选)
**响应**: 返回创建的分配单详情
---
### 3. 审批分配单
**接口**: `POST /api/v1/allocation-orders/{order_id}/approve`
**请求体**:
```json
{
"approval_status": "approved",
"approval_remark": "同意"
}
```
**字段说明**:
- `approval_status`: 审批状态approved/rejected
- `approval_remark`: 审批备注(可选)
**业务逻辑**:
- 审批通过后自动执行资产分配逻辑
- 更新资产状态
- 记录状态变更历史
---
### 4. 执行分配单
**接口**: `POST /api/v1/allocation-orders/{order_id}/execute`
**说明**: 手动执行已审批通过的分配单
---
### 5. 取消分配单
**接口**: `POST /api/v1/allocation-orders/{order_id}/cancel`
**说明**: 取消分配单(已完成的无法取消)
---
### 6. 获取分配单统计
**接口**: `GET /api/v1/allocation-orders/statistics`
**响应示例**:
```json
{
"total": 100,
"pending": 10,
"approved": 50,
"rejected": 20,
"executing": 15,
"completed": 5
}
```
---
## 业务流程
### 资产分配流程
```
1. 创建分配单pending
2. 审批分配单approved/rejected
↓ (审批通过)
3. 执行分配逻辑executing
4. 更新资产状态completed
```
### 资产调拨流程
```
1. 创建调拨单(指定调出和调入网点)
2. 审批调拨单
3. 执行调拨(更新资产所属网点)
4. 完成调拨
```
---
## 状态说明
### 审批状态 (approval_status)
| 状态 | 说明 |
|------|------|
| pending | 待审批 |
| approved | 已审批 |
| rejected | 已拒绝 |
| cancelled | 已取消 |
### 执行状态 (execute_status)
| 状态 | 说明 |
|------|------|
| pending | 待执行 |
| executing | 执行中 |
| completed | 已完成 |
| cancelled | 已取消 |
### 明细执行状态 (execute_status)
| 状态 | 说明 |
|------|------|
| pending | 待执行 |
| executing | 执行中 |
| completed | 已完成 |
| failed | 执行失败 |
---
## 错误码
| 错误码 | 说明 |
|--------|------|
| 404 | 分配单不存在 |
| 400 | 资产状态不允许分配 |
| 400 | 重复审批 |
| 400 | 已完成无法取消 |
| 403 | 权限不足 |
---
## 使用示例
### Python示例
```python
import requests
BASE_URL = "http://localhost:8000/api/v1"
TOKEN = "your_access_token"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
# 1. 创建分配单
response = requests.post(
f"{BASE_URL}/allocation-orders",
json={
"order_type": "allocation",
"title": "天河网点资产分配",
"target_organization_id": 3,
"asset_ids": [1, 2, 3]
},
headers=headers
)
order = response.json()
# 2. 审批分配单
response = requests.post(
f"{BASE_URL}/allocation-orders/{order['id']}/approve",
json={
"approval_status": "approved",
"approval_remark": "同意"
},
headers=headers
)
# 3. 获取分配单列表
response = requests.get(
f"{BASE_URL}/allocation-orders",
params={"approval_status": "pending"},
headers=headers
)
orders = response.json()
```
---
## 注意事项
1. **资产状态验证**: 只有"库存中"或"使用中"的资产可以分配
2. **单据状态**: 只有"待审批"状态的分配单可以更新
3. **删除限制**: 只能删除草稿、已拒绝或已取消的分配单
4. **自动执行**: 审批通过后会自动执行资产分配逻辑
5. **状态历史**: 所有状态变更都会记录在资产状态历史表中
---
**开发完成日期**: 2025-01-24