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

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

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

@ -243,15 +243,15 @@ public class Board4DeviceProductionVo {
#### 4.2.1 日累计产量BASE_DEVICE_PARAM_VAL #### 4.2.1 日累计产量BASE_DEVICE_PARAM_VAL
```sql ```sql
SELECT NVL(SUM(TO_NUMBER(PARAM_VALUE)), 0) SELECT NVL(SUM(TO_NUMBER(PARAM_VALUE)), 0) -- 汇总当天实际产出数量
FROM ( FROM (
SELECT DEVICE_CODE, PARAM_VALUE, 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 FROM BASE_DEVICE_PARAM_VAL
WHERE PARAM_NAME = '机台状态-实际产出数量' WHERE PARAM_NAME = '机台状态-实际产出数量' -- 固定参数名称
AND TO_CHAR(COLLECT_TIME, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD') 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 维修分析(按设备聚合) #### 4.2.2 维修分析(按设备聚合)
```sql ```sql
SELECT d.DEVICE_NAME AS deviceName, SELECT d.DEVICE_NAME AS deviceName, -- 设备名称
COUNT(*) AS repairCount, COUNT(*) AS repairCount, -- 设备故障次数
ROUND(COUNT(*) * 100.0 / NULLIF((SELECT COUNT(*) FROM DMS_BILLS_FAULT_INSTANCE WHERE IS_FLAG = 1), 0), 0) AS percent 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 FROM DMS_BILLS_FAULT_INSTANCE f
LEFT JOIN BASE_DEVICELEDGER d ON f.DEVICE_ID = d.OBJ_ID LEFT JOIN BASE_DEVICELEDGER d ON f.DEVICE_ID = d.OBJ_ID -- 关联设备台账
WHERE f.IS_FLAG = 1 AND f.DEVICE_ID IS NOT NULL WHERE f.IS_FLAG = 1 AND f.DEVICE_ID IS NOT NULL -- 只统计有效故障
GROUP BY d.OBJ_ID, d.DEVICE_NAME GROUP BY d.OBJ_ID, d.DEVICE_NAME -- 按设备聚合
ORDER BY repairCount DESC ORDER BY repairCount DESC -- 按次数降序
``` ```
#### 4.2.3 设备产量列表 #### 4.2.3 设备产量列表
```sql ```sql
SELECT d.DEVICE_NAME AS deviceName, SELECT d.DEVICE_NAME AS deviceName, -- 设备名称
NVL(TO_NUMBER(p.PARAM_VALUE), 0) AS production NVL(TO_NUMBER(p.PARAM_VALUE), 0) AS production -- 当天实际产出
FROM BASE_DEVICELEDGER d FROM BASE_DEVICELEDGER d
LEFT JOIN ( LEFT JOIN (
SELECT DEVICE_CODE, PARAM_VALUE SELECT DEVICE_CODE, PARAM_VALUE
FROM ( FROM (
SELECT DEVICE_CODE, PARAM_VALUE, 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 FROM BASE_DEVICE_PARAM_VAL
WHERE PARAM_NAME = '机台状态-实际产出数量' WHERE PARAM_NAME = '机台状态-实际产出数量' -- 固定参数名称
AND TO_CHAR(COLLECT_TIME, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD') AND TO_CHAR(COLLECT_TIME, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD') -- 当天数据
) )
WHERE RN = 1 WHERE RN = 1 -- 仅保留最新一条
) p ON d.DEVICE_CODE = p.DEVICE_CODE ) p ON d.DEVICE_CODE = p.DEVICE_CODE -- 关联设备编码
WHERE d.IS_FLAG = 0 AND d.DEVICE_TYPE = '1' WHERE d.IS_FLAG = 0 AND d.DEVICE_TYPE = '1' -- 仅生产设备
ORDER BY production DESC ORDER BY production DESC -- 按产量降序
``` ```
**业务逻辑说明** **业务逻辑说明**

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

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

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

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

Loading…
Cancel
Save