# 01-项目功能内容

## 1. 项目目标

建设一个替代当前 `MES_Manage/submit/MESCommonBase.ashx` 的通用 WebAPI 服务，运行在 Linux 操作系统上，面向前台提供统一接口，并支持以下数据库：

- SQL Server
- PostgreSQL
- MySQL

新项目不是简单把 `ashx` 改成 WebAPI，而是把旧项目中“前台通过 `Type/Name/Param` 驱动 SQL 和存储过程”的模式改造成：

```text
前台调用 WebAPI
  -> 后端按 actionId 或 legacy type 找白名单
  -> Provider 层选择 SQL Server / PostgreSQL / MySQL
  -> 统一参数、统一鉴权、统一响应、统一日志
```

### 1.1 目标 SDK 与目录基线

- 新项目目标 SDK 固定为 `.NET 10`。
- 新项目目标 `TargetFramework` 固定为 `net10.0`。
- 新代码根目录固定为 `MesUniversalApi/`。
- `working/` 仅保留分析资料，`working1/` 仅保留项目管理文档。
- 在 `.NET 10 SDK` 安装到位前，只进行文档、目录、资产盘点和接口梳理，不以 `net9.0` 临时创建正式项目。

## 2. 旧系统核心能力

旧系统入口：

```text
MES_Manage/submit/MESCommonBase.ashx
```

旧系统主要能力：

| 能力 | 旧 Type | 说明 |
| --- | --- | --- |
| Excel 导出 | `2001` | 调用 `MESDownloadExcel.ExcelWebCall.ExcelFile` |
| PDF 导出 | `2002` | 调用 `ExcelWebCall.ExcelFilePdf` |
| Excel 图片或指定扩展名导出 | `2003` | 读取 Form 第一项，生成下载文件 |
| 数据库文件下载 | `2004` | 调用 `DataLink.ExePROCEDURE_Type2004` |
| 文件上传 | `15` | 读取 `Request.Files[0]`，调用 `ExePROCEDURE_Type15` |
| 数据库文件下载 | `16` | 调用 `ExePROCEDURE_Type16` |
| IP 查询 | `4000` | 返回请求 IP |
| 通用 SQL/存储过程调用 | default | 调用 `DataLink.SqlWebCall(type,jsonData,dataobj)` |

`SqlWebCall` 的二次分发能力：

| 能力 | 旧 Type |
| --- | --- |
| 加密、注册、登录 | `8888/5001/5002` |
| 旧协议存储过程 | `1/2/5` |
| 新协议存储过程 | `11/111/12/13/21` |
| 直接 SQL 查询或执行 | `3/4/22/1001/1002/3001` |
| 动态建表导入 | `7` |

## 3. 新项目功能范围

### 3.1 WebAPI 基础能力

新项目必须提供：

- HTTP JSON API。
- OpenAPI/Swagger 文档。
- JWT 鉴权。
- CORS 配置。
- 健康检查接口。
- 统一异常处理中间件。
- 统一响应结构。
- 结构化日志和审计日志。
- Linux 部署能力。

### 3.2 多数据库执行能力

新项目必须支持：

- SQL Server 连接和执行。
- PostgreSQL 连接和执行。
- MySQL 连接和执行。
- 参数绑定。
- 查询返回动态结果集。
- 非查询执行。
- 存储过程或函数调用。
- 分页查询。
- 文件二进制上传和下载。

数据库访问不允许散落在 Controller 中，必须通过 Provider 抽象：

```text
IDatabaseProvider
  |-- SqlServerProvider
  |-- PostgreSqlProvider
  |-- MySqlProvider
```

### 3.3 旧协议兼容能力

新项目应提供短期兼容接口：

```http
POST /api/v1/legacy/execute
```

兼容字段：

- `type`
- `name`
- `param`
- `token`
- `pageSize`
- `pageList`
- `Pagination`

兼容原则：

- 兼容不等于完全放开。
- `name` 必须命中白名单。
- 高风险 Type 默认不开放。
- 旧接口只作为迁移过渡，不作为长期推荐接口。

### 3.4 新 actionId 接口

新业务推荐使用：

```http
POST /api/v1/actions/{actionId}/execute
```

例如：

```http
POST /api/v1/actions/quality.line.query/execute
```

好处：

- 前台不再传 SQL。
- 前台不再传存储过程名。
- 后端可按 actionId 做权限、参数、数据库命令和审计控制。

### 3.5 文件接口

上传：

```http
POST /api/v1/files/{actionId}/upload
```

下载：

```http
GET /api/v1/files/{actionId}/download
```

文件功能要求：

- 支持 multipart 上传。
- 支持文件大小限制。
- 支持扩展名白名单。
- 支持下载文件名 UTF-8 编码。
- 支持跨域读取 `Content-Disposition`。
- 支持数据库 BLOB 或外部文件存储。

### 3.6 报表导出

旧 `2001/2002/2003` 迁移为报表 action。

建议接口：

```http
POST /api/v1/reports/{reportId}/export
```

输出格式：

- Excel
- PDF
- 后续可扩展 CSV

## 4. 不在首期范围内的内容

首期不建议做：

- 一次性把所有 SQL Server 存储过程自动翻译成 MySQL/PostgreSQL。
- 继续开放任意 SQL 执行给前台。
- 重写全部前端。
- 重写所有 Excel 模板。
- 建立复杂低代码平台。

首期重点应是：

```text
WebAPI 化 + SQL Server 兼容 + 白名单治理 + Provider 抽象
```

## 5. 旧 Type 到新功能映射

| 旧 Type | 新项目目标功能 | 首期策略 |
| --- | --- | --- |
| `2001` | Excel 导出 | 转报表 action |
| `2002` | PDF 导出 | 转报表 action |
| `2003` | 扩展导出 | 评估后转报表 action |
| `2004` | 文件下载 | 转文件下载 action |
| `15` | 文件上传 | 转文件上传 action |
| `16` | 文件下载 | 转文件下载 action |
| `4000` | IP 查询 | 独立诊断接口 |
| `1/2/5` | 旧协议存储过程 | 兼容但必须白名单 |
| `11/111/12/13/21` | 新协议存储过程 | 优先兼容 |
| `8888/5001/5002` | 加密、注册、登录 | 迁移到 Auth API |
| `3/4/7/22/1001/1002/3001` | 直接 SQL 或建表 | 默认禁用或仅管理端审计开放 |

## 6. 目标质量属性

### 6.1 安全

- 所有执行业务接口默认要求登录。
- action 必须白名单。
- 参数必须按定义校验。
- 禁止前台任意传 SQL。
- 文件上传必须校验大小和类型。
- 连接字符串不进入代码仓库。

### 6.2 可移植

- 运行在 Linux。
- 支持 Docker。
- 支持 systemd。
- 不依赖 IIS。
- 不依赖 .NET Framework。

### 6.3 可观测

- 每次执行有 traceId。
- 每个 action 记录耗时。
- 记录数据库类型和数据源。
- 记录错误摘要。
- 支持健康检查。

### 6.4 可维护

- Controller 只负责 HTTP 协议。
- 业务编排在 Application 层。
- 数据库差异在 Infrastructure Provider 层。
- 任务推进受 `04-任务矩阵.md` 控制。

### 6.5 目录边界

- 不在 `MES_Manage/` 和 `02DataLinkMesWork/` 中直接展开新 WebAPI 开发。
- 不把新项目证据散落到旧项目目录。
- 新项目代码、测试、部署、工具和附件统一进入 `MesUniversalApi/`。
- `working1/05-验收证据.md` 负责证据索引，原始附件优先放到 `MesUniversalApi/evidence/`。

## 7. 首批验收目标

首批可验收功能：

1. WebAPI 项目可在 Linux 启动。
2. Swagger 可打开。
3. JWT 登录和鉴权可用。
4. SQL Server Provider 可执行旧 `Type=11` 查询。
5. Legacy 接口可接收旧格式请求。
6. actionId 接口可执行一个白名单查询。
7. 文件下载可返回正确文件名和二进制。
8. 审计日志可记录用户、action、数据库、耗时、结果。
