You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1116 lines
40 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Board4 看板真实数据接口实现方案
## 一、接口概述
### 1.1 接口列表
| 序号 | 接口路径 | 请求方式 | 功能描述 | 实体类 |
|------|----------|----------|----------|--------|
| 1 | `/board4/productionTotal` | GET | 产量统计(年/月/日累计) | Board4ProductionTotalVo |
| 2 | `/board4/orderStatistics` | GET | 工单统计(计划/完成/差异/完成率) | Board4OrderStatisticsVo |
| 3 | `/board4/orderProgressList` | GET | 工单进度列表 | Board4OrderProgressVo |
| 4 | `/board4/deviceStatus` | GET | 设备状态统计 | Board4DeviceStatusVo |
| 5 | `/board4/alarmInfo` | GET | 最新报警信息 | Board4AlarmInfoVo |
| 6 | `/board4/repairAnalysisList` | GET | 维修分析列表(按设备聚合) | Board4RepairAnalysisVo |
| 7 | `/board4/repairTrendList` | GET | 报修趋势列表 | Board4RepairTrendVo |
| 8 | `/board4/qualityStatistics` | GET | 质量统计 | Board4QualityStatisticsVo |
| 9 | `/board4/qualityTraceList` | GET | 质量追溯列表 | Board4QualityTraceVo |
| 10 | `/board4/deviceProductionList` | GET | 设备分析/产量列表 | Board4DeviceProductionVo |
### 1.2 前端页面
- **页面位置**: `zs_aucma-mes-ui/src/views/board/board4/index.vue`
- **前端API**: `zs_aucma-mes-ui/src/api/board/board4.js`
---
## 二、后端文件清单
### 2.1 VO实体类10个
| 序号 | 文件路径 | 说明 |
|------|----------|------|
| 1 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board4ProductionTotalVo.java` | 产量统计 |
| 2 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board4OrderStatisticsVo.java` | 工单统计 |
| 3 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board4OrderProgressVo.java` | 工单进度 |
| 4 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board4DeviceStatusVo.java` | 设备状态 |
| 5 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board4AlarmInfoVo.java` | 报警信息 |
| 6 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board4RepairAnalysisVo.java` | 维修分析 |
| 7 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board4RepairTrendVo.java` | 报修趋势 |
| 8 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board4QualityStatisticsVo.java` | 质量统计 |
| 9 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board4QualityTraceVo.java` | 质量追溯 |
| 10 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board4DeviceProductionVo.java` | 设备产量 |
### 2.2 后端核心文件4个
| 序号 | 文件类型 | 文件路径 |
|------|----------|----------|
| 1 | Mapper接口 | `aucma-report/src/main/java/com/aucma/report/mapper/Board4Mapper.java` |
| 2 | Mapper XML | `aucma-report/src/main/resources/mapper/report/Board4Mapper.xml` |
| 3 | Service接口 | `aucma-report/src/main/java/com/aucma/report/service/IBoard4Service.java` |
| 4 | Service实现 | `aucma-report/src/main/java/com/aucma/report/service/impl/Board4ServiceImpl.java` |
| 5 | Controller | `aucma-report/src/main/java/com/aucma/report/controller/Board4Controller.java` |
### 2.3 前端文件
| 序号 | 文件类型 | 文件路径 |
|------|----------|----------|
| 1 | API文件 | `zs_aucma-mes-ui/src/api/board/board4.js` |
---
## 三、实体类定义
### 3.1 Board4ProductionTotalVo - 产量统计
```java
public class Board4ProductionTotalVo {
/** 年累计产量去年数据来源BASE_ORDERINFO */
private Long yearTotal;
/** 月累计产量当月数据来源BASE_DEVICE_PARAM_VAL按设备取当月最新“机台状态-实际产出数量”汇总) */
private Long monthTotal;
/** 日累计产量当天数据来源BASE_DEVICE_PARAM_VALPARAM_NAME='机台状态-实际产出数量' */
private Long dayTotal;
}
```
### 3.2 Board4OrderStatisticsVo - 工单统计
```java
public class Board4OrderStatisticsVo {
/** 今日计划数 */
private Long planCount;
/** 今日完成数 */
private Long completeCount;
/** 今日差异数(计划-完成) */
private Long diffCount;
/** 今日完成率(百分比,不含% */
private String completeRate;
}
```
### 3.3 Board4OrderProgressVo - 工单进度
```java
public class Board4OrderProgressVo {
/** 型号/物料名称 */
private String materialName;
/** 计划数 */
private Long planCount;
/** 完成数 */
private Long completeCount;
/** 差异数 */
private Long diffCount;
/** 执行进度(如 90% */
private String progress;
}
```
### 3.4 Board4DeviceStatusVo - 设备状态
```java
public class Board4DeviceStatusVo {
/** 设备正常数DEVICE_STATUS='0' */
private Long normalCount;
/** 设备告警数DEVICE_STATUS='1' */
private Long alarmCount;
/** 设备停机数DEVICE_STATUS='2' */
private Long stopCount;
/** 设备总数 */
private Long totalCount;
/** 总维修次数 */
private Long repairCount;
}
```
### 3.5 Board4AlarmInfoVo - 报警信息
```java
public class Board4AlarmInfoVo {
/** 是否有报警 */
private Boolean hasAlarm;
/** 报警设备名称 */
private String deviceName;
/** 报警原因 */
private String alarmReason;
/** 报警时间 */
private String alarmTime;
}
```
### 3.6 Board4RepairAnalysisVo - 维修分析
```java
public class Board4RepairAnalysisVo {
/** 设备名称 */
private String deviceName;
/** 占比(百分比数值) */
private Long percent;
/** 维修次数 */
private Long repairCount;
}
```
### 3.7 Board4RepairTrendVo - 报修趋势
```java
public class Board4RepairTrendVo {
/** 时间(小时,如 08:00 */
private String timeHour;
/** 报修次数 */
private Long repairCount;
}
```
### 3.8 Board4QualityStatisticsVo - 质量统计
```java
public class Board4QualityStatisticsVo {
/** 合格数TREATMENT_MEASURE='3' */
private Long qualifiedCount;
/** 不合格数TREATMENT_MEASURE='1' */
private Long unqualifiedCount;
}
```
### 3.9 Board4QualityTraceVo - 质量追溯
```java
public class Board4QualityTraceVo {
/** 产品名/物料名称 */
private String materialName;
/** 合格率(百分比数值) */
private Long passRate;
/** 合格上限默认100 */
private Long passLimit;
}
```
### 3.10 Board4DeviceProductionVo - 设备产量
```java
public class Board4DeviceProductionVo {
/** 设备名称 */
private String deviceName;
/** 实际产量当天工艺参数PARAM_NAME='机台状态-实际产出数量' */
private Long production;
}
```
---
## 四、数据源与业务逻辑
### 4.1 接口数据源映射表
| 接口 | 数据源表 | 业务逻辑 |
| productionTotal | BASE_ORDERINFO, BASE_DEVICE_PARAM_VAL | 年累计=去年SUM(COMPLETE_AMOUNT);月累计=当月每台设备最新PARAM_NAME='机台状态-实际产出数量'汇总;日累计=当天每台设备最新PARAM_NAME='机台状态-实际产出数量'汇总 |
| orderStatistics | BASE_ORDERINFO | 当天SUM(ORDER_AMOUNT)和SUM(COMPLETE_AMOUNT),差异=计划-完成,完成率=完成/计划 |
| orderProgressList | BASE_ORDERINFO | 当天工单列表,进度=完成/计划百分比并带% |
| deviceStatus | BASE_DEVICELEDGER, DMS_BILLS_FAULT_INSTANCE | IS_FLAG=0有效设备按DEVICE_STATUS分组统计+总维修次数 |
| alarmInfo | DMS_RECORD_ALARM_INFO, BASE_DEVICELEDGER | 当前一小时内最新一条报警记录ALARM_BEGIN_TIME>=SYSDATE-1/24通过DEVICE_ID关联设备名称时间格式HH24:MI:SS |
| repairAnalysisList | DMS_BILLS_FAULT_INSTANCE, BASE_DEVICELEDGER | 按设备聚合故障次数按次数倒序取TOP10 |
| repairTrendList | DMS_BILLS_FAULT_INSTANCE | 按小时统计当天报修次数 |
| qualityStatistics | REPORT_QUALITY_INSPECTION | 当天TREATMENT_MEASURE='3'和'1'分组统计 |
| qualityTraceList | REPORT_QUALITY_INSPECTION | 近7天按产品统计合格率按合格率倒序取TOP10 |
| deviceProductionList | BASE_DEVICE_PARAM_VAL, BASE_DEVICELEDGER | 仅生产设备DEVICE_TYPE='1'且IS_FLAG=0取当天每台设备最新产出值 |
### 4.2 关键SQL说明
#### 4.2.1 日累计产量BASE_DEVICE_PARAM_VAL
```sql
SELECT NVL(SUM(TO_NUMBER(PARAM_VALUE)), 0) -- 汇总当天实际产出数量
FROM (
SELECT DEVICE_CODE, PARAM_VALUE,
ROW_NUMBER() OVER (PARTITION BY DEVICE_CODE ORDER BY COLLECT_TIME DESC) AS RN -- 每台设备取最新记录
FROM BASE_DEVICE_PARAM_VAL
WHERE PARAM_NAME = '机台状态-实际产出数量' -- 固定参数名称
AND TO_CHAR(COLLECT_TIME, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD') -- 当天数据
)
WHERE RN = 1 -- 仅保留最新一条
```
**业务逻辑说明**
- **使用 PARAM_NAME 而非 PARAM_CODE**`PARAM_CODE` 可能因不同设备而变化,但 `PARAM_NAME` 是固定的,始终为 "机台状态-实际产出数量"
- **窗口函数作用**`ROW_NUMBER() OVER (PARTITION BY DEVICE_CODE ORDER BY COLLECT_TIME DESC)` 按设备分组,按采集时间倒序排列,取 RN=1 即每台设备当天最新的一条记录
- **汇总逻辑**:将所有设备的最新实际产出数量求和,得到日累计产量
#### 4.2.2 月累计产量BASE_DEVICE_PARAM_VAL
```sql
SELECT NVL(SUM(TO_NUMBER(PARAM_VALUE)), 0) -- 汇总当月实际产出数量
FROM (
SELECT DEVICE_CODE, PARAM_VALUE,
ROW_NUMBER() OVER (PARTITION BY DEVICE_CODE ORDER BY COLLECT_TIME DESC) AS RN -- 每台设备取最新记录
FROM BASE_DEVICE_PARAM_VAL
WHERE PARAM_NAME = '机台状态-实际产出数量' -- 固定参数名称
AND COLLECT_TIME >= TRUNC(SYSDATE, 'MM') AND COLLECT_TIME < ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1) -- 当月数据
)
WHERE RN = 1 -- 仅保留最新一条
```
**业务逻辑说明**
- 与日累计一致的取数口径但时间范围是本自然月当月1日00:00:00至下月1日00:00:00
- 按设备取当月最新一条"机台状态-实际产出数量",再汇总得到月累计产量
> 原先的月累计(工单完成量 SUM(COMPLETE_AMOUNT))已替换为上述设备参数口径,旧逻辑在 Mapper XML 中以注释保留。
#### 4.2.3 维修分析(按设备聚合)
```sql
SELECT d.DEVICE_NAME AS deviceName, -- 设备名称
COUNT(*) AS repairCount, -- 设备故障次数
ROUND(COUNT(*) * 100.0 / NULLIF((SELECT COUNT(*) FROM DMS_BILLS_FAULT_INSTANCE WHERE IS_FLAG = 1), 0), 0) AS percent -- 次数占比
FROM DMS_BILLS_FAULT_INSTANCE f
LEFT JOIN BASE_DEVICELEDGER d ON f.DEVICE_ID = d.OBJ_ID -- 关联设备台账
WHERE f.IS_FLAG = 1 AND f.DEVICE_ID IS NOT NULL -- 只统计有效故障
GROUP BY d.OBJ_ID, d.DEVICE_NAME -- 按设备聚合
ORDER BY repairCount DESC -- 按次数降序
```
#### 4.2.4 设备产量列表
```sql
SELECT d.DEVICE_NAME AS deviceName, -- 设备名称
NVL(TO_NUMBER(p.PARAM_VALUE), 0) AS production -- 当天实际产出
FROM BASE_DEVICELEDGER d
LEFT JOIN (
SELECT DEVICE_CODE, PARAM_VALUE
FROM (
SELECT DEVICE_CODE, PARAM_VALUE,
ROW_NUMBER() OVER (PARTITION BY DEVICE_CODE ORDER BY COLLECT_TIME DESC) AS RN -- 每台设备最新记录
FROM BASE_DEVICE_PARAM_VAL
WHERE PARAM_NAME = '机台状态-实际产出数量' -- 固定参数名称
AND COLLECT_TIME >= TRUNC(SYSDATE) AND COLLECT_TIME < TRUNC(SYSDATE) + 1 -- 当天数据
)
WHERE RN = 1 -- 仅保留最新一条
) p ON d.DEVICE_CODE = p.DEVICE_CODE -- 关联设备编码
WHERE d.IS_FLAG = 1 -- 有效设备
ORDER BY production DESC -- 按产量降序
```
**业务逻辑说明**
- **关联查询**将设备台账表BASE_DEVICELEDGER与设备工艺参数表BASE_DEVICE_PARAM_VAL通过 DEVICE_CODE 关联
- **筛选条件**`PARAM_NAME = '机台状态-实际产出数量'` 获取实际产出数量参数
- **设备过滤**`IS_FLAG = 1`(有效设备)
- **排序逻辑**:按产量降序排列,产量高的设备排在前面
#### 4.2.5 最新报警信息(当前一小时内)
```sql
SELECT * FROM (
SELECT d.DEVICE_NAME AS DEVICE_NAME,
a.ALARM_REASON AS ALARM_REASON,
TO_CHAR(a.ALARM_BEGIN_TIME, 'HH24:MI:SS') AS ALARM_TIME
FROM DMS_RECORD_ALARM_INFO a
LEFT JOIN BASE_DEVICELEDGER d ON a.DEVICE_ID = d.OBJ_ID
WHERE a.ALARM_BEGIN_TIME >= SYSDATE - 1/24 -- 限制在当前一小时内
ORDER BY a.ALARM_BEGIN_TIME DESC
) WHERE ROWNUM = 1
```
**业务逻辑说明**
- **数据来源**`DMS_RECORD_ALARM_INFO` 设备报警记录表(由外部设备插入)
- **时间限制**:仅查询当前一小时内(`SYSDATE - 1/24`的报警记录1/24 表示一小时
- **关联查询**:通过 `DEVICE_ID` 关联 `BASE_DEVICELEDGER` 获取设备名称
- **排序规则**:按报警开始时间倒序,取最新的一条(`ROWNUM = 1`
- **时间格式**:返回 HH24:MI:SS 格式(时:分:秒)
### 4.3 服务层返回规则补充
- 所有统计类数值默认返回0避免空值导致前端异常
- 完成率等比例字段返回的是数字字符串,不包含“%”
- 工单进度列表的 progress 字段为带“%”的字符串(如 90%
- 最新报警无数据时hasAlarm=false其他字段为空字符串
---
## 五、前端API
### 5.1 API文件
**文件**: `zs_aucma-mes-ui/src/api/board/board4.js`
```javascript
import request from '@/utils/request'
// 获取产量统计(年累计、月累计、日累计)
export function getProductionTotal() {
return request({ url: '/board4/productionTotal', method: 'get' })
}
// 获取今日工单统计
export function getOrderStatistics() {
return request({ url: '/board4/orderStatistics', method: 'get' })
}
// 获取今日工单进度列表
export function getOrderProgressList() {
return request({ url: '/board4/orderProgressList', method: 'get' })
}
// 获取设备状态统计
export function getDeviceStatus() {
return request({ url: '/board4/deviceStatus', method: 'get' })
}
// 获取最新报警信息
export function getAlarmInfo() {
return request({ url: '/board4/alarmInfo', method: 'get' })
}
// 获取维修分析列表
export function getRepairAnalysisList() {
return request({ url: '/board4/repairAnalysisList', method: 'get' })
}
// 获取报修趋势列表
export function getRepairTrendList() {
return request({ url: '/board4/repairTrendList', method: 'get' })
}
// 获取质量统计
export function getQualityStatistics() {
return request({ url: '/board4/qualityStatistics', method: 'get' })
}
// 获取质量追溯列表
export function getQualityTraceList() {
return request({ url: '/board4/qualityTraceList', method: 'get' })
}
// 获取设备分析/产量列表
export function getDeviceProductionList() {
return request({ url: '/board4/deviceProductionList', method: 'get' })
}
```
---
## 六、数据库表结构参考
### 6.1 BASE_ORDERINFO工单表
| 字段 | 类型 | 说明 |
|------|------|------|
| OBJ_ID | NUMBER | 主键 |
| MATERIAL_NAME | VARCHAR2 | 物料名称 |
| ORDER_AMOUNT | NUMBER | 订单数量 |
| COMPLETE_AMOUNT | NUMBER | 完成数量 |
| BEGIN_DATE | DATE | 计划开始日期 |
### 6.2 BASE_DEVICE_PARAM_VAL设备工艺参数表
| 字段 | 类型 | 说明 |
|------|------|------|
| PARAM_NAME | VARCHAR2 | 参数名称(固定值,如 "机台状态-实际产出数量" |
| DEVICE_CODE | VARCHAR2 | 设备编号 |
| PARAM_VALUE | VARCHAR2 | 参数值 |
| COLLECT_TIME | DATE | 采集时间 |
### 6.3 BASE_DEVICELEDGER设备台账表)
| 字段 | 类型 | 说明 |
|------|------|------|
| OBJ_ID | NUMBER | 主键标识(用于关联查询) |
| DEVICE_CODE | VARCHAR2(64) | 设备编号 |
| DEVICE_NAME | VARCHAR2(64) | 设备名称 |
| DEVICE_STATUS | NUMBER(1,0) | 设备状态0=使用1=停用2=报废) |
| DEVICE_TYPE | VARCHAR2(32) | 设备类型1=生产设备2=计量设备) |
| IS_FLAG | NUMBER(1,0) | 是否标识0=有效) |
**重要说明**
- `DEVICE_STATUS``IS_FLAG``NUMBER(1,0)` 类型SQL查询时不加引号
- 关联查询使用 `OBJ_ID` 作为主键,不是 `DEVICE_ID`
### 6.4 RECORD_ALARM_DEVICE设备告警记录表
| 字段 | 类型 | 说明 |
|------|------|------|
| OBJ_ID | NUMBER(38,0) | 主键 |
| DEVICE_CODE | VARCHAR2(128) | 设备编号 |
| DEVICE_NAME | VARCHAR2(128) | 设备名称 |
| DEVICE_TYPE | VARCHAR2(32) | 设备类型 |
| ALARM_INFO | VARCHAR2(255) | 报警信息 |
| ALARM_TIME | DATE | 报警时间 |
| REMARK | VARCHAR2(255) | 备注 |
| IS_FLAG | NUMBER | 是否标识0=有效) |
| CREATED_BY | VARCHAR2(32) | 创建人 |
| CREATED_TIME | DATE | 创建时间 |
| BATCH_ID | VARCHAR2(128) | 批次ID |
| PARAM_CODE | VARCHAR2(32) | 参数编码 |
| PARAM_VALUE | VARCHAR2(32) | 参数值 |
**报警信息来源**:使用 `RECORD_ALARM_DEVICE` 表,字段 `ALARM_INFO``ALARM_TIME`,并以 `IS_FLAG = 0` 过滤有效记录
### 6.5 DMS_BILLS_FAULT_INSTANCE故障报修工单表
---
## 七、接口返回示例
### 7.1 产量统计
```json
{ "code": 200, "data": { "yearTotal": 125000, "monthTotal": 12500, "dayTotal": 27218 } }
```
### 7.2 工单统计
```json
{ "code": 200, "data": { "planCount": 1000, "completeCount": 850, "diffCount": 150, "completeRate": "85" } }
```
### 7.3 维修分析列表
```json
{ "code": 200, "data": [{ "deviceName": "YZM-01", "percent": 40, "repairCount": 10 }] }
```
### 7.4 设备产量列表
```json
{ "code": 200, "data": [{ "deviceName": "YZM-02", "production": 27218 }] }
```
---
## 八、注意事项
1. **❗重要:使用 PARAM_NAME 而非 PARAM_CODE**
- 错误写法:`WHERE PARAM_CODE = '19'`
- 正确写法:`WHERE PARAM_NAME = '机台状态-实际产出数量'`
- 原因:`PARAM_CODE` 可能因不同设备而变化,但 `PARAM_NAME` 是固定的
2. **设备状态映射**NUMBER类型不加引号0=正常/使用1=告警/停用2=停机/报废
3. **❗重要BASE_DEVICELEDGER 表字段类型**
- `OBJ_ID`NUMBER 主键,用于关联 DMS_BILLS_FAULT_INSTANCE.DEVICE_ID
- `DEVICE_STATUS`NUMBER(1,0),查询时使用 `= 0`,不是 `= '0'`
- `IS_FLAG`NUMBER(1,0),查询时使用 `= 0`,不是 `= '0'`
4. **质检结果映射**TREATMENT_MEASURE='3'=合格,'1'=不合格
5. **日累计产量查询逻辑**
- 使用窗口函数 `ROW_NUMBER() OVER (PARTITION BY DEVICE_CODE ORDER BY COLLECT_TIME DESC)` 取每台设备当天最新的一条记录
- 避免重复计算,确保每台设备只取一个值
- 将所有设备的最新值求和得到日累计产量
6. **维修分析**:使用 DMS_BILLS_FAULT_INSTANCE 故障报修表,通过 `DEVICE_ID = BASE_DEVICELEDGER.OBJ_ID` 关联设备表
7. **报警信息来源**:使用 DMS_RECORD_ALARM_INFO 表,字段 `ALARM_REASON``ALARM_BEGIN_TIME`,通过 `DEVICE_ID` 关联 BASE_DEVICELEDGER 获取设备名称
---
## 九、变更记录
| 日期 | 版本 | 变更内容 | 作者 |
|------|------|----------|------|
| 2026-01-21 | 1.0 | 初始版本 | YinQ |
| 2026-01-21 | 2.0 | 重构为独立接口模式,一个接口一个实体类 | YinQ |
| 2026-01-21 | 2.1 | 修复产量查询逻辑,使用 PARAM_NAME 替代 PARAM_CODE | YinQ |
| 2026-01-21 | 2.2 | 修复设备表结构BASE_DEVICELEDGER 字段类型修正DEVICE_STATUS/IS_FLAG 为 NUMBER 类型 | YinQ |
| 2026-01-21 | 2.3 | 修复报警表来源:使用 RECORD_ALARM_DEVICE 替代 DMS_RECORD_ALARM_INFO | YinQ |
| 2026-01-22 | 2.4 | 报警数据源切换回 DMS_RECORD_ALARM_INFO该表由外部设备插入数据 | YinQ |
| 2026-01-26 | 2.5 | alarmInfo接口增加时间限制仅查询当前一小时内SYSDATE-1/24的报警记录 | Claude |
---
# Board5 看板真实数据接口实现方案
## 一、接口概述
### 1.1 接口列表
| 序号 | 接口路径 | 请求方式 | 功能描述 | 实体类 |
|------|----------|----------|----------|--------|
| 1 | `/board5/orderWorkStatistics` | GET | 工单统计(总数、已完成、完成率、停机) | Board5OrderWorkStatisticsVo |
| 2 | `/board5/repairTimeStatistics` | GET | 维修时间统计(平均响应时间、平均维修时间) | Board5RepairTimeStatisticsVo |
| 3 | `/board5/maintStatistics` | GET | 保养执行情况统计 | Board5MaintStatisticsVo |
| 4 | `/board5/inspectStatistics` | GET | 巡检执行情况统计 | Board5InspectStatisticsVo |
| 5 | `/board5/deviceStatusDistribution` | GET | 设备状态分布 | Board5DeviceStatusDistributionVo |
| 6 | `/board5/faultSourceDistribution` | GET | 故障来源分布 | Board5FaultSourceDistributionVo |
| 7 | `/board5/faultTrendList` | GET | 故障数量曲线近30天 | Board5FaultTrendVo |
| 8 | `/board5/productionTop5` | GET | 产量机台TOP5 | Board5ProductionTopVo |
### 1.2 前端页面
- **页面位置**: `zs_aucma-mes-ui/src/views/board/board5/index.vue`
- **前端API**: `zs_aucma-mes-ui/src/api/board/board5.js`
---
## 二、后端文件清单
### 2.1 VO实体类8个
| 序号 | 文件路径 | 说明 |
|------|----------|------|
| 1 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board5OrderWorkStatisticsVo.java` | 工单统计 |
| 2 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board5RepairTimeStatisticsVo.java` | 维修时间统计 |
| 3 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board5MaintStatisticsVo.java` | 保养执行情况 |
| 4 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board5InspectStatisticsVo.java` | 巡检执行情况 |
| 5 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board5DeviceStatusDistributionVo.java` | 设备状态分布 |
| 6 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board5FaultSourceDistributionVo.java` | 故障来源分布 |
| 7 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board5FaultTrendVo.java` | 故障数量曲线 |
| 8 | `aucma-report/src/main/java/com/aucma/report/domain/vo/Board5ProductionTopVo.java` | 产量机台TOP5 |
### 2.2 后端核心文件5个
| 序号 | 文件类型 | 文件路径 |
|------|----------|----------|
| 1 | Mapper接口 | `aucma-report/src/main/java/com/aucma/report/mapper/Board5Mapper.java` |
| 2 | Mapper XML | `aucma-report/src/main/resources/mapper/report/Board5Mapper.xml` |
| 3 | Service接口 | `aucma-report/src/main/java/com/aucma/report/service/IBoard5Service.java` |
| 4 | Service实现 | `aucma-report/src/main/java/com/aucma/report/service/impl/Board5ServiceImpl.java` |
| 5 | Controller | `aucma-report/src/main/java/com/aucma/report/controller/Board5Controller.java` |
### 2.3 前端文件
| 序号 | 文件类型 | 文件路径 |
|------|----------|----------|
| 1 | API文件 | `zs_aucma-mes-ui/src/api/board/board5.js` |
---
## 三、实体类定义
### 3.1 Board5OrderWorkStatisticsVo - 工单统计
```java
public class Board5OrderWorkStatisticsVo {
/** 工单总数 */
private Long totalCount;
/** 已完成数量 */
private Long completeCount;
/** 完成率(百分比数值,不含% */
private String completeRate;
/** 停机工单数量 */
private Long stopCount;
}
```
### 3.2 Board5RepairTimeStatisticsVo - 维修时间统计
```java
public class Board5RepairTimeStatisticsVo {
/** 平均响应时间(分钟) */
private String avgResponseTime;
/** 平均维修时间(小时) */
private String avgRepairTime;
}
```
### 3.3 Board5MaintStatisticsVo - 保养执行情况
```java
public class Board5MaintStatisticsVo {
/** 计划保养数量 */
private Long planCount;
/** 已保养数量MAINT_STATUS=3 */
private Long completeCount;
/** 待保养数量MAINT_STATUS=1 */
private Long waitingCount;
/** 待保养比例 */
private String waitingRate;
/** 保养中数量MAINT_STATUS=2 */
private Long doingCount;
/** 保养中比例 */
private String doingRate;
/** 待验证数量MAINT_STATUS=4 */
private Long verifyCount;
/** 待验证比例 */
private String verifyRate;
/** 设备保养完成率 */
private String completeRate;
}
```
### 3.4 Board5InspectStatisticsVo - 巡检执行情况
```java
public class Board5InspectStatisticsVo {
/** 应检设备数量 */
private Long deviceCount;
/** 设备巡检完成率 */
private String completeRate;
}
```
### 3.5 Board5DeviceStatusDistributionVo - 设备状态分布
```java
public class Board5DeviceStatusDistributionVo {
/** 实验设备占比 */
private Long experimentPercent;
/** 未检设备占比 */
private Long uncheckedPercent;
/** 正常设备占比 */
private Long normalPercent;
/** 异常设备占比 */
private Long abnormalPercent;
}
```
### 3.6 Board5FaultSourceDistributionVo - 故障来源分布
```java
public class Board5FaultSourceDistributionVo {
/** 维护故障占比FAULT_SOURCE_TYPE=1 */
private Long maintainPercent;
/** 运行故障占比FAULT_SOURCE_TYPE=2,3 */
private Long runningPercent;
/** 自然故障占比FAULT_SOURCE_TYPE=9 */
private Long naturalPercent;
}
```
### 3.7 Board5FaultTrendVo - 故障数量曲线
```java
public class Board5FaultTrendVo {
/** 日期(格式:日,如 01、02... */
private String dateValue;
/** 故障数量 */
private Long faultCount;
}
```
### 3.8 Board5ProductionTopVo - 产量机台TOP5
```java
public class Board5ProductionTopVo {
/** 设备名称 */
private String deviceName;
/** 百分比(相对于最大产量) */
private Long percent;
/** 产量 */
private Long production;
}
```
---
## 四、数据源与业务逻辑
### 4.1 接口数据源映射表
| 接口 | 数据源表 | 业务逻辑 |
|------|----------|----------|
| orderWorkStatistics | DMS_BILLS_FAULT_INSTANCE, DMS_BILLS_MAINT_INSTANCE, DMS_BILLS_INSPECT_INSTANCE | 工单总数=维修+保养+巡检;已完成=维修完成(BILLS_STATUS='2')+保养完成(MAINT_STATUS='3')+巡检完成(INSPECT_STATUS='3');停机=维修中(BILLS_STATUS='1') |
| repairTimeStatistics | DMS_BILLS_FAULT_INSTANCE | 平均响应时间=(REAL_BEGIN_TIME-APPLY_TIME)*24*60分钟平均维修时间=(REAL_END_TIME-REAL_BEGIN_TIME)*24小时仅统计BILLS_STATUS='2' |
| maintStatistics | DMS_BILLS_MAINT_INSTANCE | 按MAINT_STATUS分组统计1=待保养2=保养中3=已完成4=待验证无此数据返回0 |
| inspectStatistics | DMS_BILLS_INSPECT_INSTANCE, DMS_PLAN_INSPECT | 应检设备=关联计划表SUM(DEVICE_AMOUNT);已检设备=INSPECT_STATUS='3'的数量 |
| deviceStatusDistribution | BASE_DEVICELEDGER | 按DEVICE_STATUS和DEVICE_TYPE分组统计WHERE IS_FLAG=1 |
| faultSourceDistribution | DMS_BILLS_FAULT_INSTANCE | 按FAULT_SOURCE_TYPE分组1=维护故障2/3=运行故障9=自然故障WHERE IS_FLAG='1' |
| faultTrendList | DMS_RECORD_ALARM_INFO | 近30天每日告警数量按ALARM_BEGIN_TIME日期分组 |
| productionTop5 | BASE_DEVICE_PARAM_VAL, BASE_DEVICELEDGER | 各设备当天PARAM_NAME='机台状态-实际产出数量'最新值取TOP5 |
### 4.2 关键SQL说明
#### 4.2.1 工单统计
```sql
SELECT
(SELECT COUNT(*) FROM DMS_BILLS_FAULT_INSTANCE WHERE IS_FLAG = '1') +
(SELECT COUNT(*) FROM DMS_BILLS_MAINT_INSTANCE) +
(SELECT COUNT(*) FROM DMS_BILLS_INSPECT_INSTANCE WHERE IS_FLAG = '1') AS TOTAL_COUNT,
(SELECT COUNT(*) FROM DMS_BILLS_FAULT_INSTANCE WHERE IS_FLAG = '1' AND BILLS_STATUS = '2') +
(SELECT COUNT(*) FROM DMS_BILLS_MAINT_INSTANCE WHERE MAINT_STATUS = '3') +
(SELECT COUNT(*) FROM DMS_BILLS_INSPECT_INSTANCE WHERE IS_FLAG = '1' AND INSPECT_STATUS = '3') AS COMPLETE_COUNT,
(SELECT COUNT(*) FROM DMS_BILLS_FAULT_INSTANCE WHERE IS_FLAG = '1' AND BILLS_STATUS = '1') AS STOP_COUNT
FROM DUAL
```
**业务逻辑说明**
- **工单总数** = 维修工单数 + 保养工单数 + 巡检工单数
- **已完成数** = 维修完成(BILLS_STATUS='2') + 保养完成(MAINT_STATUS='3') + 巡检完成(INSPECT_STATUS='3')
- **停机工单数** = 维修中(BILLS_STATUS='1'),即设备正在维修无法生产的工单数
- **数据范围**:全量历史数据,无时间限制
#### 4.2.2 维修时间统计
```sql
SELECT ROUND(NVL(AVG((REAL_BEGIN_TIME - APPLY_TIME) * 24 * 60), 0), 2) AS AVG_RESPONSE_TIME,
ROUND(NVL(AVG((REAL_END_TIME - REAL_BEGIN_TIME) * 24), 0), 2) AS AVG_REPAIR_TIME
FROM DMS_BILLS_FAULT_INSTANCE
WHERE IS_FLAG = '1'
AND REAL_BEGIN_TIME IS NOT NULL
AND REAL_END_TIME IS NOT NULL
AND BILLS_STATUS = '2'
AND APPLY_TIME IS NOT NULL
```
**业务逻辑说明**
- **平均响应时间** = (实际开始时间 - 申请时间) × 24 × 60单位分钟
- **平均维修时间** = (实际结束时间 - 实际开始时间) × 24单位小时
- **仅统计已完成工单**`BILLS_STATUS = '2'`,确保时间数据完整
#### 4.2.3 保养执行情况统计
```sql
SELECT COUNT(*) AS PLAN_COUNT,
SUM(CASE WHEN MAINT_STATUS = '3' THEN 1 ELSE 0 END) AS COMPLETE_COUNT,
SUM(CASE WHEN MAINT_STATUS = '1' THEN 1 ELSE 0 END) AS WAITING_COUNT,
SUM(CASE WHEN MAINT_STATUS = '2' THEN 1 ELSE 0 END) AS DOING_COUNT,
0 AS VERIFY_COUNT
FROM DMS_BILLS_MAINT_INSTANCE
```
**业务逻辑说明**
- **数据来源**`DMS_BILLS_MAINT_INSTANCE` 保养工单表(非计划表)
- **状态映射**1=待保养2=保养中3=已完成
- **待验证数量**:工单表中无 MAINT_STATUS=4 状态,固定返回 0
- **数据范围**:全量历史数据,该表无 IS_FLAG 字段
#### 4.2.4 巡检执行情况统计
```sql
SELECT (SELECT NVL(SUM(p.DEVICE_AMOUNT), 0)
FROM DMS_PLAN_INSPECT p
WHERE p.PLAN_INSPECT_ID IN (
SELECT DISTINCT PLAN_INSPECT_ID
FROM DMS_BILLS_INSPECT_INSTANCE
WHERE IS_FLAG = '1'
)
) AS DEVICE_COUNT,
(SELECT COUNT(*) FROM DMS_BILLS_INSPECT_INSTANCE WHERE IS_FLAG = '1' AND INSPECT_STATUS = '3') AS COMPLETE_COUNT
FROM DUAL
```
**业务逻辑说明**
- **应检设备数** = 关联 `DMS_PLAN_INSPECT` 计划表,汇总 `DEVICE_AMOUNT`(每个计划覆盖的设备数量)
- **已检设备数** = 已完成的巡检工单数(`INSPECT_STATUS = '3'`
- **数据来源**`DMS_BILLS_INSPECT_INSTANCE` 巡检工单表 + `DMS_PLAN_INSPECT` 巡检计划表
- **关联原因**工单表无设备ID字段需通过计划表获取设备数量信息
#### 4.2.5 设备状态分布
```sql
SELECT COUNT(*) AS TOTAL_COUNT,
SUM(CASE WHEN DEVICE_STATUS = 0 THEN 1 ELSE 0 END) AS NORMAL_COUNT,
SUM(CASE WHEN DEVICE_STATUS = 1 THEN 1 ELSE 0 END) AS ABNORMAL_COUNT,
SUM(CASE WHEN DEVICE_STATUS = 2 THEN 1 ELSE 0 END) AS SCRAP_COUNT,
SUM(CASE WHEN DEVICE_TYPE = '2' THEN 1 ELSE 0 END) AS EXPERIMENT_COUNT
FROM BASE_DEVICELEDGER
WHERE IS_FLAG = 1
```
**业务逻辑说明**
- **DEVICE_STATUS**0=正常1=异常2=报废
- **DEVICE_TYPE**'2'=实验设备
- **IS_FLAG = 1**:仅统计有效设备
#### 4.2.6 故障数量曲线
```sql
SELECT TO_CHAR(ALARM_BEGIN_TIME, 'DD') AS dateValue,
COUNT(*) AS faultCount
FROM DMS_RECORD_ALARM_INFO
WHERE ALARM_BEGIN_TIME >= TRUNC(SYSDATE) - 30
GROUP BY TO_CHAR(ALARM_BEGIN_TIME, 'DD'), TRUNC(ALARM_BEGIN_TIME)
ORDER BY TRUNC(ALARM_BEGIN_TIME)
```
**业务逻辑说明**
- **数据来源**`DMS_RECORD_ALARM_INFO` 设备报警记录表(由外部设备插入)
- **时间范围**近30天`ALARM_BEGIN_TIME >= TRUNC(SYSDATE) - 30`
- **分组方式**:按日期分组,返回每日告警数量
#### 4.2.7 产量机台TOP5
```sql
SELECT * FROM (
SELECT d.DEVICE_NAME AS deviceName,
NVL(TO_NUMBER(p.PARAM_VALUE), 0) AS production,
0 AS percent
FROM BASE_DEVICELEDGER d
LEFT JOIN (
SELECT DEVICE_CODE, PARAM_VALUE
FROM (
SELECT DEVICE_CODE, PARAM_VALUE,
ROW_NUMBER() OVER (PARTITION BY DEVICE_CODE ORDER BY COLLECT_TIME DESC) AS RN
FROM BASE_DEVICE_PARAM_VAL
WHERE PARAM_NAME = '机台状态-实际产出数量'
AND COLLECT_TIME >= TRUNC(SYSDATE) AND COLLECT_TIME < TRUNC(SYSDATE) + 1
)
WHERE RN = 1
) p ON d.DEVICE_CODE = p.DEVICE_CODE
ORDER BY production DESC
) WHERE ROWNUM <= 5
```
**业务逻辑说明**
- 使用 `PARAM_NAME = '机台状态-实际产出数量'` 获取各设备当天实际产出
- 取每台设备当天最新的一条记录使用窗口函数ROW_NUMBER
- 按产量降序排列取前5名
- 百分比在Service层计算`percent = production / maxProduction * 100`
#### 4.2.8 故障来源分布
```sql
SELECT COUNT(*) AS TOTAL_COUNT,
SUM(CASE WHEN FAULT_SOURCE_TYPE = 1 THEN 1 ELSE 0 END) AS MAINTAIN_COUNT,
SUM(CASE WHEN FAULT_SOURCE_TYPE IN (2, 3) THEN 1 ELSE 0 END) AS RUNNING_COUNT,
SUM(CASE WHEN FAULT_SOURCE_TYPE = 9 THEN 1 ELSE 0 END) AS NATURAL_COUNT
FROM DMS_BILLS_FAULT_INSTANCE
WHERE IS_FLAG = '1'
```
**业务逻辑说明**
- **FAULT_SOURCE_TYPE = 1**(检修)→ 维护故障
- **FAULT_SOURCE_TYPE = 2, 3**(点检/巡检)→ 运行故障
- **FAULT_SOURCE_TYPE = 9**(其他)→ 自然故障
- **数据范围**:全量历史数据,`WHERE IS_FLAG = '1'`
---
## 五、前端API
### 5.1 API文件
**文件**: `zs_aucma-mes-ui/src/api/board/board5.js`
```javascript
import request from '@/utils/request'
// 获取工单统计(工单总数、已完成、完成率、停机工单)
export function getOrderWorkStatistics() {
return request({ url: '/board5/orderWorkStatistics', method: 'get' })
}
// 获取维修时间统计(平均响应时间、平均维修时间)
export function getRepairTimeStatistics() {
return request({ url: '/board5/repairTimeStatistics', method: 'get' })
}
// 获取保养执行情况统计
export function getMaintStatistics() {
return request({ url: '/board5/maintStatistics', method: 'get' })
}
// 获取巡检执行情况统计
export function getInspectStatistics() {
return request({ url: '/board5/inspectStatistics', method: 'get' })
}
// 获取设备状态分布
export function getDeviceStatusDistribution() {
return request({ url: '/board5/deviceStatusDistribution', method: 'get' })
}
// 获取故障来源分布
export function getFaultSourceDistribution() {
return request({ url: '/board5/faultSourceDistribution', method: 'get' })
}
// 获取故障数量曲线
export function getFaultTrendList() {
return request({ url: '/board5/faultTrendList', method: 'get' })
}
// 获取产量机台TOP5
export function getProductionTop5() {
return request({ url: '/board5/productionTop5', method: 'get' })
}
```
---
## 六、数据库表结构参考
### 6.1 DMS_BILLS_FAULT_INSTANCE故障报修工单表
| 字段 | 类型 | 说明 |
|------|------|------|
| REPAIR_INSTANCE_ID | NUMBER(20) | 主键 |
| APPLY_TIME | DATE | 申请时间 |
| REAL_BEGIN_TIME | DATE | 实际开始时间 |
| REAL_END_TIME | DATE | 实际完成时间 |
| BILLS_STATUS | CHAR(1) | 工单状态0待维修1维修中2维修完成 |
| FAULT_SOURCE_TYPE | NUMBER | 报修来源类型1检修 2点检 3巡检 9其他 |
| IS_FLAG | CHAR(1) | 激活标识1是 0否 |
### 6.2 DMS_BILLS_MAINT_INSTANCE保养工单表
| 字段 | 类型 | 说明 |
|------|------|------|
| OBJ_ID | NUMBER | 主键 |
| MAINT_STATUS | CHAR(1) | 保养状态1待保养2保养中3已完成 |
| PLAN_MAINT_ID | NUMBER | 关联的保养计划ID |
**注意**:该表无 IS_FLAG 字段,统计时全量查询。
### 6.3 DMS_BILLS_INSPECT_INSTANCE巡检工单表
| 字段 | 类型 | 说明 |
|------|------|------|
| OBJ_ID | NUMBER | 主键 |
| PLAN_INSPECT_ID | NUMBER | 关联的巡检计划ID |
| INSPECT_STATUS | CHAR(1) | 巡检状态3已完成 |
| IS_FLAG | CHAR(1) | 激活标识1是 0否 |
### 6.4 DMS_RECORD_ALARM_INFO设备告警记录表
| 字段 | 类型 | 说明 |
|------|------|------|
| OBJ_ID | NUMBER(38) | 主键 |
| DEVICE_ID | NUMBER | 设备ID关联BASE_DEVICELEDGER.OBJ_ID |
| ALARM_REASON | VARCHAR2(255) | 报警原因 |
| ALARM_BEGIN_TIME | DATE | 报警开始时间 |
### 6.5 BASE_DEVICELEDGER设备台账表
| 字段 | 类型 | 说明 |
|------|------|------|
| OBJ_ID | NUMBER | 主键用于关联DMS_BILLS_FAULT_INSTANCE.DEVICE_ID |
| DEVICE_CODE | VARCHAR2(64) | 设备编号 |
| DEVICE_NAME | VARCHAR2(64) | 设备名称 |
| DEVICE_STATUS | NUMBER(1,0) | 设备状态0正常1异常2报废 |
| DEVICE_TYPE | VARCHAR2(32) | 设备类型1生产设备2计量设备 |
| IS_FLAG | NUMBER(1,0) | 是否标识1有效0无效 |
### 6.6 BASE_DEVICE_PARAM_VAL设备工艺参数表
| 字段 | 类型 | 说明 |
|------|------|------|
| RECORD_ID | NUMBER | 主键 |
| DEVICE_CODE | VARCHAR2(255) | 设备编号 |
| PARAM_NAME | VARCHAR2(255) | 参数名称(固定值,如"机台状态-实际产出数量" |
| PARAM_VALUE | VARCHAR2(255) | 参数值 |
| COLLECT_TIME | DATE | 采集时间 |
---
## 七、接口返回示例
### 7.1 工单统计
```json
{ "code": 200, "data": { "totalCount": 100, "completeCount": 85, "completeRate": "85", "stopCount": 5 } }
```
### 7.2 维修时间统计
```json
{ "code": 200, "data": { "avgResponseTime": "123.45", "avgRepairTime": "0.25" } }
```
### 7.3 保养执行情况
```json
{ "code": 200, "data": { "planCount": 10, "completeCount": 5, "waitingCount": 2, "waitingRate": "20", "doingCount": 2, "doingRate": "20", "verifyCount": 1, "verifyRate": "10", "completeRate": "50" } }
```
### 7.4 故障数量曲线
```json
{ "code": 200, "data": [{ "dateValue": "01", "faultCount": 5 }, { "dateValue": "02", "faultCount": 3 }] }
```
### 7.5 产量机台TOP5
```json
{ "code": 200, "data": [{ "deviceName": "YZM-02", "percent": 100, "production": 27218 }, { "deviceName": "YZM-01", "percent": 80, "production": 21774 }] }
```
---
## 八、注意事项
1. **❗重要:工单统计使用三类工单表汇总**
- 维修工单:`DMS_BILLS_FAULT_INSTANCE`WHERE IS_FLAG='1'
- 保养工单:`DMS_BILLS_MAINT_INSTANCE`(无 IS_FLAG 字段,全量统计)
- 巡检工单:`DMS_BILLS_INSPECT_INSTANCE`WHERE IS_FLAG='1'
2. **❗重要:巡检应检设备数计算**
- 应检设备数 = 关联 `DMS_PLAN_INSPECT` 表,汇总 `DEVICE_AMOUNT`
- 每个巡检计划的 `DEVICE_AMOUNT` 可能不同,不能硬编码 × 18
- 原先的计算逻辑 `COUNT(DISTINCT PLAN_INSPECT_ID) × 18` 导致完成率可能超过 100%
3. **保养状态映射**DMS_BILLS_MAINT_INSTANCE.MAINT_STATUS
- 1 = 待保养
- 2 = 保养中
- 3 = 已完成
- 无 MAINT_STATUS=4 状态verifyCount 固定返回 0
4. **故障来源类型映射**DMS_BILLS_FAULT_INSTANCE.FAULT_SOURCE_TYPE
- 1 = 检修 → 维护故障
- 2 = 点检 → 运行故障
- 3 = 巡检 → 运行故障
- 9 = 其他 → 自然故障
5. **设备表字段类型**BASE_DEVICELEDGER
- `DEVICE_STATUS`NUMBER(1,0),查询时使用 `= 0/1/2`
- `IS_FLAG`NUMBER(1,0),值可以是 0 或 1不同接口使用不同值
6. **前端页面字段映射**
- text1-text4 → orderWorkStatistics工单总数、已完成、完成率、停机工单
- text5-text6 → repairTimeStatistics平均响应时间、平均维修时间
- text7-text15 → maintStatistics保养执行情况
- text16-text17 → inspectStatistics巡检执行情况
- value1-value4 → deviceStatusDistribution设备状态分布
- value5-value7 → faultSourceDistribution故障来源分布
- chart1 → faultTrendList故障数量曲线
- chart2 → productionTop5产量机台TOP5
---
## 九、变更记录
| 日期 | 版本 | 变更内容 | 作者 |
|------|------|----------|------|
| 2026-01-21 | 1.0 | Board5看板接口初始版本 | YinQ |
| 2026-01-21 | 1.1 | 故障数量曲线使用RECORD_ALARM_DEVICE表真实数据 | YinQ |
| 2026-01-21 | 1.2 | 产量机台TOP5替代备件消耗费用TOP5 | YinQ |
| 2026-01-22 | 1.3 | 故障数量曲线切换为DMS_RECORD_ALARM_INFO表 | YinQ |
| 2026-01-26 | 2.0 | 根据Mapper XML更新业务逻辑工单统计改用工单表汇总、保养/巡检改用工单实例表、更新所有SQL示例和表结构 | Claude |
| 2026-01-26 | 2.1 | 修复巡检完成率超过100%问题应检设备数改为关联DMS_PLAN_INSPECT表SUM(DEVICE_AMOUNT)替代硬编码×18 | Claude |