# 视力筛查管理系统 API 文档

## 基本信息

- **Base URL**: `http://localhost:8080`
- **版本**: 1.0.0
- **描述**: 学校视力筛查数据管理系统API文档

---

## 接口列表

### 1. 学校管理

#### 1.1 获取学校信息

**接口地址**: `GET /schools/{school_id}`

**接口描述**: 根据学校ID获取学校详细信息

**请求参数**:

| 参数名 | 类型 | 位置 | 必填 | 说明 |
|--------|------|------|------|------|
| school_id | string | path | 是 | 学校ID |

**响应示例**:

```json
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "school_001",
    "name": "XX小学",
    "created_at": "2024-01-01T00:00:00Z"
  },
  "timestamp": "2024-01-01T12:00:00Z"
}
```

**错误响应**:

- `400`: 参数错误
  ```json
  {
    "code": 400,
    "message": "school_id is required",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `404`: 学校不存在
  ```json
  {
    "code": 404,
    "message": "school not found",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `500`: 服务器错误
  ```json
  {
    "code": 501,
    "message": "failed to query school",
    "data": {
      "details": "具体错误信息"
    },
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

---

### 2. 年级管理

#### 2.1 获取学校年级列表

**接口地址**: `GET /schools/{school_id}/grades`

**接口描述**: 根据学校ID获取该学校下所有年级，按小学、初中、高中顺序排序

**请求参数**:

| 参数名 | 类型 | 位置 | 必填 | 说明 |
|--------|------|------|------|------|
| school_id | string | path | 是 | 学校ID |

**响应示例**:

```json
{
  "code": 200,
  "message": "success",
  "data": {
    "school_id": "school_001",
    "grades": [
      "一年级",
      "二年级",
      "三年级",
      "初一",
      "初二",
      "高一"
    ]
  },
  "timestamp": "2024-01-01T12:00:00Z"
}
```

**错误响应**:

- `400`: 参数错误
  ```json
  {
    "code": 400,
    "message": "school_id is required",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

---

#### 2.2 获取年级班级列表

**接口地址**: `GET /schools/{school_id}/grades-with-classes`

**接口描述**: 根据学校ID和年级名称获取该年级下的所有班级

**请求参数**:

| 参数名 | 类型 | 位置 | 必填 | 说明 |
|--------|------|------|------|------|
| school_id | string | path | 是 | 学校ID |
| grade | string | query | 是 | 年级名称，如：一年级、初一、高一 |

**响应示例**:

```json
{
  "code": 200,
  "message": "success",
  "data": {
    "list": [
      {
        "id": "class_001",
        "school_id": "school_001",
        "grade": "一年级",
        "class_name": "1班",
        "created_at": "2024-01-01T00:00:00Z"
      }
    ],
    "total": 1
  },
  "timestamp": "2024-01-01T12:00:00Z"
}
```

**错误响应**:

- `400`: 参数错误
  ```json
  {
    "code": 400,
    "message": "grade parameter is required",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

---

### 3. 学生管理

#### 3.1 新增学生

**接口地址**: `POST /students`

**接口描述**: 新增学生信息，会检查身份证号在班级中是否重复

**请求参数**:

| 参数名 | 类型 | 位置 | 必填 | 说明 |
|--------|------|------|------|------|
| class_id | string | body | 是 | 班级ID |
| name | string | body | 是 | 学生姓名 |
| gender | string | body | 是 | 性别 |
| id_card | string | body | 是 | 身份证号 |
| created_user | string | body | 是 | 创建人 |
| operator_phone | string | body | 是 | 操作人手机号 |

**请求示例**:

```json
{
  "class_id": "class_001",
  "name": "张三",
  "gender": "男",
  "id_card": "110101200001011234",
  "created_user": "管理员",
  "operator_phone": "13800138000"
}
```

**响应示例**:

```json
{
  "code": 200,
  "message": "student created successfully",
  "data": {
    "student_id": 123
  },
  "timestamp": "2024-01-01T12:00:00Z"
}
```

**错误响应**:

- `400`: 参数错误
  ```json
  {
    "code": 502,
    "message": "invalid request parameters",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `409`: 学生已存在
  ```json
  {
    "code": 409,
    "message": "student with this id_card already exists in the class",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `500`: 服务器错误
  ```json
  {
    "code": 501,
    "message": "failed to create student",
    "data": {
      "details": "具体错误信息"
    },
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

---

### 4. 视力筛查

#### 4.1 查询学生视力筛查数据

**接口地址**: `GET /classes/{class_id}/incomplete-vision-students`

**接口描述**: 根据班级ID查询学生视力筛查数据，支持按姓名和身份证号模糊查询，可查询全部、未完成或已完成的学生

**请求参数**:

| 参数名 | 类型 | 位置 | 必填 | 说明 |
|--------|------|------|------|------|
| class_id | string | path | 是 | 班级ID |
| status | string | query | 否 | 查询状态：all-全部数据，incomplete-未录入数据（默认），complete-已录入数据 |
| name | string | query | 否 | 学生姓名（模糊查询） |
| id_card | string | query | 否 | 身份证号（模糊查询） |

**响应示例**:

```json
{
  "code": 200,
  "message": "success",
  "data": {
    "list": [
      {
        "id": 1,
        "class_id": "class_001",
        "name": "张三",
        "gender": "男",
        "id_card": "110101200001011234",
        "created_at": "2024-01-01T00:00:00Z",
        "vision_data_id": "vision_001",
        "vision_input_status": 1,
        "refraction_input_status": 0,
        "has_vision_data": true,
        "input_status": "已录入视力"
      }
    ],
    "total": 2
  },
  "timestamp": "2024-01-01T12:00:00Z"
}
```

**字段说明**:

- `vision_input_status`: 视力录入状态（0-未录入，1-已录入）
- `refraction_input_status`: 屈光度录入状态（0-未录入，1-已录入）
- `has_vision_data`: 是否有视力数据记录
- `input_status`: 录入状态描述（未录入、已录入视力、已录入屈光度、已完成）

**错误响应**:

- `400`: 参数错误
  ```json
  {
    "code": 400,
    "message": "class_id is required",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

---

#### 4.2 根据学生ID查询视力数据

**接口地址**: `GET /students/{student_id}/vision-data`

**接口描述**: 根据学生ID查询该学生的视力数据详情，包含学生基本信息

**请求参数**:

| 参数名 | 类型 | 位置 | 必填 | 说明 |
|--------|------|------|------|------|
| student_id | integer | path | 是 | 学生ID |

**响应示例**:

```json
{
  "code": 200,
  "message": "success",
  "data": {
    "id": "vision_001",
    "student_id": "123",
    "student_name": "张三",
    "gender": "男",
    "id_card": "110101200001011234",
    "class_id": "class_001",
    "left_eye_vision": 5.0,
    "right_eye_vision": 4.8,
    "left_eye_refraction": -2.5,
    "right_eye_refraction": -3.0,
    "vision_input_status": 1,
    "refraction_input_status": 1,
    "vision_input_user": "张医生",
    "vision_input_time": "2024-01-01T10:00:00Z",
    "refraction_input_user": "李医生",
    "refraction_input_time": "2024-01-01T11:00:00Z",
    "created_at": "2024-01-01T09:00:00Z",
    "updated_at": "2024-01-01T11:00:00Z"
  },
  "timestamp": "2024-01-01T12:00:00Z"
}
```

**错误响应**:

- `400`: 参数错误
  ```json
  {
    "code": 400,
    "message": "student_id is required",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `404`: 数据不存在
  ```json
  {
    "code": 404,
    "message": "vision data not found",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

---

#### 4.3 录入视力数据

**接口地址**: `POST /vision/input-vision`

**接口描述**: 录入学生的左右眼视力数据，支持 0 值，自动记录录入人和录入时间，并记录操作日志

**请求参数**:

| 参数名 | 类型 | 位置 | 必填 | 说明 |
|--------|------|------|------|------|
| vision_data_id | string | body | 否 | 视力数据ID，不传则新增记录，传则更新记录 |
| student_id | integer | body | 是 | 学生ID |
| left_eye_vision | number | body | 是 | 左眼视力（0-10），如：5.0，支持 0 值 |
| right_eye_vision | number | body | 是 | 右眼视力（0-10），如：4.8，支持 0 值 |
| input_user | string | body | 是 | 录入人姓名 |
| operator_phone | string | body | 是 | 操作人手机号 |

**请求示例**:

```json
{
  "student_id": 123,
  "left_eye_vision": 5.0,
  "right_eye_vision": 0,
  "input_user": "张医生",
  "operator_phone": "13900139000"
}
```

**响应示例**:

```json
{
  "code": 200,
  "message": "vision data created successfully",
  "data": {
    "vision_data_id": "550e8400e29b41d4a716446655440000"
  },
  "timestamp": "2024-01-01T12:00:00Z"
}
```

**错误响应**:

- `400`: 参数错误
  ```json
  {
    "code": 502,
    "message": "invalid request parameters",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `404`: 记录不存在（更新时）
  ```json
  {
    "code": 404,
    "message": "vision data not found",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `500`: 服务器错误
  ```json
  {
    "code": 501,
    "message": "failed to insert vision data",
    "data": {
      "details": "具体错误信息"
    },
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

---

#### 4.4 录入屈光度数据

**接口地址**: `POST /vision/input-refraction`

**接口描述**: 录入学生的左右眼屈光度数据，支持 0 值，自动记录录入人和录入时间，并记录操作日志

**请求参数**:

| 参数名 | 类型 | 位置 | 必填 | 说明 |
|--------|------|------|------|------|
| vision_data_id | string | body | 否 | 视力数据ID，不传则新增记录，传则更新记录 |
| student_id | integer | body | 是 | 学生ID |
| left_eye_refraction | number | body | 是 | 左眼屈光度，如：-2.50，支持 0 值 |
| right_eye_refraction | number | body | 是 | 右眼屈光度，如：-3.00，支持 0 值 |
| input_user | string | body | 是 | 录入人姓名 |
| operator_phone | string | body | 是 | 操作人手机号 |

**请求示例**:

```json
{
  "student_id": 123,
  "left_eye_refraction": 0,
  "right_eye_refraction": -3.0,
  "input_user": "李医生",
  "operator_phone": "13700137000"
}
```

**响应示例**:

```json
{
  "code": 200,
  "message": "refraction data created successfully",
  "data": {
    "vision_data_id": "550e8400e29b41d4a716446655440000"
  },
  "timestamp": "2024-01-01T12:00:00Z"
}
```

**错误响应**:

- `400`: 参数错误
  ```json
  {
    "code": 502,
    "message": "invalid request parameters",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `404`: 记录不存在（更新时）
  ```json
  {
    "code": 404,
    "message": "vision data not found",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `500`: 服务器错误
  ```json
  {
    "code": 501,
    "message": "failed to insert refraction data",
    "data": {
      "details": "具体错误信息"
    },
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

---

#### 4.5 根据视力数据ID修改数据

**接口地址**: `PUT /vision-data/{vision_data_id}`

**接口描述**: 根据视力数据ID修改视力或屈光度数据，支持部分字段更新，自动更新对应的录入状态和录入人信息

**请求参数**:

| 参数名 | 类型 | 位置 | 必填 | 说明 |
|--------|------|------|------|------|
| vision_data_id | string | path | 是 | 视力数据ID |
| left_eye_vision | number | body | 否 | 左眼视力（0-10） |
| right_eye_vision | number | body | 否 | 右眼视力（0-10） |
| left_eye_refraction | number | body | 否 | 左眼屈光度 |
| right_eye_refraction | number | body | 否 | 右眼屈光度 |
| input_user | string | body | 是 | 操作人姓名 |
| operator_phone | string | body | 是 | 操作人手机号 |

**请求示例**:

```json
{
  "left_eye_vision": 5.1,
  "right_eye_vision": 4.9,
  "input_user": "张医生",
  "operator_phone": "13600136000"
}
```

**响应示例**:

```json
{
  "code": 200,
  "message": "vision data updated successfully",
  "data": {
    "vision_data_id": "550e8400e29b41d4a716446655440000"
  },
  "timestamp": "2024-01-01T12:00:00Z"
}
```

**错误响应**:

- `400`: 参数错误
  ```json
  {
    "code": 400,
    "message": "at least one field must be provided for update",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `404`: 记录不存在
  ```json
  {
    "code": 404,
    "message": "vision data not found",
    "data": null,
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

- `500`: 服务器错误
  ```json
  {
    "code": 501,
    "message": "failed to update vision data",
    "data": {
      "details": "具体错误信息"
    },
    "timestamp": "2024-01-01T12:00:00Z"
  }
  ```

---

## 数据模型

### School（学校）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | string | 学校ID |
| name | string | 学校名称 |
| created_at | datetime | 创建时间 |

### Class（班级）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | string | 班级ID |
| school_id | string | 学校ID |
| grade | string | 年级名称 |
| class_name | string | 班级名称 |
| created_at | datetime | 创建时间 |

### Student（学生）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | integer | 学生ID |
| class_id | string | 班级ID |
| name | string | 学生姓名 |
| gender | string | 性别 |
| id_card | string | 身份证号 |
| created_at | datetime | 创建时间 |

### VisionData（视力数据）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | string | 视力数据ID |
| student_id | integer | 学生ID |
| left_eye_vision | number | 左眼视力 |
| right_eye_vision | number | 右眼视力 |
| left_eye_refraction | number | 左眼屈光度 |
| right_eye_refraction | number | 右眼屈光度 |
| vision_input_status | integer | 视力录入状态（0-未录入，1-已录入） |
| refraction_input_status | integer | 屈光度录入状态（0-未录入，1-已录入） |
| vision_input_user | string | 视力录入人 |
| vision_input_time | datetime | 视力录入时间 |
| refraction_input_user | string | 屈光度录入人 |
| refraction_input_time | datetime | 屈光度录入时间 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |

### OperationLog（操作日志）

| 字段 | 类型 | 说明 |
|------|------|------|
| id | string | 日志ID |
| api_path | string | 接口地址 |
| parameters | string | 传入的参数（JSON格式） |
| operator | string | 操作人 |
| operator_phone | string | 操作人手机号 |
| created_at | datetime | 创建时间 |

---

## 统一响应格式说明

### 响应结构

所有接口均返回以下统一格式：

```json
{
  "code": 200,
  "message": "success",
  "data": {},
  "timestamp": "2024-01-01T12:00:00Z"
}
```

**字段说明：**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| code | int | 是 | 业务状态码（200=成功，其他=失败） |
| message | string | 是 | 响应消息（成功提示或错误信息） |
| data | any | 否 | 业务数据（成功时返回，失败时可为null） |
| timestamp | string | 是 | 服务器响应时间（ISO 8601格式） |

### 业务状态码说明

| 状态码 | HTTP状态码 | 说明 |
|--------|-----------|------|
| 200 | 200 | 请求成功 |
| 400 | 400 | 请求参数错误 |
| 401 | 401 | 未授权 |
| 403 | 403 | 禁止访问 |
| 404 | 404 | 资源不存在 |
| 409 | 409 | 资源冲突（如重复创建） |
| 500 | 500 | 服务器内部错误 |
| 501 | 500 | 数据库错误 |
| 502 | 400 | 数据验证错误 |

---

## 注意事项

1. 所有时间字段均为 ISO 8601 格式
2. 视力数据ID为32位不带连字符的UUID
3. 新增和更新操作会自动记录操作日志
4. 身份证号在同一班级内不能重复
5. 年级列表会按照小学、初中、高中的顺序自动排序
