map/ui/dasadmin/src/views/backend/node/utils.ts
高云鹏 b533146d3c 物模型:添加敏感字段confidential
实时数据:测点选择修改为搜索框,添加子系统选择框
2024-12-17 10:30:19 +08:00

736 lines
21 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { LocaleType, BooleanNumber, SheetTypes } from '@univerjs/core'
export const protocolList = [
// * 代表需要配置的协议
{ label: 'IEC104从 *', value: 9 },
{ label: 'MODBUSTCP从 *', value: 17 },
{ label: 'MODBUS', value: 80 },
{ label: 'ADS', value: 81 },
{ label: '故障日志', value: 79 },
]
export const excelDefaultConfig: any = {
// IEC104从
9: {
//遥测138 ANALOG
138: {
name: '模拟量',
head: [
{
label: '序号',
code: 'order',
},
],
},
//遥控147 CONTROL
147: {
name: '遥控量',
head: [
{
label: '序号',
code: 'order',
},
],
},
//遥调146 SETPOINT
146: {
name: '遥调量',
head: [
{
label: '序号',
code: 'order',
},
],
},
//遥脉139 ACCUMULATOR
139: {
name: '累计量',
head: [
{
label: '序号',
code: 'order',
},
],
},
//遥信140 DISCRETE
140: {
name: '离散量',
head: [
{
label: '序号',
code: 'order',
},
],
},
},
// MODEBUS
80: {
//遥测138 ANALOG
138: {
name: '模拟量',
head: [
{
label: '功能码',
code: 'col1',
},
{
label: '数据类型',
code: 'col2',
},
{
label: '数据符号',
code: 'col3',
},
{
label: '寄存器地址',
code: 'col4',
},
{
label: '上界',
code: 'upBound',
},
{
label: '下界',
code: 'lowBound'
},
{
label: '基值',
code: 'base',
default: 0
},
{
label: '系数',
code: 'coef',
default: 1
},
{
label: '限值1',
code: 'limit1Enable',
default: 0
},
{
label: '限值1上限',
code: 'limit1High'
},
{
label: '限值1下限',
code: 'limit1Low'
},
{
label: '限值2',
code: 'limit2Enable',
default: 0
},
{
label: '限值2上限',
code: 'limit2High'
},
{
label: '限值2下限',
code: 'limit2Low'
},
{
label: '强制归档',
code: 'forceArchive',
}
],
R0C4: ['03', '04'],
R0C5: [
'0 - 32位浮点数(高位在第一个寄存器)',
'1 - 32位浮点数(高位在第二个寄存器)',
'2 - 16位归一化值',
'3 - 32位归一化值(高位在第一个寄存器)',
'4 - 32位归一化值(高位在第二个寄存器)',
'5 - 32位浮点数(小端系统模式)',
'6 - 32位BCD数据(*高位在第一个寄存器*)',
'7 - 32位BCD数据(*高位在第二个寄存器*)',
'8 - 16位BCD数据',
], // 数据类型的提示
R0C6: ['0 - 无符号', '1 - 有符号'], // 数据符号的提示
},
//遥控147 CONTROL
147: {
name: '遥控量',
head: [
{
label: '功能码',
code: 'col1',
},
{
label: '执行前需要预置',
code: 'col2',
},
{
label: '选择合寄存器',
code: 'col3',
},
{
label: '执行合寄存器',
code: 'col4',
},
{
label: '撤销合寄存器',
code: 'col5',
},
{
label: '合闸数值',
code: 'col6',
},
{
label: '选择分寄存器',
code: 'col7',
},
{
label: '执行分寄存器',
code: 'col8',
},
{
label: '撤销分寄存器',
code: 'col9',
},
{
label: '分闸数值',
code: 'col10',
},
],
R0C4: ['05', '15', '06', '16'],
R0C5: ['0 - 直接执行', '1 - 预置执行'],
},
//遥调146 SETPOINT
146: {
name: '遥调量',
head: [
{
label: '遥调类型',
code: 'col1',
},
{
label: '功能码',
code: 'col2',
},
{
label: '执行前需要预置',
code: 'col3',
},
{
label: '选择寄存器',
code: 'col4',
},
{
label: '执行寄存器',
code: 'col5',
},
{
label: '撤销寄存器',
code: 'col6',
},
],
R0C4: ['0 - 16位整型值', '1 - 32位值高位在第一个寄存器', '2 - 32位值高位在第二个寄存器'],
R0C5: ['06', '16'],
R0C6: ['0 - 直接执行', '1 - 预置执行'],
},
//遥脉139 ACCUMULATOR
139: {
name: '累计量',
head: [
{
label: '功能码',
code: 'col1',
},
{
label: '数据类型',
code: 'col2',
},
{
label: '寄存器地址',
code: 'col3',
},
{
label: '强制归档',
code: 'forceArchive',
}
],
R0C4: ['03', '04'],
R0C5: [
'0 - 16位无符号整型值',
'1 - 32位无符号整型值(高位在第一个寄存器)',
'2 - 32位有符号整型值(高位在第一个寄存器)',
'3 - 32位无符号整型值(高位在第二个寄存器)',
'4 - 32位有符号整型值(高位在第二个寄存器)',
'5 - 32位浮点数值(高位在第一个寄存器)',
'6 - 32位浮点数值(高位在第二个寄存器)',
'7 - 64位双精度值(AB CD EF GH)',
'8 - 64位双精度值(GH EF CD AB)',
'9 - 32位短浮点数值(小端模式)',
'10 - 32位BCD数据(*高位在第一个寄存器*)',
],
},
//遥信140 DISCRETE
140: {
name: '离散量',
head: [
{
label: '功能码',
code: 'col1',
},
{ label: '偏移量', code: 'col2' },
{
label: '寄存器',
code: 'col3',
},
{
label: '强制归档',
code: 'forceArchive',
}
],
R0C4: ['01', '02', '03', '04'],
},
},
// ADS
81: {
//遥测138 ANALOG
138: {
name: '模拟量',
head: [
{
label: '数据格式',
code: 'dataType',
},
{
label: '数据类型',
code: 'signMark',
},
{
label: '寄存器地址',
code: 'registerAddr',
},
{
label: '启用变量',
code: 'variableEnable',
},
{
label: '变量名称',
code: 'variableName',
},
{
label: '上界',
code: 'upBound',
},
{
label: '下界',
code: 'lowBound'
},
{
label: '基值',
code: 'base',
default: 0
},
{
label: '系数',
code: 'coef',
default: 1
},
{
label: '限值1',
code: 'limit1Enable',
default: 0
},
{
label: '限值1上限',
code: 'limit1High'
},
{
label: '限值1下限',
code: 'limit1Low'
},
{
label: '限值2',
code: 'limit2Enable',
default: 0
},
{
label: '限值2上限',
code: 'limit2High'
},
{
label: '限值2下限',
code: 'limit2Low'
},
{
label: '强制归档',
code: 'forceArchive',
}
],
R0C4: [
"0. 32位浮点数(高位在第一个寄存器)",
"1. 32位浮点数(高位在第二个寄存器)",
"2. 16位归一化值",
"3. 32位归一化值(高位在第一个寄存器)",
"4. 32位归一化值(高位在第二个寄存器)",
"5. 32位浮点数(小端系统模式)",
"6. 32位BCD数据*高位在第一个寄存器*",
"7. 32位BCD数据*高位在第二个寄存器*",
"8. 16位BCD数据",
"9. 8位归一化值"
], // 数据类型的提示
R0C7: [
"0. 不启用",
"1. 启用"
]
},
//遥控147 CONTROL
147: {
name: '遥控量',
head: [
{
label: '合闸寄存器地址',
code: 'closeRegisterAddr',
},
{
label: '合闸值',
code: 'closeValue',
},
{
label: '分闸寄存器地址',
code: 'openRegisterAddr',
},
{
label: '分闸值',
code: 'openValue',
},
]
},
//遥调146 SETPOINT
146: {
name: '遥调量',
head: [
{
label: '设值方式',
code: 'setType',
},
{
label: '寄存器地址',
code: 'registerAddr',
},
],
},
//遥脉139 ACCUMULATOR
139: {
name: '累计量',
head: [
{
label: '强制归档',
code: 'forceArchive',
}
],
},
//遥信140 DISCRETE
140: {
name: '离散量',
head: [
{
label: '数据格式',
code: 'dataType',
},
{
label: '数据偏移量',
code: 'offSet',
},
{
label: '寄存器地址',
code: 'registerAddr',
},
{
label: '强制归档',
code: 'forceArchive',
}
],
R0C4: [
"8位归一化值",
"16位归一化值",
"32位归一化值",
]
},
},
// MODBASETCP从
17: {
//遥测138 ANALOG
138: {
name: '模拟量',
head: [
{
label: '序号',
code: 'order',
},
],
},
//遥控147 CONTROL
147: {
name: '遥控量',
head: [
{
label: '序号',
code: 'order',
},
],
},
//遥调146 SETPOINT
146: {
name: '遥调量',
head: [
{
label: '序号',
code: 'order',
},
],
},
//遥脉139 ACCUMULATOR
139: {
name: '累计量',
head: [
{
label: '序号',
code: 'order',
},
],
},
//遥信140 DISCRETE
140: {
name: '离散量',
head: [
{
label: '序号',
code: 'order',
},
],
},
},
}
const DEFAULT_WORKBOOK_DATA = {
id: 'workbook-01',
locale: LocaleType.ZH_CN,
name: 'universheet',
sheetOrder: ['sheet-138', 'sheet-139', 'sheet-140', 'sheet-146', 'sheet-147'],
appVersion: '3.0.0-alpha',
styles: {
1: {
vt: 2,
ht: 2,
},
2: {
vt: 2,
ht: 2,
bg: {
rgb: '#eceff7',
},
},
},
sheets: {},
}
/**
* 创建excel标题行
* @param protocol
* @returns
*/
const createHeaderData = (protocol: string | number) => {
if (!protocol) return {}
const headerData: any = {}
Object.keys(excelDefaultConfig[protocol!]).forEach((item) => {
const dynamicData: any = {}
excelDefaultConfig[protocol!][item].head.forEach((head: any, index: number) => {
const key = index + 4
dynamicData[key] = {
v: head.label,
s: '1',
custom: head.code,
}
})
const headerItemData = {
0: {
0: {
v: '设备名称',
s: '1',
custom: 'equipmentName',
},
1: {
v: '设备编码',
s: '1',
custom: 'equipmentCode',
},
2: {
v: '属性名称',
s: '1',
custom: 'measPointName',
},
3: {
v: '属性编码',
s: '1',
custom: 'measPointCode',
},
...dynamicData,
},
}
headerData[item] = headerItemData
})
return headerData
}
/**
* 设置excel名称为linkId
* @param id linkId
*/
export const setExcelNameToLinkId = (id: string) => {
DEFAULT_WORKBOOK_DATA.name = id
}
/**
* 创建excel数据
* @param protocol 协议类型
* @param data excel数据
* @returns
*/
export const createWookbookData = (protocol: number, linkId: string, data: any = {}) => {
const headerData = createHeaderData(protocol)
const sheetData: any = {}
//#region
Object.keys(headerData).forEach((item) => {
const rowLen = Object.keys(data[item]).length + 1
sheetData['sheet-' + item] = {
type: SheetTypes.GRID,
id: 'sheet-' + item,
cellData: {
...headerData[item],
...data[item],
},
name: excelDefaultConfig[protocol][item].name,
tabColor: 'green',
hidden: BooleanNumber.FALSE,
rowCount: rowLen,
columnCount: Object.keys(headerData[item][0]).length,
zoomRatio: 1,
scrollTop: 200,
scrollLeft: 100,
defaultColumnWidth: 120,
defaultRowHeight: 30,
status: 1,
showGridlines: 1,
hideRow: [],
hideColumn: [],
columnData: {
0: {
w: 300,
h: 0,
},
1: {
w: 300,
h: 0,
},
2: {
w: 300,
h: 0,
},
3: {
w: 300,
h: 0,
},
},
rowHeader: {
width: 46,
hidden: BooleanNumber.FALSE,
},
columnHeader: {
height: 20,
hidden: BooleanNumber.FALSE,
},
rightToLeft: BooleanNumber.FALSE,
}
})
//#endregion
DEFAULT_WORKBOOK_DATA.sheets = sheetData
DEFAULT_WORKBOOK_DATA.name = linkId
return DEFAULT_WORKBOOK_DATA
}
export const createUpLoadExcelData = (workbookData: any) => {
const sheets = workbookData.sheets
const data: any = []
Object.keys(sheets).forEach((item) => {
const sheetkeyMap: any = {}
const sheetKeys = Object.keys(sheets[item].cellData)
sheetKeys.forEach((key) => {
let sheetData: any = {}
const fieldKeys = Object.keys(sheets[item].cellData[key])
if (key === '0') {
fieldKeys.forEach((fieldKey) => {
const sheetKey = sheets[item].cellData[key][fieldKey].custom
sheetkeyMap[fieldKey] = sheetKey
})
} else {
let params: any = {}
const sheetKeyMapKeys = Object.keys(sheetkeyMap)
for (let fieldKey of sheetKeyMapKeys) {
if (fieldKey === '0') {
sheetData = { ...sheets[item].cellData[key][fieldKey].custom.otherData }
sheetData.linkId = workbookData.name
sheetData[sheetkeyMap[fieldKey]] = sheets[item].cellData[key][fieldKey]?.v ?? ''
sheetData.type = sheets[item].cellData[key][fieldKey].custom.type
sheetData.protocol = sheets[item].cellData[key][fieldKey].custom.protocol
continue
}
if (['1','2','3'].includes(fieldKey)) {
sheetData[sheetkeyMap[fieldKey]] = sheets[item].cellData[key][fieldKey]?.v ?? ''
continue
}
params[sheetkeyMap[fieldKey]] = sheets[item].cellData[key][fieldKey]?.v ?? ''
}
sheetData.params = JSON.stringify(params)
data.push(sheetData)
}
})
})
return data
}
export const createSheetData = (data: any, protocol: string | number) => {
if (!protocol) return {}
const excelCellDataMap: any = {}
const headerData = createHeaderData(protocol)
const resultData: any = {}
Object.keys(headerData).forEach((item) => {
excelCellDataMap[item] = {}
Object.keys(headerData[item][0]).forEach((key) => {
excelCellDataMap[headerData[item][0][key].custom] = key
})
const result: any = {}
data[item].forEach((obj: any, index: number) => {
const params = obj.params && obj.params !== '' ? JSON.parse(obj.params) : {}
const newObj = { ...obj, ...params }
const row = index + 1
result[row] = {}
Object.keys(newObj).forEach((field) => {
const col = excelCellDataMap[field]
if (col) {
let custom: any
if (col === '0') {
custom = {}
custom.type = item
custom.protocol = Number(protocol)
custom.otherData = obj
}
result[row][col] = { v: newObj[field], s: '1', custom }
}
})
})
resultData[item] = result
})
return resultData
}