Files
my-mom-system/mom-backend/docs/Testing/EBOM-API测试文档.md
2026-03-06 02:12:34 +08:00

504 lines
12 KiB
Markdown
Raw Permalink 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.
# EBOM / 产品BOM 后端 API 测试文档
> 依据前端 `erp-frontend-vue/src/api/rd/ebom.ts` 与后端 `MdBomController`、`MdProductBomController` 编写,用于接口联调与测试。
> 生产计划单「选择EBOM单」弹窗依赖本组接口见《mom系统生产计划单-页面开发说明文档》7.6.4、7.6.5)。
---
## 1. 约定说明
| 项目 | 说明 |
|------|------|
| 基础路径 | 网关/应用根路径 + 下表 path`http://host:port/mes/md/bom` |
| 认证 | 需登录态,请求头带 Token`Authorization: Bearer xxx` |
| 分页 | 列表接口支持 `pageNum``pageSize`,响应含 `rows``total` |
| 通用响应 | 非分页接口通常为 `{ code, msg, data }`code=200 表示成功 |
---
## 2. BOM 表头接口MdBomController
**Base path:** `/mes/md/bom`
### 2.1 查询 BOM 列表(分页)
| 项目 | 内容 |
|------|------|
| 前端方法 | `listEbom(query)` / `listEbomDetail(query)` |
| 方法 | GET |
| 路径 | `/mes/md/bom/list` |
| 权限 | 无特殊注解,依赖全局或菜单权限 |
**请求参数Query与 EbomQuery 对应):**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| bomCode | string | 否 | BOM 编码,模糊 |
| itemCode | string | 否 | 产品/物料编码,模糊 |
| itemName | string | 否 | 产品/物料名称,模糊 |
| itemTypeId | number | 否 | 物料分类 ID |
| status | string | 否 | 单据状态DRAFT / APPROVED |
| businessStatus | string | 否 | 业务状态 |
| beginDate | string | 否 | 开始日期 YYYY-MM-DD映射 params.beginDate |
| endDate | string | 否 | 结束日期 YYYY-MM-DD |
| pageNum | number | 否 | 页码,默认 1 |
| pageSize | number | 否 | 每页条数,默认 10 |
**响应示例:**
```json
{
"code": 200,
"msg": "查询成功",
"rows": [
{
"bomId": 1,
"bomCode": "BOM001",
"bomName": "示例BOM",
"itemId": 100,
"itemCode": "ITEM01",
"itemName": "产品A",
"version": "V1.0",
"versionDesc": "初版",
"status": "DRAFT",
"baseQty": 1,
"createTime": "2026-01-01 10:00:00"
}
],
"total": 1
}
```
**测试要点:**
- 无参数返回分页列表total 与 rows 长度一致或 total 为总条数。
-`status=APPROVED`:仅返回已审核 BOM。
-`itemCode` / `itemName`:按物料编码或名称筛选。
-`beginDate``endDate`:按创建日期范围筛选。
---
### 2.2 获取 BOM 详情(含明细行)
| 项目 | 内容 |
|------|------|
| 前端方法 | `getEbom(bomId)` |
| 方法 | GET |
| 路径 | `/mes/md/bom/{bomId}` |
| 权限 | `mes:md:bom:query` |
**路径参数:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| bomId | long | BOM 表头主键 |
**响应示例:**
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"bomId": 1,
"bomCode": "BOM001",
"bomName": "示例BOM",
"itemId": 100,
"itemCode": "ITEM01",
"itemName": "产品A",
"version": "V1.0",
"versionDesc": "初版",
"status": "DRAFT",
"baseQty": 1,
"lines": [
{
"bomId": 101,
"bomCode": "BOM001",
"bomItemId": 201,
"bomItemCode": "MAT01",
"bomItemName": "物料1",
"quantity": 2,
"unitName": "个",
"lineNo": 1
}
]
}
}
```
**测试要点:**
- 存在 bomId返回表头 + `lines` 数组(按 bomCode 关联的 md_product_bom 行)。
- 不存在 bomId返回 404 或 code≠200。
- 用于生产计划单「选择EBOM单」确定后展示、或「查看」EBOM 详情。
---
### 2.3 新增 BOM 表头
| 项目 | 内容 |
|------|------|
| 前端方法 | `addEbom(data)` |
| 方法 | POST |
| 路径 | `/mes/md/bom` |
| Content-Type | application/json |
| 权限 | `mes:md:bom:add` |
**请求体示例:**
```json
{
"bomCode": "BOM002",
"bomName": "新BOM",
"itemId": 100,
"itemCode": "ITEM01",
"itemName": "产品A",
"unitName": "台",
"baseQty": 1,
"version": "V1.0",
"versionDesc": "初版",
"status": "DRAFT",
"enableFlag": "Y",
"remark": "备注"
}
```
**响应示例:**
```json
{
"code": 200,
"msg": "操作成功",
"data": { "bomId": 2 }
}
```
**测试要点:**
- bomCode 重复:应返回业务错误提示。
- 必填项缺失(如 bomCode、itemId 等):返回参数校验错误。
---
### 2.4 修改 BOM 表头
| 项目 | 内容 |
|------|------|
| 前端方法 | `updateEbom(data)` |
| 方法 | PUT |
| 路径 | `/mes/md/bom` |
| Content-Type | application/json |
| 权限 | `mes:md:bom:edit` |
**请求体:** 与新增类似,需带 `bomId`
**测试要点:**
- 仅更新传入字段;审核后是否允许修改依业务配置。
---
### 2.5 删除 BOM 表头
| 项目 | 内容 |
|------|------|
| 前端方法 | `deleteEbom(ids)` |
| 方法 | DELETE |
| 路径 | `/mes/md/bom/{bomIds}` |
| 权限 | `mes:md:bom:remove` |
**路径参数:** `bomIds` 为多个时逗号分隔,如 `1,2,3`
**响应示例:**
```json
{
"code": 200,
"msg": "操作成功"
}
```
**测试要点:**
- 单条:`DELETE /mes/md/bom/1`
- 多条:`DELETE /mes/md/bom/1,2,3`
- 逻辑删除del_flag=1列表不再返回已删记录。
---
### 2.6 审核 EBOM
| 项目 | 内容 |
|------|------|
| 前端方法 | `approveEbom(bomId)` |
| 方法 | PUT |
| 路径 | `/mes/md/bom/approve` |
| Content-Type | application/json |
| 权限 | `mes:md:bom:edit` |
**请求体:**
```json
{
"bomId": 1
}
```
**响应示例:**
```json
{
"code": 200,
"msg": "操作成功"
}
```
**测试要点:**
- 成功:对应 BOM 的 `status` 更新为 `APPROVED`
- 缺少 bomId返回「bomId 不能为空」或 code≠200。
---
### 2.7 反审核 EBOM
| 项目 | 内容 |
|------|------|
| 前端方法 | `unapproveEbom(bomId)` |
| 方法 | PUT |
| 路径 | `/mes/md/bom/reject` |
| Content-Type | application/json |
| 权限 | `mes:md:bom:edit` |
**请求体:**
```json
{
"bomId": 1
}
```
**测试要点:**
- 成功:对应 BOM 的 `status` 更新为 `DRAFT`
---
### 2.8 导出 BOM 列表GET
| 项目 | 内容 |
|------|------|
| 前端方法 | `exportEbom(query)` |
| 方法 | GET |
| 路径 | `/mes/md/bom/export` |
| 权限 | `mes:md:bom:export` |
**请求参数:** 与 2.1 列表查询一致bomCode、itemCode、status、beginDate、endDate 等)。
**响应:** 二进制流Excel`Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` 或类似;前端使用 `responseType: 'blob'`
**测试要点:**
- 带与列表相同的查询条件,返回 Excel 文件且可打开。
- 无权限时返回 403。
---
## 3. BOM 明细行接口MdProductBomController
**Base path:** `/mes/md/bom/line`
### 3.1 查询 BOM 明细列表(分页)
| 项目 | 内容 |
|------|------|
| 前端方法 | `listEbomLines(query)` |
| 方法 | GET |
| 路径 | `/mes/md/bom/line/list` |
**请求参数Query**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| bomCode | string | 否 | BOM 编码,精确或模糊(依后端实现) |
| pageNum | number | 否 | 页码 |
| pageSize | number | 否 | 每页条数 |
**响应示例:**
```json
{
"code": 200,
"msg": "查询成功",
"rows": [
{
"bomId": 101,
"bomCode": "BOM001",
"bomItemId": 201,
"bomItemCode": "MAT01",
"bomItemName": "物料1",
"quantity": 2,
"unitName": "个",
"lineNo": 1,
"supplyType": "PRODUCE"
}
],
"total": 1
}
```
**测试要点:**
-`bomCode` 筛选某 BOM 下的所有明细行。
---
### 3.2 获取单条 BOM 明细
| 项目 | 内容 |
|------|------|
| 方法 | GET |
| 路径 | `/mes/md/bom/line/{bomId}` |
| 权限 | `mes:md:mditem:query` |
**说明:** 此处 `bomId` 为明细表主键md_product_bom 行 ID。前端 EBOM 模块未单独调用该接口,详情通过 2.2 表头详情中的 `lines` 获取。
---
### 3.3 新增 BOM 明细
| 项目 | 内容 |
|------|------|
| 前端方法 | `addEbomLine(data)` |
| 方法 | POST |
| 路径 | `/mes/md/bom/line` |
| Content-Type | application/json |
| 权限 | `mes:md:mditem:add` |
**请求体示例:**
```json
{
"bomCode": "BOM001",
"itemId": 100,
"bomItemId": 201,
"bomItemCode": "MAT01",
"bomItemName": "物料1",
"quantity": 2,
"unitOfMeasure": "个",
"lineNo": 1,
"supplyType": "PRODUCE"
}
```
**测试要点:**
- `bomItemId == itemId`(产品作为自身 BOM 物料后端应返回「产品不能作为自身的BOM物料」。
---
### 3.4 修改 BOM 明细
| 项目 | 内容 |
|------|------|
| 前端方法 | `updateEbomLine(data)` |
| 方法 | PUT |
| 路径 | `/mes/md/bom/line` |
| Content-Type | application/json |
| 权限 | `mes:md:mditem:edit` |
**请求体:** 需带明细主键(如 `bomId` 在 line 表中表示行 ID
---
### 3.5 删除 BOM 明细
| 项目 | 内容 |
|------|------|
| 前端方法 | `deleteEbomLine(ids)` |
| 方法 | DELETE |
| 路径 | `/mes/md/bom/line/{bomIds}` |
| 权限 | `mes:md:mditem:remove` |
**路径参数:** 多个 ID 逗号分隔,如 `101,102`。此处为明细行主键md_product_bom 表 PK
---
## 4. 前端与后端接口对照表
| 前端 APIebom.ts | 方法 | 后端路径 |
|---------------------|------|----------|
| listEbom / listEbomDetail | GET | /mes/md/bom/list |
| getEbom(bomId) | GET | /mes/md/bom/{bomId} |
| addEbom(data) | POST | /mes/md/bom |
| updateEbom(data) | PUT | /mes/md/bom |
| deleteEbom(ids) | DELETE | /mes/md/bom/{bomIds} |
| approveEbom(bomId) | PUT | /mes/md/bom/approve |
| unapproveEbom(bomId) | PUT | /mes/md/bom/reject |
| exportEbom(query) | GET | /mes/md/bom/export |
| listEbomLines(query) | GET | /mes/md/bom/line/list |
| addEbomLine(data) | POST | /mes/md/bom/line |
| updateEbomLine(data) | PUT | /mes/md/bom/line |
| deleteEbomLine(ids) | DELETE | /mes/md/bom/line/{bomIds} |
---
## 5. 生产计划单场景联调要点
- **选择EBOM单弹窗7.6.4**:打开弹窗时调用 `GET /mes/md/bom/list`,建议带 `status=APPROVED`、可选 `itemCode`(引入产品)筛选;选中一条后点确定,前端将 `bomCode`/`version`/`versionDesc` 回填表头。
- **EBOM 详情查看7.6.5**:点击「查看」时调用 `GET /mes/md/bom/{bomId}`,展示表头 + `lines`(子件明细)。
- **列表分页与导出**:列表使用 `pageNum``pageSize`;导出使用 GET `/mes/md/bom/export` 且响应为 blob与前端 `exportEbom` 一致。
---
## 6. 建议测试顺序
1. 列表GET `/mes/md/bom/list`(无参、带 status、带 itemCode
2. 详情GET `/mes/md/bom/{bomId}`,校验含 `lines`
3. 新增POST `/mes/md/bom`,再查列表/详情确认。
4. 修改PUT `/mes/md/bom`
5. 审核/反审核PUT `/mes/md/bom/approve`、PUT `/mes/md/bom/reject`,再查详情校验 status。
6. 导出GET `/mes/md/bom/export`,保存为 Excel 并打开。
7. 明细GET `/mes/md/bom/line/list?bomCode=xxx`POST/PUT/DELETE 明细,再查表头详情校验 `lines`
---
## 7. 测试脚本执行说明
已提供脚本 **`run-ebom-api-tests.sh`**(与本文档同目录),按上述顺序自动调用各接口并汇总通过/失败。
**前置条件:**
- 后端已启动(如 `mvn spring-boot:run -pl ktg-admin`且数据库、Redis 可用。
- 若系统开启验证码,需在管理端关闭验证码,或先登录获取 Token 后设置环境变量再执行脚本。
**执行方式:**
```bash
cd mom-backend/docs/Testing
./run-ebom-api-tests.sh
```
**环境变量(可选):**
| 变量 | 默认值 | 说明 |
|------|--------|------|
| BASE_URL | http://localhost:8080 | 后端根地址 |
| TOKEN | (空则自动登录) | 若已持有 Token可直接设置跳过登录 |
| USERNAME | admin | 自动登录时的用户名 |
| PASSWORD | admin123 | 自动登录时的密码 |
| RESULT_DIR | ./test-results | 响应与报告输出目录 |
**示例:指定地址与 Token**
```bash
export BASE_URL=http://192.168.8.66:8080
export TOKEN=eyJhbGciOiJIUzUxMiJ9...
./run-ebom-api-tests.sh
```
**输出:**
- 控制台与 `RESULT_DIR` 下时间戳报告文件(如 `ebom-api-test-20260126-214351.txt`)中会打印每条用例的 **PASS/FAIL** 及最终 **PASS/FAIL 数量**
- 各接口响应 JSON 保存在 `RESULT_DIR/response_<用例名>.json`,便于排查失败原因。