This commit is contained in:
高云鹏 2024-11-29 16:28:32 +08:00
commit ef2bc8cf55
19 changed files with 209 additions and 67 deletions

View File

@ -1,11 +1,6 @@
package com.das.modules.calc.functions;
import com.das.common.utils.AdminRedisTemplate;
import com.das.modules.cache.domain.DeviceInfoCache;
import com.das.modules.cache.service.CacheService;
import com.das.modules.data.domain.SnapshotValueQueryParam;
import com.das.modules.data.service.DataService;
import com.googlecode.aviator.exception.StandardError;
import com.googlecode.aviator.runtime.function.AbstractFunction;
import com.googlecode.aviator.runtime.type.AviatorNil;
import com.googlecode.aviator.runtime.type.AviatorObject;
@ -13,8 +8,6 @@ import com.googlecode.aviator.runtime.type.AviatorRuntimeJavaType;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -24,9 +17,11 @@ import java.util.concurrent.ConcurrentHashMap;
* 函数格式: cacheValue(key) 读取缓存值
*/
@Slf4j
public class FunctionGetCacheValue extends AbstractFunction {
private ConcurrentHashMap<String,Double> cacheValues = new ConcurrentHashMap<>();
public FunctionGetCacheValue( ) {
public class FunctionCacheValue extends AbstractFunction {
public static final String CACHE_PREFIX = "calc:cache:";
private AdminRedisTemplate redis = null;
public FunctionCacheValue(AdminRedisTemplate redis) {
this.redis = redis;
}
@Override
@ -42,9 +37,22 @@ public class FunctionGetCacheValue extends AbstractFunction {
Double value = (Double) valData.getValue(env);
String scriptName = (String)env.get("G_SCRIPTNAME");
String cacheKey = String.format("%s_%s", scriptName, key);
cacheValues.put(cacheKey, value);
String cacheKey = String.format("%s%s_%s", CACHE_PREFIX, scriptName, key);
redis.set(cacheKey, value);
return AviatorRuntimeJavaType.valueOf(0);
}
@SneakyThrows
@Override
public AviatorObject call(Map<String, Object> env, AviatorObject keyData, AviatorObject valData, AviatorObject ttlData) {
//设备Code
String key = (String)keyData.getValue(env);
Double value = (Double) valData.getValue(env);
Long ttl = (Long) ttlData.getValue(env);
String scriptName = (String)env.get("G_SCRIPTNAME");
String cacheKey = String.format("%s%s_%s", CACHE_PREFIX, scriptName, key);
redis.setEx(cacheKey, value, ttl);
return AviatorRuntimeJavaType.valueOf(0);
}
@ -54,8 +62,8 @@ public class FunctionGetCacheValue extends AbstractFunction {
String key = (String)keyData.getValue(env);
String scriptName = (String)env.get("G_SCRIPTNAME");
String cacheKey = String.format("%s_%s", scriptName, key);
Double value = cacheValues.get(cacheKey);
String cacheKey = String.format("%s%s_%s", CACHE_PREFIX, scriptName, key);
Double value = redis.get(cacheKey);
if (value == null) {
return AviatorNil.NIL;
}

View File

@ -82,7 +82,6 @@ public class FunctionSaveCalcData extends AbstractVariadicFunction {
dt.setIotModelField(attr);
dataList.add(dt);
}
dataService.updateCalFieldData(dataList);
return AviatorRuntimeJavaType.valueOf(0);
}

View File

@ -1,6 +1,7 @@
package com.das.modules.calc.service;
import cn.hutool.core.util.StrUtil;
import com.das.modules.cache.service.CacheService;
import com.das.modules.calc.domain.entity.CalcModule;
import com.googlecode.aviator.AviatorEvaluatorInstance;
@ -28,9 +29,19 @@ public class CalcJob implements Job {
AviatorEvaluatorInstance instance = (AviatorEvaluatorInstance) dataMap.get("aviator");
CalcModule calcModule = (CalcModule) dataMap.get("module");
CacheService cacheService = (CacheService) dataMap.get("cache");
Boolean isDebug = (Boolean) dataMap.get("isDebug");
String debugTaskName = (String) dataMap.get("debugTaskName");
if (instance == null || calcModule == null || cacheService == null) {
throw new JobExecutionException("calcModule is null");
}
if (isDebug){
if (StrUtil.isBlank(debugTaskName)){
return;
}
else if (!debugTaskName.equals(calcModule.getName())){
return;
}
}
Expression expression = instance.getCachedExpressionByKey(calcModule.getName());
if (expression == null) {
log.error("expression is null, calcModule={}", calcModule.getName());
@ -38,6 +49,8 @@ public class CalcJob implements Job {
}
//准备全局变量
Map<String,Object> envs = expression.newEnv();
//调试变量
envs.put("ISDEBUG", isDebug);
//脚本名称
envs.put("G_SCRIPTNAME", calcModule.getName());
//风场信息

View File

@ -2,10 +2,11 @@ package com.das.modules.calc.service;
import cn.hutool.core.codec.Base64Encoder;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.das.common.utils.AdminRedisTemplate;
import com.das.modules.cache.service.CacheService;
import com.das.modules.calc.domain.entity.CalcModule;
import com.das.modules.calc.domain.vo.CalcModuleVo;
import com.das.modules.calc.functions.FunctionGetCacheValue;
import com.das.modules.calc.functions.FunctionCacheValue;
import com.das.modules.calc.functions.FunctionRealData;
import com.das.modules.calc.functions.FunctionSaveCalcData;
import com.das.modules.calc.mapper.CalcModuleMapper;
@ -17,19 +18,14 @@ import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 计算引擎服务
@ -53,6 +49,15 @@ public class CalcService {
@Autowired
DataService dataService;
@Autowired
AdminRedisTemplate adminRedisTemplate;
@Value("${calc.debug.enable}")
Boolean isDebug;
@Value("${calc.debug.task-name}")
String debugTaskName;
/**
* 计算引擎实例
*/
@ -70,6 +75,8 @@ public class CalcService {
dataMap.put("module", scriptModule);
dataMap.put("aviator", aviator);
dataMap.put("cache", cacheService);
dataMap.put("isDebug", isDebug);
dataMap.put("debugTaskName", debugTaskName);
JobKey jobKey = JobKey.jobKey(scriptModule.getName(), "CalcEngine");
if (sh.checkExists(jobKey)){
throw new SchedulerException("计算模块已启动,请先停止该模块");
@ -112,7 +119,7 @@ public class CalcService {
FunctionSaveCalcData save = new FunctionSaveCalcData(dataService, cacheService);
aviator.addFunction(save);
FunctionGetCacheValue cache = new FunctionGetCacheValue();
FunctionCacheValue cache = new FunctionCacheValue(adminRedisTemplate);
aviator.addFunction(cache);
}

View File

@ -806,4 +806,53 @@ public class TDEngineService {
}
return result;
}
public Boolean checkTableExist(String tableName){
StringBuffer sb = new StringBuffer(256);
sb.append("select count(*) as tablecount from information_schema.ins_tables where table_name = '");
sb.append(tableName);
sb.append("'");
Integer result = null;
try (Connection conn = hikariDataSource.getConnection();
Statement smt = conn.createStatement();
ResultSet rs = smt.executeQuery(sb.toString())) {
if (rs.next()) {
result = rs.getInt("tablecount");
}
} catch (Exception e) {
log.error("检查td表是否存在失败", e);
}
return result != null && result == 1;
}
public void updateTagDeviceName(String tableName,String deviceName){
StringBuffer sb = new StringBuffer(256);
sb.append("ALTER table ");
sb.append(tableName);
sb.append(" SET TAG device_name = '").append(deviceName).append("'");
try (Connection conn = hikariDataSource.getConnection();
Statement pstmt = conn.createStatement()) {
pstmt.executeUpdate(sb.toString());
} catch (Exception e) {
log.error("修改Tag值失败", e);
}
}
public void updateTagDeviceCode(String tableName,String deviceCode){
StringBuffer sb = new StringBuffer(256);
sb.append("ALTER table ");
sb.append(tableName);
sb.append(" SET TAG device_code = '").append(deviceCode).append("'");
try (Connection conn = hikariDataSource.getConnection();
Statement pstmt = conn.createStatement()) {
pstmt.executeUpdate(sb.toString());
} catch (Exception e) {
log.error("修改Tag值失败", e);
}
}
}

View File

@ -25,6 +25,7 @@ import org.springframework.util.StopWatch;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;
@Slf4j
@ -71,6 +72,10 @@ public class DataServiceImpl implements DataService {
public ConcurrentHashMap<String, Map<String, Integer>> eventLevelMap = new ConcurrentHashMap<>(10000);
public ConcurrentHashMap<String, Map<String, String>> stateDescMap = new ConcurrentHashMap<>(10000);
/**
* 读取实时数据快照
* @param paramList 设备id及设备属性列表
@ -234,6 +239,7 @@ public class DataServiceImpl implements DataService {
Map<String, String> calculateFieldList = allIotModelField.stream().filter(field -> field.getAttributeType() == 199).collect(Collectors.toMap(SysIotModelField::getAttributeCode, SysIotModelField::getDataType, (value1, value2) -> value1));
Map<String, String> fieldCodeNameList = allIotModelField.stream().collect(Collectors.toMap(SysIotModelField::getAttributeCode, SysIotModelField::getAttributeName, (value1, value2) -> value1));
Map<String, Integer> eventLevelList = allIotModelField.stream().collect(Collectors.toMap(SysIotModelField::getAttributeCode, SysIotModelField::getLevel, (value1, value2) -> value1));
Map<String, String> stateDescList = allIotModelField.stream().filter(field -> field.getStateDesc() != null).collect(Collectors.toMap(SysIotModelField::getAttributeCode, SysIotModelField::getStateDesc, (value1, value2) -> value1));
Map<String, Object> map = new HashMap<>();
for (String field : HighModelFieldList.keySet()) {
map.put(field, HighModelFieldList.get(field));
@ -247,6 +253,8 @@ public class DataServiceImpl implements DataService {
eventLevelMap.put(item.getIotModelCode(),eventLevelList);
fieldCodeNameMap.put(item.getIotModelCode(),fieldCodeNameList);
calculateIotFieldMap.put(item.getIotModelCode(), calculateFieldList);
stateDescMap.put(item.getIotModelCode(),stateDescList);
}
tdEngineService.initIotModel(allIotModel, highIotFieldMap, lowIotFieldMap, calculateIotFieldMap);
}

View File

@ -75,5 +75,7 @@ public class SysIotModelFieldDto implements Serializable {
private Integer level;
private String stateDesc;
}

View File

@ -67,4 +67,6 @@ public class SysIotModelFieldExcel {
private Integer level;
private String stateDesc;
}

View File

@ -68,4 +68,6 @@ public class SysIotModelFieldVo {
private Integer level;
private String stateDesc;
}

View File

@ -105,4 +105,10 @@ public class SysIotModelField extends BaseEntity {
*/
@TableField("level")
private Integer level;
/**
* 告警描述
*/
@TableField("statedesc")
private String stateDesc;
}

View File

@ -16,6 +16,7 @@ import com.das.common.utils.SequenceUtils;
import com.das.modules.auth.domain.vo.SysUserVo;
import com.das.modules.auth.mapper.SysOrgMapper;
import com.das.modules.cache.service.CacheService;
import com.das.modules.data.service.TDEngineService;
import com.das.modules.data.service.impl.DataServiceImpl;
import com.das.modules.equipment.domain.dto.SysEquipmentDto;
import com.das.modules.equipment.domain.excel.SysEquipmentExcel;
@ -66,6 +67,9 @@ public class SysEquipmentServiceImpl implements SysEquipmentService {
@Autowired
private CacheService cacheService;
@Autowired
private TDEngineService tdEngineService;
@Override
public SysEquipmentVo creatSysEquipment(SysEquipmentDto sysEquipmentDto) {
//去除空格
@ -119,6 +123,10 @@ public class SysEquipmentServiceImpl implements SysEquipmentService {
}
//更新设备缓存
cacheService.getEquipmentCache().refreshDeviceCache(sysEquipment.getId());
if (tdEngineService.checkTableExist("e_"+sysEquipment.getId())){
tdEngineService.updateTagDeviceCode("e_"+sysEquipment.getId(),sysEquipment.getCode());
tdEngineService.updateTagDeviceName("e_"+sysEquipment.getId(),sysEquipment.getName());
}
SysEquipmentVo sysEquipmentVo = new SysEquipmentVo();
BeanCopyUtils.copy(sysEquipment, sysEquipmentVo);
return sysEquipmentVo;
@ -319,6 +327,12 @@ public class SysEquipmentServiceImpl implements SysEquipmentService {
}
//更新设备缓存
cacheService.getEquipmentCache().refreshDeviceCache(item.getId());
//更新td表TAG
if (tdEngineService.checkTableExist("e_"+item.getId())){
tdEngineService.updateTagDeviceCode("e_"+item.getId(),item.getCode());
tdEngineService.updateTagDeviceName("e_"+item.getId(),item.getName());
}
}
}
if (CollectionUtils.isNotEmpty(delSysEquipmentList)) {

View File

@ -305,6 +305,7 @@ public class SysIotModelServiceImpl implements SysIotModelService {
map.put("visible", "是否可见0不可见1可见");
map.put("highSpeed", "*属性频度0低频属性1高频属性");
map.put("level","离散量级别:0提示;1告警;2故障");
map.put("stateDesc","告警级别描述");
sheetDTO.setSheetName("物模型属性");
sheetDTO.setFieldAndAlias(map);
sheetDTO.setCollection(sysIotModelFieldVoList);
@ -519,6 +520,7 @@ public class SysIotModelServiceImpl implements SysIotModelService {
field.setVisible(ObjectUtil.isEmpty(row.get(10)) ? null : Integer.valueOf(row.get(10).toString()));
field.setHighSpeed(Integer.valueOf(row.get(11).toString()));
field.setLevel(ObjectUtil.isEmpty(row.get(12)) ? null : Integer.valueOf(row.get(12).toString()));
field.setStateDesc(ObjectUtil.isEmpty(row.get(13)) ? null : row.get(13).toString());
field.setIotModelId(Long.valueOf(iotModelId));
}
@ -633,6 +635,16 @@ public class SysIotModelServiceImpl implements SysIotModelService {
}
}
if (sysIotModelField.getStateDesc() != null){
Map<String, String> stateDescMap = dataService.stateDescMap.get(modelCode);
if (stateDescMap == null) {
Map<String, String> calMap = new HashMap<>();
calMap.put(sysIotModelField.getAttributeCode(), sysIotModelField.getStateDesc());
dataService.stateDescMap.put(modelCode, calMap);
} else {
stateDescMap.put(sysIotModelField.getAttributeCode(), sysIotModelField.getStateDesc());
}
}
if (sysIotModelField.getAttributeType() == 199) {
Map<String, String> map = dataService.calculateIotFieldMap.get(modelCode);
if (map == null) {
@ -684,6 +696,9 @@ public class SysIotModelServiceImpl implements SysIotModelService {
if (sysIotModelField.getLevel() != null){
dataService.eventLevelMap.remove(sysIotModelField.getAttributeCode());
}
if (sysIotModelField.getStateDesc() != null){
dataService.stateDescMap.remove(sysIotModelField.getAttributeCode());
}
if (sysIotModelField.getAttributeType() == 199) {
Map<String, String> map = dataService.calculateIotFieldMap.get(modelCode);
map.remove(sysIotModelField.getAttributeCode());

View File

@ -369,12 +369,20 @@ public class NodeMessageServiceImpl extends TextWebSocketHandler implements Node
deviceEventInfo.setEventType(item.getEventType());
deviceEventInfo.setConfirmed(0);
if (!StringUtils.isEmpty(eventType) && eventType.equals("遥信变位")) {
String stateDesc = dataService.stateDescMap.get(model).get(item.getAttrCode());
if (item.getAttrValue().equals(0)) {
deviceEventInfo.setEventText(item.getAttrCode()+fieldName + " 复归");
if (StringUtils.isNotEmpty(stateDesc)){
List<String> descList = Arrays.stream(stateDesc.split("\\|")).toList();
deviceEventInfo.setEventText(item.getAttrCode()+fieldName + descList.get(0));
}
deviceEventInfo.setEventLevel(0);
} else {
deviceEventInfo.setEventText(item.getAttrCode()+fieldName + " 动作");
if (StringUtils.isNotEmpty(stateDesc)){
List<String> descList = Arrays.stream(stateDesc.split("\\|")).toList();
deviceEventInfo.setEventText(item.getAttrCode()+fieldName + descList.get(1));
}
Integer level = dataService.eventLevelMap.get(model).get(item.getAttrCode());
log.info("level:{}",level);
log.info("fieldname{}",fieldName);

View File

@ -86,9 +86,15 @@ captcha:
expire: 120
das:
debug: true
aes:
key: b6967ee87b86d85a
calc:
debug:
enable: true
task-name:
logging:
level:
com:
@ -96,5 +102,5 @@ logging:
tdengine:
password: taosdata
url: jdbc:TAOS-RS://192.168.109.160:6041/das
url: jdbc:TAOS-RS://192.168.109.187:6041/das
username: root

View File

@ -85,7 +85,13 @@ captcha:
verify-type: calculate
expire: 120
calc:
debug:
enable: false
task-name:
das:
debug: false
aes:
key: b6967ee87b86d85a

View File

@ -36,13 +36,13 @@
<select id="queryFieldByModelId" resultMap="SysIotModelFieldMap">
select simf.*,sim.iot_model_name as iotModelName,
sim.iot_model_code from sys_iot_model_field simf left join sys_iot_model sim on simf.iot_model_id = sim.id
where simf.iot_model_id = #{id}
where simf.iot_model_id = #{id} order by simf.porder asc
</select>
<select id="queryServiceByModelId" resultMap="SysIotModelServiceMap">
select sims.*,sim.iot_model_name as iotModelName,
sim.iot_model_code from sys_iot_model_service sims left join sys_iot_model sim on sims.iot_model_id = sim.id
where sims.iot_model_id = #{id}
where sims.iot_model_id = #{id} order by sims.porder asc
</select>
<select id="queryIotModelIdByName" resultType="java.lang.Long">
@ -78,7 +78,7 @@
where se.id = #{id}
</select>
<select id="getAllIotModelField" resultType="com.das.modules.equipment.entity.SysIotModelField">
select simf.attribute_name as attributeName, simf.attribute_code as attributeCode,simf.highspeed as highSpeed,simf.datatype as dataType,simf.attribute_type as attributeType,simf.level as level from sys_iot_model_field simf where simf.iot_model_id = #{id} order by simf.attribute_code
select simf.attribute_name as attributeName, simf.attribute_code as attributeCode,simf.highspeed as highSpeed,simf.datatype as dataType,simf.attribute_type as attributeType,simf.level as level,simf.stateDesc as stateDesc from sys_iot_model_field simf where simf.iot_model_id = #{id} order by simf.attribute_code
</select>

View File

@ -148,7 +148,7 @@ const shortcuts = [
text: '今天',
value: () => {
const start = getFormattedDate(0) + ' 00:00:00'
const end = new Date()
const end = getFormattedDate(0) + ' 23:59:59'
return [start, end]
},
},
@ -200,11 +200,13 @@ const dateValue = ref('')
const windBlowerValue = ref('')
const windBlowerList = ref<WindBlowerList[]>([])
//
const timeRange = ref([])
const timeRange = ref([]) as any
//
const interval = ref('')
const interval = ref('15m')
const intervals = [
{ label: '一分钟', value: '1m' },
{ label: '五分钟', value: '5m' },
{ label: '十分钟', value: '10m' },
{ label: '十五分钟', value: '15m' },
{ label: '一小时', value: '1h' },
{ label: '一天', value: '1d' },
@ -321,6 +323,7 @@ const queryWindBlower = () => {
modelId: item.modelId,
}
})
windBlowerValue.value = windBlowerList.value?.[0].irn
}
})
}
@ -450,7 +453,7 @@ const queryHistoryData = () => {
tableData.push({
name: item,
times: realResult[item].times,
value: realResult[item].values,
value: realResult[item].values.map((val: any) => (val === 0 ? 0 : val.toFixed(2))),
})
}
})
@ -529,6 +532,7 @@ const timestampToTime = (timestamp: any) => {
getReportTemplateList()
onMounted(() => {
timeRange.value = shortcuts[0].value()
queryWindBlower()
})
</script>

View File

@ -1,7 +1,8 @@
<template>
<div class="report">
<el-container class="mainContainer">
<el-tabs v-model="activeIndex" class="demo-tabs" @tab-click="handleClick">
<SingleReport />
<!-- <el-tabs v-model="activeIndex" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="运行报表" name="1" class="runningReport">
<RunningReport v-if="activeIndex == '1'"></RunningReport>
</el-tab-pane>
@ -11,7 +12,7 @@
<el-tab-pane label="多机报表" name="3" class="mltipleReport">
<MulipleReport v-if="activeIndex == '3'"></MulipleReport>
</el-tab-pane>
</el-tabs>
</el-tabs> -->
</el-container>
</div>
</template>
@ -40,7 +41,7 @@ const handleClick = (val: any) => {
.mainContainer {
width: 100%;
height: 100%;
padding: 0 20px;
padding: 20px;
.el-tabs {
width: 100%;
--el-tabs-header-height: 60px;

View File

@ -50,7 +50,7 @@
row-key="id"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="name" label="测点名称" width="120" />
<el-table-column prop="name" label="风机名称" width="120" />
</el-table>
<el-table
:data="tableDataRight"
@ -59,7 +59,7 @@
row-key="id"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="name" label="测点名称" width="120" />
<el-table-column prop="name" label="风机名称" width="120" />
</el-table>
</div>
</div>
@ -79,7 +79,7 @@
:data="attrTableData"
ref="attributeTableRef"
@select="selectTable"
@selectAll="selectAllTable"
@selectAll="selectTable"
row-key="id"
class="attrtable"
>
@ -200,7 +200,7 @@ onMounted(() => {
})
const tableDataLeft = ref([])
const tableDataRight = ref([])
const iotModelId = ref('')
const selectedLeft = ref([])
const selectedRight = ref([])
@ -213,10 +213,13 @@ const queryWindTurbines = () => {
queryWindTurbinesPages().then((res) => {
if (res.code == 200) {
const resData = res.data
if (resData.length) {
iotModelId.value = resData[0]['modelId']
const middleIndex = Math.ceil(resData.length / 2)
tableDataLeft.value = resData.slice(0, middleIndex)
tableDataRight.value = resData.slice(middleIndex)
}
}
})
}
@ -233,7 +236,7 @@ const getcurrentPage = () => {
const getCompleteData = () => {
const requestData: any = {
iotModelId: '',
iotModelId: iotModelId.value,
pageNum: pageSetting.current,
pageSize: pageSetting.pageSize,
attributeType: radioActiveName.value,
@ -271,30 +274,18 @@ const initSelect = () => {
const multipleSelection: any = ref([])
const selectTable = (section: any) => {
const defaultCode = multipleSelection.value.map((item: any) => item.attributeCode)
const addSection = section
.filter((item: any) => !defaultCode.includes(item.attributeCode))
.map((item: any) => {
const allCode = attrTableData.value.map((item: any) => {
return item.attributeCode
})
const extraCode = multipleSelection.value.filter((item: any) => !allCode.includes(item.attributeCode))
const setionMap = section.map((item: any) => {
return {
attributeName: item.attributeName,
attributeCode: item.attributeCode,
unit: item.unit,
}
})
multipleSelection.value = [...multipleSelection.value, ...addSection]
}
const selectAllTable = (section: any) => {
const defaultCode = multipleSelection.value.map((item: any) => item.attributeCode)
const addSection = section
.filter((item: any) => !defaultCode.includes(item.attributeCode))
.map((item: any) => {
return {
attributeName: item.attributeName,
attributeCode: item.attributeCode,
unit: item.unit,
}
})
multipleSelection.value = [...multipleSelection.value, ...addSection]
multipleSelection.value = [...extraCode, ...setionMap]
}
const attrTableData = ref([])
@ -364,6 +355,7 @@ const getDateRange = (type: 'week' | 'month') => {
const openMeasure = () => {
showMeasure.value = true
pageSetting.current = 1
}
const handleSelectionChange1 = (val: any) => {