From c7f51ae47d150838326fe12f88d143aa89fb2d1f Mon Sep 17 00:00:00 2001 From: baiYue Date: Fri, 5 Dec 2025 18:55:58 +0800 Subject: [PATCH] add save monitor functions --- common/include/global.h | 194 ++++++++++++ diagramCavas/include/baseDrawingPanel.h | 10 + diagramCavas/include/diagramCavas.h | 2 + .../graphicsDataModel/fixedPortsModel.h | 4 + diagramCavas/include/monitorPanel.h | 10 + diagramCavas/source/baseDrawingPanel.cpp | 3 +- diagramCavas/source/diagramCavas.cpp | 37 ++- diagramCavas/source/drawingPanel.cpp | 7 - .../graphicsDataModel/fixedPortsModel.cpp | 30 +- diagramCavas/source/monitorPanel.cpp | 291 ++++++++++++++++++ source/mainwindow.cpp | 3 + 11 files changed, 560 insertions(+), 31 deletions(-) diff --git a/common/include/global.h b/common/include/global.h index f71f351..d522314 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include "tools.h" @@ -1083,6 +1084,35 @@ struct monitorRelationSturctItem //监控关系结构item int nEquipType; //设备类别 QString sName; //名称 QUuid uid; //id + + QJsonObject toJson() const { + QJsonObject obj; + obj["nCategory"] = nCategory; + obj["nEquipType"] = nEquipType; + obj["sName"] = sName; + obj["uid"] = uid.toString(); + return obj; + } + + // 从JSON对象解析 + void fromJson(const QJsonObject& json) { + nCategory = json["nCategory"].toInt(); + nEquipType = json["nEquipType"].toInt(); + sName = json["sName"].toString(); + uid = QUuid::fromString(json["uid"].toString()); + } + + // 检查有效性 + bool isValid() const { + return !uid.isNull() && !sName.isEmpty(); + } + + // 重载相等运算符 + bool operator==(const monitorRelationSturctItem& other) const { + return uid == other.uid && + sName == other.sName && + nCategory == other.nCategory; + } }; struct monitorRelationItem //监控关系item @@ -1090,6 +1120,68 @@ struct monitorRelationItem //监控关系item monitorRelationSturctItem parent; monitorRelationSturctItem item; QList subList; + + QJsonObject toJson() const { + QJsonObject obj; + obj["parent"] = parent.toJson(); + obj["item"] = item.toJson(); + + // 序列化子列表 + QJsonArray subArray; + for (const auto& subItem : subList) { + subArray.append(subItem.toJson()); + } + obj["subList"] = subArray; + obj["subCount"] = subList.size(); + + return obj; + } + + // 从JSON对象解析 + void fromJson(const QJsonObject& json) { + parent.fromJson(json["parent"].toObject()); + item.fromJson(json["item"].toObject()); + + // 解析子列表 + subList.clear(); + QJsonArray subArray = json["subList"].toArray(); + for (const QJsonValue& subValue : subArray) { + monitorRelationSturctItem sub; + sub.fromJson(subValue.toObject()); + subList.append(sub); + } + } + + // 检查有效性 + bool isValid() const { + return parent.isValid() && item.isValid(); + } + + // 添加子项 + void addSubItem(const monitorRelationSturctItem& subItem) { + subList.append(subItem); + } + + // 移除子项 + bool removeSubItem(const QUuid& subUid) { + for (int i = 0; i < subList.size(); ++i) { + if (subList[i].uid == subUid) { + subList.removeAt(i); + return true; + } + } + return false; + } + + // 查找子项 + monitorRelationSturctItem* findSubItem(const QUuid& subUid) { + for (auto& sub : subList) { + if (sub.uid == subUid) { + return ⊂ + } + } + return nullptr; + } }; struct monitorItemAttributeInfo //单个监控item属性 @@ -1105,6 +1197,50 @@ struct monitorItemAttributeInfo //单个监控item属性 QString sTimeRange; //时间范围(分) QString sValue; //属性值 bool bSelected = false; + + // 转换为JSON对象 + QJsonObject toJson() const { + QJsonObject obj; + obj["sGroup"] = sGroup; + obj["sTag"] = sTag; + obj["sName"] = sName; + obj["nConnectType"] = nConnectType; + obj["sConnectPara"] = sConnectPara; + obj["nShowType"] = nShowType; + obj["bShowDiagram"] = bShowDiagram; + obj["nGraphType"] = nGraphType; + obj["sTimeRange"] = sTimeRange; + obj["sValue"] = sValue; + obj["bSelected"] = bSelected; + return obj; + } + + // 从JSON对象解析 + void fromJson(const QJsonObject& json) { + sGroup = json["sGroup"].toString(); + sTag = json["sTag"].toString(); + sName = json["sName"].toString(); + nConnectType = json["nConnectType"].toInt(); + sConnectPara = json["sConnectPara"].toString(); + nShowType = json["nShowType"].toInt(); + bShowDiagram = json["bShowDiagram"].toBool(); + nGraphType = json["nGraphType"].toInt(); + sTimeRange = json["sTimeRange"].toString(); + sValue = json["sValue"].toString(); + bSelected = json["bSelected"].toBool(); + } + + // 检查有效性 + bool isValid() const { + return !sTag.isEmpty() && !sName.isEmpty(); + } + + // 重载相等运算符 + bool operator==(const monitorItemAttributeInfo& other) const { + return sTag == other.sTag && + sName == other.sName && + sGroup == other.sGroup; + } }; enum class monitorItemState{ //监控item的状态 @@ -1134,6 +1270,36 @@ struct monitorItemDisplayInfo //监控模式显示信息 int nHeight; QString sMeta; //元模型名 QString sModel; //工程模名 + + QJsonObject toJson() const { + QJsonObject obj; + obj["nItemType"] = nItemType; + obj["sStateName"] = sStateName; + obj["bEnable"] = bEnable; + obj["sColor"] = sColor; + obj["bytPicture"] = QString(bytPicture.toBase64()); + obj["nWidth"] = nWidth; + obj["nHeight"] = nHeight; + obj["sMeta"] = sMeta; + obj["sModel"] = sModel; + return obj; + } + + // 从JSON对象解析 - 成员函数 + void fromJson(const QJsonObject& json) { + nItemType = json["nItemType"].toInt(); + sStateName = json["sStateName"].toString(); + bEnable = json["bEnable"].toBool(); + sColor = json["sColor"].toString(); + + QString pictureBase64 = json["bytPicture"].toString(); + bytPicture = QByteArray::fromBase64(pictureBase64.toUtf8()); + + nWidth = json["nWidth"].toInt(); + nHeight = json["nHeight"].toInt(); + sMeta = json["sMeta"].toString(); + sModel = json["sModel"].toString(); + } }; struct monitorItemTypeStruct //监控设备类型 @@ -1152,6 +1318,20 @@ struct monitorItemTypeStruct //监控设备类型 bool operator<(const monitorItemTypeStruct& other) const { return sTag < other.sTag || (sTag == other.sTag && sName < other.sName); } + + // 转换为JSON对象 - 成员函数 + QJsonObject toJson() const { + QJsonObject obj; + obj["sTag"] = sTag; + obj["sName"] = sName; + return obj; + } + + // 从JSON对象解析 - 成员函数 + void fromJson(const QJsonObject& json) { + sTag = json["sTag"].toString(); + sName = json["sName"].toString(); + } }; struct monitorItemStateStruct //监控设备状态 @@ -1170,6 +1350,20 @@ struct monitorItemStateStruct //监控设备状态 bool operator<(const monitorItemStateStruct& other) const { return sState < other.sState || (sState == other.sState && eState < other.eState); } + + // 转换为JSON对象 - 成员函数 + QJsonObject toJson() const { + QJsonObject obj; + obj["sState"] = sState; + obj["eState"] = static_cast(eState); + return obj; + } + + // 从JSON对象解析 - 成员函数 + void fromJson(const QJsonObject& json) { + sState = json["sState"].toString(); + eState = static_cast(json["eState"].toInt()); + } }; struct ModelTypeInfo{ //类型临时信息 diff --git a/diagramCavas/include/baseDrawingPanel.h b/diagramCavas/include/baseDrawingPanel.h index 3e19b9a..2d3d844 100644 --- a/diagramCavas/include/baseDrawingPanel.h +++ b/diagramCavas/include/baseDrawingPanel.h @@ -39,9 +39,17 @@ public: virtual void loadNodes(QJsonObject obj) {}; //加载图元信息 virtual void saveNodes(int pageId) {}; //保存到数据库 + virtual QJsonObject getDiagramInfo() {return QJsonObject();} DesignerScene* getScene() {return m_pGraphicsScene;} DesignerView* getView() {return m_pGraphicsView;} + + void setGeneratePanelLst(QStringList lst){_lstGeneratePanel = lst;} + QStringList& getGeneratePanelLst(){return _lstGeneratePanel;} + void setGenerateByPanel(QString s) {_sGenerateByPanel = s;} + QString getGenerateByPanel() {return _sGenerateByPanel;} + + PowerEntity* getEntity() {return _pEntity;} signals: void panelDelete(const QString&,int); protected: @@ -58,6 +66,8 @@ protected: QVBoxLayout* _verticalLayout; QHBoxLayout* _horizontalLayout; QSplitter* _hSplitter; + QStringList _lstGeneratePanel; //生成的panel列表 + QString _sGenerateByPanel; //被哪个panel生成 }; #endif diff --git a/diagramCavas/include/diagramCavas.h b/diagramCavas/include/diagramCavas.h index ce97fe1..3fc3a0f 100644 --- a/diagramCavas/include/diagramCavas.h +++ b/diagramCavas/include/diagramCavas.h @@ -82,6 +82,8 @@ public slots: void onSignal_monitorSelected(DiagramInfo); //监控选中 void onSignal_saveMonitor(QList>); //保存选中的监控 + void updateMonitorListFromDB(); //从数据库更新监控列表 + QMap> getMapDraw() {return m_mapDrawPanel;} QMap> getMapEdit() {return m_mapEditPanel;} QMap> getMapMonitor() {return m_mapMonitorPanel;} diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index 0bcf3b2..be31f7a 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -101,7 +101,10 @@ public: /*************************监控(运行时)**************************/ void generateMonitor(QString,QList); //生成监控 (监控名,选中的设备列表) void generateMonitorConfig(MonitorPanel*); //生成监控配置参数结构 + void setMonitorPara(QMap> map){m_monitorPara = map;} QMap>& getMonitorPara() {return m_monitorPara;} + void setMonitorRelation(QList lst){m_lstMonitorRelation = lst;} + QList getMonitorRelation() {return m_lstMonitorRelation;} void monitorItemSelected(QUuid); //运行时item选中事件 void monitorItemDetailAttr(QUuid); //显示属性详情 @@ -164,6 +167,7 @@ private: QMap> m_monitorPara; //监控参数 QMap>> m_monitorStateMap; //元件状态对照表 > QMap> m_monitorDisplaySetting; //元件设置 + QList m_lstMonitorRelation; //监控item层级关系 public: static bool _dataInitialised; }; diff --git a/diagramCavas/include/monitorPanel.h b/diagramCavas/include/monitorPanel.h index 17f554a..b1e5632 100644 --- a/diagramCavas/include/monitorPanel.h +++ b/diagramCavas/include/monitorPanel.h @@ -35,6 +35,16 @@ public: void initDisplayState(); //初始化显示状态参照表 void initDisplaySetting(); //初始化显示状态设置 +public: + //对层级关系的序列化与反序列化 + QJsonArray serializeRelationToJsonArray(const QList& data) const; + bool deserializeRelationFromJsonArray(const QJsonArray& jsonArray, QList& result); + //对para的序列化与反序列化 + QJsonArray serializeParaToJsonArray(const QMap>& data) const; + bool deserializeParaFromJsonArray(const QJsonArray& jsonArray,QMap>& result); + //对displaySetiing的序列化与反序列化 + QJsonArray serializeDisplayToJsonArray(const QMap>& data) const; + void deserializeDisplayFromJsonArray(const QJsonArray& jsonArray,QMap>& result); public slots: void onRunClicked(); void onStopClicked(); diff --git a/diagramCavas/source/baseDrawingPanel.cpp b/diagramCavas/source/baseDrawingPanel.cpp index 3276f1f..03f52ea 100644 --- a/diagramCavas/source/baseDrawingPanel.cpp +++ b/diagramCavas/source/baseDrawingPanel.cpp @@ -14,11 +14,12 @@ BaseDrawingPanel::BaseDrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramM : QWidget(parent) ,_pModel(nullptr) ,_mode(mode) - ,_pEntity(pEntity) + ,_pEntity(nullptr) ,_verticalLayout(nullptr) ,_horizontalLayout(nullptr) ,_hSplitter(nullptr) { + _pEntity = pEntity; _pModel = new FixedPortsModel(pEntity); _pModel->setTopWidget(this); m_pSelectorManager = new SelectorManager(_pModel,this); diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index 4c437d9..2cc2192 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -116,15 +116,31 @@ void DiagramCavas::onSignal_addPage() void DiagramCavas::onSignal_savePage() { QWidget* pWindow= currentSubWindow()->widget(); - DrawingPanel* pPanel = dynamic_cast(pWindow); + BaseDrawingPanel* pPanel = dynamic_cast(pWindow); if(pPanel) { if(pPanel->getMode() == DM_run) { - QMessageBox::about(NULL,QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"运行中无法保存!")); + auto pMonitor = dynamic_cast(pPanel); + if(pMonitor){ + if(DataBase::GetInstance()->getPageIdByName(pMonitor->getParentPage()) == -1){ + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"请先保存工程模型")); + return; + } + auto pEntity = pMonitor->getEntity(); + if(pEntity){ + if(DataBase::GetInstance()->getMonitorIdByName(pEntity->name()).isNull()) //不存在,创建 + DataBase::GetInstance()->insertMonitor(QUuid(pEntity->id()),pEntity->name(),pEntity->name(),pMonitor->getParentPage(),pMonitor->getMonitorInfo()); + else + DataBase::GetInstance()->updateMonitor(pEntity->name(),pMonitor->getMonitorInfo()); + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功")); + } + + } } else if(pPanel->getMode() == DM_edit) { + auto pDrawPanel = dynamic_cast(pPanel); _curPage = pPanel->pageName(); QMessageBox msgBox; msgBox.setText(QString::fromWCharArray(L"提示")); @@ -215,8 +231,8 @@ void DiagramCavas::onSignal_loadMonitor(PowerEntity* p) if(!m_mapMonitorPanel.contains(p->name())) { onSignal_addDrawingPanel(p,DiagramMode::DM_run); - //QJsonObject context = DataBase::GetInstance()->getPageContextByName(p->name()); - //m_mapDrawPanel[p->name()].first->loadNodes(context); + QJsonObject context = DataBase::GetInstance()->getMonitorContextByTag(p->name()); + m_mapMonitorPanel[p->name()].first->loadNodes(context); } else //已存在 { @@ -609,3 +625,16 @@ void DiagramCavas::onSignal_saveMonitor(QList> lst) } QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功")); } + +void DiagramCavas::updateMonitorListFromDB() +{ + QList lstMonitor = DataBase::GetInstance()->getAllMonitor(); + for(auto &info:lstMonitor) + { + auto p = TopologyManager::instance().findDiagram(info.uid.toString(),ModelFunctionType::RuntimeModel); + if(!p){ + TopologyManager::instance().createDiagram(info.uid.toString(),info.name,ModelFunctionType::RuntimeModel); + emit updateMonitorList(info.parent,qMakePair(info.name,info.uid)); + } + } +} diff --git a/diagramCavas/source/drawingPanel.cpp b/diagramCavas/source/drawingPanel.cpp index dc24be3..d6b8778 100644 --- a/diagramCavas/source/drawingPanel.cpp +++ b/diagramCavas/source/drawingPanel.cpp @@ -319,13 +319,6 @@ void DrawingPanel::loadNodes(QJsonObject obj) } } emit _pModel->updateCurrentItems(lstSecond,false); - - } - - if(_mode == DM_run) - { - //if(_pModel) - //_pModel->startHttpRequest(); } } diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index d1223b7..9078cd7 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -139,7 +139,7 @@ bool FixedPortsModel::addNodeItem(QUuid uuid,GraphicsProjectModelItem* pItem) } } -QString FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width,double height,double rotate) +QString FixedPortsModel::addNodeItem(QUuid id,QPointF pos,double width,double height,double rotate) { //todo:load图形时必有拓扑实体,关联到对应的entity BaseProperty* pro = nullptr; @@ -776,8 +776,12 @@ void FixedPortsModel::loadNodeDataFromDataBase() QString FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort) { - GraphicsProjectModelItem* src = _nodeItem[srcId]; - GraphicsProjectModelItem* dest = _nodeItem[destId]; + GraphicsProjectModelItem* src = nullptr; + if(_nodeItem.contains(srcId)) + src = _nodeItem.value(srcId); + GraphicsProjectModelItem* dest = nullptr; + if(_nodeItem.contains(destId)) + dest = _nodeItem.value(destId); QMap mapData = BasePropertyManager::instance().getEntityData(); if(mapData.contains(lineId)) { @@ -2596,6 +2600,10 @@ void FixedPortsModel::generateMonitor(QString sPage,QList l info.parentId = _pEntity->id(); _cavas->onSignal_createDiagram(info,DiagramMode::DM_run); pPanel = _cavas->getMonitorPanel(sPage); + pPanel->getModelController()->setMonitorRelation(lst); + + _widget->getGeneratePanelLst().append(sPage); //记录生成的运行页 + pPanel->setParentPage(_pageName); //生成页记录被哪个组态生成 QList lstFirst; for(auto& itemInfo:lst) @@ -2749,23 +2757,10 @@ void FixedPortsModel::monitorItemDetailAttr(QUuid uid) void FixedPortsModel::monitorItemSet(QUuid uid) { if(_nodeItem.contains(uid)){ - //QList lstRemove; //需要从item移除的动态数据 QList lstAdd; //需要向item添加的动态数据 auto pItem = _nodeItem.value(uid); auto lst = m_monitorPara.value(uid); - //auto mapText = pItem->getDynamicText(); - - /*for(auto iter = mapText.begin();iter != mapText.end();++iter){ - bool exist = false; - for(auto& info:lst){ - if(info.sTag == iter.key()){ //新旧队列都存在 - exist = true; - } - } - if(!exist) - lstRemove.append(iter.key()); - }*/ for(auto& info:lst){ if(info.bShowDiagram && info.bSelected){ @@ -2773,9 +2768,6 @@ void FixedPortsModel::monitorItemSet(QUuid uid) } } - /*for(auto& str:lstRemove){ - pItem->removeDynamicText(str); - }*/ pItem->removeAllDynamicText(); for(auto& str:lstAdd){ diff --git a/diagramCavas/source/monitorPanel.cpp b/diagramCavas/source/monitorPanel.cpp index c77cb6b..572c920 100644 --- a/diagramCavas/source/monitorPanel.cpp +++ b/diagramCavas/source/monitorPanel.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "graphicsDataModel/fixedPortsModel.h" #include "graphicsItem/graphicsBaseItem.h" #include "powerEntity.h" @@ -160,13 +161,144 @@ QJsonObject MonitorPanel::getMonitorInfo() const } } obj["bays"] = arrBay; + + auto relation = serializeRelationToJsonArray(_pModel->getMonitorRelation()); + obj["relation"] = relation; + + auto para = serializeParaToJsonArray(_pModel->getMonitorPara()); //设定参数 + obj["para"] = para; + + auto settingArr = serializeDisplayToJsonArray(_pModel->getMonitorDisplaySetting()); //显示参数 + obj["displaySetting"] = settingArr; } return obj; } void MonitorPanel::loadNodes(QJsonObject obj) { + QJsonArray nodesJsonArray = obj["nodes"].toArray(); + QList> lst; + for (QJsonValueRef nodeJson : nodesJsonArray) + { + QJsonObject node = nodeJson.toObject(); + QString uuid = node["id"].toString(); + double dX = node["x"].toDouble(); + double dY = node["y"].toDouble(); + double dWidth = node["width"].toDouble(); + double dHeight = node["height"].toDouble(); + double dRotate = node["rotate"].toDouble(); + + if(_pModel) + { + QString sName = _pModel->addNodeItem(QUuid(uuid),QPointF(dX,dY),dWidth,dHeight,dRotate); + if(sName != "err"){ + lst.append(qMakePair(sName,QUuid(uuid))); + } + } + } + + + QJsonArray connectArr = obj["connections"].toArray(); + for(QJsonValueRef connectJson:connectArr) + { + QJsonObject connect = connectJson.toObject(); + QUuid id = QUuid(connect["id"].toString()); //电缆线id,关联component中的电缆 + QUuid srcId = QUuid(connect["SrcNodeId"].toString()); + QUuid srcPortId = QUuid(connect["SrcPortId"].toString()); + QUuid destId = QUuid(connect["DestNodeId"].toString()); + QUuid destPortId = QUuid(connect["DestPortId"].toString()); + + PowerConnection* pCon = TopologyManager::instance().connection(srcPortId.toString(),destPortId.toString()); + if(pCon) + { + QString srcItemId = pCon->fromComponent(); + QString destItemId = pCon->toComponent(); + //todo:从拓扑结构中查找port的id + if(_pModel) + { + QString sName = _pModel->addConnectLline(id,QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId); + if(sName != "err"){ + lst.append(qMakePair(sName,QUuid(id))); + } + } + } + else + { + //todo:提示拓扑结构已改变 + } + } + + QJsonArray bayArr = obj["bays"].toArray(); + for(QJsonValueRef bayJson:bayArr) + { + QJsonObject bay = bayJson.toObject(); + QUuid id = QUuid(bay["id"].toString()); + if(_pModel) + { + _pModel->addBayItem(id); + } + } + + QJsonArray paraArr = obj["para"].toArray(); + QMap> mapPara; + bool resPara = deserializeParaFromJsonArray(paraArr,mapPara); + if(resPara){ + if(_pModel){ + _pModel->setMonitorPara(mapPara); + auto pItems = _pModel->getProjectItems(); + for(auto& p:pItems){ //将设置值更新到每个item + auto pPro = p->getProperty(); + if(pPro) + _pModel->monitorItemSet(pPro->uuid()); + } + } + } + + QJsonArray displayArr = obj["displaySetting"].toArray(); + QMap> mapDisplay; + deserializeDisplayFromJsonArray(displayArr,mapDisplay); + if(_pModel){ + _pModel->setMonitorDisplaySetting(mapDisplay); + _pModel->updateMonitorDisplay(); + } + + QJsonArray relationArr = obj["relation"].toArray(); + QList lstRelation; + bool resRel = deserializeRelationFromJsonArray(relationArr, lstRelation); + if(resRel){ + QList lstFirst; + if(_pModel){ + auto pItems = _pModel->getProjectItems(); + for(auto& itemInfo:lstRelation) + { + if(itemInfo.item.nCategory == 0){ //设备 + if(pItems.contains(itemInfo.item.uid)){ + if(itemInfo.item.nEquipType == 1 || itemInfo.item.nEquipType == 15 || itemInfo.item.nEquipType == 16){ //先添加母线及独立设备 + lstFirst.append(itemInfo); + } + } + } + } + + QList lstSecond; + for(auto& itemInfo:lstRelation) //第二次循环处理间隔内设备 + { + if(itemInfo.item.nCategory == 0){ //间隔 + if(pItems.contains(itemInfo.item.uid)){ + if(itemInfo.item.nEquipType != 1 && itemInfo.item.nEquipType != 15 && itemInfo.item.nEquipType != 16){ + lstSecond.append(itemInfo); + } + } + } + } + + updateSelectedItems(lstFirst,true); //直接生成监控tree + updateSelectedItems(lstSecond,false); + + _pModel->setMonitorRelation(lstRelation); + } + } } void MonitorPanel::saveNodes(int pageId) @@ -465,3 +597,162 @@ void MonitorPanel::initDisplaySetting() _pModel->getMonitorDisplaySetting().insert(keyType,mapStates); } } + +QJsonArray MonitorPanel::serializeRelationToJsonArray(const QList& data) const +{ + QJsonArray rootArray; + + for (const auto& relationItem : data) { + rootArray.append(relationItem.toJson()); + } + + return rootArray; +} + +// 从 QJsonArray 反序列化到 QList +bool MonitorPanel::deserializeRelationFromJsonArray(const QJsonArray& jsonArray, QList& result) +{ + result.clear(); + + for (const QJsonValue& itemValue : jsonArray) { + if (!itemValue.isObject()) continue; + + monitorRelationItem relationItem; + relationItem.fromJson(itemValue.toObject()); + + if (relationItem.isValid()) { + result.append(relationItem); + } + } + + return true; +} + +QJsonArray MonitorPanel::serializeParaToJsonArray(const QMap>& data) const +{ + QJsonArray rootArray; + + for (auto it = data.begin(); it != data.end(); ++it) { + const QUuid& uuid = it.key(); + const QList& attributeList = it.value(); + + QJsonObject uuidObject; + uuidObject["uuid"] = uuid.toString(); + + QJsonArray attributesArray; + + // 序列化属性列表 + for (const auto& attribute : attributeList) { + attributesArray.append(attribute.toJson()); + } + + uuidObject["attributes"] = attributesArray; + uuidObject["attributeCount"] = attributesArray.size(); + + rootArray.append(uuidObject); + } + + return rootArray; +} + +// 从 QJsonArray 反序列化到 QMap> +bool MonitorPanel::deserializeParaFromJsonArray(const QJsonArray& jsonArray, + QMap>& result) +{ + result.clear(); + + for (const QJsonValue& uuidValue : jsonArray) { + if (!uuidValue.isObject()) continue; + + QJsonObject uuidObject = uuidValue.toObject(); + + // 解析UUID + QUuid uuid = QUuid::fromString(uuidObject["uuid"].toString()); + if (uuid.isNull()) continue; + + // 解析属性列表 + QList attributeList; + QJsonArray attributesArray = uuidObject["attributes"].toArray(); + + for (const QJsonValue& attrValue : attributesArray) { + if (!attrValue.isObject()) continue; + + monitorItemAttributeInfo attribute; + attribute.fromJson(attrValue.toObject()); + attributeList.append(attribute); + } + + result[uuid] = attributeList; + } + + return true; +} + + +QJsonArray MonitorPanel::serializeDisplayToJsonArray(const QMap>& data) const +{ + + QJsonArray rootArray; + + for (auto typeIt = data.begin(); typeIt != data.end(); ++typeIt) { + const monitorItemTypeStruct& typeKey = typeIt.key(); + const auto& stateMap = typeIt.value(); + + QJsonObject typeObject; + typeObject["typeKey"] = typeKey.toJson(); + + QJsonArray statesArray; + + for (auto stateIt = stateMap.begin(); stateIt != stateMap.end(); ++stateIt) { + const monitorItemStateStruct& stateKey = stateIt.key(); + const monitorItemDisplayInfo& displayInfo = stateIt.value(); + + QJsonObject stateObject; + stateObject["stateKey"] = stateKey.toJson(); + stateObject["displayInfo"] = displayInfo.toJson(); + + statesArray.append(stateObject); + } + + typeObject["states"] = statesArray; + rootArray.append(typeObject); + } + + return rootArray; +} + +// 从JSON数组反序列化 +void MonitorPanel::deserializeDisplayFromJsonArray(const QJsonArray& jsonArray,QMap>& result) +{ + + result.clear(); + + for (const QJsonValue& typeValue : jsonArray) { + if (!typeValue.isObject()) continue; + + QJsonObject typeObject = typeValue.toObject(); + + // 解析类型键 + monitorItemTypeStruct typeKey; + typeKey.fromJson(typeObject["typeKey"].toObject()); + + QMap stateMap; + QJsonArray statesArray = typeObject["states"].toArray(); + + for (const QJsonValue& stateValue : statesArray) { + if (!stateValue.isObject()) continue; + + QJsonObject stateObject = stateValue.toObject(); + + monitorItemStateStruct stateKey; + stateKey.fromJson(stateObject["stateKey"].toObject()); + + monitorItemDisplayInfo displayInfo; + displayInfo.fromJson(stateObject["displayInfo"].toObject()); + + stateMap[stateKey] = displayInfo; + } + + result[typeKey] = stateMap; + } +} diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index a9192ff..54bcd91 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -204,6 +204,9 @@ void CMainWindow::initializeAction() _pActMonitor->setChecked(true); m_pMonitorItemsDock->show(); m_pMonitorPagesDock->show(); + + if(m_pDiagramCavas) + m_pDiagramCavas->updateMonitorListFromDB(); } });