liutao_branch
HuangHuiKang 3 weeks ago
parent 2e3ca1efaa
commit 060ad5338e

@ -160,7 +160,21 @@ public class DeviceJob implements JobHandler {
.last("LIMIT 1")
);
if (pointRulesDO == null || StringUtils.isBlank(pointRulesDO.getFieldRule())) return;
if (pointRulesDO == null || StringUtils.isBlank(pointRulesDO.getFieldRule())){
return;
}
if(StringUtils.isBlank(pointRulesDO.getFieldRule())){
//处理待机中
DeviceOperationRecordDO record = new DeviceOperationRecordDO();
record.setDeviceId(deviceId);
record.setRule(DeviceStatusEnum.STANDBY.getCode());
record.setCreator("1");
record.setUpdater("1");
deviceOperationRecordMapper.insert(record);
return;
}
// 解析规则列表
List<PointRulesRespVO> pointRulesVOList = JSON.parseArray(

@ -8,7 +8,9 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService;
import cn.iocoder.yudao.module.iot.controller.admin.device.enums.JavaToTdengineTypeEnum;
import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattributetype.DeviceAttributeTypeDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO;
import cn.iocoder.yudao.module.iot.dal.mysql.deviceattributetype.DeviceAttributeTypeMapper;
import cn.iocoder.yudao.module.iot.dal.mysql.devicecontactmodel.DeviceContactModelMapper;
import cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.iot.service.device.TDengineService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -16,6 +18,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.validation.ConstraintViolationException;
@ -58,6 +61,10 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*;
@Resource
private DeviceAttributeTypeMapper deviceAttributeTypeMapper;
@Resource
@Lazy
private DeviceContactModelMapper deviceContactModelMapper;
@Resource
private ErpProductUnitService productUnitService;
@ -164,6 +171,7 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*;
@Override
public List<Map<String, Object>> operationAnalysisDetails(Long deviceId, Long modelId,
String collectionStartTime, String collectionEndTime) {
if (deviceId == null) {
throw exception(DEVICE_ID_DOES_NOT_EXIST);
}
@ -174,47 +182,37 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*;
List<Map<String, Object>> resultList = new ArrayList<>();
try {
// 1. 获取最新10条设备数据列表直接从TDengine获取原始字段
// 获取最新10条设备数据
List<Map<String, Object>> deviceDataList =
tdengineService.newSelectLatestData(deviceId, collectionStartTime, collectionEndTime, 10);
// 2. 获取属性类型映射
Map<Long, String> idToNameMap = deviceAttributeTypeMapper.selectList()
.stream()
.collect(Collectors.toMap(
DeviceAttributeTypeDO::getId,
DeviceAttributeTypeDO::getName
));
// 查找 modelId 对应的 attributeCode
DeviceContactModelDO modelDO = deviceContactModelMapper.selectById(modelId);
if (modelDO == null) {
throw exception(POINT_ID_MODEL_NOT_EXISTS);
}
String attributeCode = modelDO.getAttributeCode();
if (StringUtils.isBlank(attributeCode)) {
return resultList;
}
// 3. 遍历每个时间点的数据
// 遍历时间点数据
for (Map<String, Object> deviceData : deviceDataList) {
Timestamp timestamp = (Timestamp) deviceData.get("ts"); // TDengine 时间列
Timestamp timestamp = (Timestamp) deviceData.get("ts");
if (timestamp == null) continue;
SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
String formattedTime = sdf.format(timestamp);
Map<String, Object> timePointData = new LinkedHashMap<>();
timePointData.put("collectTime", formattedTime);
// 遍历所有字段(除 ts 之外)
Map<String, List<Map<String, Object>>> groupedData = new LinkedHashMap<>();
for (Map.Entry<String, Object> entry : deviceData.entrySet()) {
String key = entry.getKey();
if ("ts".equalsIgnoreCase(key)) continue; // 跳过时间字段
Map<String, Object> simplifiedData = new HashMap<>();
simplifiedData.put("attributeName", key);
simplifiedData.put("addressValue", entry.getValue());
timePointData.put("collectTime", sdf.format(timestamp));
// 根据 modelId 或 attributeType 分类,这里暂时按 "其他" 分组
groupedData.computeIfAbsent("其他", k -> new ArrayList<>()).add(simplifiedData);
}
// modelId 对应的字段
Object value = deviceData.get(attributeCode);
// 添加属性分组
for (Map.Entry<String, List<Map<String, Object>>> entry : groupedData.entrySet()) {
timePointData.put(entry.getKey(), entry.getValue());
}
timePointData.put("attributeName", attributeCode);
timePointData.put("addressValue", value);
resultList.add(timePointData);
}
@ -226,7 +224,6 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*;
return resultList;
}
@Override
public List<DeviceModelAttributeDO> getDeviceModelAttributeList(Long id) {

Loading…
Cancel
Save