679 lines
20 KiB
TypeScript
679 lines
20 KiB
TypeScript
import { LocaleType, BooleanNumber, SheetTypes } from '@univerjs/core'
|
|
|
|
export const excelDefaultConfig: any = {
|
|
// MODBASERTU主
|
|
12: {
|
|
//遥测138 ANALOG
|
|
138: {
|
|
name: '模拟量',
|
|
head: [
|
|
{
|
|
label: '功能码',
|
|
code: 'col1',
|
|
},
|
|
{
|
|
label: '数据类型',
|
|
code: 'col2',
|
|
},
|
|
{
|
|
label: '数据符号',
|
|
code: 'col3',
|
|
},
|
|
{
|
|
label: '寄存器地址',
|
|
code: 'col4',
|
|
},
|
|
],
|
|
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',
|
|
},
|
|
],
|
|
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',
|
|
},
|
|
],
|
|
R0C4: ['01', '02', '03', '04'],
|
|
},
|
|
},
|
|
// MODBASETCP主
|
|
16: {
|
|
//遥测138 ANALOG
|
|
138: {
|
|
name: '模拟量',
|
|
head: [
|
|
{
|
|
label: '功能码',
|
|
code: 'col1',
|
|
},
|
|
{
|
|
label: '数据类型',
|
|
code: 'col2',
|
|
},
|
|
{
|
|
label: '数据符号',
|
|
code: 'col3',
|
|
},
|
|
{
|
|
label: '寄存器地址',
|
|
code: 'col4',
|
|
},
|
|
],
|
|
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',
|
|
},
|
|
],
|
|
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',
|
|
},
|
|
],
|
|
R0C4: ['01', '02', '03', '04'],
|
|
},
|
|
},
|
|
// IEC104主
|
|
8: {
|
|
//遥测138 ANALOG
|
|
138: {
|
|
name: '模拟量',
|
|
head: [
|
|
{
|
|
label: '信息体地址',
|
|
code: 'ioa',
|
|
},
|
|
],
|
|
},
|
|
//遥控147 CONTROL
|
|
147: {
|
|
name: '遥控量',
|
|
head: [
|
|
{
|
|
label: '信息体地址',
|
|
code: 'ioa',
|
|
},
|
|
],
|
|
},
|
|
//遥调146 SETPOINT
|
|
146: {
|
|
name: '遥调量',
|
|
head: [
|
|
{
|
|
label: '信息体地址',
|
|
code: 'ioa',
|
|
},
|
|
],
|
|
},
|
|
//遥脉139 ACCUMULATOR
|
|
139: {
|
|
name: '累计量',
|
|
head: [
|
|
{
|
|
label: '信息体地址',
|
|
code: 'ioa',
|
|
},
|
|
],
|
|
},
|
|
//遥信140 DISCRETE
|
|
140: {
|
|
name: '离散量',
|
|
head: [
|
|
{
|
|
label: '信息体地址',
|
|
code: 'ioa',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
// IEC104从
|
|
9: {
|
|
//遥测138 ANALOG
|
|
138: {
|
|
name: '模拟量',
|
|
head: [
|
|
{
|
|
label: '是否转发',
|
|
code: 'ts',
|
|
},
|
|
],
|
|
R0C4: ['否--0', '是--1']
|
|
},
|
|
//遥控147 CONTROL
|
|
147: {
|
|
name: '遥控量',
|
|
head: [
|
|
{
|
|
label: '是否转发',
|
|
code: 'ts',
|
|
},
|
|
],
|
|
R0C4: ['否--0', '是--1']
|
|
},
|
|
//遥调146 SETPOINT
|
|
146: {
|
|
name: '遥调量',
|
|
head: [
|
|
{
|
|
label: '是否转发',
|
|
code: 'ts',
|
|
},
|
|
],
|
|
R0C4: ['否--0', '是--1']
|
|
},
|
|
//遥脉139 ACCUMULATOR
|
|
139: {
|
|
name: '累计量',
|
|
head: [
|
|
{
|
|
label: '是否转发',
|
|
code: 'ts',
|
|
},
|
|
],
|
|
R0C4: ['否--0', '是--1']
|
|
},
|
|
//遥信140 DISCRETE
|
|
140: {
|
|
name: '离散量',
|
|
head: [
|
|
{
|
|
label: '是否转发',
|
|
code: 'ts',
|
|
},
|
|
],
|
|
R0C4: ['否--0', '是--1']
|
|
},
|
|
}
|
|
}
|
|
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 = {}
|
|
//#region
|
|
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: 'name',
|
|
},
|
|
3:{
|
|
v: '属性编码',
|
|
s: '1',
|
|
custom: 'code',
|
|
},
|
|
...dynamicData,
|
|
},
|
|
}
|
|
headerData[item] = headerItemData
|
|
})
|
|
//#endregion
|
|
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) => {
|
|
const 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.equipmentId = sheets[item].cellData[key][fieldKey].custom.equipmentId
|
|
sheetData.linkId = workbookData.name
|
|
sheetData[sheetkeyMap[fieldKey]] = sheets[item].cellData[key][fieldKey]?.v ?? ''
|
|
sheetData.type = sheets[item].cellData[key][fieldKey].custom.type
|
|
sheetData.id = sheets[item].cellData[key][fieldKey].custom.id
|
|
continue
|
|
}
|
|
if (fieldKey === '1') {
|
|
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) => {
|
|
console.log(obj)
|
|
|
|
const params = obj.params && obj.params !== '' ? JSON.parse(obj.params) : {}
|
|
obj = { ...obj, ...params }
|
|
const row = index + 1
|
|
result[row] = {}
|
|
Object.keys(obj).forEach((field) => {
|
|
const col = excelCellDataMap[field]
|
|
if (col) {
|
|
let custom: any
|
|
if (col === '0') {
|
|
custom = {}
|
|
custom.equipmentId = obj.equipmentId
|
|
custom.type = item
|
|
custom.id = obj.id
|
|
}
|
|
result[row][col] = { v: obj[field], s: '1', custom }
|
|
}
|
|
})
|
|
})
|
|
resultData[item] = result
|
|
})
|
|
return resultData
|
|
}
|