change(report/Board4Mapper): 修复生产统计数据计算逻辑

- 修改月累计产量查询逻辑,按设备取最早值与最新值差值后汇总
- 修改日累计产量查询逻辑,按设备取最早值与最新值差值后汇总
- 更新API文档中的功能描述,明确按设备差分累加的计算方式
- 修正年累计产量为去年SUM(COMPLETE_AMOUNT)的说明
- 更新关键SQL说明文档,详细描述差分汇总的实现逻辑
master
zangch@mesnac.com 3 days ago
parent fa8b0cfca7
commit a97c17c566

@ -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_VALPARAM_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 维修分析(按设备聚合)

@ -19,15 +19,24 @@
WHERE TO_CHAR(BEGIN_DATE, 'YYYY-MM') = TO_CHAR(SYSDATE, 'YYYY-MM')
-->
<select id="selectMonthProductionTotal" resultType="java.lang.Long">
SELECT NVL(SUM(TO_NUMBER(PARAM_VALUE)), 0)
/* 按设备取本月窗口内的最早值与最新值差值再汇总无起始值则按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 &gt;= TRUNC(SYSDATE, 'MM') AND COLLECT_TIME &lt; 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 &gt;= TRUNC(SYSDATE, 'MM')
AND COLLECT_TIME &lt; ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1)
)
GROUP BY device_code
)
WHERE RN = 1
</select>
<!-- 查询日累计产量当天00:00-23:59 工艺参数) -->
@ -35,15 +44,24 @@
<!-- 注意PARAM_CODE可能因设备不同而变化但PARAM_NAME是固定的 -->
<!-- 取每台设备当天最新的一条记录的实际产出数量进行汇总 -->
<select id="selectDayProductionTotal" resultType="java.lang.Long">
SELECT NVL(SUM(TO_NUMBER(PARAM_VALUE)), 0)
/* 按设备取当天窗口内的最早值与最新值差值再汇总无起始值则按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 &gt;= TRUNC(SYSDATE) AND COLLECT_TIME &lt; TRUNC(SYSDATE) + 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 &gt;= TRUNC(SYSDATE)
AND COLLECT_TIME &lt; TRUNC(SYSDATE) + 1
)
GROUP BY device_code
)
WHERE RN = 1
</select>
<!-- 查询今日工单统计计划数、完成数注释当天00:00-23:59 -->

Loading…
Cancel
Save