# Board4 看板真实数据接口实现方案

## 一、接口概述

### 1.1 接口列表

| 序号 | 接口路径 | 请求方式 | 功能描述 | 实体类 |
|------|----------|----------|----------|--------|
| 1 | `/board4/productionTotal` | GET | 产量统计（年：订单累计；月/日：PARAM_NAME='生产计数-当前日期生产总数'，取每台设备当日最新值汇总） | 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.COMPLETE_AMOUNT） */
    private Long yearTotal;
    
    /** 月累计产量（当月：BASE_DEVICE_PARAM_VAL，PARAM_NAME='生产计数-当前日期生产总数'；按天取每台设备当日最新值求和，再汇总整月） */
    private Long monthTotal;
    
    /** 日累计产量（当天：BASE_DEVICE_PARAM_VAL，PARAM_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)；月累计=当月窗口内按设备取最早/最新“机台状态-实际产出数量”差值汇总；日累计=当天窗口内按设备取最早/最新差值汇总 |
| 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(latest_val - earliest_val), 0)
FROM (
    SELECT device_code,
           NVL(MAX(CASE WHEN rn_desc = 1 THEN val END), 0) AS latest_val,
           NVL(MAX(CASE WHEN rn_asc = 1 THEN val END), 0) AS earliest_val
    FROM (
        SELECT DEVICE_CODE,
               TO_NUMBER(PARAM_VALUE) AS val,
               ROW_NUMBER() OVER (PARTITION BY DEVICE_CODE ORDER BY COLLECT_TIME DESC) AS rn_desc,
               ROW_NUMBER() OVER (PARTITION BY DEVICE_CODE ORDER BY COLLECT_TIME ASC) AS rn_asc
        FROM BASE_DEVICE_PARAM_VAL
        WHERE PARAM_NAME = '机台状态-实际产出数量'
          AND COLLECT_TIME >= TRUNC(SYSDATE)
          AND COLLECT_TIME < TRUNC(SYSDATE) + 1
    )
    GROUP BY device_code
)
```

**业务逻辑说明**：
- 窗口：当天00:00:00（含）至次日00:00:00前（不含），按数据库时间。
- 取值：同一设备内取最早一条（rn_asc=1）和最新一条（rn_desc=1），差值=当日增量。
- 默认：缺最早记录时 earliest_val 置 0，最终差值为 latest-0，避免空值导致整台设备被跳过。
- 类型：`TO_NUMBER(PARAM_VALUE)` 将字符串数值转数字，确保可运算；需保证采集值为可解析的数字。
- 标识：仍用固定参数名 `PARAM_NAME='机台状态-实际产出数量'`，与采集端定义保持一致。

#### 4.2.2 月累计产量（BASE_DEVICE_PARAM_VAL，按差分汇总）

```sql
SELECT NVL(SUM(latest_val - earliest_val), 0)
FROM (
    SELECT device_code,
           NVL(MAX(CASE WHEN rn_desc = 1 THEN val END), 0) AS latest_val,
           NVL(MAX(CASE WHEN rn_asc = 1 THEN val END), 0) AS earliest_val
    FROM (
        SELECT DEVICE_CODE,
               TO_NUMBER(PARAM_VALUE) AS val,
               ROW_NUMBER() OVER (PARTITION BY DEVICE_CODE ORDER BY COLLECT_TIME DESC) AS rn_desc,
               ROW_NUMBER() OVER (PARTITION BY DEVICE_CODE ORDER BY COLLECT_TIME ASC) AS rn_asc
        FROM BASE_DEVICE_PARAM_VAL
        WHERE PARAM_NAME = '机台状态-实际产出数量'
          AND COLLECT_TIME >= TRUNC(SYSDATE, 'MM')
          AND COLLECT_TIME < ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1)
    )
    GROUP BY device_code
)
```

**业务逻辑说明**：
- 窗口：本自然月起始（含）到下月首日（不含）。
- 取值：同一设备取月内最早/最新记录差值作为当月增量。
- 默认：缺最早记录时 earliest_val 置 0；仅有一条记录时差值=最新-0。
- 类型：`TO_NUMBER(PARAM_VALUE)` 需为可解析数字。
- 参数名：固定使用 `PARAM_NAME='机台状态-实际产出数量'`。
- 旧口径：原工单累计 SUM(COMPLETE_AMOUNT) 已替换，旧 SQL 在 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 |
