diff --git a/aucma-report/boardAPIComplete.md b/aucma-report/boardAPIComplete.md
index e495722..04bed77 100644
--- a/aucma-report/boardAPIComplete.md
+++ b/aucma-report/boardAPIComplete.md
@@ -6,7 +6,7 @@
| 序号 | 接口路径 | 请求方式 | 功能描述 | 实体类 |
|------|----------|----------|----------|--------|
-| 1 | `/board4/productionTotal` | GET | 产量统计(年/月/日累计) | Board4ProductionTotalVo |
+| 1 | `/board4/productionTotal` | GET | 产量统计(年/月/日累计,按设备差分累加) | Board4ProductionTotalVo |
| 2 | `/board4/orderStatistics` | GET | 工单统计(计划/完成/差异/完成率) | Board4OrderStatisticsVo |
| 3 | `/board4/orderProgressList` | GET | 工单进度列表 | Board4OrderProgressVo |
| 4 | `/board4/deviceStatus` | GET | 设备状态统计 | Board4DeviceStatusVo |
@@ -68,10 +68,10 @@ public class Board4ProductionTotalVo {
/** 年累计产量(去年数据,来源BASE_ORDERINFO) */
private Long yearTotal;
- /** 月累计产量(当月数据,来源BASE_DEVICE_PARAM_VAL,按设备取当月最新“机台状态-实际产出数量”汇总) */
+ /** 月累计产量(当月数据,来源BASE_DEVICE_PARAM_VAL,按设备取当月最早/最新“机台状态-实际产出数量”差值汇总) */
private Long monthTotal;
- /** 日累计产量(当天数据,来源BASE_DEVICE_PARAM_VAL,PARAM_NAME='机台状态-实际产出数量') */
+ /** 日累计产量(当天数据,来源BASE_DEVICE_PARAM_VAL,按设备取当日最早/最新差值汇总,PARAM_NAME='机台状态-实际产出数量') */
private Long dayTotal;
}
```
@@ -227,7 +227,7 @@ public class Board4DeviceProductionVo {
### 4.1 接口数据源映射表
| 接口 | 数据源表 | 业务逻辑 |
-| productionTotal | BASE_ORDERINFO, BASE_DEVICE_PARAM_VAL | 年累计=去年SUM(COMPLETE_AMOUNT);月累计=当月每台设备最新PARAM_NAME='机台状态-实际产出数量'汇总;日累计=当天每台设备最新PARAM_NAME='机台状态-实际产出数量'汇总 |
+| 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分组统计+总维修次数 |
@@ -240,44 +240,64 @@ public class Board4DeviceProductionVo {
### 4.2 关键SQL说明
-#### 4.2.1 日累计产量(BASE_DEVICE_PARAM_VAL)
+#### 4.2.1 日累计产量(BASE_DEVICE_PARAM_VAL,按差分汇总)
```sql
-SELECT NVL(SUM(TO_NUMBER(PARAM_VALUE)), 0) -- 汇总当天实际产出数量
+SELECT NVL(SUM(latest_val - earliest_val), 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') -- 当天数据
+ 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
)
-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 即每台设备当天最新的一条记录
-- **汇总逻辑**:将所有设备的最新实际产出数量求和,得到日累计产量
+- 窗口:当天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)
+#### 4.2.2 月累计产量(BASE_DEVICE_PARAM_VAL,按差分汇总)
```sql
-SELECT NVL(SUM(TO_NUMBER(PARAM_VALUE)), 0) -- 汇总当月实际产出数量
+SELECT NVL(SUM(latest_val - earliest_val), 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) -- 当月数据
+ 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
)
-WHERE RN = 1 -- 仅保留最新一条
```
**业务逻辑说明**:
-- 与日累计一致的取数口径,但时间范围是本自然月(当月1日00:00:00至下月1日00:00:00)
-- 按设备取当月最新一条"机台状态-实际产出数量",再汇总得到月累计产量
-
-> 原先的月累计(工单完成量 SUM(COMPLETE_AMOUNT))已替换为上述设备参数口径,旧逻辑在 Mapper XML 中以注释保留。
+- 窗口:本自然月起始(含)到下月首日(不含)。
+- 取值:同一设备取月内最早/最新记录差值作为当月增量。
+- 默认:缺最早记录时 earliest_val 置 0;仅有一条记录时差值=最新-0。
+- 类型:`TO_NUMBER(PARAM_VALUE)` 需为可解析数字。
+- 参数名:固定使用 `PARAM_NAME='机台状态-实际产出数量'`。
+- 旧口径:原工单累计 SUM(COMPLETE_AMOUNT) 已替换,旧 SQL 在 Mapper XML 注释保留。
#### 4.2.3 维修分析(按设备聚合)
diff --git a/aucma-report/src/main/resources/mapper/report/Board4Mapper.xml b/aucma-report/src/main/resources/mapper/report/Board4Mapper.xml
index 4ec5bbe..14950f4 100644
--- a/aucma-report/src/main/resources/mapper/report/Board4Mapper.xml
+++ b/aucma-report/src/main/resources/mapper/report/Board4Mapper.xml
@@ -19,15 +19,24 @@
WHERE TO_CHAR(BEGIN_DATE, 'YYYY-MM') = TO_CHAR(SYSDATE, 'YYYY-MM')
-->
@@ -35,15 +44,24 @@