# 物业人员管理系统 API 接口文档

## 基础信息

- 基础路径: `http://{host}:{port}/app/`
- 请求方式: 统一使用 POST（遵循项目 Cmd 模式）
- 数据格式: JSON
- 统一返回格式:

```json
{
  "code": 0,
  "msg": "success",
  "data": {}
}
```

---

## 一、用户绑定接口

### 1.1 用户绑定工种

**服务编码**: `property.userBind`
**请求路径**: `/app/property.userBind`
**功能描述**: 用户绑定工种和设备信息

**请求参数**:

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| userId | String | 是 | 用户ID |
| workType | String | 是 | 工种: CLEANING(保洁)/SECURITY(保安)/ENGINEERING(工程维修) |
| role | String | 否 | 角色: ADMIN(管理员)/STAFF(员工)，默认STAFF |
| deviceId | String | 否 | 绑定设备ID |

**请求示例**:
```json
{
  "userId": "302021122401234567",
  "workType": "SECURITY",
  "role": "STAFF",
  "deviceId": "DEVICE_ABC123"
}
```

**返回示例**:
```json
{
  "code": 0,
  "msg": "success"
}
```

---

## 二、定位接口

### 2.1 实时定位上报

**服务编码**: `property.locationReport`
**请求路径**: `/app/property.locationReport`
**功能描述**: 接收安卓端每3秒上报的经纬度，自动去重存储

**请求参数**:

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| userId | String | 是 | 用户ID |
| longitude | BigDecimal | 是 | 经度(-180~180) |
| latitude | BigDecimal | 是 | 纬度(-90~90) |
| bindRelation | String | 否 | 绑定关系(工单ID/巡更ID等) |

**请求示例**:
```json
{
  "userId": "302021122401234567",
  "longitude": 116.397428,
  "latitude": 39.909230
}
```

**返回示例**:
```json
{
  "code": 0,
  "msg": "success"
}
```

### 2.2 轨迹查询

**服务编码**: `property.queryLocationTracks`
**请求路径**: `/app/property.queryLocationTracks`
**功能描述**: 按用户ID/时间范围查询历史轨迹坐标

**请求参数**:

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| userId | String | 是 | 用户ID |
| startTime | String | 否 | 开始时间(yyyy-MM-dd HH:mm:ss) |
| endTime | String | 否 | 结束时间(yyyy-MM-dd HH:mm:ss) |
| page | int | 否 | 页码(从1开始) |
| row | int | 否 | 每页条数(默认20) |

**请求示例**:
```json
{
  "userId": "302021122401234567",
  "startTime": "2026-05-11 08:00:00",
  "endTime": "2026-05-11 18:00:00",
  "page": 1,
  "row": 50
}
```

**返回示例**:
```json
{
  "code": 0,
  "msg": "success",
  "data": {
    "data": [
      {
        "id": 1001,
        "user_id": "302021122401234567",
        "user_name": "张三",
        "work_type": "SECURITY",
        "longitude": 116.397428,
        "latitude": 39.909230,
        "report_time": "2026-05-11 09:00:05",
        "loc_status": "NORMAL"
      }
    ],
    "total": 150
  }
}
```

---

## 三、打卡接口

### 3.1 上下班打卡

**服务编码**: `property.attendancePunch`
**请求路径**: `/app/property.attendancePunch`
**功能描述**: 记录打卡时间、地点、坐标，校验当天重复打卡
**业务规则**: 打卡必须关联定位坐标，无定位不允许打卡

**请求参数**:

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| userId | String | 是 | 用户ID |
| userName | String | 否 | 用户姓名 |
| workType | String | 否 | 工种 |
| punchType | String | 是 | 打卡类型: ON(上班)/OFF(下班) |
| longitude | BigDecimal | 是 | 打卡经度 |
| latitude | BigDecimal | 是 | 打卡纬度 |
| punchAddress | String | 否 | 打卡地点描述 |

**请求示例**:
```json
{
  "userId": "302021122401234567",
  "userName": "张三",
  "workType": "SECURITY",
  "punchType": "ON",
  "longitude": 116.397428,
  "latitude": 39.909230,
  "punchAddress": "北京市朝阳区xxx项目南门"
}
```

**返回示例**:
```json
{
  "code": 0,
  "msg": "success"
}
```

### 3.2 打卡记录查询

**服务编码**: `property.queryAttendanceRecords`
**请求路径**: `/app/property.queryAttendanceRecords`
**功能描述**: 按工种/时间/人员查询打卡数据

**请求参数**:

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| userId | String | 否 | 用户ID |
| workType | String | 否 | 工种: CLEANING/SECURITY/ENGINEERING |
| punchType | String | 否 | 打卡类型: ON/OFF |
| startTime | String | 否 | 开始时间 |
| endTime | String | 否 | 结束时间 |
| page | int | 否 | 页码 |
| row | int | 否 | 每页条数 |

**请求示例**:
```json
{
  "workType": "SECURITY",
  "startTime": "2026-05-01 00:00:00",
  "endTime": "2026-05-11 23:59:59",
  "page": 1,
  "row": 20
}
```

**返回示例**:
```json
{
  "code": 0,
  "msg": "success",
  "data": {
    "data": [
      {
        "id": "10xxxxx",
        "user_id": "302021122401234567",
        "user_name": "张三",
        "work_type": "SECURITY",
        "punch_type": "ON",
        "punch_time": "2026-05-11 08:00:00",
        "punch_address": "北京市朝阳区xxx项目南门",
        "longitude": 116.397428,
        "latitude": 39.909230
      }
    ],
    "total": 22
  }
}
```

---

## 四、保安巡更接口

### 4.1 巡更上报

**服务编码**: `property.patrolReport`
**请求路径**: `/app/property.patrolReport`
**功能描述**: 保安人员上报巡更数据，关联人员+位置

**请求参数**:

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| userId | String | 是 | 巡更人ID |
| userName | String | 否 | 巡更人姓名 |
| patrolLocation | String | 是 | 巡更地点 |
| patrolContent | String | 否 | 巡更内容 |
| longitude | BigDecimal | 是 | 巡更经度 |
| latitude | BigDecimal | 是 | 巡更纬度 |
| images | String | 否 | 图片URL列表(JSON数组) |
| remark | String | 否 | 备注 |

**请求示例**:
```json
{
  "userId": "302021122401234567",
  "userName": "张三",
  "patrolLocation": "A栋-B栋连廊",
  "patrolContent": "检查消防设施完好，通道畅通",
  "longitude": 116.397428,
  "latitude": 39.909230,
  "images": "[\"https://img.example.com/patrol1.jpg\"]",
  "remark": "一切正常"
}
```

### 4.2 巡更记录查询

**服务编码**: `property.queryPatrolRecords`
**请求路径**: `/app/property.queryPatrolRecords`

---

## 五、保洁作业接口

### 5.1 作业上报

**服务编码**: `property.cleaningReport`
**请求路径**: `/app/property.cleaningReport`

**请求参数**:

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| userId | String | 是 | 作业人ID |
| userName | String | 否 | 作业人姓名 |
| workArea | String | 是 | 作业区域 |
| workContent | String | 否 | 作业内容 |
| longitude | BigDecimal | 是 | 作业经度 |
| latitude | BigDecimal | 是 | 作业纬度 |
| images | String | 否 | 图片URL列表(JSON数组) |
| remark | String | 否 | 备注 |

### 5.2 保洁记录查询

**服务编码**: `property.queryCleaningRecords`
**请求路径**: `/app/property.queryCleaningRecords`

---

## 六、维修工单接口

### 6.1 提交工单

**服务编码**: `property.submitRepairOrder`
**请求路径**: `/app/property.submitRepairOrder`
**功能描述**: 所有人可提交工单，自动分配给工程维修人员

**请求参数**:

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| submitterId | String | 是 | 提交人ID |
| submitterName | String | 否 | 提交人姓名 |
| title | String | 是 | 工单标题 |
| description | String | 否 | 工单描述 |
| repairLocation | String | 是 | 报修位置 |
| longitude | BigDecimal | 是 | 报修经度 |
| latitude | BigDecimal | 是 | 报修纬度 |
| images | String | 否 | 报修图片(JSON数组) |

**请求示例**:
```json
{
  "submitterId": "302021122401234567",
  "submitterName": "李四",
  "title": "3栋2单元电梯故障",
  "description": "电梯门无法正常关闭，存在安全隐患",
  "repairLocation": "3栋2单元电梯间",
  "longitude": 116.397428,
  "latitude": 39.909230,
  "images": "[\"https://img.example.com/repair1.jpg\"]"
}
```

**返回示例**:
```json
{
  "code": 0,
  "msg": "success",
  "data": "20xxxxx"
}
```
> data 为工单ID

### 6.2 更新工单状态

**服务编码**: `property.updateRepairStatus`
**请求路径**: `/app/property.updateRepairStatus`
**功能描述**: 接单/开始维修/完成/取消
**业务规则**: 工单状态变更自动通知提交人

**请求参数**:

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | String | 是 | 工单ID |
| status | String | 是 | 状态: PENDING/REPAIRING/COMPLETED/CANCELLED |
| repairerId | String | 否 | 维修人ID(接单时) |
| repairResult | String | 否 | 维修结果(完成时) |
| resultImages | String | 否 | 维修结果图片(完成时) |

**工单状态流转**:
```
PENDING(待接单) → REPAIRING(维修中) → COMPLETED(已完成)
                 → CANCELLED(已取消)
```

### 6.3 工单查询

**服务编码**: `property.queryRepairOrders`
**请求路径**: `/app/property.queryRepairOrders`

**请求参数**:

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| submitterId | String | 否 | 提交人ID |
| repairerId | String | 否 | 维修人ID |
| status | String | 否 | 工单状态 |
| startTime | String | 否 | 开始时间 |
| endTime | String | 否 | 结束时间 |
| page | int | 否 | 页码 |
| row | int | 否 | 每页条数 |

---

## 七、消息通知接口

### 7.1 查询通知

**服务编码**: `property.queryMessages`
**请求路径**: `/app/property.queryMessages`

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| userId | String | 否 | 接收人ID |
| isRead | String | 否 | 是否已读: 0/1 |
| msgType | String | 否 | 类型: REPAIR_STATUS/REPAIR_NEW |

### 7.2 标记已读

**服务编码**: `property.readMessage`
**请求路径**: `/app/property.readMessage`

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | String | 是 | 消息ID |

---

## 八、人员查询接口

### 8.1 人员列表

**服务编码**: `property.queryUsers`
**请求路径**: `/app/property.queryUsers`

| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| workType | String | 否 | 工种筛选: CLEANING/SECURITY/ENGINEERING |
| status | String | 否 | 状态: ON(在职)/OFF(离职) |
| name | String | 否 | 姓名模糊搜索 |
| page | int | 否 | 页码 |
| row | int | 否 | 每页条数 |

---

## 附录

### A. 工种枚举值

| 值 | 说明 |
|----|------|
| CLEANING | 保洁 |
| SECURITY | 保安 |
| ENGINEERING | 工程维修 |

### B. 工单状态枚举值

| 值 | 说明 | 触发动作 |
|----|------|----------|
| PENDING | 待接单 | 自动通知维修人员 |
| REPAIRING | 维修中 | 记录接单时间 |
| COMPLETED | 已完成 | 记录完成时间，通知提交人 |
| CANCELLED | 已取消 | 通知提交人 |

### C. 错误码

| code | 说明 |
|------|------|
| 0 | 成功 |
| 非0 | 失败，msg字段包含具体错误信息 |

### D. 前后端字段对照表

| 数据库字段 | Java PO字段 | JSON字段 | 说明 |
|-----------|-------------|----------|------|
| user_id | userId | userId | 用户ID |
| work_type | workType | workType | 工种 |
| report_time | reportTime | reportTime | 上报时间 |
| punch_type | punchType | punchType | 打卡类型 |
| longitude | longitude | longitude | 经度 |
| latitude | latitude | latitude | 纬度 |
| loc_status | locStatus | locStatus | 定位状态 |
| patrol_location | patrolLocation | patrolLocation | 巡更地点 |
| patrol_content | patrolContent | patrolContent | 巡更内容 |
| work_area | workArea | workArea | 作业区域 |
| submitter_id | submitterId | submitterId | 提交人ID |
| repairer_id | repairerId | repairerId | 维修人ID |
| repair_result | repairResult | repairResult | 维修结果 |
