feat(report): 添加设备保养与故障分析看板功能

- 新增Board5Controller提供设备保养与故障分析看板的API接口
- 添加Board5Service服务层处理设备数据分析逻辑
- 创建Board5Mapper数据访问层实现数据库查询操作
- 新增多个VO类用于封装看板数据模型包括工单统计、维修时间、设备状态等
- 配置Board5Mapper.xml实现各类统计数据的SQL查询语句
- 实现设备状态分布、故障来源分析、产量TOP5等统计功能
- 添加保养执行情况、巡检执行情况等数据统计查询接口
master
zangch@mesnac.com 1 week ago
parent 09d81b8a26
commit 78b6ea367e

@ -0,0 +1,96 @@
package com.aucma.report.controller;
import com.aucma.common.annotation.Anonymous;
import com.aucma.common.core.controller.BaseController;
import com.aucma.common.core.domain.AjaxResult;
import com.aucma.report.service.IBoard5Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Board5Controller
*
*
* @author YinQ
*/
@RestController
@RequestMapping("/board5")
public class Board5Controller extends BaseController {
@Autowired
private IBoard5Service board5Service;
/**
*
*/
@Anonymous
@GetMapping("/orderWorkStatistics")
public AjaxResult getOrderWorkStatistics() {
return AjaxResult.success(board5Service.getOrderWorkStatistics());
}
/**
*
*/
@Anonymous
@GetMapping("/repairTimeStatistics")
public AjaxResult getRepairTimeStatistics() {
return AjaxResult.success(board5Service.getRepairTimeStatistics());
}
/**
*
*/
@Anonymous
@GetMapping("/maintStatistics")
public AjaxResult getMaintStatistics() {
return AjaxResult.success(board5Service.getMaintStatistics());
}
/**
*
*/
@Anonymous
@GetMapping("/inspectStatistics")
public AjaxResult getInspectStatistics() {
return AjaxResult.success(board5Service.getInspectStatistics());
}
/**
*
*/
@Anonymous
@GetMapping("/deviceStatusDistribution")
public AjaxResult getDeviceStatusDistribution() {
return AjaxResult.success(board5Service.getDeviceStatusDistribution());
}
/**
*
*/
@Anonymous
@GetMapping("/faultSourceDistribution")
public AjaxResult getFaultSourceDistribution() {
return AjaxResult.success(board5Service.getFaultSourceDistribution());
}
/**
* 线
*/
@Anonymous
@GetMapping("/faultTrendList")
public AjaxResult getFaultTrendList() {
return AjaxResult.success(board5Service.getFaultTrendList());
}
/**
* TOP5
*/
@Anonymous
@GetMapping("/productionTop5")
public AjaxResult getProductionTop5() {
return AjaxResult.success(board5Service.getProductionTop5());
}
}

@ -0,0 +1,57 @@
package com.aucma.report.domain.vo;
import java.io.Serializable;
/**
* Board5 VO
*
*
* @author YinQ
*/
public class Board5DeviceStatusDistributionVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 实验设备占比 */
private Long experimentPercent;
/** 未检设备占比 */
private Long uncheckedPercent;
/** 正常设备占比 */
private Long normalPercent;
/** 异常设备占比 */
private Long abnormalPercent;
public Long getExperimentPercent() {
return experimentPercent;
}
public void setExperimentPercent(Long experimentPercent) {
this.experimentPercent = experimentPercent;
}
public Long getUncheckedPercent() {
return uncheckedPercent;
}
public void setUncheckedPercent(Long uncheckedPercent) {
this.uncheckedPercent = uncheckedPercent;
}
public Long getNormalPercent() {
return normalPercent;
}
public void setNormalPercent(Long normalPercent) {
this.normalPercent = normalPercent;
}
public Long getAbnormalPercent() {
return abnormalPercent;
}
public void setAbnormalPercent(Long abnormalPercent) {
this.abnormalPercent = abnormalPercent;
}
}

@ -0,0 +1,46 @@
package com.aucma.report.domain.vo;
import java.io.Serializable;
/**
* Board5 VO
*
*
* @author YinQ
*/
public class Board5FaultSourceDistributionVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 维护故障占比FAULT_SOURCE_TYPE=1 */
private Long maintainPercent;
/** 运行故障占比FAULT_SOURCE_TYPE=2,3 */
private Long runningPercent;
/** 自然故障占比FAULT_SOURCE_TYPE=9 */
private Long naturalPercent;
public Long getMaintainPercent() {
return maintainPercent;
}
public void setMaintainPercent(Long maintainPercent) {
this.maintainPercent = maintainPercent;
}
public Long getRunningPercent() {
return runningPercent;
}
public void setRunningPercent(Long runningPercent) {
this.runningPercent = runningPercent;
}
public Long getNaturalPercent() {
return naturalPercent;
}
public void setNaturalPercent(Long naturalPercent) {
this.naturalPercent = naturalPercent;
}
}

@ -0,0 +1,35 @@
package com.aucma.report.domain.vo;
import java.io.Serializable;
/**
* Board5 线VO
*
*
* @author YinQ
*/
public class Board5FaultTrendVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 日期(格式:日,如 01、02... */
private String dateValue;
/** 故障数量 */
private Long faultCount;
public String getDateValue() {
return dateValue;
}
public void setDateValue(String dateValue) {
this.dateValue = dateValue;
}
public Long getFaultCount() {
return faultCount;
}
public void setFaultCount(Long faultCount) {
this.faultCount = faultCount;
}
}

@ -0,0 +1,35 @@
package com.aucma.report.domain.vo;
import java.io.Serializable;
/**
* Board5 VO
*
*
* @author YinQ
*/
public class Board5InspectStatisticsVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 应检设备数量 */
private Long deviceCount;
/** 设备巡检完成率 */
private String completeRate;
public Long getDeviceCount() {
return deviceCount;
}
public void setDeviceCount(Long deviceCount) {
this.deviceCount = deviceCount;
}
public String getCompleteRate() {
return completeRate;
}
public void setCompleteRate(String completeRate) {
this.completeRate = completeRate;
}
}

@ -0,0 +1,112 @@
package com.aucma.report.domain.vo;
import java.io.Serializable;
/**
* Board5 VO
*
*
* @author YinQ
*/
public class Board5MaintStatisticsVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 计划保养数量 */
private Long planCount;
/** 已保养数量MAINT_STATUS=3 */
private Long completeCount;
/** 待保养数量MAINT_STATUS=1 */
private Long waitingCount;
/** 待保养比例 */
private String waitingRate;
/** 保养中数量MAINT_STATUS=2 */
private Long doingCount;
/** 保养中比例 */
private String doingRate;
/** 待验证数量MAINT_STATUS=4 */
private Long verifyCount;
/** 待验证比例 */
private String verifyRate;
/** 设备保养完成率 */
private String completeRate;
public Long getPlanCount() {
return planCount;
}
public void setPlanCount(Long planCount) {
this.planCount = planCount;
}
public Long getCompleteCount() {
return completeCount;
}
public void setCompleteCount(Long completeCount) {
this.completeCount = completeCount;
}
public Long getWaitingCount() {
return waitingCount;
}
public void setWaitingCount(Long waitingCount) {
this.waitingCount = waitingCount;
}
public String getWaitingRate() {
return waitingRate;
}
public void setWaitingRate(String waitingRate) {
this.waitingRate = waitingRate;
}
public Long getDoingCount() {
return doingCount;
}
public void setDoingCount(Long doingCount) {
this.doingCount = doingCount;
}
public String getDoingRate() {
return doingRate;
}
public void setDoingRate(String doingRate) {
this.doingRate = doingRate;
}
public Long getVerifyCount() {
return verifyCount;
}
public void setVerifyCount(Long verifyCount) {
this.verifyCount = verifyCount;
}
public String getVerifyRate() {
return verifyRate;
}
public void setVerifyRate(String verifyRate) {
this.verifyRate = verifyRate;
}
public String getCompleteRate() {
return completeRate;
}
public void setCompleteRate(String completeRate) {
this.completeRate = completeRate;
}
}

@ -0,0 +1,57 @@
package com.aucma.report.domain.vo;
import java.io.Serializable;
/**
* Board5 VO
*
*
* @author YinQ
*/
public class Board5OrderWorkStatisticsVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 工单总数 */
private Long totalCount;
/** 已完成数量 */
private Long completeCount;
/** 完成率(百分比数值,不含% */
private String completeRate;
/** 停机工单数量 */
private Long stopCount;
public Long getTotalCount() {
return totalCount;
}
public void setTotalCount(Long totalCount) {
this.totalCount = totalCount;
}
public Long getCompleteCount() {
return completeCount;
}
public void setCompleteCount(Long completeCount) {
this.completeCount = completeCount;
}
public String getCompleteRate() {
return completeRate;
}
public void setCompleteRate(String completeRate) {
this.completeRate = completeRate;
}
public Long getStopCount() {
return stopCount;
}
public void setStopCount(Long stopCount) {
this.stopCount = stopCount;
}
}

@ -0,0 +1,46 @@
package com.aucma.report.domain.vo;
import java.io.Serializable;
/**
* Board5 TOP5 VO
*
*
* @author YinQ
*/
public class Board5ProductionTopVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 设备名称 */
private String deviceName;
/** 百分比(相对于最大产量) */
private Long percent;
/** 产量 */
private Long production;
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public Long getPercent() {
return percent;
}
public void setPercent(Long percent) {
this.percent = percent;
}
public Long getProduction() {
return production;
}
public void setProduction(Long production) {
this.production = production;
}
}

@ -0,0 +1,35 @@
package com.aucma.report.domain.vo;
import java.io.Serializable;
/**
* Board5 VO
*
*
* @author YinQ
*/
public class Board5RepairTimeStatisticsVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 平均响应时间(分钟) */
private String avgResponseTime;
/** 平均维修时间(小时) */
private String avgRepairTime;
public String getAvgResponseTime() {
return avgResponseTime;
}
public void setAvgResponseTime(String avgResponseTime) {
this.avgResponseTime = avgResponseTime;
}
public String getAvgRepairTime() {
return avgRepairTime;
}
public void setAvgRepairTime(String avgRepairTime) {
this.avgRepairTime = avgRepairTime;
}
}

@ -0,0 +1,71 @@
package com.aucma.report.mapper;
import com.aucma.report.domain.vo.*;
import org.apache.ibatis.annotations.Mapper;
import java.util.HashMap;
import java.util.List;
/**
* Board5Mapper
*
*
* @author YinQ
*/
@Mapper
public interface Board5Mapper {
/**
*
* BASE_ORDERINFO
*/
HashMap<String, Object> selectOrderWorkStatistics();
/**
*
* DMS_BILLS_FAULT_INSTANCE
*/
HashMap<String, Object> selectRepairTimeStatistics();
/**
*
* DMS_PLAN_MAINT
*/
HashMap<String, Object> selectMaintStatistics();
/**
*
* DMS_PLAN_INSPECT, DMS_BILLS_INSPECT_INSTANCE
*/
HashMap<String, Object> selectInspectStatistics();
/**
*
* BASE_DEVICELEDGER
*/
HashMap<String, Object> selectDeviceStatusDistribution();
/**
*
* DMS_BILLS_FAULT_INSTANCE
*/
HashMap<String, Object> selectFaultSourceDistribution();
/**
* 线30
* RECORD_ALARM_DEVICE
*/
List<Board5FaultTrendVo> selectFaultTrendList();
/**
* TOP5
* BASE_DEVICE_PARAM_VAL + BASE_DEVICELEDGER
*/
List<Board5ProductionTopVo> selectProductionTop5();
/**
*
* BASE_DEVICE_PARAM_VAL
*/
Long selectMaxProduction();
}

@ -0,0 +1,54 @@
package com.aucma.report.service;
import com.aucma.report.domain.vo.*;
import java.util.List;
/**
* Board5Service
*
*
* @author YinQ
*/
public interface IBoard5Service {
/**
*
*/
Board5OrderWorkStatisticsVo getOrderWorkStatistics();
/**
*
*/
Board5RepairTimeStatisticsVo getRepairTimeStatistics();
/**
*
*/
Board5MaintStatisticsVo getMaintStatistics();
/**
*
*/
Board5InspectStatisticsVo getInspectStatistics();
/**
*
*/
Board5DeviceStatusDistributionVo getDeviceStatusDistribution();
/**
*
*/
Board5FaultSourceDistributionVo getFaultSourceDistribution();
/**
* 线
*/
List<Board5FaultTrendVo> getFaultTrendList();
/**
* TOP5
*/
List<Board5ProductionTopVo> getProductionTop5();
}

@ -0,0 +1,260 @@
package com.aucma.report.service.impl;
import com.aucma.report.domain.vo.*;
import com.aucma.report.mapper.Board5Mapper;
import com.aucma.report.service.IBoard5Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Board5Service
*
*
* @author YinQ
*/
@Service
public class Board5ServiceImpl implements IBoard5Service {
@Autowired
private Board5Mapper board5Mapper;
/**
*
*/
@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 {
vo.setTotalCount(0L);
vo.setCompleteCount(0L);
vo.setStopCount(0L);
vo.setCompleteRate("0");
}
return vo;
}
/**
*
*/
@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 {
vo.setAvgResponseTime("0");
vo.setAvgRepairTime("0");
}
return vo;
}
/**
*
*/
@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)));
vo.setVerifyRate(String.valueOf(Math.round(verifyCount * 100.0 / planCount)));
vo.setCompleteRate(String.valueOf(Math.round(completeCount * 100.0 / planCount)));
} else {
vo.setWaitingRate("0");
vo.setDoingRate("0");
vo.setVerifyRate("0");
vo.setCompleteRate("0");
}
} else {
vo.setPlanCount(0L);
vo.setCompleteCount(0L);
vo.setWaitingCount(0L);
vo.setDoingCount(0L);
vo.setVerifyCount(0L);
vo.setWaitingRate("0");
vo.setDoingRate("0");
vo.setVerifyRate("0");
vo.setCompleteRate("0");
}
return vo;
}
/**
*
*/
@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 {
vo.setCompleteRate("0");
}
} else {
vo.setDeviceCount(0L);
vo.setCompleteRate("0");
}
return vo;
}
/**
*
*/
@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));
vo.setNormalPercent(Math.round(normalCount * 100.0 / totalCount));
vo.setAbnormalPercent(Math.round(abnormalCount * 100.0 / totalCount));
} else {
vo.setExperimentPercent(0L);
vo.setUncheckedPercent(0L);
vo.setNormalPercent(0L);
vo.setAbnormalPercent(0L);
}
} else {
vo.setExperimentPercent(0L);
vo.setUncheckedPercent(0L);
vo.setNormalPercent(0L);
vo.setAbnormalPercent(0L);
}
return vo;
}
/**
*
*/
@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));
vo.setNaturalPercent(Math.round(naturalCount * 100.0 / totalCount));
} else {
vo.setMaintainPercent(0L);
vo.setRunningPercent(0L);
vo.setNaturalPercent(0L);
}
} else {
vo.setMaintainPercent(0L);
vo.setRunningPercent(0L);
vo.setNaturalPercent(0L);
}
return vo;
}
/**
* 线
*/
@Override
public List<Board5FaultTrendVo> getFaultTrendList() {
List<Board5FaultTrendVo> list = board5Mapper.selectFaultTrendList();
return list != null ? list : new ArrayList<>();
}
/**
* TOP5
*/
@Override
public List<Board5ProductionTopVo> getProductionTop5() {
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));
} else {
vo.setPercent(0L);
}
}
return list;
}
/**
* 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) {
return 0L;
}
}
/**
* String
*/
private String getStringValue(Object obj) {
if (obj == null) {
return "0";
}
return obj.toString();
}
}

@ -0,0 +1,132 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"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">
SELECT COUNT(*) AS TOTAL_COUNT,
SUM(CASE WHEN EXECUTION_STATUS = 'COMPLETED' THEN 1 ELSE 0 END) AS COMPLETE_COUNT,
SUM(CASE WHEN EXECUTION_STATUS = 'PAUSED' THEN 1 ELSE 0 END) AS STOP_COUNT
FROM BASE_ORDERINFO
WHERE IS_FLAG = 0
</select>
<!-- 查询维修时间统计(平均响应时间、平均维修时间) -->
<!-- 平均响应时间 = (REAL_BEGIN_TIME - APPLY_TIME) 的平均值,单位分钟 -->
<!-- 平均维修时间 = (REAL_END_TIME - REAL_BEGIN_TIME) 的平均值,单位小时 -->
<!-- 数据来源DMS_BILLS_FAULT_INSTANCE -->
<select id="selectRepairTimeStatistics" resultType="java.util.HashMap">
SELECT ROUND(NVL(AVG((REAL_BEGIN_TIME - APPLY_TIME) * 24 * 60), 0), 2) AS AVG_RESPONSE_TIME,
ROUND(NVL(AVG((REAL_END_TIME - REAL_BEGIN_TIME) * 24), 0), 2) AS AVG_REPAIR_TIME
FROM DMS_BILLS_FAULT_INSTANCE
WHERE IS_FLAG = '1'
AND REAL_BEGIN_TIME IS NOT NULL
AND APPLY_TIME IS NOT NULL
</select>
<!-- 查询保养执行情况统计 -->
<!-- MAINT_STATUS: 1=待保养, 2=保养中, 3=已完成, 4=待验证 -->
<!-- 数据来源DMS_PLAN_MAINT -->
<select id="selectMaintStatistics" resultType="java.util.HashMap">
SELECT COUNT(*) AS PLAN_COUNT,
SUM(CASE WHEN MAINT_STATUS = 3 THEN 1 ELSE 0 END) AS COMPLETE_COUNT,
SUM(CASE WHEN MAINT_STATUS = 1 THEN 1 ELSE 0 END) AS WAITING_COUNT,
SUM(CASE WHEN MAINT_STATUS = 2 THEN 1 ELSE 0 END) AS DOING_COUNT,
SUM(CASE WHEN MAINT_STATUS = 4 THEN 1 ELSE 0 END) AS VERIFY_COUNT
FROM DMS_PLAN_MAINT
WHERE IS_FLAG = 1
</select>
<!-- 查询巡检执行情况统计 -->
<!-- 应检设备 = DMS_PLAN_INSPECT.DEVICE_AMOUNT 求和 -->
<!-- 已检设备 = DMS_BILLS_INSPECT_INSTANCE 中 INSPECT_STATUS=2(已完成) 的设备数量 -->
<!-- 数据来源DMS_PLAN_INSPECT, DMS_BILLS_INSPECT_INSTANCE -->
<select id="selectInspectStatistics" resultType="java.util.HashMap">
SELECT NVL(SUM(DEVICE_AMOUNT), 0) AS DEVICE_COUNT,
(SELECT COUNT(*) FROM DMS_BILLS_INSPECT_INSTANCE WHERE IS_FLAG = '1' AND INSPECT_STATUS = '2') AS COMPLETE_COUNT
FROM DMS_PLAN_INSPECT
WHERE IS_FLAG = '1'
</select>
<!-- 查询设备状态分布 -->
<!-- DEVICE_STATUS: NUMBER(1,0)类型0=使用/正常, 1=停用/异常, 2=报废 -->
<!-- 实验设备、未检设备、正常设备、异常设备 的比例分布 -->
<!-- 数据来源BASE_DEVICELEDGER -->
<select id="selectDeviceStatusDistribution" resultType="java.util.HashMap">
SELECT COUNT(*) AS TOTAL_COUNT,
SUM(CASE WHEN DEVICE_STATUS = 0 THEN 1 ELSE 0 END) AS NORMAL_COUNT,
SUM(CASE WHEN DEVICE_STATUS = 1 THEN 1 ELSE 0 END) AS ABNORMAL_COUNT,
SUM(CASE WHEN DEVICE_STATUS = 2 THEN 1 ELSE 0 END) AS SCRAP_COUNT,
SUM(CASE WHEN DEVICE_TYPE = '2' THEN 1 ELSE 0 END) AS EXPERIMENT_COUNT
FROM BASE_DEVICELEDGER
WHERE IS_FLAG = 0
</select>
<!-- 查询故障来源分布 -->
<!-- FAULT_SOURCE_TYPE: 1=检修(维护故障), 2=点检, 3=巡检(运行故障), 9=其他(自然故障) -->
<!-- 数据来源DMS_BILLS_FAULT_INSTANCE -->
<select id="selectFaultSourceDistribution" resultType="java.util.HashMap">
SELECT COUNT(*) AS TOTAL_COUNT,
SUM(CASE WHEN FAULT_SOURCE_TYPE = 1 THEN 1 ELSE 0 END) AS MAINTAIN_COUNT,
SUM(CASE WHEN FAULT_SOURCE_TYPE IN (2, 3) THEN 1 ELSE 0 END) AS RUNNING_COUNT,
SUM(CASE WHEN FAULT_SOURCE_TYPE = 9 THEN 1 ELSE 0 END) AS NATURAL_COUNT
FROM DMS_BILLS_FAULT_INSTANCE
WHERE IS_FLAG = '1'
</select>
<!-- 查询故障数量曲线近30天每日告警数量 -->
<!-- 数据来源RECORD_ALARM_DEVICE -->
<select id="selectFaultTrendList" resultType="com.aucma.report.domain.vo.Board5FaultTrendVo">
SELECT TO_CHAR(ALARM_TIME, 'DD') AS dateValue,
COUNT(*) AS faultCount
FROM RECORD_ALARM_DEVICE
WHERE IS_FLAG = 0
AND ALARM_TIME >= TRUNC(SYSDATE) - 30
GROUP BY TO_CHAR(ALARM_TIME, 'DD'), TRUNC(ALARM_TIME)
ORDER BY TRUNC(ALARM_TIME)
</select>
<!-- 查询产量机台TOP5 -->
<!-- 从BASE_DEVICE_PARAM_VAL获取当天每台设备的最新实际产出数量 -->
<!-- 数据来源BASE_DEVICE_PARAM_VAL + BASE_DEVICELEDGER -->
<select id="selectProductionTop5" resultType="com.aucma.report.domain.vo.Board5ProductionTopVo">
SELECT * FROM (
SELECT d.DEVICE_NAME AS deviceName,
NVL(TO_NUMBER(p.PARAM_VALUE), 0) AS production,
0 AS percent
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
FROM BASE_DEVICE_PARAM_VAL
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 ROWNUM &lt;= 5
</select>
<!-- 查询最大产量(用于计算百分比) -->
<select id="selectMaxProduction" resultType="java.lang.Long">
SELECT NVL(MAX(TO_NUMBER(PARAM_VALUE)), 1)
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')
)
WHERE RN = 1
</select>
</mapper>
Loading…
Cancel
Save