fast(网关相关): 添加南向、北向、数据采集页面,及南向和北向部分接口对接

This commit is contained in:
fhysy 2024-11-15 17:54:05 +08:00
parent 9364ef8412
commit 2d4d509ef0
11 changed files with 2859 additions and 310 deletions

View File

@ -24,8 +24,10 @@
"dayjs": "^1.11.11",
"electron-updater": "^6.1.7",
"element-plus": "^2.7.6",
"file-saver": "^2.0.5",
"pinia": "^2.1.7",
"vue-router": "^4.4.0"
"vue-router": "^4.4.0",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@electron-toolkit/eslint-config": "^1.0.2",

View File

@ -13,6 +13,9 @@ const settings = defineProps({
<el-menu-item index="/system/videoplayer"><span class="iconfont icon-icon_jiankong"></span> 视频监控</el-menu-item>
<el-menu-item index="/system/serialport"><span class="iconfont icon-chuankou2"></span> 设备参数读写</el-menu-item>
<el-menu-item index="/system/devicestandard"><span class="iconfont icon-icon_chajian"></span> 空开标定</el-menu-item>
<el-menu-item index="/gateway/southdirection"><span class="iconfont icon-icon_chajian"></span> 南向采集配置</el-menu-item>
<el-menu-item index="/gateway/northboundtask"><span class="iconfont icon-icon_chajian"></span> 北向任务配置</el-menu-item>
<el-menu-item index="/gateway/collectdatamonitor"><span class="iconfont icon-icon_chajian"></span> 采集数据监视</el-menu-item>
<!-- <el-menu-item index="/system/test"><el-icon> <Menu /> </el-icon></el-menu-item>-->
</el-menu>
</el-scrollbar>

View File

@ -7,7 +7,7 @@
<div class="haeder-menu" :style="{ width: menuWidth + 'px' }">
<el-menu default-active="/system" mode="horizontal" router="true">
<el-menu-item index="/system">系统模板</el-menu-item>
<!-- <el-menu-item index="/test">测试</el-menu-item>-->
<!-- <el-menu-item index="/gateway">网关</el-menu-item>-->
</el-menu>
</div>
<div class="haeder-right">

View File

@ -72,6 +72,41 @@ const router = createRouter({
}
}
]
},
{
path: '/gateway',
name: 'gateway',
component: systenLayout,
redirect: { name: 'southdirection' },
children: [
{
path: 'southdirection',
name: 'southdirection',
component: () => import('@renderer/views/gateway/southdirection.vue'),
meta: {
menu: 'southdirection',
keepAlive: true
}
},
{
path: 'northboundtask',
name: 'northboundtask',
component: () => import('@renderer/views/gateway/northboundtask.vue'),
meta: {
menu: 'northboundtask',
keepAlive: true
}
},
{
path: 'collectdatamonitor',
name: 'collectdatamonitor',
component: () => import('@renderer/views/gateway/collectdatamonitor.vue'),
meta: {
menu: 'collectdatamonitor',
keepAlive: true
}
}
]
}
]
},

View File

@ -16,21 +16,22 @@
// wsUrl: 'ws://127.0.0.1:8000'
// }
export default {
url: 'http://127.0.0.1:8888',
wsUrl: 'ws://127.0.0.1:8888',
swichWsUrl: 'ws://127.0.0.1:8001',
serialPortUrl: 'http://127.0.0.1:8888',
// 远程连接串口使用
// serialPortUrl: 'http://120.77.172.42:7202',
// serialPortUrl: 'http://192.168.1.17:8888',
}
// export default {
// url: 'http://127.0.0.1:8888',
// wsUrl: 'ws://127.0.0.1:8888',
// swichWsUrl: 'ws://127.0.0.1:8001',
// serialPortUrl: 'http://127.0.0.1:8888',
//
// // 远程连接串口使用
// // serialPortUrl: 'http://120.77.172.42:7202',
// // serialPortUrl: 'http://192.168.1.17:8888',
// }
// 手动配置的地址
// export default {
// url: 'http://192.168.1.17:8000',
// wsUrl: 'ws://192.168.1.17:8000',
// swichWsUrl: 'ws://192.168.1.17:8001',
// }
export default {
url: 'http://192.168.1.17:8000',
wsUrl: 'ws://192.168.1.17:8000',
swichWsUrl: 'ws://192.168.1.17:8001',
serialPortUrl: 'http://127.0.0.1:8888',
}

View File

@ -0,0 +1,6 @@
export function guidGenerator() {
var S4 = function() {
return ((1 + Math.random())*0X10000|0).toString(16).substring(1);
};
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
}

View File

@ -0,0 +1,273 @@
<template>
<div id="southdirection-box">
<div class="device-config">
<h2>设备状态</h2>
<div class="btn-list">
<div class="btn-list-left">
</div>
<div class="btn-list-right">
<el-button type="primary" @click="getDeviceConfig">刷新</el-button>
</div>
</div>
<div class="table-box">
<el-table
ref="deviceConfigTableRef"
highlight-current-row
:data="deviceConfigList"
border
height="187"
@row-click="deviceConfigClick"
:style="{ width: tabelBox + 'px',background:'#f2f2f2' }"
empty-text="配置为空"
>
<el-table-column type="index" label="序号" align="center" width="60" />
<el-table-column prop="equipId" label="设备ID" align="center"/>
<el-table-column prop="communicationQuality" label="通讯质量" align="center"/>
<el-table-column prop="state" label="运行状态" align="center"/>
<el-table-column prop="equipName" label="临时停止" align="center">
<template #default="scope">
<el-switch v-model="scope.row.isStart" />
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="data-config">
<h2>数据源配置</h2>
<div class="btn-list">
<div class="btn-list-left">
</div>
<div class="btn-list-right">
<el-button type="primary" @click="getDeviceConfig">刷新</el-button>
</div>
</div>
<div class="table-box">
<el-table
:data="activeDeviceConfig"
border
size="small"
height="100%"
ref="deviceDataTableRef"
:style="{ width: tabelBox + 'px' }"
empty-text="配置为空"
>
<el-table-column type="index" label="序号" align="center" width="60" fixed />
<el-table-column prop="dataId" label="设备ID_数据ID" align="center" />
<el-table-column prop="dataName" label="数据名" align="center" />
<el-table-column prop="dataDesc" label="描述" align="center" />
<el-table-column prop="value" label="当前值" align="center" />
<el-table-column prop="timeStamp" label="时间" align="center" />
<el-table-column label="操作" width="55" fixed="right" align="center">
<!-- <template #default="scope">-->
<!-- <el-button link type="danger" size="small" @click.stop="delDeviceDataConfig(scope.$index)">删除</el-button>-->
<!-- </template>-->
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref, onMounted, onUnmounted, computed, watch } from "vue"
import { ElMessage, ElMessageBox } from "element-plus"
import axios from "axios"
import config from '@renderer/util/config.js';
const deviceConfigTableRef = ref();
const deviceDataTableRef = ref();
const tabelBox = ref(884)
const deviceConfigList = ref([
{
"equipId": "dev102", // ID
"communicationQuality": "good",
"state":true,
"isStart":false,
"dataList":[
{
"dataId":'WUHaNG-ELOT A01',
"dataName":'A01',
"dataDesc":'炉体进水流量',
"value":'-1.17549',
"timeStamp":'2024-09-11 11:44:52.721',
},
{
"dataId":'WUHaNG-ELOT A02',
"dataName":'A02',
"dataDesc":'炉体出水流量',
"value":'-1.71603',
"timeStamp":'2024-09-11 11:44:52.721',
},
{
"dataId":'WUHaNG-ELOT A03',
"dataName":'A03',
"dataDesc":'炉盖进水流量',
"value":'-0.447121',
"timeStamp":'2024-09-11 11:44:52.721',
}
]
},
{
"equipId": "dev103", // ID
"communicationQuality": "good",
"state":true,
"isStart":false,
"dataList":[
{
"dataId":'WUHaNG-ELOT A01',
"dataName":'A01',
"dataDesc":'炉体进水流量',
"value":'-1.17549',
"timeStamp":'2024-09-11 11:44:52.721',
}
]
},
{
"equipId": "dev104", // ID
"communicationQuality": "good",
"state":true,
"isStart":false,
"dataList":[
{
"dataId":'WUHaNG-ELOT A01',
"dataName":'A01',
"dataDesc":'炉体进水流量',
"value":'-1.17549',
"timeStamp":'2024-09-11 11:44:52.721',
},
{
"dataId":'WUHaNG-ELOT A02',
"dataName":'A02',
"dataDesc":'炉体出水流量',
"value":'-1.71603',
"timeStamp":'2024-09-11 11:44:52.721',
},
{
"dataId":'WUHaNG-ELOT A03',
"dataName":'A03',
"dataDesc":'炉盖进水流量',
"value":'-0.447121',
"timeStamp":'2024-09-11 11:44:52.721',
},
{
"dataId":'WUHaNG-ELOT A02',
"dataName":'A02',
"dataDesc":'炉体出水流量',
"value":'-1.71603',
"timeStamp":'2024-09-11 11:44:52.721',
},
{
"dataId":'WUHaNG-ELOT A03',
"dataName":'A03',
"dataDesc":'炉盖进水流量',
"value":'-0.447121',
"timeStamp":'2024-09-11 11:44:52.721',
},
{
"dataId":'WUHaNG-ELOT A02',
"dataName":'A02',
"dataDesc":'炉体出水流量',
"value":'-1.71603',
"timeStamp":'2024-09-11 11:44:52.721',
},
{
"dataId":'WUHaNG-ELOT A03',
"dataName":'A03',
"dataDesc":'炉盖进水流量',
"value":'-0.447121',
"timeStamp":'2024-09-11 11:44:52.721',
}
]
}
]);
const getDeviceConfig = () => {
console.log('获取配置')
}
//
const ActiveRowIndex = ref(0);
const activeDeviceConfig = ref([])
// watch(
// () => ({ ...activeDeviceConfig.value }),
// (newVal) => {
// // console.log("",newVal)
// deviceConfigList.value[ActiveRowIndex.value] = newVal;
// },
// { deep: true }
// );
//
const deviceConfigClick = (e) => {
console.log(`current page:`,e)
activeDeviceConfig.value = e.dataList;
deviceConfigTableRef.value.toggleRowSelection(e);
ActiveRowIndex.value = deviceConfigList.value.indexOf(e);
// e.isDoubleClicked = !e.isDoubleClicked;
}
//
const handleResize = () => {
deviceDataTableRef.value.doLayout();
tabelBox.value = window.innerWidth - 180 - 10 ;
}
onMounted(() => {
window.addEventListener('resize', handleResize);
if(deviceConfigList.value[0]){
activeDeviceConfig.value = deviceConfigList.value[0].dataList;
ActiveRowIndex.value = 0;
}
});
onUnmounted(() => {
window.removeEventListener('resize', handleResize);
});
</script>
<style scoped lang="scss">
.el-table .double-clicked-row {
background-color: #f0f9eb;
}
:deep(.el-table .el-scrollbar) {
background: #fff;
}
#southdirection-box{
height: 100%;
.btn-list{
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 0;
}
.device-config{
position: relative;
overflow-y: auto;
}
.data-config{
position: relative;
height: calc(100% - 278px);
.table-box{
position: absolute;
width: 100%;
height: calc(100% - 162px);
}
}
.table-box{
//position: absolute;
//width: 100%;
}
}
</style>

View File

@ -0,0 +1,836 @@
<template>
<div id="southdirection-box">
<div class="plat-config">
<h2>平台配置</h2>
<div class="btn-list">
<div class="btn-list-left">
<el-button type="primary" @click="addDeviceConfig">新增配置</el-button>
<!-- <el-button type="danger" @click="getDeviceConfig">删除</el-button>-->
</div>
<div class="btn-list-right">
<!-- <el-button type="primary" @click="getDeviceConfig">导出</el-button>-->
<!-- <el-button type="primary" @click="getDeviceConfig">导入</el-button>-->
<el-button type="primary" @click="getDeviceConfig">获取配置</el-button>
<el-button type="primary" @click="setDeviceConfig">设置配置</el-button>
</div>
</div>
<div class="table-box">
<el-table
ref="platConfigTableRef"
highlight-current-row
:data="platConfigList"
border
height="187"
:row-class-name="tableRowClassName"
:style="{ width: tabelBox + 'px',background:'#f2f2f2' }"
empty-text="配置为空"
>
<el-table-column type="index" label="序号" align="center" width="60" />
<el-table-column prop="PlatformIp" label="平台地址" >
<template #default="scope">
<el-input v-model="scope.row.PlatformIp" placeholder="请输入平台地址" />
</template>
</el-table-column>
<el-table-column prop="type" label="上报格式" >
<template #default="scope">
<el-select v-model="scope.row.type" placeholder="请选择上报格式">
<el-option
v-for="item in uploadType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
</el-table-column>
<el-table-column prop="mqtt.user" label="用户名" >
<template #default="scope">
<el-input v-model="scope.row.mqtt.user" placeholder="请输入用户名" />
</template>
</el-table-column>
<el-table-column prop="mqtt.passwd" label="密码" >
<template #default="scope">
<el-input type="password" show-password v-model="scope.row.mqtt.passwd" placeholder="请输入密码" />
</template>
</el-table-column>
<el-table-column prop="mqtt.isUseSsl" label="ssl" >
<template #default="scope">
<el-switch v-model="scope.row.mqtt.isUseSsl" />
</template>
</el-table-column>
<el-table-column prop="mqtt.isUseSslConf" label="ssl文件" >
<template #default="scope">
<el-switch v-model="scope.row.mqtt.isUseSslConf" />
</template>
</el-table-column>
<el-table-column prop="pushConf.isUseResumeBrokenTransfer" label="断点续存" >
<template #default="scope">
<el-switch v-model="scope.row.pushConf.isUseResumeBrokenTransfer" />
</template>
</el-table-column>
<el-table-column prop="protocol.params.linkPar" label="设备地址" >
<template #default="scope">
{{scope.row.tasks?scope.row.tasks.join():''}}
</template>
</el-table-column>
<el-table-column label="操作" width="140" align="center">
<template #default="scope">
<el-button link type="primary" size="small" @click="openCollectionModel(scope.row)">加解密配置</el-button>
<el-button link type="danger" size="small" @click="delDeviceConfig(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="plat-config">
<h2>任务配置</h2>
<div class="table-box">
<el-table
ref="platConfigTableRef"
highlight-current-row
:data="taskList"
border
height="187"
:row-class-name="tableRowClassName"
@row-click="taskConfigClick"
:style="{ width: tabelBox + 'px',background:'#f2f2f2' }"
empty-text="配置为空"
>
<el-table-column type="index" label="序号" align="center" width="60" />
<el-table-column prop="taskId" label="任务ID" >
<template #default="scope">
<el-input v-model="scope.row.taskId" placeholder="请输入任务ID" />
</template>
</el-table-column>
<el-table-column prop="uploadMode" label="上报策略" >
<template #default="scope">
<el-autocomplete
v-model="scope.row.uploadMode"
:fetch-suggestions="querySearch"
clearable
class="inline-input w-50"
placeholder="请选择上报策略"
/>
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="data-config">
<h2>上报测点{{activeDeviceConfig.taskId}}</h2>
<div class="table-box">
<el-table
:data="activeDeviceConfig.dataId_entire"
border
size="small"
height="100%"
ref="deviceDataTableRef"
:style="{ width: tabelBox + 'px' }"
empty-text="配置为空"
>
<el-table-column type="index" label="序号" align="center" width="60" fixed />
<el-table-column prop="equipId" label="设备ID" align="center"/>
<el-table-column prop="idInfo.id" label="数据ID" align="center"/>
<el-table-column prop="idInfo.uploadMode" label="上报策略" align="center"/>
</el-table>
</div>
</div>
<el-dialog
v-model="collectionModelShow"
title="加解密配置"
width="500"
:before-close="handleClose"
>
<el-form ref="collectionRef" :model="collectionForm" label-width="auto" status-icon>
<h3>加密算法配置</h3>
<el-form-item label="启动">
<el-switch v-model="collectionForm.encrypt_1.enable" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="加密算法">
<el-select v-model="collectionForm.encrypt_1.algorithm" placeholder="选择加密算法">
<el-option label="AES" value="AES" />
<el-option label="DES" value="DES" />
<el-option label="SM4" value="SM4" />
<el-option label="RSA" value="RSA" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="text-center">
<el-form-item label="加密key值">
<el-input v-model="collectionForm.encrypt_1.param.key" placeholder="请输入加密key值" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="加密模式">
<el-select v-model="collectionForm.encrypt_1.mode" placeholder="选择加密模式">
<el-option label="ECB" value="ECB" />
<el-option label="CBC" value="CBC" />
<el-option label="CTR" value="CTR" />
<el-option label="CFB" value="CFB" />
<el-option label="CFB1" value="CFB1" />
<el-option label="CFB8" value="CFB8" />
<el-option label="CFB128" value="CFB128" />
<el-option label="OFB" value="OFB" />
<el-option label="OFB128" value="OFB128" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="text-center">
<el-form-item label="加密向量表">
<el-input v-model="collectionForm.encrypt_1.param.ivec" placeholder="请输入加密向量表" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="加密位数">
<el-select v-model="collectionForm.encrypt_1.bits" placeholder="选择加密位数">
<el-option label="128" value="128" />
<el-option label="192" value="192" />
<el-option label="256" value="256" />
</el-select>
</el-form-item>
<h3>解密算法配置</h3>
<el-form-item label="启动">
<el-switch v-model="collectionForm.decrypt_1.enable" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="加密算法">
<el-select v-model="collectionForm.decrypt_1.algorithm" placeholder="选择加密算法">
<el-option label="AES" value="AES" />
<el-option label="DES" value="DES" />
<el-option label="SM4" value="SM4" />
<el-option label="RSA" value="RSA" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="text-center">
<el-form-item label="加密key值">
<el-input v-model="collectionForm.decrypt_1.param.key" placeholder="请输入加密key值" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="加密模式">
<el-select v-model="collectionForm.decrypt_1.mode" placeholder="选择加密模式">
<el-option label="ECB" value="ECB" />
<el-option label="CBC" value="CBC" />
<el-option label="CTR" value="CTR" />
<el-option label="CFB" value="CFB" />
<el-option label="CFB1" value="CFB1" />
<el-option label="CFB8" value="CFB8" />
<el-option label="CFB128" value="CFB128" />
<el-option label="OFB" value="OFB" />
<el-option label="OFB128" value="OFB128" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="text-center">
<el-form-item label="加密向量表">
<el-input v-model="collectionForm.decrypt_1.param.ivec" placeholder="请输入加密向量表" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="加密位数">
<el-select v-model="collectionForm.decrypt_1.bits" placeholder="选择加密位数">
<el-option label="128" value="128" />
<el-option label="192" value="192" />
<el-option label="256" value="256" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="collectionModelShow = false">取消</el-button>
<el-button type="primary" @click="editCollection">
确认
</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref, onMounted, onUnmounted, computed, watch } from "vue"
import { ElMessage, ElMessageBox } from "element-plus"
import axios from "axios"
import config from '@renderer/util/config.js';
//
const uploadModeList = ref([
{ value: 'timer 10', link: 'timer 10' },
{ value: 'change 10', link: 'change 10' },
{ value: 'timer 10 || change 10', link: 'timer 10 || change 10' },
{ value: 'label LD200 up', link: 'label LD200 up' },
])
const querySearch = (queryString, cb) => {
const results = queryString
? uploadModeList.value.filter(createFilter(queryString))
: uploadModeList.value
// call callback function to return suggestions
cb(results)
}
const createFilter = (queryString) => {
return (restaurant) => {
return (
restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
)
}
}
//
const taskList = ref([
{
"dataId_entire": [
{
"equipId": "dev102",
"idInfo": [{ "id": "", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
},
{
"equipId": "dev103",
"idInfo": [{ "id": "as", "uploadMode": "timer 10 || change 10" }]
}
],
"taskId": "T1",
"taskType": "",
"uploadMode": "timer 1 || change 0.1"
},
{
"dataId_entire": [
{
"equipId": "dev103",
"idInfo": [{ "id": "xc", "uploadMode": "" }]
}
],
"taskId": "T2",
"taskType": "",
"uploadMode": "timer 10 || change 1"
},
{
"dataId_entire": [],
"taskId": "T3",
"taskType": "",
"uploadMode": "timer 120 || change 0.1"
},
{
"dataId_entire": [],
"taskId": "T4",
"taskType": "",
"uploadMode": "timer 120 || change 1"
},
{
"dataId_entire": [],
"taskId": "T5",
"taskType": "",
"uploadMode": "timer 120 || change 3"
}
]);
const platConfigTableRef = ref();
const deviceDataTableRef = ref();
const tabelBox = ref(884)
const platConfigList = ref([])
// const platConfigList = ref([
// {
// // IP
// "PlatformIp": "",
// //
// "tasks": [
// "T1",
// "T2",
// "T3",
// "T4",
// "T5"
// ],
// //
// "type": "",
// // MQTT
// "mqtt": {
// // MQTT
// "user": "",
// // MQTT
// "passwd": "",
// // 使SSL
// "isUseSsl": false,
// // 使SSL
// "isUseSslConf": false,
// // SSL
// "sslConf": {
// //
// "localCertificate_file": "/etc/custom/sslConf/pupu_core_3501000001.pem",
// //
// "privateKey_file": "/etc/custom/sslConf/pupu_core_3501000001.prv"
// }
// },
// //
// "pushConf": {
// //
// "isRun": true,
// // 使
// "isUseResumeBrokenTransfer": false,
// //
// "broken": {
// //
// "resume": {
// "intervalTime_ms": 1000
// },
// //
// "filter": {
// //
// "filter_s": 600,
// // ID
// "relevanceTaskId": [
// "T1",
// "T2",
// "T3",
// "T4",
// "T5"
// ]
// }
// }
// },
// //
// "encrypt_decrypt": {
// //
// "encrypt_1": {
// //
// "algorithm": "AES",
// //
// "param": {
// "mode": "CBC",
// "key": "0123456789abcdef",
// "ivec": "0123456789abcdef",
// "bits": 128
// },
// //
// "enable": false
// },
// //
// "decrypt_1": {
// //
// "algorithm": "AES",
// //
// "param": {
// "mode": "CBC",
// "key": "0123456789abcdef",
// "ivec": "0123456789abcdef",
// "bits": 128
// },
// //
// "enable": false
// }
// }
// }
// ]);
const activeTaskIndex = ref(0);
const uploadType = ref([
{ label: 'DT-MQTT-DEFAULT', value: 'DT-MQTT-DEFAULT'},
{ label: 'DT-MQTT-DEBUG', value: 'DT-MQTT-DEBUG'},
{ label: 'HN-MQTT-BJ', value: 'HN-MQTT-BJ'},
{ label: 'SC-MQTT-DEFAULT', value: 'SC-MQTT-DEFAULT'},
{ label: 'WG-MQTT-PuPu', value: 'WG-MQTT-PuPu'},
{ label: 'WG-MQTT-TengSheng', value: 'WG-MQTT-TengSheng'},
])
//
const addDeviceConfig = () => {
let newDeviceConfig = {
"PlatformIp": "",
"tasks": ["T1", "T2", "T3", "T4", "T5"],
"type": "",
"mqtt": {
"user": "",
"passwd": "",
"isUseSsl": false,
"isUseSslConf": false,
"sslConf": {
"localCertificate_file": "/etc/custom/sslConf/pupu_core_3501000001.pem",
"privateKey_file": "/etc/custom/sslConf/pupu_core_3501000001.prv"
}
},
"pushConf": {
"isRun": true,
"isUseResumeBrokenTransfer": false,
"broken": {
"resume": { "intervalTime_ms": 1000 },
"filter": {
"filter_s": 600,
"relevanceTaskId": ["T1", "T2", "T3", "T4", "T5"]
}
}
},
"encrypt_decrypt": {
"encrypt_1": {
"algorithm": "AES",
"param": {
"mode": "CBC",
"key": "0123456789abcdef",
"ivec": "0123456789abcdef",
"bits": 128
},
"enable": false
},
"decrypt_1": {
"algorithm": "AES",
"param": {
"mode": "CBC",
"key": "0123456789abcdef",
"ivec": "0123456789abcdef",
"bits": 128
},
"enable": false
}
}
};
console.log("platConfigList.value",platConfigTableRef.value)
platConfigList.value.push(newDeviceConfig);
}
//
const delDeviceConfig = (index) => {
console.log("当前点击的行号", index);
ElMessageBox.confirm(
'确认要删除该设备配置吗?',
'告警',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
platConfigList.value.splice(index, 1);
ElMessage({
type: 'success',
message: '删除成功',
})
})
.catch(() => {
ElMessage({
type: 'info',
message: '取消删除',
})
})
}
const getDeviceConfig = () => {
console.log('获取配置')
axios
.get(config.url + '/config/platform/query', {})
.then(response => {
//
console.log(response); //
if (response.data.code == 0) {
//
platConfigList.value = response.data.data.PlatformPar || [];
if(!platConfigList.value.length){
addDeviceConfig()
}
// if(platConfigList.value.length){
// if(platConfigList.value.length>ActiveRowIndex.value){
// activeDeviceConfig.value = platConfigList.value[ActiveRowIndex.value];
// }else{
// activeDeviceConfig.value = platConfigList.value[0];
// }
// }else{
// addDeviceConfig()
// }
} else {
ElMessage.error(response.data.message);
}
})
.catch(error => {
//
console.error(error); //
ElMessage.error(error);
});
}
const setDeviceConfig = () => {
console.log('提交配置',platConfigList.value)
axios
.post(config.url + '/config/platform/add', {PlatformPar: platConfigList.value})
.then(response => {
//
console.log(response); //
if (response.data.code == 0) {
ElMessage.success('保存成功');
} else {
ElMessage.error(response.data.message);
}
})
.catch(error => {
//
console.error(error); //
ElMessage.error(error);
});
}
//
const ActiveRowIndex = ref(0);
const collectionModelShow = ref(false);
const collectionRef = ref();
const collectionForm = ref({
//
"encrypt_1": {
//
"algorithm": "AES",
//
"param": {
"mode": "CBC",
"key": "0123456789abcdef",
"ivec": "0123456789abcdef",
"bits": 128
},
//
"enable": false
},
//
"decrypt_1": {
//
"algorithm": "AES",
//
"param": {
"mode": "CBC",
"key": "0123456789abcdef",
"ivec": "0123456789abcdef",
"bits": 128
},
//
"enable": false
}
})
//
const openCollectionModel = (row) => {
console.log("当前采集",row)
collectionForm.value = {
"encrypt_1": row.encrypt_decrypt.encrypt_1,
"decrypt_1": row.encrypt_decrypt.decrypt_1
};
collectionModelShow.value = true;
}
const editCollection = () => {
platConfigList.value[ActiveRowIndex.value].encrypt_decrypt.encrypt_1 = collectionForm.value.encrypt_1;
platConfigList.value[ActiveRowIndex.value].encrypt_decrypt.decrypt_1 = collectionForm.value.decrypt_1;
collectionModelShow.value = false;
}
const activeDeviceConfig = ref({
"PlatformIp": "",
"tasks": ["T1", "T2", "T3", "T4", "T5"],
"type": "",
"mqtt": {
"user": "",
"passwd": "",
"isUseSsl": false,
"isUseSslConf": false,
"sslConf": {
"localCertificate_file": "/etc/custom/sslConf/pupu_core_3501000001.pem",
"privateKey_file": "/etc/custom/sslConf/pupu_core_3501000001.prv"
}
},
"pushConf": {
"isRun": true,
"isUseResumeBrokenTransfer": false,
"broken": {
"resume": { "intervalTime_ms": 1000 },
"filter": {
"filter_s": 600,
"relevanceTaskId": ["T1", "T2", "T3", "T4", "T5"]
}
}
},
"encrypt_decrypt": {
"encrypt_1": {
"algorithm": "AES",
"param": {
"mode": "CBC",
"key": "0123456789abcdef",
"ivec": "0123456789abcdef",
"bits": 128
},
"enable": false
},
"decrypt_1": {
"algorithm": "AES",
"param": {
"mode": "CBC",
"key": "0123456789abcdef",
"ivec": "0123456789abcdef",
"bits": 128
},
"enable": false
}
}
})
watch(
() => ({ ...activeDeviceConfig.value }),
(newVal) => {
// console.log("",newVal)
platConfigList.value[ActiveRowIndex.value] = newVal;
},
{ deep: true }
);
// const saveDeviceDataConfig = () => {
// platConfigList.value[ActiveRowIndex.value] = activeDeviceConfig.value;
// }
const tableRowClassName = ({ row, rowIndex }) => {
if (rowIndex === ActiveRowIndex.value) {
return 'selected-row';
}
return '';
};
//
const taskConfigClick = (e) => {
console.log(`current page:`,e)
activeDeviceConfig.value = e;
platConfigTableRef.value.toggleRowSelection(e);
ActiveRowIndex.value = platConfigList.value.indexOf(e);
// e.isDoubleClicked = !e.isDoubleClicked;
}
//
const handleResize = () => {
deviceDataTableRef.value.doLayout();
tabelBox.value = window.innerWidth - 180 - 10 ;
}
onMounted(() => {
window.addEventListener('resize', handleResize);
getDeviceConfig()
// if(platConfigList.value[0]){
// activeDeviceConfig.value = platConfigList.value[0];
// platConfigTableRef.value.toggleRowSelection(platConfigList.value[0]);
// ActiveRowIndex.value = 0;
// }
});
onUnmounted(() => {
window.removeEventListener('resize', handleResize);
});
</script>
<style scoped lang="scss">
.el-table .double-clicked-row {
background-color: #f0f9eb;
}
:deep(.el-table .el-scrollbar) {
background: #fff;
}
#southdirection-box{
height: 100%;
.btn-list{
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 0;
}
.plat-config{
position: relative;
overflow-y: auto;
}
.data-config{
position: relative;
height: calc(100% - 278px - 226px);
.table-box{
position: absolute;
width: 100%;
height: calc(100% - 120px);
}
}
.table-box{
//position: absolute;
//width: 100%;
}
}
</style>
<style>
.selected-row {
background-color: #55e800;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@ -43,7 +43,7 @@
</div>
</el-tab-pane>
<el-tab-pane label="断路器3p、4p">
<div class="electrical-parameters-list">
<div class="electrical-parameters-list switch34">
<div v-for="item in electricalParametersList" :key="item.id" class="electrical-parameters-item">
<div class="electrical-parameters-icon">
<i class="iconfont icon-icon_duanluqi"></i>
@ -244,49 +244,9 @@ const swich1p2pAttrList = [
];
const swich3p4pAttrList = [
{
id: 1,
name: '电网频率',
startValue: 50004,
lengthValue: 1,
value: '', //
dataType: 'uint32_t',
unit: 'Hz',
accuracy: 0.01
},
{
id: 2,
name: '漏电流',
startValue: 50005,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: 'mA',
accuracy: 1
},
{
id: 3,
name: 'N相进线温度',
startValue: 50006,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 4,
name: 'N相出线温度',
startValue: 50007,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 5,
name: 'L/A相电压',
name: 'A相电压',
startValue: 50008,
lengthValue: 1,
value: '',
@ -296,7 +256,7 @@ const swich3p4pAttrList = [
},
{
id: 6,
name: 'L/A相电流',
name: 'A相电流',
startValue: 50009,
lengthValue: 1,
value: '',
@ -306,7 +266,7 @@ const swich3p4pAttrList = [
},
{
id: 7,
name: 'L/A相有功功率',
name: 'A相有功功率',
startValue: 50010,
lengthValue: 1,
value: '',
@ -316,7 +276,7 @@ const swich3p4pAttrList = [
},
{
id: 8,
name: 'L/A相无功功率',
name: 'A相无功功率',
startValue: 50011,
lengthValue: 1,
value: '',
@ -326,7 +286,7 @@ const swich3p4pAttrList = [
},
{
id: 9,
name: 'L/A相视在功率',
name: 'A相视在功率',
startValue: 50012,
lengthValue: 1,
value: '',
@ -336,7 +296,7 @@ const swich3p4pAttrList = [
},
{
id: 10,
name: 'L/A相功率因数',
name: 'A相功率因数',
startValue: 50013,
lengthValue: 1,
value: '',
@ -344,26 +304,7 @@ const swich3p4pAttrList = [
unit: '',
accuracy: 0.001
},
{
id: 15,
name: 'L/A相进线温度',
startValue: 50018,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 16,
name: 'L/A相出线温度',
startValue: 50019,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 17,
name: 'B相电压',
@ -424,26 +365,6 @@ const swich3p4pAttrList = [
unit: '',
accuracy: 0.001
},
{
id: 27,
name: 'B相进线温度',
startValue: 50030,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 28,
name: 'B相出线温度',
startValue: 50031,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 29,
name: 'C相电压',
@ -504,26 +425,6 @@ const swich3p4pAttrList = [
unit: '',
accuracy: 0.001
},
{
id: 39,
name: 'C相进线温度',
startValue: 50042,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 40,
name: 'C相出线温度',
startValue: 50043,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 41,
name: '合相电压',
@ -536,7 +437,7 @@ const swich3p4pAttrList = [
},
{
id: 42,
name: '剩余电流',
name: '合相电流',
startValue: 50045,
lengthValue: 1,
value: '',
@ -566,7 +467,7 @@ const swich3p4pAttrList = [
},
{
id: 45,
name: 'RMS合相视在功率',
name: '合相视在功率',
startValue: 50048,
lengthValue: 1,
value: '',
@ -576,14 +477,119 @@ const swich3p4pAttrList = [
},
{
id: 46,
name: 'RMS合相功率因数',
name: '合相功率因数',
startValue: 50049,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '',
accuracy: 0.001
}
},
{
id: 2,
name: '漏电流',
startValue: 50005,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: 'mA',
accuracy: 1
},
{
id: 1,
name: '电网频率',
startValue: 50004,
lengthValue: 1,
value: '', //
dataType: 'uint32_t',
unit: 'Hz',
accuracy: 0.01
},
{
id: 15,
name: 'A相进线温度',
startValue: 50018,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 16,
name: 'A相出线温度',
startValue: 50019,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 27,
name: 'B相进线温度',
startValue: 50030,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 28,
name: 'B相出线温度',
startValue: 50031,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 39,
name: 'C相进线温度',
startValue: 50042,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 40,
name: 'C相出线温度',
startValue: 50043,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 3,
name: 'N相进线温度',
startValue: 50006,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
{
id: 4,
name: 'N相出线温度',
startValue: 50007,
lengthValue: 1,
value: '',
dataType: 'uint32_t',
unit: '°C',
accuracy: 0.1
},
];
const electricalParametersList = ref([]);
@ -1082,6 +1088,11 @@ onUnmounted(() => {});
}
}
}
&.switch34{
.electrical-parameters-item{
width: calc(16% - 20px);
}
}
}
.electrical-parameters-calibrate-list {
.electrical-parameters-item {

View File

@ -923,6 +923,11 @@ acorn@^8.9.0:
resolved "https://registry.npmmirror.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
adler-32@~1.3.0:
version "1.3.1"
resolved "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2"
integrity sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==
agent-base@6:
version "6.0.2"
resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
@ -1224,6 +1229,14 @@ caniuse-lite@^1.0.30001629:
resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz#32c467d4bf1f1a0faa63fc793c2ba81169e7652f"
integrity sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==
cfb@~1.2.1:
version "1.2.2"
resolved "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz#94e687628c700e5155436dac05f74e08df23bc44"
integrity sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==
dependencies:
adler-32 "~1.3.0"
crc-32 "~1.2.0"
chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@ -1295,6 +1308,11 @@ clone-response@^1.0.2:
dependencies:
mimic-response "^1.0.0"
codepage@~1.15.0:
version "1.15.0"
resolved "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz#2e00519024b39424ec66eeb3ec07227e692618ab"
integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@ -1366,6 +1384,11 @@ core-util-is@1.0.2:
resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
crc-32@~1.2.0, crc-32@~1.2.1:
version "1.2.2"
resolved "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
crc@^3.8.0:
version "3.8.0"
resolved "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6"
@ -1889,6 +1912,11 @@ file-entry-cache@^6.0.1:
dependencies:
flat-cache "^3.0.4"
file-saver@^2.0.5:
version "2.0.5"
resolved "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38"
integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==
filelist@^1.0.4:
version "1.0.4"
resolved "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
@ -1947,6 +1975,11 @@ form-data@^4.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
frac@~1.1.2:
version "1.1.2"
resolved "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==
fs-extra@^10.0.0, fs-extra@^10.1.0:
version "10.1.0"
resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
@ -3083,6 +3116,13 @@ sprintf-js@^1.1.2:
resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
ssf@~0.11.2:
version "0.11.2"
resolved "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c"
integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==
dependencies:
frac "~1.1.2"
stat-mode@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465"
@ -3361,11 +3401,21 @@ which@^2.0.1:
dependencies:
isexe "^2.0.0"
wmf@~1.0.1:
version "1.0.2"
resolved "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da"
integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==
word-wrap@^1.2.5:
version "1.2.5"
resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
word@~0.3.0:
version "0.3.0"
resolved "https://registry.npmmirror.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961"
integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
@ -3398,6 +3448,19 @@ wrappy@1:
resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
xlsx@^0.18.5:
version "0.18.5"
resolved "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz#16711b9113c848076b8a177022799ad356eba7d0"
integrity sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==
dependencies:
adler-32 "~1.3.0"
cfb "~1.2.1"
codepage "~1.15.0"
crc-32 "~1.2.1"
ssf "~0.11.2"
wmf "~1.0.1"
word "~0.3.0"
xml-name-validator@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"