feat:添加大屏"今日开机率/稼动率"接口

liutao_branch
HuangHuiKang 1 week ago
parent ac61c3c384
commit 3f3c0eb2b8

@ -104,6 +104,15 @@ public class DeviceOperationRecordController {
}
@GetMapping("/deviceOperationList")
@Operation(summary = "产线设备运行开机率/稼动率-大屏")
@PreAuthorize("@ss.hasPermission('iot:device-operation-record:query')")
public CommonResult<List<DeviceTotalTimeRecordRespVO>> deviceOperationList(@Valid DeviceTotalTimeRecordReqVO pageReqVO) {
List<DeviceTotalTimeRecordRespVO> deviceTotalTimeRecordRespVOList = deviceOperationRecordService.deviceOperationList(pageReqVO);
return success(deviceTotalTimeRecordRespVOList);
}
@GetMapping("/export-device-operation-report")
@Operation(summary = "导出设备运行报表记录 Excel")
@PreAuthorize("@ss.hasPermission('iot:device-operation-record:export')")

@ -11,8 +11,8 @@ import lombok.Data;
@ExcelIgnoreUnannotated
public class DeviceTotalTimeRecordRespVO {
// @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4283")
// private Long id;
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4283")
private Long id;
@Schema(description = "设备编码")
@ExcelProperty("设备编码")
@ -59,4 +59,13 @@ public class DeviceTotalTimeRecordRespVO {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty("结束时间")
private String endTime;
@Schema(description = "产线编码")
private String lineCode;
@Schema(description = "产线名称")
private String lineName;
@Schema(description = "产线id")
private Long lineId;
}

@ -37,4 +37,8 @@ public interface DeviceOperationRecordMapper extends BaseMapperX<DeviceOperation
List<DeviceOperationRecordDO> selectLatestRecords(@Param("deviceIds") Collection<Long> deviceIds);
List<DeviceTotalTimeRecordRespVO> selectLine();
List<DeviceTotalTimeRecordRespVO> deviceOperationList(@Param("deviceTotalTimeRecordReqVO") DeviceTotalTimeRecordReqVO deviceTotalTimeRecordReqVO);
}

@ -54,4 +54,5 @@ public interface DeviceOperationRecordService {
PageResult<DeviceTotalTimeRecordRespVO> deviceOperationPage(@Valid DeviceTotalTimeRecordReqVO pageReqVO);
List<DeviceTotalTimeRecordRespVO> deviceOperationList(@Valid DeviceTotalTimeRecordReqVO pageReqVO);
}

@ -12,8 +12,11 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo.*;
import cn.iocoder.yudao.module.iot.dal.dataobject.deviceoperationrecord.DeviceOperationRecordDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -95,6 +98,65 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe
}
@Override
public List<DeviceTotalTimeRecordRespVO> deviceOperationList(DeviceTotalTimeRecordReqVO deviceTotalTimeRecordReqVO) {
// 1 查询产线设备
List<DeviceTotalTimeRecordRespVO> lineList = deviceOperationRecordMapper.selectLine();
// 2 提取 deviceId
String ids = lineList.stream()
.map(DeviceTotalTimeRecordRespVO::getId)
.filter(Objects::nonNull)
.distinct()
.map(String::valueOf)
.collect(Collectors.joining(","));
// 3 设置时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
deviceTotalTimeRecordReqVO.setStartTime(LocalDateTime.now().with(LocalTime.MIN).format(formatter));
deviceTotalTimeRecordReqVO.setEndTime(LocalDateTime.now().format(formatter));
deviceTotalTimeRecordReqVO.setIds(ids);
// 4 查询统计数据
List<DeviceTotalTimeRecordRespVO> list =
deviceOperationRecordMapper.deviceOperationList(deviceTotalTimeRecordReqVO);
if (list != null && !list.isEmpty()) {
// 5 计算转换
calculateAndSetConvertedValues(list, deviceTotalTimeRecordReqVO);
// 6 转成 map (deviceId -> 统计数据)
Map<Long, DeviceTotalTimeRecordRespVO> recordMap =
list.stream().collect(Collectors.toMap(
DeviceTotalTimeRecordRespVO::getId,
v -> v,
(a, b) -> a
));
// 7 回填到 lineList
for (DeviceTotalTimeRecordRespVO line : lineList) {
DeviceTotalTimeRecordRespVO record = recordMap.get(line.getId());
if (record != null) {
line.setTotalOfflineTime(record.getTotalOfflineTime());
line.setTotalRunningTime(record.getTotalRunningTime());
line.setTotalStandbyTime(record.getTotalStandbyTime());
line.setTotalFaultTime(record.getTotalFaultTime());
line.setPowerOnRate(record.getPowerOnRate());
line.setUtilizationRate(record.getUtilizationRate());
}
}
}
// 8 返回产线设备
return lineList;
}
private void calculateAndSetConvertedValues(
List<DeviceTotalTimeRecordRespVO> records,
DeviceTotalTimeRecordReqVO reqVO) {

@ -44,6 +44,11 @@
<if test="pageReqVO.deviceName != null and pageReqVO.deviceName != ''">
AND ide.device_name LIKE CONCAT('%', #{pageReqVO.deviceName}, '%')
</if>
<!-- id筛选条件 -->
<if test="pageReqVO.ids != null and pageReqVO.ids != ''">
AND FIND_IN_SET(ide.id, #{pageReqVO.ids})
</if>
GROUP BY ide.id, ide.device_code, ide.device_name
ORDER BY ide.id desc
@ -98,4 +103,58 @@
AND t1.create_time = t2.max_time
</select>
<select id="selectLine"
resultType="cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo.DeviceTotalTimeRecordRespVO">
select
mo.id as lineId,
mo.code as lineCode,
mo.name as lineName,
mo.dv_id as id
from mes_organization mo
where dv_id is not null
and mo.deleted = 0
</select>
<select id="deviceOperationList"
resultType="cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo.DeviceTotalTimeRecordRespVO">
SELECT
ide.id ,
ide.device_code AS deviceCode,
ide.device_name AS deviceName,
-- 每条 rule=0 的记录计数 * 60 秒
SUM(CASE WHEN idor.rule = '0' THEN 1 ELSE 0 END) * 60 AS totalOfflineTime,
-- 每条 rule=1 的记录计数 * 60 秒
SUM(CASE WHEN idor.rule = '1' THEN 1 ELSE 0 END) * 60 AS totalRunningTime,
-- 每条 rule=2 的记录计数 * 60 秒
SUM(CASE WHEN idor.rule = '2' THEN 1 ELSE 0 END) * 60 AS totalStandbyTime,
-- 每条 rule=3 的记录计数 * 60 秒
SUM(CASE WHEN idor.rule = '3' THEN 1 ELSE 0 END) * 60 AS totalFaultTime
FROM besure.iot_device ide
LEFT JOIN besure.iot_device_operation_record idor
ON idor.device_id = ide.id
AND idor.deleted = 0
<!-- 时间筛选条件 -->
<if test="deviceTotalTimeRecordReqVO.startTime != null">
AND idor.create_time &gt;= #{deviceTotalTimeRecordReqVO.startTime}
</if>
<if test="deviceTotalTimeRecordReqVO.endTime != null">
AND idor.create_time &lt;= #{deviceTotalTimeRecordReqVO.endTime}
</if>
WHERE ide.deleted = 0
<!-- 设备编码筛选条件 -->
<if test="deviceTotalTimeRecordReqVO.deviceCode != null and deviceTotalTimeRecordReqVO.deviceCode != ''">
AND ide.device_code LIKE CONCAT('%', #{deviceTotalTimeRecordReqVO.deviceCode}, '%')
</if>
<!-- 设备名称筛选条件 -->
<if test="deviceTotalTimeRecordReqVO.deviceName != null and deviceTotalTimeRecordReqVO.deviceName != ''">
AND ide.device_name LIKE CONCAT('%', #{deviceTotalTimeRecordReqVO.deviceName}, '%')
</if>
<!-- id筛选条件 -->
<if test="deviceTotalTimeRecordReqVO.ids != null and deviceTotalTimeRecordReqVO.ids != ''">
AND FIND_IN_SET(ide.id, #{deviceTotalTimeRecordReqVO.ids})
</if>
GROUP BY ide.id, ide.device_code, ide.device_name
ORDER BY ide.id desc
</select>
</mapper>
Loading…
Cancel
Save