change(report): 完善board的维修平均响应时间

- 明确年累计为上一自然年(上一年1月1日到12月31日,非滚动12个月)
- 明确月累计为本自然月(当月1日至月末)
- 明确日累计为当天(00:00-23:59)
- 更新质量追溯为近7天含当天按产品统计合格率
- 添加全量历史数据查询说明(工单、维修、保养、巡检、设备状态、故障来源)
- 补充近30天故障趋势查询说明
- 优化SQL查询注释,明确数据来源与处理逻辑
- 添加安全类型转换保护,避免空指针异常
- 标准化返回格式,确保前端数据稳定性
master
zangch@mesnac.com 5 days ago
parent cdd5819326
commit 24467a71ed

@ -37,6 +37,8 @@ public class SAPPortController extends BaseController {
@Autowired
private ISAPPutStorageService storageService;
/**
* SAP
* @param paramMap

@ -243,15 +243,15 @@ public class Board4DeviceProductionVo {
#### 4.2.1 日累计产量BASE_DEVICE_PARAM_VAL
```sql
SELECT NVL(SUM(TO_NUMBER(PARAM_VALUE)), 0)
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
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 PARAM_NAME = '机台状态-实际产出数量' -- 固定参数名称
AND TO_CHAR(COLLECT_TIME, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD') -- 当天数据
)
WHERE RN = 1
WHERE RN = 1 -- 仅保留最新一条
```
**业务逻辑说明**
@ -262,35 +262,35 @@ WHERE RN = 1
#### 4.2.2 维修分析(按设备聚合)
```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
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
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.3 设备产量列表
```sql
SELECT d.DEVICE_NAME AS deviceName,
NVL(TO_NUMBER(p.PARAM_VALUE), 0) AS production
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
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 PARAM_NAME = '机台状态-实际产出数量' -- 固定参数名称
AND TO_CHAR(COLLECT_TIME, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD') -- 当天数据
)
WHERE RN = 1
) p ON d.DEVICE_CODE = p.DEVICE_CODE
WHERE d.IS_FLAG = 0 AND d.DEVICE_TYPE = '1'
ORDER BY production DESC
WHERE RN = 1 -- 仅保留最新一条
) p ON d.DEVICE_CODE = p.DEVICE_CODE -- 关联设备编码
WHERE d.IS_FLAG = 0 AND d.DEVICE_TYPE = '1' -- 仅生产设备
ORDER BY production DESC -- 按产量降序
```
**业务逻辑说明**

@ -24,13 +24,21 @@ public class Board4ServiceImpl implements IBoard4Service {
/**
*
* 11123112
* 1
* -00:00-23:59
*/
@Override
public Board4ProductionTotalVo getProductionTotal() {
// 初始化返回对象,避免前端空指针
Board4ProductionTotalVo vo = new Board4ProductionTotalVo();
// 年累计:去年完成数量总和
Long yearTotal = board4Mapper.selectYearProductionTotal();
// 月累计:当月完成数量总和
Long monthTotal = board4Mapper.selectMonthProductionTotal();
// 日累计:当天每台设备最新产出数量汇总
Long dayTotal = board4Mapper.selectDayProductionTotal();
// 空值保护并赋值
vo.setYearTotal(yearTotal != null ? yearTotal : 0L);
vo.setMonthTotal(monthTotal != null ? monthTotal : 0L);
vo.setDayTotal(dayTotal != null ? dayTotal : 0L);
@ -39,23 +47,31 @@ public class Board4ServiceImpl implements IBoard4Service {
/**
*
* =-%
*/
@Override
public Board4OrderStatisticsVo getOrderStatistics() {
// 初始化返回对象
Board4OrderStatisticsVo vo = new Board4OrderStatisticsVo();
// 查询今日工单统计(计划/完成)
HashMap<String, Object> stats = board4Mapper.selectTodayOrderStatistics();
if (stats != null) {
// 安全转换计划数与完成数
Long planCount = getLongValue(stats.get("PLAN_COUNT"));
Long completeCount = getLongValue(stats.get("COMPLETE_COUNT"));
// 设置基础字段
vo.setPlanCount(planCount);
vo.setCompleteCount(completeCount);
// 差异=计划-完成
vo.setDiffCount(planCount - completeCount);
// 完成率=完成/计划(四舍五入),返回不带“%”
if (planCount > 0) {
vo.setCompleteRate(String.valueOf(Math.round(completeCount * 100.0 / planCount)));
} else {
vo.setCompleteRate("0");
}
} else {
// 无数据时返回0保证前端稳定
vo.setPlanCount(0L);
vo.setCompleteCount(0L);
vo.setDiffCount(0L);
@ -66,31 +82,39 @@ public class Board4ServiceImpl implements IBoard4Service {
/**
*
* %
*/
@Override
public List<Board4OrderProgressVo> getOrderProgressList() {
// 查询今日工单列表并计算进度
List<Board4OrderProgressVo> list = board4Mapper.selectTodayOrderProgressList();
return list != null ? list : new ArrayList<>();
}
/**
*
* DEVICE_STATUS
*/
@Override
public Board4DeviceStatusVo getDeviceStatus() {
// 初始化返回对象
Board4DeviceStatusVo vo = new Board4DeviceStatusVo();
// 查询设备状态分布
HashMap<String, Object> stats = board4Mapper.selectDeviceStatusStatistics();
if (stats != null) {
// 正常/告警/停机/总数
vo.setNormalCount(getLongValue(stats.get("NORMAL_COUNT")));
vo.setAlarmCount(getLongValue(stats.get("ALARM_COUNT")));
vo.setStopCount(getLongValue(stats.get("STOP_COUNT")));
vo.setTotalCount(getLongValue(stats.get("TOTAL_COUNT")));
} else {
// 无数据时默认0
vo.setNormalCount(0L);
vo.setAlarmCount(0L);
vo.setStopCount(0L);
vo.setTotalCount(0L);
}
// 总维修次数统计
Long repairCount = board4Mapper.selectTotalRepairCount();
vo.setRepairCount(repairCount != null ? repairCount : 0L);
return vo;
@ -98,17 +122,22 @@ public class Board4ServiceImpl implements IBoard4Service {
/**
*
* HH24:MI:SS
*/
@Override
public Board4AlarmInfoVo getAlarmInfo() {
// 初始化返回对象
Board4AlarmInfoVo vo = new Board4AlarmInfoVo();
// 查询最新报警记录
HashMap<String, Object> info = board4Mapper.selectLatestAlarmInfo();
if (info != null && !info.isEmpty()) {
// 有报警:填充设备、原因、时间
vo.setHasAlarm(true);
vo.setDeviceName(getStringValue(info.get("DEVICE_NAME")));
vo.setAlarmReason(getStringValue(info.get("ALARM_REASON")));
vo.setAlarmTime(getStringValue(info.get("ALARM_TIME")));
} else {
// 无报警hasAlarm=false其余置空
vo.setHasAlarm(false);
vo.setDeviceName("");
vo.setAlarmReason("");
@ -119,33 +148,42 @@ public class Board4ServiceImpl implements IBoard4Service {
/**
*
* TOP10
*/
@Override
public List<Board4RepairAnalysisVo> getRepairAnalysisList() {
// 查询维修分析TOP10
List<Board4RepairAnalysisVo> list = board4Mapper.selectRepairAnalysisByDevice();
return list != null ? list : new ArrayList<>();
}
/**
*
* 00:00-23:59
*/
@Override
public List<Board4RepairTrendVo> getRepairTrendList() {
// 查询当天小时维度的报修数量
List<Board4RepairTrendVo> list = board4Mapper.selectRepairTrendList();
return list != null ? list : new ArrayList<>();
}
/**
*
* TREATMENT_MEASURE=3=1
*/
@Override
public Board4QualityStatisticsVo getQualityStatistics() {
// 初始化返回对象
Board4QualityStatisticsVo vo = new Board4QualityStatisticsVo();
// 查询当天质量统计
HashMap<String, Object> stats = board4Mapper.selectQualityStatistics();
if (stats != null) {
// 合格/不合格数
vo.setQualifiedCount(getLongValue(stats.get("QUALIFIED_COUNT")));
vo.setUnqualifiedCount(getLongValue(stats.get("UNQUALIFIED_COUNT")));
} else {
// 无数据默认0
vo.setQualifiedCount(0L);
vo.setUnqualifiedCount(0L);
}
@ -154,18 +192,22 @@ public class Board4ServiceImpl implements IBoard4Service {
/**
*
* 7TOP10
*/
@Override
public List<Board4QualityTraceVo> getQualityTraceList() {
// 查询近7天质量追溯TOP10
List<Board4QualityTraceVo> list = board4Mapper.selectQualityTraceList();
return list != null ? list : new ArrayList<>();
}
/**
* /
*
*/
@Override
public List<Board4DeviceProductionVo> getDeviceProductionList() {
// 查询当天设备产量列表
List<Board4DeviceProductionVo> list = board4Mapper.selectDeviceProductionAnalysis();
return list != null ? list : new ArrayList<>();
}
@ -174,12 +216,15 @@ public class Board4ServiceImpl implements IBoard4Service {
* Long
*/
private Long getLongValue(Object obj) {
// 空值保护
if (obj == null) {
return 0L;
}
// 数值类型直接转换
if (obj instanceof Number) {
return ((Number) obj).longValue();
}
// 字符串安全解析
try {
return Long.parseLong(obj.toString());
} catch (NumberFormatException e) {
@ -191,6 +236,7 @@ public class Board4ServiceImpl implements IBoard4Service {
* String
*/
private String getStringValue(Object obj) {
// 空值返回空字符串
if (obj == null) {
return "";
}

@ -27,21 +27,27 @@ public class Board5ServiceImpl implements IBoard5Service {
*/
@Override
public Board5OrderWorkStatisticsVo getOrderWorkStatistics() {
// 初始化返回对象
Board5OrderWorkStatisticsVo vo = new Board5OrderWorkStatisticsVo();
// 查询工单统计数据
HashMap<String, Object> stats = board5Mapper.selectOrderWorkStatistics();
if (stats != null) {
// 安全转换各统计数
Long totalCount = getLongValue(stats.get("TOTAL_COUNT"));
Long completeCount = getLongValue(stats.get("COMPLETE_COUNT"));
Long stopCount = getLongValue(stats.get("STOP_COUNT"));
// 设置统计结果
vo.setTotalCount(totalCount);
vo.setCompleteCount(completeCount);
vo.setStopCount(stopCount);
// 完成率=完成/总数,返回不带“%”
if (totalCount > 0) {
vo.setCompleteRate(String.valueOf(Math.round(completeCount * 100.0 / totalCount)));
} else {
vo.setCompleteRate("0");
}
} else {
// 无数据时返回0
vo.setTotalCount(0L);
vo.setCompleteCount(0L);
vo.setStopCount(0L);
@ -52,15 +58,20 @@ public class Board5ServiceImpl implements IBoard5Service {
/**
*
*
*/
@Override
public Board5RepairTimeStatisticsVo getRepairTimeStatistics() {
// 初始化返回对象
Board5RepairTimeStatisticsVo vo = new Board5RepairTimeStatisticsVo();
// 查询平均响应/维修时间
HashMap<String, Object> stats = board5Mapper.selectRepairTimeStatistics();
if (stats != null) {
// 直接返回字符串,避免精度丢失
vo.setAvgResponseTime(getStringValue(stats.get("AVG_RESPONSE_TIME")));
vo.setAvgRepairTime(getStringValue(stats.get("AVG_REPAIR_TIME")));
} else {
// 无数据时返回0
vo.setAvgResponseTime("0");
vo.setAvgRepairTime("0");
}
@ -69,24 +80,30 @@ public class Board5ServiceImpl implements IBoard5Service {
/**
*
*
*/
@Override
public Board5MaintStatisticsVo getMaintStatistics() {
// 初始化返回对象
Board5MaintStatisticsVo vo = new Board5MaintStatisticsVo();
// 查询保养统计
HashMap<String, Object> stats = board5Mapper.selectMaintStatistics();
if (stats != null) {
// 安全转换各状态数量
Long planCount = getLongValue(stats.get("PLAN_COUNT"));
Long completeCount = getLongValue(stats.get("COMPLETE_COUNT"));
Long waitingCount = getLongValue(stats.get("WAITING_COUNT"));
Long doingCount = getLongValue(stats.get("DOING_COUNT"));
Long verifyCount = getLongValue(stats.get("VERIFY_COUNT"));
// 设置数量字段
vo.setPlanCount(planCount);
vo.setCompleteCount(completeCount);
vo.setWaitingCount(waitingCount);
vo.setDoingCount(doingCount);
vo.setVerifyCount(verifyCount);
// 计算各状态比例,返回不带“%”
if (planCount > 0) {
vo.setWaitingRate(String.valueOf(Math.round(waitingCount * 100.0 / planCount)));
vo.setDoingRate(String.valueOf(Math.round(doingCount * 100.0 / planCount)));
@ -99,6 +116,7 @@ public class Board5ServiceImpl implements IBoard5Service {
vo.setCompleteRate("0");
}
} else {
// 无数据默认0
vo.setPlanCount(0L);
vo.setCompleteCount(0L);
vo.setWaitingCount(0L);
@ -114,15 +132,21 @@ public class Board5ServiceImpl implements IBoard5Service {
/**
*
*
*/
@Override
public Board5InspectStatisticsVo getInspectStatistics() {
// 初始化返回对象
Board5InspectStatisticsVo vo = new Board5InspectStatisticsVo();
// 查询巡检统计
HashMap<String, Object> stats = board5Mapper.selectInspectStatistics();
if (stats != null) {
// 安全转换应检/已检数量
Long deviceCount = getLongValue(stats.get("DEVICE_COUNT"));
Long completeCount = getLongValue(stats.get("COMPLETE_COUNT"));
// 设置应检数量
vo.setDeviceCount(deviceCount);
// 完成率=已检/应检
if (deviceCount > 0) {
vo.setCompleteRate(String.valueOf(Math.round(completeCount * 100.0 / deviceCount)));
} else {
@ -137,18 +161,23 @@ public class Board5ServiceImpl implements IBoard5Service {
/**
*
*
*/
@Override
public Board5DeviceStatusDistributionVo getDeviceStatusDistribution() {
// 初始化返回对象
Board5DeviceStatusDistributionVo vo = new Board5DeviceStatusDistributionVo();
// 查询设备状态分布
HashMap<String, Object> stats = board5Mapper.selectDeviceStatusDistribution();
if (stats != null) {
// 安全转换各状态数量
Long totalCount = getLongValue(stats.get("TOTAL_COUNT"));
Long normalCount = getLongValue(stats.get("NORMAL_COUNT"));
Long abnormalCount = getLongValue(stats.get("ABNORMAL_COUNT"));
Long scrapCount = getLongValue(stats.get("SCRAP_COUNT"));
Long experimentCount = getLongValue(stats.get("EXPERIMENT_COUNT"));
// 计算分布比例,返回不带“%”
if (totalCount > 0) {
vo.setExperimentPercent(Math.round(experimentCount * 100.0 / totalCount));
vo.setUncheckedPercent(Math.round(scrapCount * 100.0 / totalCount));
@ -171,17 +200,22 @@ public class Board5ServiceImpl implements IBoard5Service {
/**
*
*
*/
@Override
public Board5FaultSourceDistributionVo getFaultSourceDistribution() {
// 初始化返回对象
Board5FaultSourceDistributionVo vo = new Board5FaultSourceDistributionVo();
// 查询故障来源统计
HashMap<String, Object> stats = board5Mapper.selectFaultSourceDistribution();
if (stats != null) {
// 安全转换各来源数量
Long totalCount = getLongValue(stats.get("TOTAL_COUNT"));
Long maintainCount = getLongValue(stats.get("MAINTAIN_COUNT"));
Long runningCount = getLongValue(stats.get("RUNNING_COUNT"));
Long naturalCount = getLongValue(stats.get("NATURAL_COUNT"));
// 计算来源比例,返回不带“%”
if (totalCount > 0) {
vo.setMaintainPercent(Math.round(maintainCount * 100.0 / totalCount));
vo.setRunningPercent(Math.round(runningCount * 100.0 / totalCount));
@ -201,26 +235,32 @@ public class Board5ServiceImpl implements IBoard5Service {
/**
* 线
* 30
*/
@Override
public List<Board5FaultTrendVo> getFaultTrendList() {
// 查询近30天故障数量
List<Board5FaultTrendVo> list = board5Mapper.selectFaultTrendList();
return list != null ? list : new ArrayList<>();
}
/**
* TOP5
* 00:00-23:59
*/
@Override
public List<Board5ProductionTopVo> getProductionTop5() {
// 查询TOP5产量机台
List<Board5ProductionTopVo> list = board5Mapper.selectProductionTop5();
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
// 查询最大产量用于比例计算
Long maxProduction = board5Mapper.selectMaxProduction();
if (maxProduction == null || maxProduction == 0) {
maxProduction = 1L;
}
// 逐条计算百分比
for (Board5ProductionTopVo vo : list) {
if (vo.getProduction() != null && vo.getProduction() > 0) {
vo.setPercent(Math.round(vo.getProduction() * 100.0 / maxProduction));
@ -235,12 +275,15 @@ public class Board5ServiceImpl implements IBoard5Service {
* Long
*/
private Long getLongValue(Object obj) {
// 空值保护
if (obj == null) {
return 0L;
}
// 数值类型直接转换
if (obj instanceof Number) {
return ((Number) obj).longValue();
}
// 字符串安全解析
try {
return Long.parseLong(obj.toString());
} catch (NumberFormatException e) {
@ -252,6 +295,7 @@ public class Board5ServiceImpl implements IBoard5Service {
* String
*/
private String getStringValue(Object obj) {
// 空值返回字符串0
if (obj == null) {
return "0";
}

@ -4,21 +4,21 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aucma.report.mapper.Board4Mapper">
<!-- 查询年累计产量(去年数据 -->
<!-- 查询年累计产量(上一自然年上一年1月1日到12月31日非滚动12个月 -->
<select id="selectYearProductionTotal" resultType="java.lang.Long">
SELECT NVL(SUM(COMPLETE_AMOUNT), 0)
FROM BASE_ORDERINFO
WHERE TO_CHAR(BEGIN_DATE, 'YYYY') = TO_CHAR(ADD_MONTHS(SYSDATE, -12), 'YYYY')
</select>
<!-- 查询月累计产量(当月数据 -->
<!-- 查询月累计产量(本自然月当月1日至月末 -->
<select id="selectMonthProductionTotal" resultType="java.lang.Long">
SELECT NVL(SUM(COMPLETE_AMOUNT), 0)
FROM BASE_ORDERINFO
WHERE TO_CHAR(BEGIN_DATE, 'YYYY-MM') = TO_CHAR(SYSDATE, 'YYYY-MM')
</select>
<!-- 查询日累计产量(当天工艺参数) -->
<!-- 查询日累计产量(当天00:00-23:59 工艺参数) -->
<!-- 使用BASE_DEVICE_PARAM_VAL表通过PARAM_NAME='机台状态-实际产出数量'定位参数 -->
<!-- 注意PARAM_CODE可能因设备不同而变化但PARAM_NAME是固定的 -->
<!-- 取每台设备当天最新的一条记录的实际产出数量进行汇总 -->
@ -34,7 +34,7 @@
WHERE RN = 1
</select>
<!-- 查询今日工单统计(计划数、完成数 -->
<!-- 查询今日工单统计(计划数、完成数当天00:00-23:59 -->
<select id="selectTodayOrderStatistics" resultType="java.util.HashMap">
SELECT NVL(SUM(ORDER_AMOUNT), 0) AS PLAN_COUNT,
NVL(SUM(COMPLETE_AMOUNT), 0) AS COMPLETE_COUNT
@ -42,7 +42,7 @@
WHERE TO_CHAR(BEGIN_DATE, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD')
</select>
<!-- 查询今日工单进度列表 -->
<!-- 查询今日工单进度列表当天00:00-23:59 -->
<select id="selectTodayOrderProgressList" resultType="com.aucma.report.domain.vo.Board4OrderProgressVo">
SELECT MATERIAL_NAME AS materialName,
ORDER_AMOUNT AS planCount,
@ -104,7 +104,7 @@
) WHERE ROWNUM &lt;= 10
</select>
<!-- 查询报修趋势(按小时段统计,当天数据 -->
<!-- 查询报修趋势(按小时段统计,当天00:00-23:59 -->
<select id="selectRepairTrendList" resultType="com.aucma.report.domain.vo.Board4RepairTrendVo">
SELECT TO_CHAR(APPLY_TIME, 'HH24') || ':00' AS timeHour,
COUNT(*) AS repairCount
@ -115,7 +115,7 @@
ORDER BY timeHour
</select>
<!-- 查询质量统计(合格数/不合格数 -->
<!-- 查询质量统计(合格数/不合格数当天00:00-23:59 -->
<!-- TREATMENT_MEASURE: 3=合格, 1=返修 -->
<select id="selectQualityStatistics" resultType="java.util.HashMap">
SELECT NVL(SUM(CASE WHEN TREATMENT_MEASURE = '3' THEN 1 ELSE 0 END), 0) AS QUALIFIED_COUNT,
@ -124,7 +124,7 @@
WHERE TO_CHAR(INSPECTOR_TIME, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD')
</select>
<!-- 查询质量追溯列表(按产品统计合格率) -->
<!-- 查询质量追溯列表(近7天含当天按产品统计合格率) -->
<select id="selectQualityTraceList" resultType="com.aucma.report.domain.vo.Board4QualityTraceVo">
SELECT * FROM (
SELECT MATERIAL_NAME AS materialName,

@ -4,7 +4,7 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aucma.report.mapper.Board5Mapper">
<!-- 查询工单统计(总数、已完成、停机 -->
<!-- 查询工单统计(总数、已完成、停机,全量历史 -->
<!-- 数据来源BASE_ORDERINFO -->
<!-- EXECUTION_STATUS: PENDING/RUNNING/COMPLETED/PAUSED -->
<select id="selectOrderWorkStatistics" resultType="java.util.HashMap">
@ -15,7 +15,7 @@
WHERE IS_FLAG = 0
</select>
<!-- 查询维修时间统计(平均响应时间、平均维修时间 -->
<!-- 查询维修时间统计(平均响应时间、平均维修时间,全量历史 -->
<!-- 平均响应时间 = (REAL_BEGIN_TIME - APPLY_TIME) 的平均值,单位分钟 -->
<!-- 平均维修时间 = (REAL_END_TIME - REAL_BEGIN_TIME) 的平均值,单位小时 -->
<!-- 数据来源DMS_BILLS_FAULT_INSTANCE -->
@ -25,10 +25,12 @@
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 IN ('2', '5') -- 仅计算已完成工单
AND APPLY_TIME IS NOT NULL
</select>
<!-- 查询保养执行情况统计 -->
<!-- 查询保养执行情况统计(全量历史) -->
<!-- MAINT_STATUS: 1=待保养, 2=保养中, 3=已完成, 4=待验证 -->
<!-- 数据来源DMS_PLAN_MAINT -->
<select id="selectMaintStatistics" resultType="java.util.HashMap">
@ -41,7 +43,7 @@
WHERE IS_FLAG = 1
</select>
<!-- 查询巡检执行情况统计 -->
<!-- 查询巡检执行情况统计(全量历史) -->
<!-- 应检设备 = DMS_PLAN_INSPECT.DEVICE_AMOUNT 求和 -->
<!-- 已检设备 = DMS_BILLS_INSPECT_INSTANCE 中 INSPECT_STATUS=2(已完成) 的设备数量 -->
<!-- 数据来源DMS_PLAN_INSPECT, DMS_BILLS_INSPECT_INSTANCE -->
@ -51,7 +53,7 @@
FROM DUAL
</select>
<!-- 查询设备状态分布 -->
<!-- 查询设备状态分布(有效设备全量) -->
<!-- DEVICE_STATUS: NUMBER(1,0)类型0=使用/正常, 1=停用/异常, 2=报废 -->
<!-- 实验设备、未检设备、正常设备、异常设备 的比例分布 -->
<!-- 数据来源BASE_DEVICELEDGER -->
@ -65,7 +67,7 @@
WHERE IS_FLAG = 0
</select>
<!-- 查询故障来源分布 -->
<!-- 查询故障来源分布(全量历史) -->
<!-- FAULT_SOURCE_TYPE: 1=检修(维护故障), 2=点检, 3=巡检(运行故障), 9=其他(自然故障) -->
<!-- 数据来源DMS_BILLS_FAULT_INSTANCE -->
<select id="selectFaultSourceDistribution" resultType="java.util.HashMap">
@ -77,7 +79,7 @@
WHERE IS_FLAG = '1'
</select>
<!-- 查询故障数量曲线近30天每日告警数量) -->
<!-- 查询故障数量曲线近30天含今天,每日告警数量) -->
<!-- 数据来源RECORD_ALARM_DEVICE -->
<select id="selectFaultTrendList" resultType="com.aucma.report.domain.vo.Board5FaultTrendVo">
SELECT TO_CHAR(ALARM_TIME, 'DD') AS dateValue,
@ -89,7 +91,7 @@
ORDER BY TRUNC(ALARM_TIME)
</select>
<!-- 查询产量机台TOP5 -->
<!-- 查询产量机台TOP5当天00:00-23:59 -->
<!-- 从BASE_DEVICE_PARAM_VAL获取当天每台设备的最新实际产出数量 -->
<!-- 数据来源BASE_DEVICE_PARAM_VAL + BASE_DEVICELEDGER -->
<select id="selectProductionTop5" resultType="com.aucma.report.domain.vo.Board5ProductionTopVo">
@ -115,7 +117,7 @@
) WHERE ROWNUM &lt;= 5
</select>
<!-- 查询最大产量(用于计算百分比) -->
<!-- 查询最大产量(当天00:00-23:59用于计算百分比) -->
<select id="selectMaxProduction" resultType="java.lang.Long">
SELECT NVL(MAX(TO_NUMBER(PARAM_VALUE)), 1)
FROM (

Loading…
Cancel
Save