map/ui/dasadmin/src/views/backend/node/utils.ts
高云鹏 1cbfb80f50 物模型:属性表单添加数据类型验证
链路:测点添加设备编码、属性编码字段
2024-10-18 11:01:39 +08:00

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
}