Files
ocean/backend/API.md
T

401 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目管理系统 API 文档
**依据**:《产品文档》《交互文档》《初始需求》
**读者**:后端/前端工程师
**版本**v1
---
## 1. 概述
- **基础路径**`/api`(按实际部署约定)
- **请求方式****全部采用 POST**
- **认证方式**:登录后使用 Token(如 Bearer Token 或 Session),请求头携带,具体与现有账号体系对齐
- **数据格式**:请求体与响应体均为 JSON,编码 UTF-8Content-Type: application/json
- **角色**:管理员、市场部、工程部、技经部、财务部、物贸部;新建项目仅市场部可调,查看/修改所有角色可调
---
## 2. 认证
### 2.1 登录
| 项目 | 说明 |
|------|------|
| **接口** | `POST /api/auth/login` |
| **说明** | 用户登录,成功返回 Token 及用户信息(含角色) |
| **权限** | 无需登录 |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| username | string | 是 | 账号 |
| password | string | 是 | 密码 |
#### 响应参数(成功,HTTP 200
| 参数名 | 类型 | 说明 |
|--------|------|------|
| token | string | 登录凭证,后续请求需携带 |
| user | object | 当前用户信息 |
| user.id | string | 用户 ID |
| user.username | string | 账号 |
| user.role | string | 角色:管理员 / 市场部 / 工程部 / 技经部 / 财务部 / 物贸部 |
| user.displayName | string | 显示名称 |
#### 响应参数(失败,HTTP 401
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | number | 错误码,401 |
| message | string | 错误信息,如「账号或密码错误」 |
---
## 3. 项目列表
| 项目 | 说明 |
|------|------|
| **接口** | `POST /api/projects/list` |
| **说明** | 分页获取项目列表,支持按名称/编号搜索、按进度/费用筛选、时间筛选、日期异常筛选 |
| **权限** | 已登录,所有角色可访问 |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| page | number | 否 | 页码,从 1 开始,默认 1 |
| pageSize | number | 否 | 每页条数,默认 20 |
| searchType | string | 否 | 搜索维度:`name`(项目名称)、`code`(项目编号) |
| keyword | string | 否 | 搜索关键词,与 searchType 配合使用 |
| progress | string | 否 | 项目进度筛选,取值与业务枚举一致 |
| cost | string | 否 | 项目费用筛选,取值与业务枚举一致 |
| dateFilterType | string | 否 | 时间筛选维度:`signDate`(签订日期)、`startDate`(开工日期)、`plannedCompletionDate`(计划竣工日期)、`actualCompletionDate`(实际竣工日期);仅对「日期正常」项目按 DATE 筛选 |
| dateFrom | string | 否 | 时间范围起(YYYY-MM-DD),与 dateFilterType 配合 |
| dateTo | string | 否 | 时间范围止(YYYY-MM-DD),与 dateFilterType 配合 |
| dateAbnormal | boolean | 否 | 为 true 时只返回「日期异常」项目(四个日期中任意一个非「日期正常」) |
#### 响应参数(成功,HTTP 200
| 参数名 | 类型 | 说明 |
|--------|------|------|
| list | array | 项目列表,无数据时为空数组 |
| list[].id | string | 项目 ID |
| list[].projectName | string | 项目名称 |
| list[].contractCode | string | 合同编号 |
| list[].progress | string | 项目进度 |
| list[].cost | string | 项目费用 |
| list[].updatedAt | string | 最后更新时间,ISO8601 |
| total | number | 总条数,无数据时为 0 |
| page | number | 当前页码 |
| pageSize | number | 每页条数 |
---
## 4. 项目详情
| 项目 | 说明 |
|------|------|
| **接口** | `POST /api/projects/detail` |
| **说明** | 获取单个项目完整信息(5 个分类) |
| **权限** | 已登录,所有角色可访问 |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | string | 是 | 项目 ID |
#### 响应参数(成功,HTTP 200
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | string | 项目 ID |
| contract | object | 合同信息,字段见第 8.1 节 |
| costControl | object | 成本控制,字段见第 8.2 节 |
| receivable | object | 应收款,字段见第 8.3 节 |
| payable | object | 应付款,字段见第 8.4 节 |
| other | object | 其他,字段见第 8.5 节 |
| createdAt | string | 创建时间,ISO8601 |
| updatedAt | string | 更新时间,ISO8601 |
#### 响应参数(失败,HTTP 404
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | number | 错误码,404 |
| message | string | 错误信息,如「项目不存在」 |
---
## 5. 新建项目
| 项目 | 说明 |
|------|------|
| **接口** | `POST /api/projects/create` |
| **说明** | 新建项目,仅市场部可调用 |
| **权限** | 已登录,角色为市场部;非市场部返回 403 |
#### 请求参数
请求体为项目 5 个分类的完整或部分数据,未传字段由后端赋默认值。结构见第 8 节「项目信息字段(5 个分类)」;**新建时合同编号、项目名称为必填项**。
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| contract | object | 是 | 合同信息,字段见 8.1;其中 contractCode、projectName 必填 |
| contract.contractCode | string | 是 | 合同编号 |
| contract.projectName | string | 是 | 项目名称 |
| costControl | object | 否 | 成本控制,字段见 8.2 |
| receivable | object | 否 | 应收款,字段见 8.3 |
| payable | object | 否 | 应付款,字段见 8.4 |
| other | object | 否 | 其他,字段见 8.5 |
#### 响应参数(成功,HTTP 201
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | string | 新创建的项目 ID |
| message | string | 固定为「创建成功」 |
#### 响应参数(失败,HTTP 400
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | number | 错误码,400 |
| message | string | 错误信息,如「合同编号不能为空」「项目名称不能为空」 |
| errors | array | 可选,见第 10 节 |
#### 响应参数(失败,HTTP 403
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | number | 错误码,403 |
| message | string | 错误信息,如「无权限」 |
---
## 6. 更新项目
| 项目 | 说明 |
|------|------|
| **接口** | `POST /api/projects/update` |
| **说明** | 更新项目全部或部分信息;每次保存由后端记录一条操作日志 |
| **权限** | 已登录,所有角色可访问 |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | string | 是 | 项目 ID |
| contract | object | 否 | 合同信息,传则按约定全量/合并更新,字段见 8.1 |
| costControl | object | 否 | 成本控制,字段见 8.2 |
| receivable | object | 否 | 应收款,字段见 8.3 |
| payable | object | 否 | 应付款,字段见 8.4 |
| other | object | 否 | 其他,字段见 8.5 |
#### 响应参数(成功,HTTP 200
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | string | 项目 ID |
| message | string | 固定为「保存成功」 |
#### 响应参数(失败)
| HTTP 状态 | 参数名 | 类型 | 说明 |
|-----------|--------|------|------|
| 404 | code | number | 错误码,404 |
| 404 | message | string | 如「项目不存在」 |
---
## 7. 操作日志
| 项目 | 说明 |
|------|------|
| **接口** | `POST /api/projects/logs` |
| **说明** | 获取某项目的修改记录(操作人、时间、修改摘要) |
| **权限** | 已登录,所有角色可访问 |
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | string | 是 | 项目 ID |
| page | number | 否 | 页码,从 1 开始,默认 1 |
| pageSize | number | 否 | 每页条数,默认 20 |
#### 响应参数(成功,HTTP 200
| 参数名 | 类型 | 说明 |
|--------|------|------|
| list | array | 操作日志列表,无记录时为空数组 |
| list[].id | string | 日志 ID |
| list[].operatorId | string | 操作人 ID |
| list[].operatorName | string | 操作人姓名 |
| list[].operatedAt | string | 操作时间,ISO8601 |
| list[].summary | string | 修改摘要,如「合同信息」「成本控制」 |
| list[].detail | string | 可选,修改内容详情 |
| total | number | 总条数,无记录时为 0 |
| page | number | 当前页码 |
| pageSize | number | 每页条数 |
#### 响应参数(失败,HTTP 404
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | number | 错误码,404 |
| message | string | 如「项目不存在」 |
---
## 8. 项目信息字段(5 个分类)
以下为各分类在 **请求/响应** 中使用的字段定义;单位、是否必填、校验规则由后端统一规定,前端与后端对齐。
### 8.1 合同信息 `contract`
| 字段名 | 类型 | 说明 |
|--------|------|------|
| serialNo | string | 序号 |
| contractCode | string | 合同编号 |
| powerBureauContractCode | string | 供电局项目合同编号 |
| projectName | string | 项目名称 |
| subItemCount | number | 子项个数 |
| subItemCode | string | 子项编码 |
| totalInvestment | number | 项目总投资(万元) |
| bidContractAmount | string | 中标合同金额(万元,字符串存储) |
| warrantyRatio | string \| number | 质保金比例 |
| settlementAmount | number | 结算金额(万元) |
| totalCostEstimate | number | 总成本测算 |
| voltageLevel | string | 工程电压等级 |
| projectCategory | string | 工程类别 |
| ownerUnit | string | 业主单位 |
| ownerContact | string | 业主联系人及电话 |
| bidType | string | 中标形式 |
| signDate | string | 签订日期:有有效日期时返回 YYYY-MM-DD,否则返回原文(如「在建中」「未开工」) |
| startDate | string | 开工日期:同上 |
| plannedCompletionDate | string | 计划竣工日期:同上 |
| actualCompletionDate | string | 实际竣工日期:同上 |
| warrantyAmount | number | 质保金(万元) |
| warrantyEndDate | string | 质保期截止日(字符串存储) |
| actualWarrantyRefundDate | string | 实际退质保金日期 |
| projectDepartment | string | 所属项目部 |
| projectLeaderContact | string | 项目负责人及电话 |
| paymentMethod | string | 工程款拨付方式 |
### 8.2 成本控制 `costControl`
| 字段名 | 类型 | 说明 |
|--------|------|------|
| totalCost | number | 总体成本 |
| isAdjusted | string | 是否调整:是/否 |
| migrantWorkerPlan | string \| number | 农民工工资(按进度计划) |
| migrantWorkerActual | number | 农民工工资(实付) |
| selfSupplyMaterialControl | number | 乙供材料费(控制) |
| materialPayableByRatio | number | 应付材料费(按收款比例) |
| materialActualOccurred | number | 实际发生材料费 |
| materialActualPaid | number | 实际支付材料费 |
| otherCostControl | number | 其他费用(控制) |
| otherPayable | number | 应付其他费 |
| otherActual | number | 实际其他费用 |
| tax | number | 税金 |
| profit | number | 利润(万元) |
| actualProfit | number | 实际利润(万元) |
| costSettlementAmount | number | 成本结算金额(万元) |
### 8.3 应收款 `receivable`
| 字段名 | 类型 | 说明 |
|--------|------|------|
| receivableProgress | number | 应收款(完成进度款) |
| invoiceAmount | number | 开票金额(万元) |
| actualReceiptAmount | number | 实际收款金额(万元) |
| actualReceiptRate | string \| number | 实际收款完成率 |
### 8.4 应付款 `payable`
| 字段名 | 类型 | 说明 |
|--------|------|------|
| payableAmount | number | 应付款金额(万元) |
| actualPaymentAmount | number | 实际付款金额(万元) |
| unreceivedAmount | number | 未收款(万元) |
| actualPaymentRate | string \| number | 实际付款完成率 |
| migrantWorkerArrears | number | 民工工资清欠金额(万元) |
### 8.5 其他 `other`
| 字段名 | 类型 | 说明 |
|--------|------|------|
| settlementCostEstimate | number | 结算后成本测算金额 |
| settlementLaborCost | number | 结算人工费 |
| settlementMaterialCost | number | 结算材料费 |
| settlementOtherCost | number | 结算其他费 |
| dueSettlementCount | number | 到期应结算项目个数 |
| overdueSettlementCount | number | 到期未完成结算个数 |
| existingProblems | string | 存在的问题 |
| suggestions | string | 建议措施 |
| cumulativeProgress | string \| number | 累计进度 |
| remark | string | 备注 |
---
## 9. 项目列表/筛选枚举
以下由后端定义并提供给前端(如通过配置接口或文档约定):
- **项目进度 progress**:枚举值列表,如「未开始 / 进行中 / 已竣工」等
- **项目费用 cost**:枚举值列表,如按金额区间的选项
具体取值以实际业务与后端实现为准。
---
## 10. 统一错误响应
| HTTP 状态 | 说明 |
|-----------|------|
| 400 | 请求参数错误 |
| 401 | 未登录或 Token 无效 |
| 403 | 无权限(如非市场部调用新建项目) |
| 404 | 资源不存在(如项目 ID 不存在) |
| 500 | 服务器内部错误 |
#### 错误响应体参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | number | HTTP 状态码或业务错误码 |
| message | string | 错误描述 |
| errors | array | 可选,参数校验详情 |
| errors[].field | string | 出错字段名 |
| errors[].message | string | 该字段错误说明 |
**示例**
```json
{
"code": 400,
"message": "参数校验失败",
"errors": [
{ "field": "projectName", "message": "项目名称不能为空" }
]
}
```
---
## 11. 接口一览
| 接口 | 方法 | 说明 | 权限 |
|------|------|------|------|
| /api/auth/login | POST | 登录 | 公开 |
| /api/projects/list | POST | 项目列表(搜索、筛选、分页) | 已登录 |
| /api/projects/detail | POST | 项目详情 | 已登录 |
| /api/projects/create | POST | 新建项目 | 已登录且市场部 |
| /api/projects/update | POST | 更新项目(记操作日志) | 已登录 |
| /api/projects/logs | POST | 操作日志列表 | 已登录 |
字段命名采用驼峰;日期格式建议 ISO8601 或 `YYYY-MM-DD`,前后端约定一致。