Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
d7c3254874
@ -110,7 +110,7 @@ public class SysIotModelController {
|
|||||||
|
|
||||||
if (sysIotModelFieldDto.getIotModelId() == null || sysIotModelFieldDto.getAttributeCode() == null
|
if (sysIotModelFieldDto.getIotModelId() == null || sysIotModelFieldDto.getAttributeCode() == null
|
||||||
|| sysIotModelFieldDto.getAttributeName() == null || sysIotModelFieldDto.getAttributeType() == null
|
|| sysIotModelFieldDto.getAttributeName() == null || sysIotModelFieldDto.getAttributeType() == null
|
||||||
|| sysIotModelFieldDto.getPorder() == null) {
|
|| sysIotModelFieldDto.getPorder() == null || sysIotModelFieldDto.getHighSpeed() == null) {
|
||||||
throw new ServiceException("参数缺失");
|
throw new ServiceException("参数缺失");
|
||||||
}
|
}
|
||||||
return R.success(sysIotModelService.creatSysIotModelField(sysIotModelFieldDto));
|
return R.success(sysIotModelService.creatSysIotModelField(sysIotModelFieldDto));
|
||||||
|
@ -44,4 +44,9 @@ public class SysIotModelFieldDto implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Integer pageNum;
|
private Integer pageNum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 物模型属性频度
|
||||||
|
*/
|
||||||
|
private Integer highSpeed;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -45,4 +45,6 @@ public class SysIotModelFieldVo {
|
|||||||
|
|
||||||
private Integer revision;
|
private Integer revision;
|
||||||
|
|
||||||
|
private Integer highSpeed;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -69,4 +69,10 @@ public class SysIotModelField extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
@TableField("porder")
|
@TableField("porder")
|
||||||
private Integer porder;
|
private Integer porder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 物模型属性频度
|
||||||
|
*/
|
||||||
|
@TableField("highspeed")
|
||||||
|
private Integer highSpeed;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import com.das.modules.equipment.domain.excel.SysIotModelServiceExcel;
|
|||||||
import com.das.modules.equipment.domain.vo.IotModelFieldVo;
|
import com.das.modules.equipment.domain.vo.IotModelFieldVo;
|
||||||
import com.das.modules.equipment.domain.vo.SysIotModelVo;
|
import com.das.modules.equipment.domain.vo.SysIotModelVo;
|
||||||
import com.das.modules.equipment.entity.SysIotModel;
|
import com.das.modules.equipment.entity.SysIotModel;
|
||||||
|
import com.das.modules.equipment.entity.SysIotModelField;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -30,6 +31,6 @@ public interface SysIotModelMapper extends BaseMapper<SysIotModel> {
|
|||||||
|
|
||||||
String getIotModel(Long id);
|
String getIotModel(Long id);
|
||||||
|
|
||||||
List<String> getAllIotModelField(Long id);
|
List<SysIotModelField> getAllIotModelField(Long id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ import java.sql.SQLException;
|
|||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -58,19 +59,24 @@ public class TDEngineService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 遍历所有的物模型存入内存中
|
// 遍历所有的物模型存入内存中
|
||||||
public void initIotModel(List<IotModelFieldVo> allIotModel, ConcurrentHashMap<String,Map<String, Object>> iotFieldMap) {
|
public void initIotModel(List<IotModelFieldVo> allIotModel, ConcurrentHashMap<String,Map<String, Object>> highIotFieldMap,ConcurrentHashMap<String,Map<String, Object>> lowIotFieldMap) {
|
||||||
// 创建物模型超级表
|
// 创建物模型超级表
|
||||||
StringBuilder sb = new StringBuilder(1024*1024);
|
|
||||||
try (Connection conn = hikariDataSource.getConnection();
|
try (Connection conn = hikariDataSource.getConnection();
|
||||||
Statement pstmt = conn.createStatement()) {
|
Statement pstmt = conn.createStatement()) {
|
||||||
|
|
||||||
ListUtil.page(allIotModel, batchSize, (list)->{
|
ListUtil.page(allIotModel, batchSize, list ->{
|
||||||
sb.setLength(0);
|
|
||||||
for (IotModelFieldVo info : list) {
|
for (IotModelFieldVo info : list) {
|
||||||
|
StringBuilder sb = new StringBuilder(1024*1024);
|
||||||
|
sb.setLength(0);
|
||||||
|
Map<String, Object> map = highIotFieldMap.get(info.getIotModelCode());
|
||||||
|
Set<String> keySet = map.keySet();
|
||||||
|
if (keySet.size() != 0){
|
||||||
sb.append("CREATE STABLE IF NOT EXISTS ");
|
sb.append("CREATE STABLE IF NOT EXISTS ");
|
||||||
sb.append(info.getIotModelCode());
|
sb.append("h_").append(info.getIotModelCode());
|
||||||
sb.append(" (`updatetime` TIMESTAMP");
|
sb.append(" (`updatetime` TIMESTAMP");
|
||||||
Map<String, Object> map = iotFieldMap.get(info.getIotModelCode());
|
|
||||||
// 使用增强的 for 循环遍历键
|
// 使用增强的 for 循环遍历键
|
||||||
for (String key : map.keySet()) {
|
for (String key : map.keySet()) {
|
||||||
sb.append(", ");
|
sb.append(", ");
|
||||||
@ -78,13 +84,38 @@ public class TDEngineService {
|
|||||||
sb.append(" float");
|
sb.append(" float");
|
||||||
}
|
}
|
||||||
sb.append(") TAGS (`deviceid` BIGINT);");
|
sb.append(") TAGS (`deviceid` BIGINT);");
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
|
System.out.println(sb.toString());
|
||||||
pstmt.executeUpdate(sb.toString());
|
pstmt.executeUpdate(sb.toString());
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
log.error("save yx error", ex);
|
log.error("save yx error", ex);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
for (IotModelFieldVo info : list) {
|
||||||
|
StringBuilder sb = new StringBuilder(1024*1024);
|
||||||
|
sb.setLength(0);
|
||||||
|
Map<String, Object> map = lowIotFieldMap.get(info.getIotModelCode());
|
||||||
|
if (map.keySet().size() != 0){
|
||||||
|
sb.append("CREATE STABLE IF NOT EXISTS ");
|
||||||
|
sb.append("l_").append(info.getIotModelCode());
|
||||||
|
sb.append(" (`updatetime` TIMESTAMP");
|
||||||
|
// 使用增强的 for 循环遍历键
|
||||||
|
for (String key : map.keySet()) {
|
||||||
|
sb.append(", ");
|
||||||
|
sb.append(key);
|
||||||
|
sb.append(" float");
|
||||||
|
}
|
||||||
|
sb.append(") TAGS (`deviceid` BIGINT);");
|
||||||
|
try {
|
||||||
|
System.out.println(sb.toString());
|
||||||
|
pstmt.executeUpdate(sb.toString());
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
log.error("save yx error", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
log.error(ex.getMessage());
|
log.error(ex.getMessage());
|
||||||
|
@ -3,6 +3,7 @@ package com.das.modules.node.service.impl;
|
|||||||
import com.das.common.constant.BaseIotModelType;
|
import com.das.common.constant.BaseIotModelType;
|
||||||
import com.das.common.utils.AdminRedisTemplate;
|
import com.das.common.utils.AdminRedisTemplate;
|
||||||
import com.das.modules.equipment.domain.vo.IotModelFieldVo;
|
import com.das.modules.equipment.domain.vo.IotModelFieldVo;
|
||||||
|
import com.das.modules.equipment.entity.SysIotModelField;
|
||||||
import com.das.modules.equipment.mapper.SysIotModelMapper;
|
import com.das.modules.equipment.mapper.SysIotModelMapper;
|
||||||
import com.das.modules.node.disruptor.MessageEventFactory;
|
import com.das.modules.node.disruptor.MessageEventFactory;
|
||||||
import com.das.modules.node.disruptor.TerminalMessageEventHandler;
|
import com.das.modules.node.disruptor.TerminalMessageEventHandler;
|
||||||
@ -35,6 +36,7 @@ import java.util.Map;
|
|||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
@ -66,7 +68,9 @@ public class DataServiceImpl implements DataService {
|
|||||||
|
|
||||||
private ConcurrentHashMap<String, String> iotModelMap = new ConcurrentHashMap<>(10000);
|
private ConcurrentHashMap<String, String> iotModelMap = new ConcurrentHashMap<>(10000);
|
||||||
|
|
||||||
public ConcurrentHashMap<String, Map<String, Object>> iotFieldMap = new ConcurrentHashMap<>(10000);
|
public ConcurrentHashMap<String, Map<String, Object>> highIotFieldMap = new ConcurrentHashMap<>(10000);
|
||||||
|
|
||||||
|
public ConcurrentHashMap<String, Map<String, Object>> lowIotFieldMap = new ConcurrentHashMap<>(10000);
|
||||||
|
|
||||||
public static final String DEVICE_DATA = "deviceData:{0}";
|
public static final String DEVICE_DATA = "deviceData:{0}";
|
||||||
|
|
||||||
@ -217,14 +221,21 @@ public class DataServiceImpl implements DataService {
|
|||||||
for (IotModelFieldVo item : allIotModel) {
|
for (IotModelFieldVo item : allIotModel) {
|
||||||
String key = String.valueOf(item.getId());
|
String key = String.valueOf(item.getId());
|
||||||
iotModelMap.put(key, item.getIotModelCode());
|
iotModelMap.put(key, item.getIotModelCode());
|
||||||
List<String> modelFieldList = sysIotModelMapper.getAllIotModelField(item.getId());
|
List<SysIotModelField> allIotModelField = sysIotModelMapper.getAllIotModelField(item.getId());
|
||||||
|
List<String> LowModelFieldList = allIotModelField.stream().filter(field -> field.getHighSpeed() == 0).map(SysIotModelField::getAttributeCode).collect(Collectors.toList());
|
||||||
|
List<String> HighModelFieldList = allIotModelField.stream().filter(field -> field.getHighSpeed() == 1).map(SysIotModelField::getAttributeCode).collect(Collectors.toList());
|
||||||
Map<String, Object> map = new HashMap<>();
|
Map<String, Object> map = new HashMap<>();
|
||||||
for (String field : modelFieldList) {
|
for (String field : HighModelFieldList) {
|
||||||
map.put(field, null);
|
map.put(field, null);
|
||||||
}
|
}
|
||||||
iotFieldMap.put(item.getIotModelCode(), map);
|
highIotFieldMap.put(item.getIotModelCode(), map);
|
||||||
|
Map<String, Object> lowMap = new HashMap<>();
|
||||||
|
for (String field : LowModelFieldList) {
|
||||||
|
lowMap.put(field, null);
|
||||||
}
|
}
|
||||||
tdEngineService.initIotModel(allIotModel, iotFieldMap);
|
lowIotFieldMap.put(item.getIotModelCode(), lowMap);
|
||||||
|
}
|
||||||
|
tdEngineService.initIotModel(allIotModel, highIotFieldMap,lowIotFieldMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -63,11 +63,9 @@
|
|||||||
select sim.iot_model_code from sys_iot_model sim left join sys_equipment se on sim.id = se.iot_model_id
|
select sim.iot_model_code from sys_iot_model sim left join sys_equipment se on sim.id = se.iot_model_id
|
||||||
where se.id = #{id}
|
where se.id = #{id}
|
||||||
</select>
|
</select>
|
||||||
|
<select id="getAllIotModelField" resultType="com.das.modules.equipment.entity.SysIotModelField">
|
||||||
<select id="getAllIotModelField" resultType="java.lang.String">
|
select simf.attribute_code as attributeCode,simf.highspeed as highSpeed from sys_iot_model_field simf where simf.iot_model_id = #{id} order by simf.attribute_code
|
||||||
select simf.attribute_code from sys_iot_model_field simf where simf.iot_model_id = #{id} order by simf.attribute_code
|
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
@ -195,6 +195,9 @@
|
|||||||
<el-form-item :label="ModelAttributeFieldsEnums['porder']" prop="porder">
|
<el-form-item :label="ModelAttributeFieldsEnums['porder']" prop="porder">
|
||||||
<el-input v-model="attributeForm.porder" :placeholder="'请输入' + ModelAttributeFieldsEnums['porder']"></el-input>
|
<el-input v-model="attributeForm.porder" :placeholder="'请输入' + ModelAttributeFieldsEnums['porder']"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item :label="ModelAttributeFieldsEnums['highSpeed']" prop="highSpeed">
|
||||||
|
<el-checkbox v-model="attributeForm.highSpeed"></el-checkbox>
|
||||||
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<el-button type="primary" @click="submitAttributeForm">提交</el-button>
|
<el-button type="primary" @click="submitAttributeForm">提交</el-button>
|
||||||
@ -298,6 +301,7 @@ import {
|
|||||||
import ContextMenu from './contextMenu.vue'
|
import ContextMenu from './contextMenu.vue'
|
||||||
import { encrypt_aes, generateRandomNumber } from '/@/utils/crypto'
|
import { encrypt_aes, generateRandomNumber } from '/@/utils/crypto'
|
||||||
import { debounce } from 'lodash'
|
import { debounce } from 'lodash'
|
||||||
|
import { log } from '/@/api/backend/routine/AdminInfo'
|
||||||
|
|
||||||
const DeviceModelPropReplace = {
|
const DeviceModelPropReplace = {
|
||||||
label: 'iotModelName',
|
label: 'iotModelName',
|
||||||
@ -526,6 +530,7 @@ const getAttributeList = (type?: radioGroupType, value?: string) => {
|
|||||||
: item.attributeType === 140
|
: item.attributeType === 140
|
||||||
? '离散量'
|
? '离散量'
|
||||||
: item.attributeType!,
|
: item.attributeType!,
|
||||||
|
highSpeed: item.highSpeed === 1,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
pageTotal.value = res.total
|
pageTotal.value = res.total
|
||||||
@ -607,6 +612,7 @@ const originAttributeForm: AddModelAttributeType & UpdateModelAttributeType = {
|
|||||||
attributeName: '',
|
attributeName: '',
|
||||||
attributeType: null,
|
attributeType: null,
|
||||||
porder: null,
|
porder: null,
|
||||||
|
highSpeed: false,
|
||||||
revision: 1,
|
revision: 1,
|
||||||
createdBy: undefined,
|
createdBy: undefined,
|
||||||
createdTime: undefined,
|
createdTime: undefined,
|
||||||
@ -625,22 +631,19 @@ const submitAttributeForm = () => {
|
|||||||
attributeFormRef.value?.validate((valid: boolean) => {
|
attributeFormRef.value?.validate((valid: boolean) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
if (attributeFormTitle.value === AttributeDialogTitleStateType['add']) {
|
if (attributeFormTitle.value === AttributeDialogTitleStateType['add']) {
|
||||||
attributeForm.value.iotModelId = curContextMenuTreeData.value!.id!
|
const addFormData = JSON.parse(JSON.stringify(attributeForm.value))
|
||||||
addModelAttributeReq(attributeForm.value)
|
addFormData.iotModelId = curContextMenuTreeData.value!.id!
|
||||||
|
addFormData.highSpeed = addFormData.highSpeed ? 1 : 0
|
||||||
|
addModelAttributeReq(addFormData)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.success) {
|
|
||||||
ElMessage.success('新增物模型属性成功')
|
|
||||||
closeAttributeForm()
|
|
||||||
getAttributeList()
|
|
||||||
} else {
|
|
||||||
ElMessage.error(res.msg)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
ElMessage.error(err?.response?.data?.msg ?? '新增失败')
|
ElMessage.error(err?.response?.data?.msg ?? '新增失败')
|
||||||
})
|
})
|
||||||
} else if (attributeFormTitle.value === AttributeDialogTitleStateType['edit']) {
|
} else if (attributeFormTitle.value === AttributeDialogTitleStateType['edit']) {
|
||||||
updateModelAttributeReq(attributeForm.value)
|
const updateForm = JSON.parse(JSON.stringify(attributeForm.value))
|
||||||
|
updateForm.highSpeed = updateForm.highSpeed ? 1 : 0
|
||||||
|
updateModelAttributeReq(updateForm)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
ElMessage.success('修改物模型属性成功')
|
ElMessage.success('修改物模型属性成功')
|
||||||
|
@ -62,6 +62,7 @@ export enum ModelAttributeFieldsEnums {
|
|||||||
'attributeType' = '属性类型value',
|
'attributeType' = '属性类型value',
|
||||||
'attributeTypeName' = '属性类型',
|
'attributeTypeName' = '属性类型',
|
||||||
'porder' = '序号',
|
'porder' = '序号',
|
||||||
|
'highSpeed'='是否高频',
|
||||||
'revision' = '乐观锁',
|
'revision' = '乐观锁',
|
||||||
'createdBy' = '创建人',
|
'createdBy' = '创建人',
|
||||||
'createdTime' = '创建时间',
|
'createdTime' = '创建时间',
|
||||||
@ -98,6 +99,7 @@ export type AddModelAttributeType = {
|
|||||||
attributeName: string
|
attributeName: string
|
||||||
attributeType: ModelAttributeType | null
|
attributeType: ModelAttributeType | null
|
||||||
porder: number | null
|
porder: number | null
|
||||||
|
highSpeed:0|1|boolean
|
||||||
revision: number
|
revision: number
|
||||||
createdBy?: string
|
createdBy?: string
|
||||||
createdTime?: string
|
createdTime?: string
|
||||||
|
Loading…
Reference in New Issue
Block a user