Commit 7cc8813034836939cc4b46c77c566bbf06c3ae7b

Authored by xp.Huang
2 parents 04bfec3e ad950e67

Merge branch 'ww' into 'main'

feat: complete right data source console

See merge request huang/thingskit-drawio!9
... ... @@ -87,4 +87,7 @@ class ConfigurationNodeApi {
87 87 static updateNodeInfo(data) {
88 88 return defHttp.post('/yt/configuration/node', data)
89 89 }
  90 +
  91 +
  92 +
90 93 }
... ...
... ... @@ -4878,12 +4878,13 @@ DataFormatPanel.prototype.addDataFont = function (container) {
4878 4878 const editor = ui.editor;
4879 4879 const graph = editor.graph;
4880 4880 const ss = ui.getSelectionState();
  4881 + const vertices = ss.vertices || []
4881 4882
4882   - console.log(ss.vertices)
  4883 + console.log(vertices)
4883 4884 /**
4884 4885 * @description 不是单一节点则不进入数据绑定
4885 4886 */
4886   - if (!isSingleNode(ss.vertices)) return
  4887 + if (!isSingleNode(vertices)) return
4887 4888
4888 4889 // 组态id
4889 4890 const configurationId = getRequest().configurationId;
... ... @@ -4891,7 +4892,7 @@ DataFormatPanel.prototype.addDataFont = function (container) {
4891 4892 const currentPageId = ui.currentPage.node;
4892 4893
4893 4894 // 图形的id
4894   - const graphId = ss.vertices[0].id;
  4895 + const graphId = vertices[0].id;
4895 4896
4896 4897 // 解构全局属性layui要用到的模块
4897 4898 const { layer, form, jquery: $ } = layui;
... ... @@ -4914,7 +4915,7 @@ DataFormatPanel.prototype.addDataFont = function (container) {
4914 4915 * @description 选中节点信息来源
4915 4916 * @param {string} nodeInfo.id - 节点ID
4916 4917 */
4917   - const nodeInfo = getNodeInfo(ss.vertices)
  4918 + const nodeInfo = getNodeInfo(vertices)
4918 4919
4919 4920
4920 4921 /**
... ... @@ -5008,15 +5009,16 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5008 5009 },
5009 5010 ];
5010 5011
5011   - const enumDataSourceConst = (() => {
5012   - return {
5013   - ORG_ID: 'orgId',
5014   - DEVICE_ID: 'deviceId',
5015   - SLAVE_DEVICE_ID: 'slaveDeviceId',
5016   - ATTR: 'attr',
5017   - GATEWAY: 'GATEWAY'
5018   - }
5019   - })()
  5012 + const enumDataSourceConst = {
  5013 + ORG_ID: 'orgId',
  5014 + DEVICE_ID: 'deviceId',
  5015 + SLAVE_DEVICE_ID: 'slaveDeviceId',
  5016 + ATTR: 'attr',
  5017 + GATEWAY: 'GATEWAY'
  5018 + }
  5019 +
  5020 + let echoRefreshFn = null
  5021 +
5020 5022
5021 5023
5022 5024 // 获取url的请求参数函数
... ... @@ -5067,12 +5069,16 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5067 5069 /**
5068 5070 * @description 获取节点绑定信息
5069 5071 */
5070   - function getNodeBindInfo() {
  5072 + async function getNodeBindInfo() {
5071 5073 const { id } = nodeInfo
5072   - return ConfigurationNodeApi.getConfigurationInfo('NODE', id)
  5074 + const [err, res] = await to(ConfigurationNodeApi.getConfigurationInfo('NODE', id))
  5075 + currentNodeData = res
  5076 + if (echoRefreshFn && typeof echoRefreshFn === 'function') echoRefreshFn()
5073 5077 }
5074 5078
5075 5079
  5080 +
  5081 +
5076 5082 /**
5077 5083 * @description 生成数据交互面板
5078 5084 * @returns {Array}
... ... @@ -5157,8 +5163,6 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5157 5163 treeProps: {
5158 5164 data: treeList,
5159 5165 onlyIconControl: true,
5160   - onReady(setValue) {
5161   - },
5162 5166 click(node) {
5163 5167 currentCheckedOrgNode = node.data.id
5164 5168 getDevicesByOrgId(node.data.id)
... ... @@ -5262,37 +5266,44 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5262 5266 * @description 数据回显
5263 5267 */
5264 5268 async function echoData() {
5265   - const [err, res] = await to(getNodeBindInfo())
5266   - if (err || !Object.keys(res).length) return
5267   - currentNodeData = res
5268 5269
5269   - echoDataSource()
5270   - echoActionType()
  5270 + echoRefreshFn = () => {
  5271 + echoDataSource()
  5272 + echoActionType()
  5273 + form.render(null, CONTAINER_FILTER)
  5274 + }
  5275 +
  5276 + await getNodeBindInfo()
  5277 +
  5278 +
5271 5279
5272 5280 function echoDataSource() {
5273 5281 const { dataSources = [] } = currentNodeData
5274   - const [ dataSource = {} ] = dataSources
5275   - const { orgId, deviceId, slaveDeviceId, attr: [bindAttr] = [] } = dataSource
  5282 + const [dataSource = {}] = dataSources
  5283 + const { orgId, deviceId, slaveDeviceId, attr } = dataSource
5276 5284 const queue = []
5277 5285 if (orgId) {
5278 5286 currentCheckedOrgNode = orgId
5279 5287 queue.push(() => getDevicesByOrgId(orgId))
5280 5288 }
5281 5289 if (slaveDeviceId) {
5282   - queue.push(() => getSlaveDeviceByMasterDeviceId(orgId, deviceId))
  5290 + queue.push(() => {
  5291 + getSlaveDeviceByMasterDeviceId(orgId, deviceId)
  5292 + $(`#${enumActionEl.SLAVE_DEVICE_EL}`).css({ display: 'block' })
  5293 + })
5283 5294 queue.push(() => getAttrByDeviceId(slaveDeviceId))
5284 5295 } else {
5285 5296 queue.push(() => getAttrByDeviceId(deviceId))
5286 5297 }
5287 5298 Promise.all(queue.map(item => item()))
5288 5299 .finally(() => {
5289   - const orgNode = UseLayUi.findTreeObjectByField(treeList, orgId)
5290   - $(`#${enumActionEl.ORG_EL} input`).parent().find('span').html(orgNode.name)
  5300 + const orgNode = UseLayUi.findTreeObjectByField(treeList, currentCheckedOrgNode)
  5301 + $(`#${enumActionEl.ORG_EL} input[name="${enumDataSourceConst.ORG_ID}"]`).parent().find('span').html(orgNode?.name)
5291 5302 form.val(CONTAINER_FILTER, {
5292 5303 orgId,
5293 5304 deviceId,
5294 5305 slaveDeviceId,
5295   - attr: bindAttr
  5306 + attr
5296 5307 })
5297 5308 })
5298 5309 }
... ... @@ -5301,11 +5312,8 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5301 5312 const all = [...(currentNodeData.act ?? []), ...(currentNodeData.event ?? [])]
5302 5313 const actionType = {}
5303 5314 for (const item of all) {
5304   - if (!item.enabled) {
5305   - actionType[item.type] = 'on'
5306   - }
  5315 + actionType[item.type] = item.enabled
5307 5316 }
5308   - console.log(actionType)
5309 5317 form.val(CONTAINER_FILTER, actionType)
5310 5318 }
5311 5319 }
... ... @@ -5321,8 +5329,6 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5321 5329
5322 5330 $(container).append(fragment)
5323 5331
5324   - UseLayUi.nextTick(() => form.render(null, CONTAINER_FILTER))
5325   -
5326 5332 }
5327 5333 mount()
5328 5334
... ... @@ -5370,37 +5376,38 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5370 5376 const panel = createPanel()
5371 5377 $(panel).addClass('data-source__submit-panel').append(`<button type="button" lay-submit lay-filter="formDataSource" class="layui-btn">保存</button>`)
5372 5378 $(container).append(panel)
5373   - form.on('submit(formDataSource)', function (data) {
  5379 + form.on('submit(formDataSource)', async function (data) {
5374 5380 const ENABLED_FLAG = 'on'
5375 5381 const { field } = data
5376   - const value = { [enumCategory.ACT]: [], [enumCategory.EVENT]: [], [enumCategory.DATA_SOURCE]: [] }
  5382 + const value = {
  5383 + configurationId,
  5384 + contentId: currentPageId.id,
  5385 + nodeId: graphId,
  5386 + [enumCategory.ACT]: [],
  5387 + [enumCategory.EVENT]: [],
  5388 + [enumCategory.DATA_SOURCE]: {
  5389 + [enumDataSourceConst.ORG_ID]: field[enumDataSourceConst.ORG_ID],
  5390 + [enumDataSourceConst.DEVICE_ID]: field[enumDataSourceConst.DEVICE_ID],
  5391 + ...(field[enumDataSourceConst.SLAVE_DEVICE_ID] && { [enumDataSourceConst.SLAVE_DEVICE_ID]: field[enumDataSourceConst.SLAVE_DEVICE_ID] }),
  5392 + [enumDataSourceConst.ATTR]: field[enumDataSourceConst.ATTR],
  5393 + }
  5394 + }
5377 5395 const allType = [...interactionList, ...dynamicEffectList]
5378 5396 for (const item of allType) {
5379 5397 if (field[item.type] === ENABLED_FLAG) {
5380 5398 const enableItem = currentNodeData[item.category].find(each => each.type === item.type)
5381 5399 if (!enableItem) continue
5382 5400 value[item.category].push({
5383   - configurationId,
5384   - contentId: currentPageId.id,
5385   - id: graphId,
5386 5401 type: item.type,
5387 5402 enabled: true
5388 5403 })
5389 5404 }
5390 5405 }
5391   - value[enumCategory.DATA_SOURCE].push({
5392   - [enumDataSourceConst.ORG_ID]: field[enumDataSourceConst.ORG_ID],
5393   - [enumDataSourceConst.DEVICE_ID]: field[enumDataSourceConst.DEVICE_ID],
5394   - [enumDataSourceConst.SLAVE_DEVICE_ID]: field[enumDataSourceConst.SLAVE_DEVICE_ID],
5395   - [enumDataSourceConst.ATTR]: [field[enumDataSourceConst.ATTR]],
5396   - })
5397 5406
5398   - ConfigurationNodeApi.updateNodeInfo(value)
5399   - .then(res => {
5400   - console.log(res)
5401   - }).catch(err => {
5402   - console.log(err)
5403   - })
  5407 + const [err, res] = await to(ConfigurationNodeApi.updateNodeInfo(value))
  5408 + if (err) return
  5409 + UseLayUi.successMsg()
  5410 + await getNodeBindInfo()
5404 5411 return false;
5405 5412 });
5406 5413 }
... ... @@ -5415,18 +5422,41 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5415 5422 return
5416 5423 }
5417 5424 // 事件类型
5418   - const eventType = {
  5425 + const enumenumEventType = {
5419 5426 DOWN: "按下",
5420 5427 UP: "抬起",
5421 5428 SINGLE: "单击",
5422 5429 DOUBLE: "双击",
5423 5430 };
5424 5431
5425   - /**
5426   - * @description 表格表体
5427   - * @type {string}
5428   - */
5429   - const deviceDataTbody = 'deviceDataTbody'
  5432 + const enumActionEl = {
  5433 + /**
  5434 + * @description 表体节点
  5435 + */
  5436 + DEVICE_DATA_BODY_EL: 'deviceDataTbody',
  5437 +
  5438 + /**
  5439 + * @description 删除行节点
  5440 + */
  5441 + DEL_ROW_EL: 'deleteRow',
  5442 +
  5443 + /**
  5444 + * @description 增加行节点
  5445 + */
  5446 + ADD_ROW_EL: 'addRow',
  5447 +
  5448 + /**
  5449 + * @descripton
  5450 + */
  5451 + ROW_FILTER: 'interactionRowFilter',
  5452 +
  5453 + /**
  5454 + * @description 弹出层保存 filter
  5455 + */
  5456 + LAYER_SUBMIT_FILTER: 'interactionLayerSubmit'
  5457 + }
  5458 +
  5459 +
5430 5460
5431 5461 /**
5432 5462 * @description 所有设备选项
... ... @@ -5436,25 +5466,25 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5436 5466
5437 5467 let addRowNumber = 0
5438 5468
5439   - const rowFormList = []
  5469 + const getRowFilter = (rowNumber) => `${enumActionEl.ROW_FILTER}${rowNumber}`
5440 5470
5441 5471 /**
5442 5472 * @description 枚举常量
5443   - * @enum DEVICE -
  5473 + * @enum DEVICE
5444 5474 */
5445 5475 const enumConst = {
5446 5476 /**
5447 5477 * @description 设备
5448 5478 */
5449   - DEVICE: 'device',
  5479 + DEVICE: 'deviceId',
5450 5480 /**
5451 5481 * @description 子设备
5452 5482 */
5453   - CHILD_DEVICE: 'childDevice',
  5483 + SLAVE_DEVICE: 'slaveDeviceId',
5454 5484 /**
5455 5485 * @description 变量
5456 5486 */
5457   - VARIABLE: 'variable',
  5487 + ATTR: 'attr',
5458 5488 /**
5459 5489 * @description 下发值
5460 5490 */
... ... @@ -5464,39 +5494,36 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5464 5494 /**
5465 5495 * @description 创建回显数据 查询出所有网关设备和直连设备
5466 5496 */
5467   - function getAllDevice() {
  5497 + async function getMaterDevice() {
5468 5498 if (!currentCheckedOrgNode) return
5469   - ConfigurationNodeApi.getMasterDevice(currentCheckedOrgNode)
5470   - .then(res => {
5471   - allDeviceOptions = res
5472   - setDeviceOptions()
5473   - })
  5499 + const [err, res] = await to(ConfigurationNodeApi.getMasterDevice(currentCheckedOrgNode))
  5500 + allDeviceOptions = res
5474 5501 }
5475 5502
5476 5503 function addRecord() {
5477   - addRowNumber++
5478   - rowFormList.push(addRowNumber)
5479 5504 const content = `
5480   - <tr class="layui-form" lay-filter="deviceDataRow${addRowNumber}">
  5505 + <tr class="layui-form" lay-filter="${enumActionEl.ROW_FILTER}${addRowNumber}">
5481 5506 <td>
5482   - <select name="${enumConst.DEVICE}" lay-filter="device" lay-verify="required"></select>
  5507 + <select name="${enumConst.DEVICE}" lay-filter="${enumConst.DEVICE}" lay-verType="tips" lay-verify="required"></select>
5483 5508 </td>
5484 5509 <td>
5485   - <select name="${enumConst.CHILD_DEVICE}" lay-filter="childDevice" lay-verify="required" ></select>
  5510 + <select name="${enumConst.SLAVE_DEVICE}" lay-filter="${enumConst.SLAVE_DEVICE}" lay-verType="tips"></select>
5486 5511 </td>
5487 5512 <td>
5488   - <select name="${enumConst.VARIABLE}" lay-verify="required"></select>
  5513 + <select name="${enumConst.ATTR}" lay-verType="tips" lay-verify="required"></select>
5489 5514 </td>
5490 5515 <td>
5491   - <textarea name="${enumConst.VALUE}" placeholder="请输入命令" class="layui-textarea" ></textarea>
  5516 + <textarea name="${enumConst.VALUE}" placeholder="请输入命令" lay-verType="tips" class="layui-textarea" ></textarea>
5492 5517 </td>
5493 5518 <td>
5494   - <button type="button" class="layui-btn layui-btn-primary layui-border-red deleteRow">删除</button>
  5519 + <button type="button" class="layui-btn layui-btn-primary layui-border-red ${enumActionEl.DEL_ROW_EL}">删除</button>
5495 5520 </td>
5496 5521 </tr>
5497 5522 `
5498   - $('#deviceDataTbody').append(content)
5499   - form.render(null, `deviceDataRow${addRowNumber}`)
  5523 + $(`#${enumActionEl.DEVICE_DATA_BODY_EL}`).append(content)
  5524 + setDeviceOptions(addRowNumber)
  5525 + form.render('select', getRowFilter(addRowNumber))
  5526 + addRowNumber++
5500 5527 }
5501 5528
5502 5529 /**
... ... @@ -5507,8 +5534,8 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5507 5534 const [err, res] = await to(ConfigurationNodeApi.getDeviceAttr(data.value))
5508 5535 if (!res) return
5509 5536 const generateOption = UseLayUi.generateOptionTemplate({ dataSource: res })
5510   - $(data.elem).parents('tr').find(`select[name="${enumConst.VARIABLE}"]`).html(generateOption)
5511   - UseLayUi.nextTick(() => form.render())
  5537 + $(data.elem).parents('tr').find(`select[name="${enumConst.ATTR}"]`).html(generateOption)
  5538 + form.render('select')
5512 5539 }
5513 5540
5514 5541 /**
... ... @@ -5521,14 +5548,14 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5521 5548 if (isGATEWAY && data.value) {
5522 5549 const [err, res] = await to(ConfigurationNodeApi.getSlaveDevice(currentCheckedOrgNode, data.value))
5523 5550 if (!res) return
5524   - const generateOption = UseLayUi.generateOptionTemplate({ dataSource: res.items })
5525   - $(data.elem).parents('tr').find(`select[name="${enumConst.CHILD_DEVICE}"]`).html(generateOption)
  5551 + const generateOption = UseLayUi.generateOptionTemplate({ dataSource: res })
  5552 + $(data.elem).parents('tr').find(`select[name="${enumConst.SLAVE_DEVICE}"]`).html(generateOption)
5526 5553 } else {
5527 5554 updateVariableOptions(data)
5528 5555 }
5529   - UseLayUi.nextTick(() => form.render())
  5556 + form.render('select')
5530 5557 })
5531   - form.on(`select(${enumConst.CHILD_DEVICE})`, (data) => {
  5558 + form.on(`select(${enumConst.SLAVE_DEVICE})`, (data) => {
5532 5559 updateVariableOptions(data)
5533 5560 })
5534 5561 }
... ... @@ -5537,7 +5564,7 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5537 5564 * @description 删除行
5538 5565 */
5539 5566 function createDeleteRowListenEvent() {
5540   - $('.deleteRow').click((event) => {
  5567 + $(`.${enumActionEl.DEL_ROW_EL}`).click((event) => {
5541 5568 $(event.target).parents('tr').remove()
5542 5569 })
5543 5570 }
... ... @@ -5546,21 +5573,21 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5546 5573 * @description 新增行
5547 5574 */
5548 5575 function createAddRowListenEvent() {
5549   - $('#addRow').click(() => {
  5576 + $(`#${enumActionEl.ADD_ROW_EL}`).click(() => {
5550 5577 addRecord()
5551 5578 const generateOption = UseLayUi.generateOptionTemplate({ dataSource: allDeviceOptions })
5552   - $(`#${deviceDataTbody} tr`).last().find(`select[name="${enumConst.DEVICE}"]`).html(generateOption)
  5579 + $(`#${enumActionEl.DEVICE_DATA_BODY_EL} tr`).last().find(`select[name="${enumConst.DEVICE}"]`).html(generateOption)
5553 5580 createDeleteRowListenEvent()
5554   - form.render()
  5581 + form.render('select')
5555 5582 })
5556 5583 }
5557 5584
5558 5585 /**
5559 5586 * @description 设置设备选项
5560 5587 */
5561   - function setDeviceOptions() {
  5588 + function setDeviceOptions(row) {
5562 5589 const generateOption = UseLayUi.generateOptionTemplate({ dataSource: allDeviceOptions })
5563   - $(`#${deviceDataTbody}`).find(`select[name="${enumConst.DEVICE}"]`).html(generateOption)
  5590 + $(`#${enumActionEl.DEVICE_DATA_BODY_EL} tr[lay-filter="${getRowFilter(row)}"]`).find(`select[name="${enumConst.DEVICE}"]`).html(generateOption)
5564 5591 }
5565 5592
5566 5593 /**
... ... @@ -5580,52 +5607,23 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5580 5607 */
5581 5608 function mountSelectOptions(row, key, data) {
5582 5609 const generateOption = UseLayUi.generateOptionTemplate({ dataSource: data })
5583   - $(`#${deviceDataTbody}`).find(`tr[lay-filter="deviceDataRow${row}"] select[name="${key}"]`).html(generateOption)
  5610 + $(`#${enumActionEl.DEVICE_DATA_BODY_EL}`).find(`tr[lay-filter="${getRowFilter(row)}"] select[name="${key}"]`).html(generateOption)
5584 5611 }
5585 5612
5586 5613 /**
5587   - * @description 设置select val
5588   - * @param row
5589   - * @param key
5590   - * @param val
  5614 + * @description 根据主设备ID获取从设备
5591 5615 */
5592   - function setSelectVal(row, key, val) {
5593   - $(`#${deviceDataTbody}`).find(`tr[lay-filter="deviceDataRow${row}"] select[name="${key}"]`).val(val)
  5616 + async function getSlaveDeviceByMasterDevice(deviceId, row) {
  5617 + const res = await ConfigurationNodeApi.getSlaveDevice(currentCheckedOrgNode, deviceId)
  5618 + mountSelectOptions(row, enumConst.SLAVE_DEVICE, res)
5594 5619 }
5595 5620
5596 5621 /**
5597   - * @description 处理每条回显数据
5598   - * @param datum
5599   - * @returns {Promise<void>}
  5622 + * @description 根据设备ID获取设备属性
5600 5623 */
5601   - async function handleEachDataEcho(datum) {
5602   -
5603   - addRecord()
5604   - setDeviceOptions()
5605   - const currentRow = addRowNumber
5606   -
5607   - const childDeviceId = datum[enumConst.CHILD_DEVICE]
5608   - const deviceId = datum[enumConst.DEVICE]
5609   - const variable = datum[enumConst.VARIABLE]
5610   - let findId = deviceId
5611   -
5612   - /**
5613   - * @description 存在子设备请求子设备列表
5614   - */
5615   - if (childDeviceId && deviceId) {
5616   - findId = childDeviceId
5617   - ConfigurationNodeApi.getSlaveDevice(currentCheckedOrgNode, deviceId)
5618   - .then(res => {
5619   - mountSelectOptions(currentRow, enumConst.CHILD_DEVICE, res.items)
5620   - setSelectVal(currentRow, enumConst.CHILD_DEVICE, childDeviceId)
5621   - form.val(`deviceDataRow${currentRow}`, datum)
5622   - })
5623   - }
5624   - deviceId && ConfigurationNodeApi.getDeviceAttr(findId).then(res => {
5625   - mountSelectOptions(currentRow, enumConst.VARIABLE, res)
5626   - setSelectVal(currentRow, enumConst.CHILD_DEVICE, variable)
5627   - form.val(`deviceDataRow${currentRow}`, datum)
5628   - })
  5624 + async function getDeviceAttrByDeviceId(deviceId, row) {
  5625 + const res = await ConfigurationNodeApi.getDeviceAttr(deviceId)
  5626 + mountSelectOptions(row, enumConst.ATTR, res)
5629 5627 }
5630 5628
5631 5629 /**
... ... @@ -5633,16 +5631,37 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5633 5631 */
5634 5632 function echoFormData(info) {
5635 5633 const { content: { data = [] } = {} } = info
5636   - for (const datum of data) {
5637   - handleEachDataEcho(datum)
  5634 + data.forEach((datum, index) => echoEachData(datum, index))
  5635 + }
  5636 +
  5637 + /**
  5638 + * @description 回显每条数据
  5639 + */
  5640 + function echoEachData(datum = {}, row) {
  5641 + addRecord()
  5642 + const deviceId = datum[enumConst.DEVICE]
  5643 + const slaveDeviceId = datum[enumConst.SLAVE_DEVICE]
  5644 + const queue = []
  5645 +
  5646 + if (slaveDeviceId) {
  5647 + queue.push(() => getSlaveDeviceByMasterDevice(deviceId, row))
  5648 + queue.push(() => getDeviceAttrByDeviceId(slaveDeviceId, row))
  5649 + } else {
  5650 + queue.push(() => getDeviceAttrByDeviceId(deviceId, row))
5638 5651 }
  5652 +
  5653 + Promise
  5654 + .all(queue.map(item => item()))
  5655 + .finally(() => {
  5656 + form.val(getRowFilter(row), datum)
  5657 + })
5639 5658 }
5640 5659
5641 5660 /**
5642 5661 * @description 保存
5643 5662 */
5644   - function submit() {
5645   - const data = rowFormList.map(rowNumber => form.val(`deviceDataRow${rowNumber}`)).filter(item => Object.keys(item).length)
  5663 + async function submit(callback) {
  5664 + const data = Array.from({ length: addRowNumber }).map((_, row) => form.val(getRowFilter(row))).filter(item => Object.keys(item).length)
5646 5665 const formModal = {
5647 5666 configurationId,
5648 5667 contentId: currentPageId.id,
... ... @@ -5652,7 +5671,10 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5652 5671 },
5653 5672 type: event.data.type
5654 5673 };
5655   - ConfigurationNodeApi.updateNodeEvent(formModal)
  5674 + const [err, res] = await to(ConfigurationNodeApi.updateNodeEvent(formModal))
  5675 + if (err) return
  5676 + UseLayUi.successMsg()
  5677 + callback()
5656 5678 }
5657 5679
5658 5680 /**
... ... @@ -5666,7 +5688,7 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5666 5688 <div class="layui-form-item">
5667 5689 <label class="layui-form-label">事件</label>
5668 5690 <div class="layui-input-block">
5669   - <input type="text" name="event" class="layui-input" value="${eventType[type]}" disabled>
  5691 + <input type="text" name="event" class="layui-input" value="${enumenumEventType[type]}" disabled>
5670 5692 </div>
5671 5693 </div>
5672 5694 <div class="layui-form-item">
... ... @@ -5685,12 +5707,12 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5685 5707 </div>
5686 5708 </div>
5687 5709 </div>
5688   - <div style="height:255px;" id="tableContent">
  5710 + <div id="tableContent">
5689 5711 <table class="layui-table" >
5690 5712 <colgroup>
5691   - <col>
5692   - <col>
5693   - <col>
  5713 + <col width="240">
  5714 + <col width="240">
  5715 + <col width="240">
5694 5716 <col width="240">
5695 5717 <col width="60">
5696 5718 </colgroup>
... ... @@ -5703,10 +5725,10 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5703 5725 <th style="text-align:center">操作</th>
5704 5726 </tr>
5705 5727 </thead>
5706   - <tbody id="${deviceDataTbody}"></tbody>
  5728 + <tbody id="${enumActionEl.DEVICE_DATA_BODY_EL}"></tbody>
5707 5729 </table>
5708 5730 <div style="display:flex;justify-content:center;">
5709   - <button type="button" class="layui-btn layui-btn-primary layui-border-blue" id="addRow">添加一条</button>
  5731 + <button type="button" class="layui-btn layui-btn-primary layui-border-blue" id="${enumActionEl.ADD_ROW_EL}">添加一条</button>
5710 5732 </div>
5711 5733 </div>
5712 5734 </form>`
... ... @@ -5716,21 +5738,23 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5716 5738 content,
5717 5739 skin: 'event-layer__override',
5718 5740 // area: ["800px", "600px"],
5719   - area: '800px',
  5741 + area: '1100px',
5720 5742 btn: ["保存", "取消"],
5721 5743 shade: ["0.7", "#fafafa"],
5722   - async yes(index, layero) {
5723   - await submit()
5724   - layer.close(index)
5725   - const [err, res] = await to(getNodeBindInfo())
5726   - if (err || !Object.keys(res).length) return
5727   - currentNodeData = res
  5744 + yes(index) {
  5745 + form.on(`submit(${enumActionEl.LAYER_SUBMIT_FILTER})`, data => {
  5746 + submit(() => {
  5747 + layer.close(index)
  5748 + getNodeBindInfo()
  5749 + })
  5750 + })
5728 5751 },
5729 5752 but2(index, layero) {
5730   -
  5753 + return false
5731 5754 },
5732   - success(layero, index) {
5733   - getAllDevice()
  5755 + async success(layero, index) {
  5756 + $(layero).addClass('layui-form').find('.layui-layer-btn0').attr({ 'lay-submit': '', 'lay-filter': enumActionEl.LAYER_SUBMIT_FILTER })
  5757 + await getMaterDevice()
5734 5758 const info = getLayerBindInfo('event', type)
5735 5759 if (!info) {
5736 5760 addRecord()
... ... @@ -5751,7 +5775,7 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5751 5775 */
5752 5776 function handleClickOrDbClick(event) {
5753 5777
5754   - const eventType = {
  5778 + const enumEventType = {
5755 5779 DOWN: "按下",
5756 5780 UP: "抬起",
5757 5781 SINGLE: "单击",
... ... @@ -5802,6 +5826,11 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5802 5826 * @description 页面 ID
5803 5827 */
5804 5828 PAGE_EL_ID: 'dynamicInputPage',
  5829 +
  5830 + /**
  5831 + * @description layer submit filter
  5832 + */
  5833 + LAYER_SUBMIT_FILTER: 'dynamicLinkLayerFilter'
5805 5834 }
5806 5835
5807 5836 /**
... ... @@ -5837,6 +5866,7 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5837 5866 }
5838 5867 const [err] = await to(ConfigurationNodeApi.updateNodeEvent(data))
5839 5868 if (err) return
  5869 + UseLayUi.successMsg()
5840 5870 callback()
5841 5871 }
5842 5872
... ... @@ -5884,13 +5914,13 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5884 5914 <div class="layui-form-item">
5885 5915 <label class="layui-form-label">事件</label>
5886 5916 <div class="layui-input-block">
5887   - <input type="text" name="${enumConst.EVENT}" disabled class="layui-input" value="${eventType[type]}">
  5917 + <input type="text" name="${enumConst.EVENT}" disabled class="layui-input" value="${enumEventType[type]}">
5888 5918 </div>
5889 5919 </div>
5890 5920 <div class="layui-form-item">
5891 5921 <label class="layui-form-label">动作</label>
5892 5922 <div class="layui-input-block">
5893   - <select name="${enumConst.ACTION}" lay-verify="required" lay-filter="${enumActionEl.ACTION_SELECT_FILTER}">
  5923 + <select name="${enumConst.ACTION}" lay-verType="tips" lay-verify="required" lay-filter="${enumActionEl.ACTION_SELECT_FILTER}">
5894 5924 ${generatorActionOptions()}
5895 5925 </select>
5896 5926 </div>
... ... @@ -5898,13 +5928,13 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5898 5928 <div class="layui-form-item" id="${enumActionEl.LINK_EL_ID}">
5899 5929 <label class="layui-form-label">链接</label>
5900 5930 <div class="layui-input-block">
5901   - <input type="text" name="${enumConst.LINK_VALUE}" class="layui-input">
  5931 + <input type="text" lay-verType="tips" name="${enumConst.LINK_VALUE}" class="layui-input">
5902 5932 </div>
5903 5933 </div>
5904 5934 <div class="layui-form-item" id="${enumActionEl.PAGE_EL_ID}" style="display:none">
5905 5935 <label class="layui-form-label">页面</label>
5906 5936 <div class="layui-input-block">
5907   - <select name="${enumConst.PAGE_VALUE}" lay-verify="required" id="pageSelect">
  5937 + <select name="${enumConst.PAGE_VALUE}" lay-verType="tips" id="pageSelect">
5908 5938 ${generatorPageOptions()}
5909 5939 </select>
5910 5940 </div>
... ... @@ -5920,13 +5950,19 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5920 5950 content,
5921 5951 area: ["800px", "500px"],
5922 5952 btn: ["保存", "取消"],
5923   - async yes(index) {
5924   - submit(() => layer.close(index))
  5953 + yes(index) {
  5954 + form.on(`submit(${enumActionEl.LAYER_SUBMIT_FILTER})`, data => {
  5955 + submit(() => {
  5956 + layer.close(index)
  5957 + getNodeBindInfo()
  5958 + })
  5959 + })
5925 5960 },
5926 5961 btn2(index) {
5927 5962 layer.close(index);
5928 5963 },
5929   - success() {
  5964 + success(layero) {
  5965 + $(layero).addClass('layui-form').find('.layui-layer-btn0').attr({ 'lay-submit': '', 'lay-filter': enumActionEl.LAYER_SUBMIT_FILTER })
5930 5966 generatorEventListen()
5931 5967 const info = getLayerBindInfo('event', type)
5932 5968 form.render(null, enumActionEl.FORM_FILTER)
... ... @@ -5946,7 +5982,7 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5946 5982
5947 5983 const IS_DISPLAY = event.data.type === 'DISPLAY'
5948 5984
5949   - const eventType = {
  5985 + const enumEventType = {
5950 5986 FLASH: '闪烁',
5951 5987 DISPLAY: '显示/隐藏',
5952 5988 ROTATE: '旋转',
... ... @@ -5964,7 +6000,8 @@ DataFormatPanel.prototype.addDataFont = function (container) {
5964 6000 ATTR_EL: 'dataDynamicEffectAtt',
5965 6001 DEL_BTN_EL: 'dataDynamicEffectDelBtn',
5966 6002 ADD_BTN_EL: 'dataDynamicEffectAddBtn',
5967   - DISPLAY_SWITCH_EL: 'visibleOrHidden'
  6003 + DISPLAY_SWITCH_EL: 'visibleOrHidden',
  6004 + LAYER_SUBMIT_FILTER: 'dynamicEffectLayerFilter'
5968 6005 }
5969 6006
5970 6007 const getRowFilter = (rowNumber) => `${enumActionEl.ROW_FILTER}${rowNumber}`
... ... @@ -6012,8 +6049,6 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6012 6049 treeProps: {
6013 6050 data: treeList,
6014 6051 onlyIconControl: true,
6015   - onReady(setValue) {
6016   - },
6017 6052 click(node) {
6018 6053 currentOrgId = node.data.id
6019 6054 getDeviceByOrg(node.data.id)
... ... @@ -6084,10 +6119,10 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6084 6119 <tr class="layui-form" lay-filter="${getRowFilter(addRowNumber)}">
6085 6120 ${IS_DISPLAY && `<td>${generatorDisplayOptions()}</td>`}
6086 6121 <td>
6087   - <input type="text" name="${enumConst.MIN}" class="layui-input">
  6122 + <input lay-verType="tips" lay-verify="required" type="text" name="${enumConst.MIN}" class="layui-input">
6088 6123 </td>
6089 6124 <td>
6090   - <input type="text" name="${enumConst.MAX}" class="layui-input">
  6125 + <input lay-verType="tips" lay-verify="required" type="text" name="${enumConst.MAX}" class="layui-input">
6091 6126 </td>
6092 6127 <td style="text-align: center;">
6093 6128 <button type="button" class="layui-btn layui-btn-primary layui-border-red ${enumActionEl.DEL_BTN_EL}">删除</button>
... ... @@ -6158,15 +6193,18 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6158 6193 const { slaveDeviceId, deviceId, attr, orgId, condition = [] } = info
6159 6194 echoEachData(condition)
6160 6195 echoOrgTree(orgId)
6161   - const queue = [getDeviceByOrg(orgId)]
  6196 + const queue = []
  6197 + if (orgId) {
  6198 + queue.push(() => getDeviceByOrg(orgId))
  6199 + }
6162 6200 if (slaveDeviceId) {
6163 6201 $(`#${enumActionEl.SLAVE_DEVICE_EL}`).css({ display: 'block' })
6164   - queue.push(getSlaveDeviceByMasterDevice(orgId, deviceId))
6165   - queue.push(getAttrsByDevice(slaveDeviceId))
  6202 + queue.push(() => getSlaveDeviceByMasterDevice(orgId, deviceId))
  6203 + queue.push(() => getAttrsByDevice(slaveDeviceId))
6166 6204 } else {
6167   - queue.push(getAttrsByDevice(deviceId))
  6205 + queue.push(() => getAttrsByDevice(deviceId))
6168 6206 }
6169   - Promise.all(queue).finally(() => {
  6207 + Promise.all(queue.map(item => item())).finally(() => {
6170 6208 form.val(enumActionEl.FORM_FILTER, { slaveDeviceId, deviceId, attr, orgId })
6171 6209 })
6172 6210 }
... ... @@ -6186,7 +6224,6 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6186 6224 */
6187 6225 function echoOrgTree(id) {
6188 6226 const node = UseLayUi.findTreeObjectByField(treeList, id)
6189   - console.log($(`#${enumActionEl.ORG_EL}`).find(`input[name="${enumConst.ORG_ID}"]`).parent().find('span'))
6190 6227 $(`#${enumActionEl.ORG_EL}`).find(`input[name="${enumConst.ORG_ID}"]`).parent().find('span').html(node.name)
6191 6228 }
6192 6229
... ... @@ -6202,7 +6239,9 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6202 6239 type: event.data.type
6203 6240 }
6204 6241 const [err, res] = await to(ConfigurationNodeApi.updateNodeAct(formModel))
6205   - if (!err) callback()
  6242 + if (err) return
  6243 + UseLayUi.successMsg()
  6244 + callback()
6206 6245 }
6207 6246
6208 6247
... ... @@ -6223,7 +6262,7 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6223 6262 <div class="layui-form-item" id="${enumActionEl.DEVICE_EL}">
6224 6263 <label class="layui-form-label">设备</label>
6225 6264 <div class="layui-input-block">
6226   - <select name="${enumConst.DEVICE_ID}" lay-verify="required" lay-filter="${enumActionEl.DEVICE_EL}">
  6265 + <select name="${enumConst.DEVICE_ID}" lay-verType="tips" lay-verify="required" lay-filter="${enumActionEl.DEVICE_EL}">
6227 6266 </select>
6228 6267 </div>
6229 6268 </div>
... ... @@ -6231,7 +6270,7 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6231 6270 <div class="layui-form-item" id="${enumActionEl.SLAVE_DEVICE_EL}" style="display: none">
6232 6271 <label class="layui-form-label">子设备</label>
6233 6272 <div class="layui-input-block">
6234   - <select name="${enumConst.SLAVE_DEVICE_ID}" lay-verify="required" lay-filter="${enumActionEl.SLAVE_DEVICE_EL}">
  6273 + <select name="${enumConst.SLAVE_DEVICE_ID}" lay-verType="tips" lay-filter="${enumActionEl.SLAVE_DEVICE_EL}">
6235 6274 </select>
6236 6275 </div>
6237 6276 </div>
... ... @@ -6239,7 +6278,7 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6239 6278 <div class="layui-form-item" id="${enumActionEl.ATTR_EL}">
6240 6279 <label class="layui-form-label">属性</label>
6241 6280 <div class="layui-input-block">
6242   - <select name="${enumConst.ATTR}" lay-verify="required" lay-filter="${enumActionEl.ATTR_EL}"></select>
  6281 + <select name="${enumConst.ATTR}" lay-verType="tips" lay-verify="required" lay-filter="${enumActionEl.ATTR_EL}"></select>
6243 6282 </div>
6244 6283 </div>
6245 6284 </div>
... ... @@ -6269,12 +6308,13 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6269 6308 `
6270 6309
6271 6310 layer.open({
6272   - title: eventType[type],
  6311 + title: enumEventType[type],
6273 6312 content,
6274 6313 skin: 'event-layer__override',
6275 6314 btn: ['保存', '取消'],
6276   - area: [IS_DISPLAY ? '1000px' : '800PX', '500px'],
6277   - success() {
  6315 + area: IS_DISPLAY ? '1000px' : '800PX',
  6316 + success(layero) {
  6317 + $(layero).addClass('layui-form').find('.layui-layer-btn0').attr({ 'lay-submit': '', 'lay-filter': enumActionEl.LAYER_SUBMIT_FILTER })
6278 6318 generatorOrgTreeSelect()
6279 6319 const info = getLayerBindInfo('act', type)
6280 6320 if (info) {
... ... @@ -6286,7 +6326,12 @@ DataFormatPanel.prototype.addDataFont = function (container) {
6286 6326 form.render()
6287 6327 },
6288 6328 yes(index) {
6289   - submit(() => layer.close(index))
  6329 + form.on(`submit(${enumActionEl.LAYER_SUBMIT_FILTER})`, data => {
  6330 + submit(() => {
  6331 + layer.close(index)
  6332 + getNodeBindInfo()
  6333 + })
  6334 + })
6290 6335 },
6291 6336 btn2() {
6292 6337
... ... @@ -10332,6 +10377,11 @@ class UseLayUi {
10332 10377
10333 10378 template = singleUsage ? UseLayUi.createSingleUseFormItem(template) : template
10334 10379
  10380 + /**
  10381 + * @description 设置下拉树值
  10382 + * @param {string} id - layui tree 树形结构 title字段
  10383 + * @param {string} title - layui tree 树形结构 id字段
  10384 + */
10335 10385 function setValue({ id, title }) {
10336 10386 $(elem)
10337 10387 .find('.layui-form-select').removeClass('layui-form-selected').end()
... ... @@ -10349,7 +10399,7 @@ class UseLayUi {
10349 10399 tree.render({
10350 10400 ...treeProps,
10351 10401 ...(autoFormatDataSource ? { data: UseLayUi.formatTreeDataSource(data, customSetTree, valueField, labelField, childrenField) } : {}),
10352   - elem: `#${layFilter}`,
  10402 + elem: $(elem).find(`#${layFilter}`),
10353 10403 click(node) {
10354 10404 setValue(node.data)
10355 10405 if (UseLayUi.isFunction(click)) click(node)
... ... @@ -10492,6 +10542,14 @@ class UseLayUi {
10492 10542 })
10493 10543 }
10494 10544
  10545 + static msg(msg, options) {
  10546 + const { layer } = layui
  10547 + layer.msg(msg, options)
  10548 + }
  10549 +
  10550 + static successMsg(msg = '操作成功', options) {
  10551 + UseLayUi.msg(msg, { ...options, icon: 6 })
  10552 + }
10495 10553
10496 10554 }
10497 10555
... ... @@ -10512,3 +10570,257 @@ function to(promise, errorExt) {
10512 10570 return [err, undefined]
10513 10571 })
10514 10572 }
  10573 +
  10574 +
  10575 +class Ws {
  10576 + /**
  10577 + * @description url 连接地址
  10578 + */
  10579 + url
  10580 +
  10581 + /**
  10582 + * @description 协议
  10583 + */
  10584 + protocols
  10585 +
  10586 + /**
  10587 + * @description socket 实例
  10588 + * @type {WebSocket}
  10589 + */
  10590 + ws
  10591 +
  10592 + /**
  10593 + * @description 重连标志
  10594 + * @type {boolean}
  10595 + */
  10596 + isReconnectionLoading = false
  10597 +
  10598 + /**
  10599 + * @description 重连定时器
  10600 + */
  10601 + timeId = null
  10602 +
  10603 + /**
  10604 + * @description 手动关闭标志位
  10605 + * @type {boolean}
  10606 + */
  10607 + isCustomClose = false
  10608 +
  10609 + /**
  10610 + * @description 消息队列 重新连接后会将之前断开期间发送的消息重新推送
  10611 + * @type {Array}
  10612 + */
  10613 + errorStack = []
  10614 +
  10615 + /**
  10616 + * @description 创建websocket实例
  10617 + * @params {string} url - 连接路径
  10618 + * @params {string} protocols - 协议
  10619 + */
  10620 + constructor(url, protocols) {
  10621 + this.url = url
  10622 + this.protocols = protocols
  10623 + this.createWs()
  10624 + }
  10625 +
  10626 + /**
  10627 + * @description
  10628 + */
  10629 + createWs() {
  10630 + this.ws = new WebSocket(this.url, this.protocols)
  10631 + this.onopen()
  10632 + this.onerror()
  10633 + this.onclose()
  10634 + this.onmessage()
  10635 + }
  10636 +
  10637 + /**
  10638 + * @description 建立连接时
  10639 + */
  10640 + onopen() {
  10641 + this.ws.onopen = () => {
  10642 + console.log(this.ws, 'onopen')
  10643 + this.errorStack.forEach(message => {
  10644 + this.send(message)
  10645 + })
  10646 + this.errorStack = []
  10647 + this.isReconnectionLoading = false
  10648 + }
  10649 + }
  10650 +
  10651 + /**
  10652 + * @description 连接发生错误
  10653 + */
  10654 + onerror() {
  10655 + this.ws.onerror = (err) => {
  10656 + console.log(err, 'onerror')
  10657 + this.reconnection()
  10658 + this.isReconnectionLoading = false
  10659 + }
  10660 + }
  10661 +
  10662 + /**
  10663 + * @description 连接断开时
  10664 + */
  10665 + onclose() {
  10666 + this.ws.onclose = () => {
  10667 + console.log('onclose')
  10668 + if (this.isCustomClose) return
  10669 +
  10670 + this.reconnection()
  10671 + this.isReconnectionLoading = false
  10672 + }
  10673 + }
  10674 +
  10675 + /**
  10676 + * @description 接受消息
  10677 + */
  10678 + async onmessage() {
  10679 + this.ws.onmessage = (event) => {
  10680 + try {
  10681 + const data = JSON.parse(event.data)
  10682 + this.eventCenter.emit(data.type, data.data)
  10683 + } catch (error) {
  10684 + console.log(error, 'error')
  10685 + }
  10686 + }
  10687 + }
  10688 +
  10689 + /**
  10690 + * @description 断开重连
  10691 + */
  10692 + reconnection() {
  10693 + if (this.isReconnectionLoading) return
  10694 +
  10695 + this.isReconnectionLoading = true
  10696 + clearTimeout(this.timeId)
  10697 + this.timeId = setTimeout(() => {
  10698 + this.createWs()
  10699 + }, 10000)
  10700 + }
  10701 +
  10702 + /**
  10703 + * @description 发送消息
  10704 + */
  10705 + send(message) {
  10706 + if (this.ws.readyState !== 1) {
  10707 + this.errorStack.push(message)
  10708 + return
  10709 + }
  10710 +
  10711 + this.ws.send(message)
  10712 + }
  10713 +
  10714 + /**
  10715 + * @description 手动关闭
  10716 + */
  10717 + close() {
  10718 + this.isCustomClose = true
  10719 + this.ws.close()
  10720 + }
  10721 +
  10722 + /**
  10723 + * @description 手动开启
  10724 + */
  10725 + start() {
  10726 + this.isCustomClose = false
  10727 + this.reconnection()
  10728 + }
  10729 +
  10730 + /**
  10731 + * @description 销毁
  10732 + */
  10733 + destroy() {
  10734 + this.close()
  10735 + this.ws = null
  10736 + this.errorStack = null
  10737 + this.eventCenter = null
  10738 + }
  10739 +}
  10740 +
  10741 +
  10742 +class EventCenter {
  10743 +
  10744 + /**
  10745 + * @description 调度中心
  10746 + * @type {Map<string, Function[]}
  10747 + */
  10748 + eventStack
  10749 +
  10750 + /**
  10751 + * @description
  10752 + */
  10753 + constructor() {
  10754 + this.eventStack = new Map()
  10755 + }
  10756 +
  10757 + /**
  10758 + * @description 监听事件
  10759 + */
  10760 + on(eventName, callback) {
  10761 + if (this.eventStack.has(eventName)) {
  10762 + this.eventStack.get(eventName).push(callback)
  10763 + return
  10764 + }
  10765 + this.eventStack.set(eventName, [callback])
  10766 + }
  10767 +
  10768 + /**
  10769 + * @description 触发事件
  10770 + */
  10771 + emit(eventName, ...args) {
  10772 + if (this.eventStack.has(eventName))
  10773 + this.eventStack.get(eventName).forEach(fn => fn(...args))
  10774 +
  10775 + }
  10776 +
  10777 + /**
  10778 + * @description 移除事件
  10779 + */
  10780 + off(eventName) {
  10781 + if (this.eventStack.has(eventName))
  10782 + this.eventStack.delete(eventName)
  10783 + }
  10784 +
  10785 + /**
  10786 + * @description 清除事件
  10787 + */
  10788 + clean(eventName) {
  10789 + this.eventStack.clear()
  10790 + }
  10791 +
  10792 +
  10793 +}
  10794 +
  10795 +
  10796 +// TODO preview action
  10797 +function previewAction() {
  10798 +
  10799 + setTimeout(() => {
  10800 + console.dir(GLOBAL_EDITOR_UI)
  10801 + }, 5000);
  10802 +
  10803 + function getContentInfo() {
  10804 +
  10805 + }
  10806 +
  10807 + const sendMsgTemplate = {
  10808 + tsSubCmds: [
  10809 + {
  10810 + entityType: "DEVICE",
  10811 + entityId: "a5ef5840-d68a-11ec-9c71-a9680487d1e0",
  10812 + scope: "LATEST_TELEMETRY",
  10813 + cmdId: 1
  10814 + }
  10815 + ]
  10816 + }
  10817 +
  10818 + const GLOBAL_TOKEN = JSON.parse(localStorage.getItem("UNDEFINED__DEVELOPMENT__2.7.1__COMMON__LOCAL__KEY__")).value.JWT_TOKEN.value
  10819 +
  10820 + const wsUrl = `ws://192.168.10.115:8080/api/ws/plugins/telemetry?token=${GLOBAL_TOKEN}`
  10821 +
  10822 + const websocket = new Ws(wsUrl)
  10823 +
  10824 +}
  10825 +
  10826 +previewAction()
... ...