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 @@