Files
MES/yawei-mes/.tasks/2026-02-24_v2.0.000_ATS接口文档.md

741 lines
20 KiB
Markdown
Raw Permalink Normal View History

2026-04-02 10:38:23 +08:00
# ATS 批量排产报工接口文档
## 版本信息
- 版本号v2.0.0
- 创建日期2026-02-24
- 当前局域网测试地址:
- **前端地址**http://192.168.1.244:80
- **后端地址**http://192.168.1.244:8080
## 接口说明
### 1. 批量自动完成接口(异步模式)
#### 1.1 基本信息
- **接口名称**:批量自动完成销售订单(异步提交)
- **接口路径**`后端地址/production/autoComplete/batchAutoComplete`
- **请求方法**POST
- **Content-Type**application/json;charset=UTF-8
- **认证方式**:无需认证(已配置匿名访问)
- **执行模式**异步执行立即返回任务ID
#### 1.2 请求参数
##### 请求体JSON
```json
{
"orderNumbers": ["SO202602240001", "SO202602240002"],//订单编号列表,必填
"routeId": 1001,//工序路线id可选
"productionStartTime": "2026-02-24 08:00:00"//生产计划开始时间,可选
}
```
##### 参数说明
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| orderNumbers | Array<String> | 是 | 销售订单编号列表,不能为空 |
| routeId | Long | 否 | 工序路线ID如不指定则使用物料默认路线 |
| productionStartTime | String | 否 | 生产开始时间格式yyyy-MM-dd HH:mm:ss |
##### 参数约束
- `orderNumbers`:必填,至少包含一个有效订单编号
- 订单编号会自动过滤空字符串和null值
- `routeId`:可选,不指定时系统会根据物料配置自动选择路线
- `productionStartTime`:可选,指第一条工单的计划开始时间,不指定时系统会生成模拟时间(生产订单日期作为日期早8:00-9:00随机时间后续工单按照系统逻辑读取工序持续时间生成)
#### 1.3 响应结果(立即返回)
##### 成功响应示例
```json
{
"code": 200,
"msg": "任务已提交,正在后台处理",
"data": {
"taskId": "TASK_20260224_001",
"totalCount": 50,
"estimatedSeconds": 50,
"status": "PENDING",
"message": "任务已创建预计需要50秒完成"
}
}
```
##### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| code | Integer | 响应状态码200表示成功 |
| msg | String | 响应消息 |
| data.taskId | String | 任务ID用于后续查询任务状态 |
| data.totalCount | Integer | 总订单数 |
| data.estimatedSeconds | Integer | 预计耗时(秒) |
| data.status | String | 任务状态PENDING-待处理 |
| data.message | String | 提示信息 |
---
### 2. 任务状态查询接口
#### 2.1 基本信息
- **接口名称**:查询批量任务状态
- **接口路径**`后端地址/production/autoComplete/taskStatus/{taskId}`
- **请求方法**GET
- **认证方式**:无需认证(已配置匿名访问)
#### 2.2 请求参数
##### 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| taskId | String | 是 | 任务ID由提交接口返回 |
##### 请求示例
```
GET /production/autoComplete/taskStatus/TASK_20260224_001
```
#### 2.3 响应结果
##### 处理中响应示例
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"taskId": "TASK_20260224_001",
"status": "PROCESSING",
"totalCount": 50,
"processedCount": 25,
"successCount": 23,
"failedCount": 2,
"completedCount": 0,
"percentage": 50,
"startTime": "2026-02-24 10:00:00",
"estimatedSeconds": 50,
"elapsedSeconds": 25,
"message": "正在处理中已完成50%"
}
}
```
##### 已完成响应示例
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"taskId": "TASK_20260224_001",
"status": "COMPLETED",
"totalCount": 50,
"processedCount": 50,
"successCount": 48,
"failedCount": 2,
"completedCount": 0,
"percentage": 100,
"startTime": "2026-02-24 10:00:00",
"endTime": "2026-02-24 10:00:52",
"estimatedSeconds": 50,
"elapsedSeconds": 52,
"message": "任务已完成",
"result": {
"successOrders": ["SO001", "SO002", "..."],
"failedOrders": ["SO025", "SO038"],
"completedOrders": [],
"failureReasons": {
"SO025": "订单不存在",
"SO038": "物料未配置工序路线"
}
}
}
}
```
##### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| code | Integer | 响应状态码200表示成功 |
| msg | String | 响应消息 |
| data.taskId | String | 任务ID |
| data.status | String | 任务状态PENDING-待处理/PROCESSING-处理中/COMPLETED-已完成/FAILED-失败 |
| data.totalCount | Integer | 总订单数 |
| data.processedCount | Integer | 已处理数量 |
| data.successCount | Integer | 成功数量 |
| data.failedCount | Integer | 失败数量 |
| data.completedCount | Integer | 已完成(跳过)数量 |
| data.percentage | Integer | 完成百分比0-100 |
| data.startTime | String | 开始时间 |
| data.endTime | String | 结束时间(仅完成时有值) |
| data.estimatedSeconds | Integer | 预计耗时(秒) |
| data.elapsedSeconds | Integer | 已耗时(秒) |
| data.message | String | 状态描述信息 |
| data.result | Object | 详细结果(仅完成时有值) |
| data.result.successOrders | Array<String> | 成功处理的订单编号列表 |
| data.result.failedOrders | Array<String> | 处理失败的订单编号列表 |
| data.result.completedOrders | Array<String> | 已完成(跳过)的订单编号列表 |
| data.result.failureReasons | Map<String, String> | 失败原因映射 |
#### 2.4 错误响应
##### 任务不存在
```json
{
"code": 500,
"msg": "任务不存在"
}
```
---
## 业务流程
### 3.1 异步处理流程
```
客户端 服务端 数据库
| | |
|--1.提交批量请求------->| |
| |--2.创建任务记录--------->|
| | |
|<--3.返回任务ID---------| |
| | |
| |--4.异步执行任务--------->|
| | (后台线程池) |
| | |
|--5.查询任务状态------->| |
| |--6.查询任务记录--------->|
|<--7.返回当前进度-------|<--返回任务数据-----------|
| | |
|--8.再次查询状态------->| |
| |--9.查询任务记录--------->|
|<--10.返回完成结果------|<--返回完成数据-----------|
```
### 3.2 详细处理步骤
#### 步骤1提交任务同步<1秒
1. **参数验证**
- 验证订单编号列表不为空
- 过滤无效的订单编号null或空字符串
2. **创建任务记录**
- 生成唯一任务ID格式TASK_yyyyMMdd_HHmmss_随机数
- 计算预计耗时(订单数 × 1秒
- 初始化任务状态为 PENDING
- 写入数据库
3. **立即返回**
- 返回任务ID、总订单数、预计耗时
- 客户端收到响应,可以开始轮询查询状态
#### 步骤2异步执行后台线程池
1. **更新任务状态为 PROCESSING**
- 记录开始时间
- 写入数据库
2. **循环处理订单**
- 验证订单是否存在
- 检查订单状态(已完成的订单会跳过)
- 根据订单类型(连续制造/离散制造)执行不同流程
- 生成工单、报工单
- 更新工单状态
3. **批量更新进度每5个订单**
- 更新 processedCount、successCount、failedCount
- 写入数据库
- 减少数据库写入频率,提升性能
4. **任务完成**
- 更新任务状态为 COMPLETED 或 FAILED
- 记录结束时间
- 保存完整结果数据JSON格式
- 写入数据库
#### 步骤3查询任务状态同步<100ms
1. **根据任务ID查询数据库**
2. **计算实时数据**
- 完成百分比 = (processedCount / totalCount) × 100
- 已耗时 = 当前时间 - 开始时间
3. **返回任务状态和进度**
### 3.3 数据库更新策略
为了平衡性能和实时性,采用**批量更新策略**
| 更新时机 | 说明 | 频率 |
|---------|------|------|
| 任务创建 | 初始化任务记录 | 1次 |
| 任务开始 | 更新状态为PROCESSING | 1次 |
| 处理过程 | 每处理5个订单更新一次进度 | N/5次 |
| 任务完成 | 更新状态为COMPLETED保存完整结果 | 1次 |
| 任务失败 | 更新状态为FAILED保存错误信息 | 1次 |
**示例**处理50个订单
- 总更新次数1创建+ 1开始+ 10进度+ 1完成= 13次
- 相比实时更新53次减少了75%的数据库写入
### 3.4 订单处理流程
#### 连续制造流程
1. 为每个订单明细生成工单
2. 生成默认工序配置
3. 批量生成报工单
4. 更新工单状态为"已完成"
#### 离散制造流程
1. 为每个订单明细生成工单
2. 生成默认工序配置
3. 批量生成报工单
4. 更新工单状态为"已完成"
### 3.5 订单状态说明
| 状态 | 说明 | 处理方式 |
|------|------|----------|
| 待生产 | 订单未开始生产 | 正常处理 |
| 生产中 | 订单正在生产 | 正常处理 |
| 已完成 | 订单已完成 | 跳过处理计入completedCount |
| 已删除 | 订单已删除 | 返回错误 |
### 3.6 工序路线选择逻辑
1. 如果请求中指定了`routeId`,优先使用指定的路线
2. 如果订单明细中配置了路线,使用明细配置的路线
3. 如果物料配置了默认路线,使用物料默认路线
4. 如果以上都没有,返回错误
## 性能说明
### 4.1 执行时长估算
| 订单数 | 预计耗时 | 数据库更新次数 |
|--------|---------|--------------|
| 5个 | ~5秒 | 4次 |
| 10个 | ~10秒 | 5次 |
| 50个 | ~50秒 | 13次 |
| 100个 | ~100秒 | 23次 |
**说明**
- 单个订单平均处理时间1秒包含生成工单、报工单、更新状态
- 实际耗时可能因服务器性能、数据库负载而有所差异
### 4.2 并发限制
- **线程池大小**10个线程
- **最大并发任务数**10个
- **任务队列长度**100个
- **超过限制时**:新任务会进入队列等待
### 4.3 超时设置
- **单个任务最大执行时间**5分钟300秒
- **超时后**任务状态标记为FAILED
- **建议**单次批量不超过100个订单
---
## 注意事项
### 5.1 性能考虑
- 建议单次批量处理的订单数量不超过100个
- 大批量处理建议分批调用
- 查询状态的轮询间隔建议3-5秒
### 5.2 事务处理
- 每个订单的处理是独立的事务
- 单个订单失败不会影响其他订单的处理
- 任务记录的更新是独立事务
### 5.3 幂等性
- 已完成的订单会被跳过,不会重复处理
- 可以安全地重复调用接口
- 相同订单号不会重复生成工单
### 5.4 匿名访问
- 该接口已配置为允许匿名访问
- 系统会自动使用"system"用户进行数据创建和更新
- 无需传递token或其他认证信息
### 5.5 日志记录
- 所有操作都会记录详细日志
- 建议在生产环境中监控日志以便排查问题
- 任务失败时会记录详细的错误信息
### 5.6 日志记录
- 所有操作都会记录详细日志
- 建议在生产环境中监控日志以便排查问题
- 任务失败时会记录详细的错误信息
---
---
## 为什么必须使用异步模式?
### 同步方式的严重问题
如果不使用异步批量处理方法,而是用同步方式处理大批量订单,会带来以下严重问题:
### 1. HTTP超时问题 ⚠️ 严重
**问题描述**
- 假设处理50个订单需要50秒
- 大多数HTTP客户端默认超时时间30-60秒
- Nginx/负载均衡器默认超时60秒
- 浏览器默认超时通常2分钟
**后果**
```
客户端发送请求 → 服务器开始处理50个订单
30秒后...客户端超时断开连接
服务器还在继续处理已经处理了30个
客户端收到504 Gateway Timeout 或 Connection Reset
客户端不知道:订单到底处理了多少?成功了多少?
```
**实际影响**
- ❌ 客户端认为请求失败,但服务器可能已经处理了部分订单
- ❌ 无法知道哪些订单成功,哪些失败
- ❌ 可能重复提交,导致数据重复
- ❌ 用户体验极差,不知道发生了什么
### 2. 数据库连接占用 ⚠️ 严重
**问题描述**
- 同步处理会长时间占用数据库连接
- 处理50个订单可能需要50秒
- 这期间数据库连接一直被占用
**后果**
```
数据库连接池大小20个连接
10个客户端同时提交批量请求每个50个订单
10个连接被占用50秒
其他正常业务请求无法获取连接
整个系统卡死!
```
**实际影响**
- ❌ 数据库连接池耗尽
- ❌ 其他业务功能无法使用
- ❌ 系统整体性能下降
- ❌ 可能导致系统崩溃
### 3. 线程阻塞问题 ⚠️ 严重
**问题描述**
- Tomcat默认最大线程数200
- 每个同步请求占用一个线程直到完成
**后果**
```
Tomcat线程池200个线程
20个客户端同时提交批量请求每个处理50秒
20个线程被阻塞50秒
如果有100个这样的请求...
所有线程被占满,新请求无法处理
系统完全无响应!
```
**实际影响**
- ❌ 线程池耗尽
- ❌ 新请求被拒绝503 Service Unavailable
- ❌ 系统无法处理任何请求
- ❌ 需要重启服务器才能恢复
### 4. 用户体验问题 ⚠️ 中等
**问题描述**
- 用户点击提交后,页面一直转圈
- 50秒内无法做任何操作
- 不知道进度,不知道还要等多久
**后果**
```
用户点击提交
页面loading...
10秒...20秒...30秒...
用户:是不是卡死了?要不要刷新?
用户刷新页面或关闭浏览器
但服务器还在处理...
数据可能处理了一半,状态不一致
```
**实际影响**
- ❌ 用户体验极差
- ❌ 用户不知道进度
- ❌ 容易误操作(刷新、重复提交)
- ❌ 客户投诉增加
### 5. 事务管理问题 ⚠️ 中等
**问题描述**
- 如果50个订单在一个事务中
- 第49个订单失败前48个都要回滚
**后果**
```
开始事务
处理订单1...成功
处理订单2...成功
...
处理订单48...成功
处理订单49...失败!
整个事务回滚
前48个订单的工作全部白做
浪费了48秒的处理时间
```
**实际影响**
- ❌ 一个订单失败,全部失败
- ❌ 无法部分成功
- ❌ 处理效率低下
- ❌ 资源浪费
### 6. 无法监控和追踪 ⚠️ 中等
**问题描述**
- 同步处理无法查询进度
- 不知道处理到第几个订单
- 出错后无法定位问题
**后果**
```
提交50个订单
处理中...(黑盒)
30秒后超时
问题:
- 处理了多少个?不知道
- 哪些成功了?不知道
- 哪些失败了?不知道
- 为什么失败?不知道
```
**实际影响**
- ❌ 无法追踪进度
- ❌ 问题难以排查
- ❌ 无法提供客户支持
- ❌ 数据状态不明确
### 7. 系统稳定性问题 ⚠️ 严重
**问题描述**
- 大批量同步请求会导致系统资源耗尽
- 可能引发雪崩效应
**后果**
```
高峰期100个客户端同时提交批量请求
线程池满 + 数据库连接池满
系统响应变慢
客户端超时重试
更多请求涌入
系统完全崩溃
需要紧急重启
```
**实际影响**
- ❌ 系统不稳定
- ❌ 容易崩溃
- ❌ 影响所有用户
- ❌ 需要人工干预
### 8. 扩展性问题 ⚠️ 中等
**问题描述**
- 同步方式无法应对业务增长
- 订单量增加时系统无法承受
**后果**
```
现在每次处理50个订单
业务增长每次需要处理200个订单
处理时间200秒3分20秒
必然超时,系统无法使用
需要重新设计架构
```
**实际影响**
- ❌ 无法应对业务增长
- ❌ 需要重构代码
- ❌ 技术债务增加
- ❌ 开发成本增加
---
## 同步 vs 异步对比
### 性能对比表
| 问题 | 同步方式 | 异步方式 |
|------|---------|---------|
| HTTP超时 | ❌ 必然超时(>30秒 | ✅ 立即返回(<1秒 |
| 数据库连接 | ❌ 长时间占用50秒 | ✅ 短时间占用(<1秒 |
| 线程阻塞 | ❌ 长时间阻塞50秒 | ✅ 立即释放(<1秒 |
| 用户体验 | ❌ 长时间等待,无反馈 | ✅ 立即响应,可查询进度 |
| 事务管理 | ❌ 全部回滚,一个失败全失败 | ✅ 独立事务,部分成功 |
| 进度追踪 | ❌ 无法追踪,黑盒处理 | ✅ 实时查询进度和结果 |
| 系统稳定性 | ❌ 容易崩溃,资源耗尽 | ✅ 稳定可靠,资源可控 |
| 扩展性 | ❌ 无法扩展,订单量增加即崩溃 | ✅ 易于扩展,支持大批量 |
| 错误处理 | ❌ 难以定位,状态不明 | ✅ 详细错误信息和原因 |
| 并发能力 | ❌ 极差10个请求即可拖垮系统 | ✅ 优秀,支持高并发 |
### 实际场景对比
**场景**: 10个客户端同时提交50个订单
#### 同步方式:
```
每个请求耗时50秒
占用线程10个持续50秒
占用数据库连接10个持续50秒
用户等待时间50秒
超时风险100%
系统可用性:严重下降
其他业务影响:严重(连接池和线程池被占用)
```
#### 异步方式:
```
每个请求耗时:<1秒立即返回
占用线程10个持续<1秒
占用数据库连接10个持续<1秒
用户等待时间:<1秒可查询进度
超时风险0%
系统可用性:正常
其他业务影响:无(资源立即释放)
```
### 资源占用对比图
```
同步方式资源占用:
时间轴0s -------- 10s -------- 20s -------- 30s -------- 40s -------- 50s
线程: ████████████████████████████████████████████████████████ (持续占用)
连接: ████████████████████████████████████████████████████████ (持续占用)
用户: ⏳等待中...................................................
异步方式资源占用:
时间轴0s - 1s
线程: █ (立即释放)
连接: █ (立即释放)
用户: ✅已收到任务ID可查询进度
后台处理:
时间轴0s -------- 10s -------- 20s -------- 30s -------- 40s -------- 50s
线程: ████████████████████████████████████████████████████████ (后台线程池)
连接: █ █ █ █ █ █ █ █ █ █ (批量更新,间歇占用)
用户: ✅可随时查询进度20%...40%...60%...80%...100%
```
---
## 异步模式的核心优势
### 1. 立即响应
- ✅ 接口在1秒内返回任务ID
- ✅ 用户无需等待
- ✅ 不会超时
### 2. 进度可追踪
- ✅ 实时查询处理进度(百分比)
- ✅ 查看成功/失败数量
- ✅ 获取详细错误信息
### 3. 资源高效利用
- ✅ HTTP线程立即释放
- ✅ 数据库连接短时间占用
- ✅ 后台线程池统一管理
### 4. 部分成功机制
- ✅ 单个订单失败不影响其他订单
- ✅ 独立事务,可部分成功
- ✅ 详细记录每个订单的处理结果
### 5. 系统稳定性
- ✅ 不会因大批量请求导致系统崩溃
- ✅ 线程池和连接池可控
- ✅ 支持高并发场景
### 6. 易于扩展
- ✅ 订单量增加不影响系统稳定性
- ✅ 可通过调整线程池大小扩展
- ✅ 支持未来业务增长
---
## 结论
**强烈建议使用异步模式!**
异步批量处理是处理大批量、长时间任务的行业标准做法。不使用异步方式会导致:
1.**系统不可用** - HTTP超时、线程阻塞、连接池耗尽
2.**用户体验差** - 长时间等待、无进度反馈
3.**数据不一致** - 超时后状态不明确
4.**无法扩展** - 业务增长后系统崩溃
5.**运维困难** - 问题难以排查和监控
使用异步模式后:
1.**系统稳定** - 资源可控,不会崩溃
2.**用户体验好** - 立即响应,实时进度
3.**数据一致** - 详细记录,状态明确
4.**易于扩展** - 支持大批量和高并发
5.**运维友好** - 完整日志,易于监控