From 9f38ffd14da5b6886e823a70db42009f7ec57c98 Mon Sep 17 00:00:00 2001 From: baiYue Date: Fri, 6 Jun 2025 18:57:37 +0800 Subject: [PATCH] add common project model module --- common/include/global.h | 42 + diagramCavas/include/designerScene.h | 2 - diagramCavas/include/util/baseSelector.h | 2 +- diagramCavas/source/designerScene.cpp | 37 +- diagramCavas/source/util/baseSelector.cpp | 33 + diagramUtils/CMakeLists.txt | 2 + diagramUtils/include/projectModelManager.h | 49 + diagramUtils/source/projectModelManager.cpp | 778 ++++++++++++++ include/projectModelDlg.h | 69 +- source/mainwindow.cpp | 3 +- source/projectModelDlg.cpp | 1030 ++----------------- 11 files changed, 974 insertions(+), 1073 deletions(-) create mode 100644 diagramUtils/include/projectModelManager.h create mode 100644 diagramUtils/source/projectModelManager.cpp diff --git a/common/include/global.h b/common/include/global.h index 75f1f5a..f85977a 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -8,6 +8,7 @@ #include #include #include +#include const double g_dGriaphicsScene_Width = 800; const double g_dGriaphicsScene_Height = 600; @@ -180,6 +181,47 @@ struct projectManager //工程模管理类 QJsonObject checkState; //属性选择状态 }; +enum projectState +{ + Err = -1, + NotExist = 0, + Exist, + Changed +}; + +struct FormerName //曾用名,记录修改前名称 +{ + QString sName; + bool bChanged = false; //是否改变过 +}; + +struct PropertyState //每个属性的状态 +{ + bool checkState = false; + QString dataType; + bool editable = true; //可勾选状态 +}; + +struct PropertyPage //属性信息 +{ + QMap mCheckState; //属性选择状态 + bool isPublic = false; +}; + +typedef QMap MapProperty; //属性组 +struct PropertyModel //工程模 +{ + MapProperty mapProperty; + int nType = 0; //工程模类型,选择图标后确定 + QStandardItemModel* pBase; //基础属性 + QStandardItemModel* pSelect; //已选择属性 + FormerName formerMeta; //曾用元模名 + FormerName formerProject; //曾用工程模名 + QMap dataInfo; //存放数据库内容 +}; +typedef QMap MapProject; //str为工程名,PropertyModel为工程属性 +typedef QMap MapMeta; //str为元模名,PropertyModel为工程模集 + //===================================== struct propertyGroupState //模型属性组信息 { diff --git a/diagramCavas/include/designerScene.h b/diagramCavas/include/designerScene.h index 02b5bd0..4ad04a2 100644 --- a/diagramCavas/include/designerScene.h +++ b/diagramCavas/include/designerScene.h @@ -27,8 +27,6 @@ public: signals: void signalAddItem(QGraphicsItem*); -public slots: - void onDeleteClicked(); protected: void drawBackground(QPainter*, const QRectF&) override; void mousePressEvent(QGraphicsSceneMouseEvent*) override; diff --git a/diagramCavas/include/util/baseSelector.h b/diagramCavas/include/util/baseSelector.h index a92e434..f2eddcc 100644 --- a/diagramCavas/include/util/baseSelector.h +++ b/diagramCavas/include/util/baseSelector.h @@ -58,6 +58,7 @@ public: virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event, DesignerScene*); virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event, DesignerScene*); virtual void dropEvent(QGraphicsSceneDragDropEvent *event, DesignerScene*); + virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event,DesignerScene*); SelectorType getSelectorType() { return m_type; } //void setOperationMode(OperationMode m) { m_opMode = m; } @@ -71,7 +72,6 @@ public: void updateConnectLineByTopology(QList); //通过拓扑关系更新位置 signals: void setWorkingSelector(SelectorType); - protected: //静态变量,用于不同类型selector间的成员共享 static OperationMode ms_opMode; diff --git a/diagramCavas/source/designerScene.cpp b/diagramCavas/source/designerScene.cpp index 92eb513..cf62740 100644 --- a/diagramCavas/source/designerScene.cpp +++ b/diagramCavas/source/designerScene.cpp @@ -131,18 +131,17 @@ void DesignerScene::keyReleaseEvent(QKeyEvent* event) QGraphicsScene::keyReleaseEvent(event); } -void DesignerScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *contextMenuEvent) +void DesignerScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { - QList listItem = selectedItems(); - if(listItem.isEmpty()) - return; - else if(listItem.count() == 1) + if(m_pDrawingPanel) { - QMenu menu; - QAction *removeAction = menu.addAction(QString::fromWCharArray(L"删除")); - connect(removeAction,&QAction::triggered,this,&DesignerScene::onDeleteClicked); - menu.exec(QCursor::pos()); + if(m_pDrawingPanel->getMode() == DM_run) + return; + m_pDrawingPanel->selectorManager()->getWorkingSelector()->contextMenuEvent(event, this); + update(); } + else + QGraphicsScene::contextMenuEvent(event); } void DesignerScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event) @@ -184,26 +183,6 @@ void DesignerScene::dropEvent(QGraphicsSceneDragDropEvent *event) QGraphicsScene::dropEvent(event); } -void DesignerScene::onDeleteClicked() -{ - QList listItem = selectedItems(); - if(listItem.isEmpty()) - return; - else if(listItem.count() == 1) - { - GraphicsBaseItem* item = qgraphicsitem_cast(listItem.first()); - if(item) - { - GraphicsItemType tpe = item->getItemType(); - if(tpe > QGraphicsItem::UserType && tpe < QGraphicsItem::UserType+1000) - { - if(_graphModel) - _graphModel->deleteNodeItem(item); - } - } - } -} - void DesignerScene::setGridVisible(bool bVisible) { m_bGridVisible = bVisible; diff --git a/diagramCavas/source/util/baseSelector.cpp b/diagramCavas/source/util/baseSelector.cpp index 6732fbe..2a2d416 100644 --- a/diagramCavas/source/util/baseSelector.cpp +++ b/diagramCavas/source/util/baseSelector.cpp @@ -421,6 +421,38 @@ void BaseSelector::dropEvent(QGraphicsSceneDragDropEvent *event, DesignerScene*) } } +void BaseSelector::contextMenuEvent(QGraphicsSceneContextMenuEvent *event,DesignerScene* scene) +{ + QList listItem = scene->selectedItems(); + if(listItem.isEmpty()) + return; + else if(listItem.count() == 1) + { + QMenu menu; + QAction *removeAction = menu.addAction(QString::fromWCharArray(L"删除")); + //connect(removeAction,&QAction::triggered,this,&DesignerScene::onDeleteClicked); + connect(removeAction,&QAction::triggered,[&,scene](){ + QList listItem = scene->selectedItems(); + if(listItem.isEmpty()) + return; + else if(listItem.count() == 1) + { + GraphicsBaseItem* item = qgraphicsitem_cast(listItem.first()); + if(item) + { + GraphicsItemType tpe = item->getItemType(); + if(tpe > QGraphicsItem::UserType && tpe < QGraphicsItem::UserType+1000) + { + if(_model) + _model->deleteNodeItem(item); + } + } + } + }); + menu.exec(QCursor::pos()); + } +} + void BaseSelector::setCursor(DesignerScene *scene, const QCursor &cursor) { QGraphicsView *view = scene->getView(); @@ -463,3 +495,4 @@ void BaseSelector::updateConnectLineByTopology(QList lst) } } } + diff --git a/diagramUtils/CMakeLists.txt b/diagramUtils/CMakeLists.txt index e3891ea..1589853 100644 --- a/diagramUtils/CMakeLists.txt +++ b/diagramUtils/CMakeLists.txt @@ -5,6 +5,7 @@ set(DIAGRAMUTILS_HEADER_FILES include/dataManager.h include/componentIconManager.h include/basePropertyManager.h + include/projectModelManager.h ../common/include/global.h ../common/include/baseProperty.h ../common/include/compiler.hpp @@ -17,6 +18,7 @@ set(DIAGRAMUTILS_SOURCE_FILES source/dataBase.cpp source/dataManager.cpp source/basePropertyManager.cpp + source/projectModelManager.cpp source/componentIconManager.cpp ../common/source/global.cpp ../common/source/baseProperty.cpp diff --git a/diagramUtils/include/projectModelManager.h b/diagramUtils/include/projectModelManager.h new file mode 100644 index 0000000..b062d85 --- /dev/null +++ b/diagramUtils/include/projectModelManager.h @@ -0,0 +1,49 @@ +#ifndef PROJECTMODELMANAGER_H +#define PROJECTMODELMANAGER_H + +#include +#include +#include "export.hpp" +#include "global.h" +/****工程模管理类*****/ + +class DIAGRAM_DESIGNER_PUBLIC ProjectModelManager : public QObject +{ + Q_OBJECT + +public: + explicit ProjectModelManager(QObject *parent = nullptr); + ~ProjectModelManager(); + + static ProjectModelManager& instance(); +public: + void initialModel(); + void generate(const QString& sMeta,const QString& sPro); //根据输入名称生成表 + MapProperty addNewProject(const QString& sMeta,const QString& sProject,PropertyModel&); //根据元模型、工程模名称生成工程模对象 + QList getGroupSub(QStandardItemModel*,const QString&); //返回指定组下的属性(如果存在) + MapMeta& getData() {return m_mapTotalData;} + void deleteData(const QString& meta,const QString& proj); +public: + QStringList getModelList() const; //获取元模型列表 + QStringList getGroupList(const QString& model) const; //返回该元模下的属性组列表 + QStringList getPublicGroupList() const; //返回公共属性组列表 + QStringList getAttributeList(const QString& model,const QString& group) const; //根据元模名和组名返回属性列表 + QStringList getPublicAttributeList(const QString& group); //返回公共属性组的属性列表 + void setItemAttribute(const QString&,QStandardItem*); //设置item的属性(数据库表字段名) + QPair combinePropertySql(const QStandardItem*); //根据item属性生成sql + bool ifProjectEqual(const QString& sMeta,const QString& sPro,QMap); //根据每个属性组的勾选状态判断两个模型是否相同 + QString modifyProjectModel(const QString& sMeta,const QString& sProject,QMap); //修改工程模 + bool renameProjectModel(const QString& strCur,QMap datas); //重命名工程模 + void updateComponentModelName(const QString& strOld,const QString& strNew); //更新component中的工程模 + bool ifProjectExsit(const QString&); //判断工程模存在 +signals: + void modelChange(); //模型改变信号 +private: + int createPropertyTable(const QString& sMeta,const QString& sProject,const QString& sGroup,QList lstSelect,QList lstBase,int nLinkType,bool isPublic = false); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型) + QJsonObject getSelectedState(QList select,QList base); //返回json格式的选中状态 + QString getItemDataType(const QStandardItem* pItem); //返回数据类型 +private: + MapMeta m_mapTotalData; + bool _bInitialised; +}; +#endif // PROJECTMODELMANAGER_H diff --git a/diagramUtils/source/projectModelManager.cpp b/diagramUtils/source/projectModelManager.cpp new file mode 100644 index 0000000..3962276 --- /dev/null +++ b/diagramUtils/source/projectModelManager.cpp @@ -0,0 +1,778 @@ +#include +#include "projectModelManager.h" +#include "dataBase.h" +#include "logger.h" +const QSet stringDataTypes = {"VARCHAR", "CHAR", "TEXT", "DATE", "TIME", "TIMESTAMP","JSONB","JSON"}; + +ProjectModelManager& ProjectModelManager::instance() +{ + //采用静态局部变量的方式,静态局部变量的初始化是在第一次访问时,以后的调用不会多次初始化,并且生命周期和程序一致 + static ProjectModelManager instance; + return instance; +} + +ProjectModelManager::ProjectModelManager(QObject *parent) + : QObject(parent) +{ + _bInitialised = false; +} + +ProjectModelManager::~ProjectModelManager() +{ + +} + +void ProjectModelManager::initialModel() +{ + if(_bInitialised) + return; + QStringList lstModel = getModelList(); + for(auto &model:lstModel) + { + MapProject mp; + QMap mapProject = DataBase::GetInstance()->getProjectFromManager(model); + + + QMap::Iterator iter; + for(iter = mapProject.begin();iter != mapProject.end(); ++iter) + { + //QStandardItem* propertyItem = new QStandardItem(iter.key()); + + PropertyModel pm; + pm.pBase = new QStandardItemModel(this); + pm.pSelect = new QStandardItemModel(this); + pm.mapProperty = addNewProject(model,iter.key(),pm); + pm.nType = iter.value(); + pm.formerMeta.sName = model; + pm.formerProject.sName = iter.key(); + pm.dataInfo = DataBase::GetInstance()->getProjectModelGroupInfo(iter.key()); + mp.insert(iter.key(),pm); + } + + //todo:读取存储,按分类遍历名称 + m_mapTotalData.insert(model,mp); + } + + _bInitialised = true; +} + + +void ProjectModelManager::generate(const QString& sMeta,const QString& sPro) +{ + MapMeta::Iterator iter = m_mapTotalData.find(sMeta); //获取元模下的工程 + if(iter != m_mapTotalData.end()) + { + MapProject mp = iter.value(); + MapProject::Iterator ite = mp.find(sPro); //获取工程下的属性组 + if(ite != mp.end()) + { + MapProperty mapProperty = ite.value().mapProperty; + + int createRes = 0; //动态表生成结果 + for(MapProperty::Iterator it = mapProperty.begin();it != mapProperty.end();++it){ //每个属性组单独生成表 + int nType = ite.value().nType; + QStandardItemModel* pSelectModel = ite->pSelect; + QStandardItemModel* pBaseModel = ite->pBase; + + QList lstSelected = getGroupSub(pSelectModel,it.key()); + QList lstBase = getGroupSub(pBaseModel,it.key()); + if(!lstSelected.isEmpty()) + { + bool isPub = it->isPublic; + int res = createPropertyTable(sMeta,sPro,it.key(),lstSelected,lstBase,nType,isPub); + switch (res){ + case int(AlertInfo::success): + LOG_INFO("DB", QString("create %1 dynamicTable success").arg(sPro)); + break; + case int(AlertInfo::fail): + LOG_WARN("DB", QString("create %1 dynamicTable fail").arg(sPro)); + break; + case int(AlertInfo::exist): + LOG_WARN("DB", QString("%1 dynamicTable exist").arg(sPro)); + break; + default: + break; + } + createRes = createRes | res; + } + } + if(!(createRes & int(AlertInfo::fail))) //结果不含失败就成功 + { + //QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"创建表成功")); + emit modelChange(); + } + else //创建失败 + { + //QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"创建表失败")); + } + } + } +} + +MapProperty ProjectModelManager::addNewProject(const QString& sMeta,const QString& sProject,PropertyModel& model) +{ + MapProperty mt; + QStringList lstProperty = getGroupList(sMeta); //返回元模下的属性组名 + QStringList lstProPublic = getPublicGroupList(); //返回公共属性组 + //lstProperty< mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(sProject); //获取选择状态 + for(auto &property:lstProperty) + { + PropertyPage struProperty; + struProperty.isPublic = false; + + if(mapCheckState.contains(property) && !model.formerMeta.bChanged) //生成的模型中勾选了该属性组且元模未改变过 + { + QJsonObject obj = mapCheckState[property]; + QJsonArray nodesJsonArray = obj["checkState"].toArray(); + + for (QJsonValueRef nodeJson : nodesJsonArray) + { + QJsonObject node = nodeJson.toObject(); + QString propertyName = node["name"].toString(); + int nState = node["checked"].toInt(); + QString dataType = node["type"].toString(); + QString defaultValue = node["defaultValue"].toString(); + + QStandardItem* pItem = new QStandardItem(propertyName); + setItemAttribute(propertyName,pItem); + PropertyState sta; + sta.dataType = dataType; + if(nState) + { + QStandardItem* pGroup = nullptr; + if(model.pSelect->findItems(propertyName).isEmpty()) + { + pGroup = new QStandardItem(property); + model.pSelect->appendRow(pGroup); //属性的组未存在,将组添加到model + } + else + { + pGroup = model.pSelect->findItems(propertyName)[0]; + } + + if(pGroup){ + pGroup->appendRow(pItem); + sta.checkState = true; + struProperty.mCheckState.insert(propertyName,sta); + } + } + else + { + QStandardItem* pGroup = nullptr; + if(model.pBase->findItems(propertyName).isEmpty()) + { + pGroup = new QStandardItem(property); + model.pBase->appendRow(pGroup); //属性的组未存在,将组添加到model + } + else + { + pGroup = model.pBase->findItems(propertyName)[0]; + } + + if(pGroup){ + pGroup->appendRow(pItem); + sta.checkState = false; + struProperty.mCheckState.insert(propertyName,sta); + } + } + } + } + else //未勾选属性组或是新建或元模已改变 + { + QStandardItem* pGroup = nullptr; //新建的不包含属性组 + pGroup = new QStandardItem(property); + model.pBase->appendRow(pGroup); + + QStringList lstName = getAttributeList(sMeta,property); + for(auto &name:lstName) + { + QStandardItem* pItem = new QStandardItem(name); + setItemAttribute(name,pItem); + pGroup->appendRow(pItem); + QString dataType = getItemDataType(pItem); + PropertyState sta; + sta.dataType = dataType; + sta.checkState = false; + struProperty.mCheckState.insert(name,sta); //初始都是未选择状态 + } + } + mt.insert(property,struProperty); + } + + MapProperty pubMap; + for(auto &pro:lstProPublic) //公共属性组 + { + PropertyPage struProperty; + struProperty.isPublic = true; + + QStandardItem* pGroup = nullptr; + pGroup = new QStandardItem(pro); + //model.pSelect->appendRow(pGroup); //公共属性组默认都包含 + model.pSelect->insertRow(0,pGroup); + + QStringList lstName = getPublicAttributeList(pro); + for(auto &name:lstName) + { + QStandardItem* pItem = new QStandardItem(name); + pItem->setData(QColor(60,140,180,180), Qt::BackgroundRole); + setItemAttribute(name,pItem); + pGroup->appendRow(pItem); + QString dataType = getItemDataType(pItem); + PropertyState sta; + sta.dataType = dataType; + sta.checkState = true; + sta.editable = false; + struProperty.mCheckState.insert(name,sta); //初始都已经选择 + } + pubMap.insert(pro,struProperty); + } + + for (auto it = mt.begin(); it != mt.end(); ++it) { //将正常属性添到公共属性后 + if(pubMap.contains(it.key())) + continue; //公共属性组已有的不重复添加 + pubMap.insert(it.key(), it.value()); + } + + return pubMap; +} + + +QList ProjectModelManager::getGroupSub(QStandardItemModel* pModel,const QString& str) +{ + QList lst; + if(!pModel) + return lst; + QList items = pModel->findItems(str); + if (!items.isEmpty()) { + // 存在该文本的项 + QStandardItem* item = items[0]; + for (int row = 0; row < item->rowCount(); ++row) { + // 默认获取第 0 列的子项 + QStandardItem* child = item->child(row, 0); + if (child) { + lst.append(child); + } + } + } + return lst; +} + +void ProjectModelManager::deleteData(const QString& sMeta,const QString& sProject) +{ + delete m_mapTotalData[sMeta][sProject].pBase; //手动释放 + delete m_mapTotalData[sMeta][sProject].pSelect; + m_mapTotalData[sMeta].remove(sProject); +} + +QStringList ProjectModelManager::getModelList() const +{ + QMap modelMap = DataBase::GetInstance()->ModelType(); + + QSet modelSet; + for(auto &model:modelMap) + { + modelSet.insert(model.modelType); + } + + return QStringList(modelSet.values()); +} + +QStringList ProjectModelManager::getGroupList(const QString& sM) const +{ + QMap modelType = DataBase::GetInstance()->ModelType(); + QMap modelGroupMap = DataBase::GetInstance()->ModelGroup(); + QMap groupMap = DataBase::GetInstance()->AttributeGroup(); + + int metaId = 0; + for(auto &meta:modelType) + { + if(sM == meta.modelType) //查找元模对应的id + { + metaId = meta.id; + break; + } + } + + QList lstGroupId; + for(auto &group:modelGroupMap) //找到元模id对应的属性组id + { + if(group.modelTypeId == metaId) + { + lstGroupId.push_back(group.attributeGroupId); + } + } + + QStringList groupList; + for(auto &id:lstGroupId) //从属性组中找到id对应的组名 + { + groupList.append(groupMap[id].groupType); + } + + return groupList; +} + +QStringList ProjectModelManager::getPublicGroupList() const +{ + QMap modelAttPublic = DataBase::GetInstance()->ModelAttributePublic(); + QMap groupMap = DataBase::GetInstance()->AttributeGroup(); + + QSet setGroup; + for(auto &model:modelAttPublic) + { + setGroup.insert(model.attributeGroupId); + } + + QStringList groupList; + for(auto &id:setGroup) + { + groupList.append(groupMap[id].groupType); + } + return groupList; +} + +QStringList ProjectModelManager::getAttributeList(const QString& sM,const QString& sG) const +{ + QMap modelType = DataBase::GetInstance()->ModelType(); + //QMap modelGroupMap = DataBase::GetInstance()->ModelGroup(); + QMap groupMap = DataBase::GetInstance()->AttributeGroup(); + QMap modelAttMap = DataBase::GetInstance()->ModelAttribute(); + QMap attMap = DataBase::GetInstance()->Attribute(); + + int metaId = -1; + for(auto &meta:modelType) + { + if(sM == meta.modelType) //查找元模对应的id + { + metaId = meta.id; + break; + } + } + + int groupId = -1; + for(auto &attGroup:groupMap) + { + if(attGroup.groupType == sG) //返回参数属性组名对应的id + { + groupId = attGroup.id; + break; + } + } + + QStringList lst; + for(auto &mt:modelAttMap) + { + if(mt.modelTypeId == metaId && mt.attributeGroupId == groupId) + { + lst.append(attMap[mt.attributeId].attribute); + } + } + + return lst; +} + +QStringList ProjectModelManager::getPublicAttributeList(const QString& group) +{ + QMap modelAttPublic = DataBase::GetInstance()->ModelAttributePublic(); + QMap groupMap = DataBase::GetInstance()->AttributeGroup(); + QMap attMap = DataBase::GetInstance()->Attribute(); + + int groupId = -1; + for(auto &attGroup:groupMap) + { + if(attGroup.groupType == group) //返回参数属性组名对应的id + { + groupId = attGroup.id; + break; + } + } + + QStringList lst; + for(auto &mt:modelAttPublic) + { + if(mt.attributeGroupId == groupId) + { + lst.append(attMap[mt.attributeId].attribute); + } + } + + return lst; +} + +void ProjectModelManager::setItemAttribute(const QString& name,QStandardItem* p) +{ + QMap attMap = DataBase::GetInstance()->Attribute(); + QMap dt = DataBase::GetInstance()->DataType(); + + for(auto &att:attMap) + { + QString sType = dt[att.dataTypeId].dataType; //获得属性id对应的属性名 + if(name == att.attribute) + { + p->setData(att.id,Id); + p->setData(att.attribute,Attribute); + p->setData(att.attributeName,AttributeName); + p->setData(sType,DataType); //不直接使用id,拼接完成str + p->setData(att.lengthPrecision,LengthPrecision); + p->setData(att.scale,Scale); + p->setData(att.isNotNull,IsNotNull); + p->setData(att.defaultValue,DefaultValue); + p->setData(att.valueRange,ValueRange); + p->setData(att.isVisible,IsVisible); + return; + } + } +} + +QPair ProjectModelManager::combinePropertySql(const QStandardItem* pItem) +{ + QMap dt = DataBase::GetInstance()->DataType(); + + int id = pItem->data(Id).toInt(); + QString attribute = pItem->data(Attribute).toString(); + QString dataType = pItem->data(DataType).toString(); + int lengthPrecision = pItem->data(LengthPrecision).toInt(); + int scale = pItem->data(Scale).toInt(); + QString defaultValue = pItem->data(DefaultValue).toString(); + QString valueRange = pItem->data(ValueRange).toString(); + int isNotNull = pItem->data(IsNotNull).toInt(); + + bool needsQuotes = stringDataTypes.contains(dataType); + // 处理数据类型及其长度精度 + QString dataTypePart = dataType; + if (lengthPrecision > 0) { + dataTypePart += QString("(%1").arg(lengthPrecision); + if (scale > 0) { + dataTypePart += QString(",%1").arg(scale); + } + dataTypePart += ")"; + } + + // 开始拼接SQL + QString sql = QString("%1 %2").arg(attribute, dataTypePart); + + // 处理约束条件 + if (isNotNull != -1) { + sql += " NOT NULL"; + } + + if (!defaultValue.isEmpty()) { + QString defValue = defaultValue; + if (needsQuotes && defValue != "null" && defValue != "NULL") { + // 转义单引号并包裹 + defValue.replace("'", "''"); + defValue = QString("'%1'").arg(defValue); + } + sql += QString(" DEFAULT %1").arg(defValue); + } + + /*if (isPrimaryKey != 0) { + sql += " PRIMARY KEY"; + }*/ + + return qMakePair(sql,dataTypePart); +} + +bool ProjectModelManager::ifProjectEqual(const QString& sMeta,const QString& sProject,QMap map) +{ + //todo:判断关联的模型类型 + MapProperty curPro = m_mapTotalData[sMeta][sProject].mapProperty; + + QMap::Iterator iter; + for(iter = curPro.begin();iter != curPro.end();++iter) + { + if(iter->isPublic) //公共组跳过判断 + continue; + if(!map.contains(iter.key())) //已存在的模型中不包含该属性组 + { + QMap curCheckState = iter.value().mCheckState; + for(auto &val:curCheckState) + { + if(val.checkState) //该属性组不在模型中且被勾选 + return false; + } + continue; //该属性组不在模型中且未被勾选,不做判断 + } + else + { + QJsonObject dbCheckState = map[iter.key()]; //数据库中该属性组的勾选状态 + QMap curCheckState = iter.value().mCheckState; //当前程序中的勾选状态 + + QJsonArray nodesJsonArray = dbCheckState["checkState"].toArray(); + if(nodesJsonArray.size() != curCheckState.size()) //属性个数对不上,模型不同 + return false; + for (QJsonValueRef nodeJson : nodesJsonArray) + { + QJsonObject node = nodeJson.toObject(); + QString propertyName = node["name"].toString(); + int nState = node["checked"].toInt(); + if(curCheckState[propertyName].checkState != nState) //相同属性选中状态不同 + return false; + } + } + } + return true; +} + +QString ProjectModelManager::modifyProjectModel(const QString& sMeta,const QString& sProject,QMap mapOld) +{ + QString sRes; + MapProperty curPro = m_mapTotalData[sMeta][sProject].mapProperty; + QStandardItemModel* pSelectModel = m_mapTotalData[sMeta][sProject].pSelect; + QStandardItemModel* pBaseModel = m_mapTotalData[sMeta][sProject].pBase; + int nType = m_mapTotalData[sMeta][sProject].nType; + + QMap::Iterator iter; + for(iter = curPro.begin();iter != curPro.end();++iter) //遍历当前模型所有属性组 + { + QMap curCheckState = iter.value().mCheckState; //当前程序中的属性勾选状态 + bool isNull = true; //当前属性组是否未空 + for(auto &val:curCheckState) + { + if(val.checkState){ + isNull = false; //当前程序模型有勾选,不为空 + break; + } + } + if(isNull){ + if(mapOld.contains(iter.key())){ //当前模型勾选为空且库模型中包含此属性组,移除库中该属性组表 + QMap map = DataBase::GetInstance()->getProjectTableName(sProject); + bool res = DataBase::GetInstance()->deleteTable(map[iter.key()]); + if(res){ + DataBase::GetInstance()->deleteRecordFromManager(sProject,iter.key()); + sRes = QString::fromWCharArray(L"修改模型成功"); + } + } + } + else{ + QList lstSelected = ProjectModelManager::instance().getGroupSub(pSelectModel,iter.key()); + QList lstBase = ProjectModelManager::instance().getGroupSub(pBaseModel,iter.key()); + if(mapOld.contains(iter.key())){ //新旧模型中都存在,修改模型 + QMap oldSchema; //库中模型 属性名/数据类型 + QMap newSchema; //现有模型 + + QJsonObject obj = mapOld[iter.key()]; + QJsonArray nodesJsonArray = obj["checkState"].toArray(); + + for (QJsonValueRef nodeJson : nodesJsonArray) + { + QJsonObject node = nodeJson.toObject(); + QString propertyName = node["name"].toString(); + int nState = node["checked"].toInt(); + QString dataType = node["type"].toString(); + + if(nState) + oldSchema.insert(propertyName,dataType); + } + + QMap::Iterator it; + for(it = curCheckState.begin(); it != curCheckState.end();++it) + { + if(it->checkState){ + newSchema.insert(it.key(),it->dataType); + } + } + if(oldSchema == newSchema) + continue; + + QMap map = DataBase::GetInstance()->getProjectTableName(sProject); + + bool res = DataBase::GetInstance()->modifyProjectTable(map[iter.key()],oldSchema,newSchema); + + QJsonObject objState = getSelectedState(lstSelected,lstBase); + DataBase::GetInstance()->updateCheckState(map[iter.key()],objState); + if(res) + { + sRes = QString::fromWCharArray(L"修改模型成功"); + } + } + else{ //非空且库模型中不存在,新增 + bool res = createPropertyTable(sMeta,sProject,iter.key(),lstSelected,lstBase,nType); + if(res) + { + sRes = QString::fromWCharArray(L"修改模型成功"); + } + } + } + } + return sRes; +} + +bool ProjectModelManager::renameProjectModel(const QString& strCur,QMap datas) +{ + for(auto &data:datas) + { + QString sTable = data.metaModel + QString("_") + strCur + QString("_")+data.groupName; + + DataBase::GetInstance()->updateProjectName(sTable,strCur,data.name); + DataBase::GetInstance()->alterTableName(data.name,sTable); + } + return true; +} + +void ProjectModelManager::updateComponentModelName(const QString& strOld,const QString& strNew) +{ + DataBase::GetInstance()->updateComponentModelName(strOld,strNew); +} + +bool ProjectModelManager::ifProjectExsit(const QString& sPro) +{ + for(auto &meta:m_mapTotalData) + { + if(meta.contains(sPro)) + { + return true; + } + } + return false; +} + + +int ProjectModelManager::createPropertyTable(const QString& sMeta,const QString& sProject,const QString& sGroup,QList lstSelect,QList lstBase,int nLinkType,bool isPublic) +{ + if(!isPublic) + { + QString sName = sMeta + QString("_") + sProject + QString("_")+sGroup; + + QStringList fields; + fields.append("id SERIAL NOT NULL PRIMARY KEY"); + fields.append("global_uuid uuid NOT NULL DEFAULT gen_random_uuid()"); + fields.append("attribute_group VARCHAR(64) NOT NULL"); + + for(auto &item:lstSelect) + { + QPair pair = combinePropertySql(item); //拼接单句sql + fields.append(pair.first); + } + + QJsonObject objState = getSelectedState(lstSelect,lstBase); + + if(!DataBase::GetInstance()->createDynamicTable(sName,fields)) + { + return int(AlertInfo::fail); + } + else + { + DataBase::GetInstance()->insertProjectManager(sName,sProject,sMeta,sGroup,nLinkType,objState); + return int(AlertInfo::success); + } + } + else + { + QString sName = sGroup; + + QStringList fields; + fields.append("id SERIAL NOT NULL PRIMARY KEY"); + fields.append("global_uuid uuid NOT NULL DEFAULT gen_random_uuid()"); + //fields.append("attribute_group VARCHAR(64) NOT NULL"); + + for(auto &item:lstSelect) + { + QString attribute = item->data(Attribute).toString(); + if(attribute.contains("global_uuid")) + continue; + QPair pair = combinePropertySql(item); //拼接单句sql + fields.append(pair.first); + } + + QJsonObject objState = getSelectedState(lstSelect,lstBase); + + if(!DataBase::GetInstance()->ifDynamicTableExist(sName)) + { + bool val = DataBase::GetInstance()->createDynamicTable(sName,fields); + if(val) + { + DataBase::GetInstance()->insertProjectManager(sName,sName,"NULL",sGroup,0,objState,true); + return int(AlertInfo::success); + } + else { + return int(AlertInfo::fail); + } + } + else + { + return int(AlertInfo::exist); + } + } +} + +QJsonObject ProjectModelManager::getSelectedState(QList select,QList base) +{ + QJsonObject objState; + QJsonArray arrState; + + for(auto &item:select) + { + QString dataType = item->data(DataType).toString(); + int lengthPrecision = item->data(LengthPrecision).toInt(); + int scale = item->data(Scale).toInt(); + QString defaultValue = item->data(DefaultValue).toString(); + int isVisible = item->data(IsVisible).toInt(); + + QString dataTypePart = dataType; //拼接数据类型 + if (lengthPrecision > 0) { + dataTypePart += QString("(%1").arg(lengthPrecision); + if (scale > 0) { + dataTypePart += QString(",%1").arg(scale); + } + dataTypePart += ")"; + } + + QJsonObject node; //保存已选择状态 + node["name"] = item->text(); + node["checked"] = 1; + node["type"] = dataTypePart; + node["defaultValue"] = defaultValue; + node["lengthPrecision"] = lengthPrecision; + node["isVisible"] = isVisible; + arrState.append(node); + } + + for(auto &item:base) + { + QString dataType = item->data(DataType).toString(); + int lengthPrecision = item->data(LengthPrecision).toInt(); + int scale = item->data(Scale).toInt(); + QString defaultValue = item->data(DefaultValue).toString(); + int isVisible = item->data(IsVisible).toInt(); + + QString dataTypePart = dataType; //拼接数据类型 + if (lengthPrecision > 0) { + dataTypePart += QString("(%1").arg(lengthPrecision); + if (scale > 0) { + dataTypePart += QString(",%1").arg(scale); + } + dataTypePart += ")"; + } + + QJsonObject node; //保存未选择状态 + node["name"] = item->text(); + node["checked"] = 0; + node["type"] = dataTypePart; + node["defaultValue"] = defaultValue; + node["lengthPrecision"] = lengthPrecision; + node["isVisible"] = isVisible; + arrState.append(node); + } + + objState["checkState"] = arrState; + return objState; +} + +QString ProjectModelManager::getItemDataType(const QStandardItem* pItem) +{ + QString dataType = pItem->data(DataType).toString(); + int lengthPrecision = pItem->data(LengthPrecision).toInt(); + int scale = pItem->data(Scale).toInt(); + + QString dataTypePart = dataType; + if (lengthPrecision > 0) { + dataTypePart += QString("(%1").arg(lengthPrecision); + if (scale > 0) { + dataTypePart += QString(",%1").arg(scale); + } + dataTypePart += ")"; + } + return dataTypePart; +} diff --git a/include/projectModelDlg.h b/include/projectModelDlg.h index a9db8e9..8ea83b0 100644 --- a/include/projectModelDlg.h +++ b/include/projectModelDlg.h @@ -12,46 +12,6 @@ QT_BEGIN_NAMESPACE namespace Ui { class projectModelDlg; } QT_END_NAMESPACE -enum projectState -{ - Err = -1, - NotExist = 0, - Exist, - Changed -}; - -struct FormerName //曾用名,记录修改前名称 -{ - QString sName; - bool bChanged = false; //是否改变过 -}; - -struct PropertyState //每个属性的状态 -{ - bool checkState = false; - QString dataType; - bool editable = true; //可勾选状态 -}; - -struct PropertyPage //属性信息 -{ - QMap mCheckState; //属性选择状态 - bool isPublic = false; -}; - -typedef QMap MapProperty; //属性组 -struct PropertyModel //工程模 -{ - MapProperty mapProperty; - int nType = 0; //工程模类型,选择图标后确定 - QStandardItemModel* pBase; //基础属性 - QStandardItemModel* pSelect; //已选择属性 - FormerName formerMeta; //曾用元模名 - FormerName formerProject; //曾用工程模名 - QMap dataInfo; //存放数据库内容 -}; -typedef QMap MapProject; //str为工程名,PropertyModel为工程属性 -typedef QMap MapMeta; //str为元模名,PropertyModel为工程模集 class projectModelDlg : public QDialog { @@ -64,20 +24,13 @@ public: void initial(); void initialModel(); void initialList(); - MapProperty addNewProject(const QString& sMeta,const QString& sProject,PropertyModel&); //根据元模型、工程模名称生成工程模对象 //void update(); - void generate(const QString&); //根据输入名称生成表 public slots: void onSaveClicked(); void onCancelClicked(); void onApplyClicked(); void onRevokeClicked(); - //void onBaseModelIndexChanged(const QString&); - //void onProjectIndexChanged(const QString&); - //void onPropertyIndexChanged(const QString&); - //void onIconClicked(const QModelIndex &index); //关联图元改变 - //void onIndexClicked(const QModelIndex &index); //索引列表点击 void onIndexRbtnClicked(const QPoint &pos); //索引列表右键菜单 void onDeleteProjectClicked(); //删除选中工程模 @@ -85,28 +38,11 @@ public slots: void onTableItemClicked(QTableWidgetItem *item); //模型item点击事件 void onDelegateFinishEdit(const QModelIndex &index, const QString &value); //lineEdit代理编辑完成事件 public: - QStringList getModelList() const; //获取元模型列表 - QStringList getGroupList(const QString& model) const; //返回该元模下的属性组列表 - QStringList getPublicGroupList() const; //返回公共属性组列表 - QStringList getAttributeList(const QString& model,const QString& group) const; //根据元模名和组名返回属性列表 - QStringList getPublicAttributeList(const QString& group); //返回公共属性组的属性列表 - void setItemAttribute(const QString&,QStandardItem*); //设置item的属性(数据库表字段名) - QPair combinePropertySql(const QStandardItem*); //根据item属性生成sql QString getProjectName() const; //返回当前选择项目的名称 QString getMetaName() const; //返回当前元模型名 - bool ifProjectEqual(QMap); //根据每个属性组的勾选状态判断两个模型是否相同 - QString modifyProjectModel(QMap); //修改工程模 - bool renameProjectModel(const QString& strCur,QMap datas); //重命名工程模 - void updateComponentModelName(const QString& strOld,const QString& strNew); //更新component中的工程模 -signals: - void modelChange(); //模型改变信号 + private: - //void updateIconList(); //选择工程模后刷新关联图标 void removeProjectData(const QString&,const QString&,int role); //移除对应的project层级结构 - QString getItemDataType(const QStandardItem* pItem); //返回数据类型 - int createPropertyTable(const QString& sProject,const QString& sGroup,QList lstSelect,QList lstBase,int nLinkType,bool isPublic = false); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型) - QJsonObject getSelectedState(QList select,QList base); //返回json格式的选中状态 - QList getGroupSub(QStandardItemModel*,const QString&); //返回指定组下的属性(如果存在) void setupUI(); void initialTypeMap(); @@ -115,11 +51,8 @@ private: void setTableItemState(int row,TableItemState state); //设置状态 int getModelEditState(); //返回工程模编辑状态(选择、编辑、新建) - - bool ifProjectExsit(const QString&); //判断工程模存在 private: Ui::projectModelDlg *ui; - MapMeta m_mapTotal; QString _curMeta; //当前元模型 QString _curProject; //当前工程模 QString _curType; //当前关联类型 diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index ef51fc3..99543d2 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -27,6 +27,7 @@ #include "topologyView.h" #include "diagramView.h" #include "createEditor.h" +#include "projectModelManager.h" //using namespace ads; @@ -100,7 +101,7 @@ void CMainWindow::initializeDockUi() connect(m_pElectricElementsBox,&ElectricElementsBox::addEletricItem,m_pDiagramCavas,&DiagramCavas::onSignal_addGraphicsItem); m_pProjectModelDlg = new projectModelDlg(this); - connect(m_pProjectModelDlg,&projectModelDlg::modelChange,m_pElectricElementsBox,&ElectricElementsBox::onSignal_modelChanged); + connect(&ProjectModelManager::instance(),&ProjectModelManager::modelChange,m_pElectricElementsBox,&ElectricElementsBox::onSignal_modelChanged); } void CMainWindow::initializeAction() diff --git a/source/projectModelDlg.cpp b/source/projectModelDlg.cpp index fca428f..b73b53e 100644 --- a/source/projectModelDlg.cpp +++ b/source/projectModelDlg.cpp @@ -7,9 +7,7 @@ #include "dataBase.h" #include "global.h" #include "projectTableDelegate.h" -#include "logger.h" - -const QSet stringDataTypes = {"VARCHAR", "CHAR", "TEXT", "DATE", "TIME", "TIMESTAMP","JSONB","JSON"}; +#include "projectModelManager.h" projectModelDlg::projectModelDlg(QWidget *parent) : QDialog(parent) @@ -36,13 +34,7 @@ void projectModelDlg::initial() connect(ui->btn_apply,&QPushButton::clicked,this,&projectModelDlg::onApplyClicked); connect(ui->btn_revoke,&QPushButton::clicked,this,&projectModelDlg::onRevokeClicked); - //connect(ui->cb_baseModel,&QComboBox::textActivated,this,&projectModelDlg::onBaseModelIndexChanged); - //connect(ui->cb_projectModel,&QComboBox::textActivated,this,&projectModelDlg::onProjectIndexChanged); - //connect(ui->cb_property,&QComboBox::textActivated,this,&projectModelDlg::onPropertyIndexChanged); - - //ui->treeView_model->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->tableWidget_model, &QTableWidget::customContextMenuRequested, this, &projectModelDlg::onIndexRbtnClicked); - //connect(ui->treeView_model, &QTreeView::clicked, this, &projectModelDlg::onIndexClicked); connect(ui->btn_new, &QPushButton::clicked, this, &projectModelDlg::addPropertyGroup); connect(ui->tableWidget_model, &QTableWidget::itemClicked, this, &projectModelDlg::onTableItemClicked); @@ -51,169 +43,15 @@ void projectModelDlg::initial() update(); } -MapProperty projectModelDlg::addNewProject(const QString& sMeta,const QString& sProject,PropertyModel& model) -{ - MapProperty mt; - QStringList lstProperty = getGroupList(sMeta); //返回元模下的属性组名 - QStringList lstProPublic = getPublicGroupList(); //返回公共属性组 - //lstProperty< mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(sProject); //获取选择状态 - for(auto &property:lstProperty) - { - PropertyPage struProperty; - struProperty.isPublic = false; - - if(mapCheckState.contains(property) && !model.formerMeta.bChanged) //生成的模型中勾选了该属性组且元模未改变过 - { - QJsonObject obj = mapCheckState[property]; - QJsonArray nodesJsonArray = obj["checkState"].toArray(); - - for (QJsonValueRef nodeJson : nodesJsonArray) - { - QJsonObject node = nodeJson.toObject(); - QString propertyName = node["name"].toString(); - int nState = node["checked"].toInt(); - QString dataType = node["type"].toString(); - QString defaultValue = node["defaultValue"].toString(); - - QStandardItem* pItem = new QStandardItem(propertyName); - setItemAttribute(propertyName,pItem); - PropertyState sta; - sta.dataType = dataType; - if(nState) - { - QStandardItem* pGroup = nullptr; - if(model.pSelect->findItems(propertyName).isEmpty()) - { - pGroup = new QStandardItem(property); - model.pSelect->appendRow(pGroup); //属性的组未存在,将组添加到model - } - else - { - pGroup = model.pSelect->findItems(propertyName)[0]; - } - - if(pGroup){ - pGroup->appendRow(pItem); - sta.checkState = true; - struProperty.mCheckState.insert(propertyName,sta); - } - } - else - { - QStandardItem* pGroup = nullptr; - if(model.pBase->findItems(propertyName).isEmpty()) - { - pGroup = new QStandardItem(property); - model.pBase->appendRow(pGroup); //属性的组未存在,将组添加到model - } - else - { - pGroup = model.pBase->findItems(propertyName)[0]; - } - - if(pGroup){ - pGroup->appendRow(pItem); - sta.checkState = false; - struProperty.mCheckState.insert(propertyName,sta); - } - } - } - } - else //未勾选属性组或是新建或元模已改变 - { - QStandardItem* pGroup = nullptr; //新建的不包含属性组 - pGroup = new QStandardItem(property); - model.pBase->appendRow(pGroup); - - QStringList lstName = getAttributeList(sMeta,property); - for(auto &name:lstName) - { - QStandardItem* pItem = new QStandardItem(name); - setItemAttribute(name,pItem); - pGroup->appendRow(pItem); - QString dataType = getItemDataType(pItem); - PropertyState sta; - sta.dataType = dataType; - sta.checkState = false; - struProperty.mCheckState.insert(name,sta); //初始都是未选择状态 - } - } - mt.insert(property,struProperty); - } - - MapProperty pubMap; - for(auto &pro:lstProPublic) //公共属性组 - { - PropertyPage struProperty; - struProperty.isPublic = true; - - QStandardItem* pGroup = nullptr; - pGroup = new QStandardItem(pro); - //model.pSelect->appendRow(pGroup); //公共属性组默认都包含 - model.pSelect->insertRow(0,pGroup); - - QStringList lstName = getPublicAttributeList(pro); - for(auto &name:lstName) - { - QStandardItem* pItem = new QStandardItem(name); - pItem->setData(QColor(60,140,180,180), Qt::BackgroundRole); - setItemAttribute(name,pItem); - pGroup->appendRow(pItem); - QString dataType = getItemDataType(pItem); - PropertyState sta; - sta.dataType = dataType; - sta.checkState = true; - sta.editable = false; - struProperty.mCheckState.insert(name,sta); //初始都已经选择 - } - pubMap.insert(pro,struProperty); - } - - for (auto it = mt.begin(); it != mt.end(); ++it) { //将正常属性添到公共属性后 - if(pubMap.contains(it.key())) - continue; //公共属性组已有的不重复添加 - pubMap.insert(it.key(), it.value()); - } - - return pubMap; -} - void projectModelDlg::initialModel() { - QStringList lstModel = getModelList(); - for(auto &model:lstModel) - { - MapProject mp; - QMap mapProject = DataBase::GetInstance()->getProjectFromManager(model); - - - QMap::Iterator iter; - for(iter = mapProject.begin();iter != mapProject.end(); ++iter) - { - //QStandardItem* propertyItem = new QStandardItem(iter.key()); - - PropertyModel pm; - pm.pBase = new QStandardItemModel(this); - pm.pSelect = new QStandardItemModel(this); - pm.mapProperty = addNewProject(model,iter.key(),pm); - pm.nType = iter.value(); - pm.formerMeta.sName = model; - pm.formerProject.sName = iter.key(); - pm.dataInfo = DataBase::GetInstance()->getProjectModelGroupInfo(iter.key()); - mp.insert(iter.key(),pm); - } - - //todo:读取存储,按分类遍历名称 - m_mapTotal.insert(model,mp); - } + ProjectModelManager::instance().initialModel(); } void projectModelDlg::initialList() { MapMeta::Iterator iter; - for(iter = m_mapTotal.begin();iter != m_mapTotal.end();++iter) + for(iter = ProjectModelManager::instance().getData().begin();iter != ProjectModelManager::instance().getData().end();++iter) { MapProject proj = iter.value(); MapProject::Iterator it; @@ -249,58 +87,6 @@ void projectModelDlg::initialList() } }*/ -void projectModelDlg::generate(const QString& str) -{ - MapMeta::Iterator iter = m_mapTotal.find(_curMeta); //获取元模下的工程 - if(iter != m_mapTotal.end()) - { - MapProject mp = iter.value(); - MapProject::Iterator ite = mp.find(_curProject); //获取工程下的属性组 - if(ite != mp.end()) - { - MapProperty mapProperty = ite.value().mapProperty; - - int createRes = 0; //动态表生成结果 - for(MapProperty::Iterator it = mapProperty.begin();it != mapProperty.end();++it){ //每个属性组单独生成表 - int nType = ite.value().nType; - QStandardItemModel* pSelectModel = ite->pSelect; - QStandardItemModel* pBaseModel = ite->pBase; - - QList lstSelected = getGroupSub(pSelectModel,it.key()); - QList lstBase = getGroupSub(pBaseModel,it.key()); - if(!lstSelected.isEmpty()) - { - bool isPub = it->isPublic; - int res = createPropertyTable(str,it.key(),lstSelected,lstBase,nType,isPub); - switch (res){ - case int(AlertInfo::success): - LOG_INFO("DB", QString("create %1 dynamicTable success").arg(str)); - break; - case int(AlertInfo::fail): - LOG_WARN("DB", QString("create %1 dynamicTable fail").arg(str)); - break; - case int(AlertInfo::exist): - LOG_WARN("DB", QString("%1 dynamicTable exist").arg(str)); - break; - default: - break; - } - createRes = createRes | res; - } - } - if(!(createRes & int(AlertInfo::fail))) //结果不含失败就成功 - { - QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"创建表成功")); - emit modelChange(); - } - else //创建失败 - { - QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"创建表失败")); - } - } - } - -} void projectModelDlg::onSaveClicked() { @@ -310,7 +96,7 @@ void projectModelDlg::onSaveClicked() } else { - if(m_mapTotal[_curMeta][_curProject].nType == 0) + if(ProjectModelManager::instance().getData()[_curMeta][_curProject].nType == 0) { QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请选择工程模类型")); return; @@ -318,7 +104,7 @@ void projectModelDlg::onSaveClicked() projectState state = couldSave(); if(state == NotExist) //目前名称工程模不存在 { - PropertyModel proModel = m_mapTotal[_curMeta][_curProject]; + PropertyModel proModel = ProjectModelManager::instance().getData()[_curMeta][_curProject]; if(proModel.formerProject.bChanged) //工程模改过名 { if(proModel.formerMeta.bChanged) //元模改过类型 @@ -338,7 +124,7 @@ void projectModelDlg::onSaveClicked() bool val = DataBase::GetInstance()->deleteProjectModel(proModel.formerProject.sName); //删除旧工程模,生成新工程模 if(val) { - generate(_curProject); + ProjectModelManager::instance().generate(_curMeta,_curProject); setTableItemState(_curRow,TS_select); } break; @@ -355,7 +141,7 @@ void projectModelDlg::onSaveClicked() bool val = DataBase::GetInstance()->deleteProjectModel(proModel.formerProject.sName); //删除旧工程模,生成新工程模 if(val) { - generate(_curProject); + ProjectModelManager::instance().generate(_curMeta,_curProject); setTableItemState(_curRow,TS_select); } } @@ -363,7 +149,7 @@ void projectModelDlg::onSaveClicked() else //元模未改类型 { QMap map = DataBase::GetInstance()->getCheckStateFromManager(proModel.formerProject.sName); - bool val = ifProjectEqual(map); + bool val = ProjectModelManager::instance().ifProjectEqual(_curMeta,_curProject,map); QStringList lst = DataBase::GetInstance()->ifModelOccupy(proModel.formerProject.sName); if(!lst.isEmpty()){ //工程模被使用 @@ -379,20 +165,20 @@ void projectModelDlg::onSaveClicked() { if(val) //旧工程模和新工程模数据相同,改名 { - renameProjectModel(_curProject,proModel.dataInfo); - updateComponentModelName(proModel.formerProject.sName,_curProject); //修改component中的模型名 + ProjectModelManager::instance().renameProjectModel(_curProject,proModel.dataInfo); + ProjectModelManager::instance().updateComponentModelName(proModel.formerProject.sName,_curProject); //修改component中的模型名 setTableItemState(_curRow,TS_select); } else //不同,先改工程模名称,后修改数据 { - renameProjectModel(_curProject,proModel.dataInfo); - updateComponentModelName(proModel.formerProject.sName,_curProject); //修改component中的模型名 - QString sRes = modifyProjectModel(map); + ProjectModelManager::instance().renameProjectModel(_curProject,proModel.dataInfo); + ProjectModelManager::instance().updateComponentModelName(proModel.formerProject.sName,_curProject); //修改component中的模型名 + QString sRes = ProjectModelManager::instance().modifyProjectModel(_curMeta,_curProject,map); if(!sRes.isEmpty()) { QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改模型成功")); setTableItemState(_curRow,TS_select); - emit modelChange(); + emit ProjectModelManager::instance().modelChange(); } else { @@ -413,18 +199,18 @@ void projectModelDlg::onSaveClicked() { if(val) //旧工程模和新工程模数据相同,改名 { - renameProjectModel(_curProject,proModel.dataInfo); + ProjectModelManager::instance().renameProjectModel(_curProject,proModel.dataInfo); setTableItemState(_curRow,TS_select); } else //不同,先改工程模名称,后修改数据 { - renameProjectModel(_curProject,proModel.dataInfo); - QString sRes = modifyProjectModel(map); + ProjectModelManager::instance().renameProjectModel(_curProject,proModel.dataInfo); + QString sRes = ProjectModelManager::instance().modifyProjectModel(_curMeta,_curProject,map); if(!sRes.isEmpty()) { QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改模型成功")); setTableItemState(_curRow,TS_select); - emit modelChange(); + emit ProjectModelManager::instance().modelChange(); } else { @@ -436,7 +222,7 @@ void projectModelDlg::onSaveClicked() } else //新建 { - generate(_curProject); + ProjectModelManager::instance().generate(_curMeta,_curProject); setTableItemState(_curRow,TS_select); } } @@ -454,20 +240,20 @@ void projectModelDlg::onSaveClicked() int ret = msgBox.exec(); if(ret == QMessageBox::Yes) { - PropertyModel proModel = m_mapTotal[_curMeta][_curProject]; + PropertyModel proModel = ProjectModelManager::instance().getData()[_curMeta][_curProject]; if(proModel.formerMeta.bChanged) //判断元模是否改变,元模变了删除旧工程模,添加新工程模 { bool val = DataBase::GetInstance()->deleteProjectModel(proModel.formerProject.sName); if(val) { - generate(_curProject); + ProjectModelManager::instance().generate(_curMeta,_curProject); setTableItemState(_curRow,TS_select); } } else //元模未变直接修改 { QMap mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(_curProject); //获取选择状态 - QString sRes = modifyProjectModel(mapCheckState); + QString sRes = ProjectModelManager::instance().modifyProjectModel(_curMeta,_curProject,mapCheckState); if(!sRes.isEmpty()) { QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改模型成功")); @@ -495,8 +281,8 @@ void projectModelDlg::onCancelClicked() void projectModelDlg::onApplyClicked() { - MapMeta::Iterator iter = m_mapTotal.find(_curMeta); - if(iter != m_mapTotal.end()) + MapMeta::Iterator iter = ProjectModelManager::instance().getData().find(_curMeta); + if(iter != ProjectModelManager::instance().getData().end()) { MapProject project = iter.value(); MapProject::Iterator it= project.find(_curProject); @@ -533,7 +319,7 @@ void projectModelDlg::onApplyClicked() //it->pBase->removeRow(selected.row()); - m_mapTotal[_curMeta][_curProject].mapProperty[strGroup].mCheckState[pItem->text()].checkState = true; //选择状态设为1 + ProjectModelManager::instance().getData()[_curMeta][_curProject].mapProperty[strGroup].mCheckState[pItem->text()].checkState = true; //选择状态设为1 } } } @@ -544,9 +330,9 @@ void projectModelDlg::onApplyClicked() void projectModelDlg::onRevokeClicked() { - QStringList lstPub = getPublicGroupList(); - MapMeta::Iterator iter = m_mapTotal.find(_curMeta); - if(iter != m_mapTotal.end()) + QStringList lstPub = ProjectModelManager::instance().getPublicGroupList(); + MapMeta::Iterator iter = ProjectModelManager::instance().getData().find(_curMeta); + if(iter != ProjectModelManager::instance().getData().end()) { MapProject project = iter.value(); MapProject::Iterator it= project.find(_curProject); @@ -590,7 +376,7 @@ void projectModelDlg::onRevokeClicked() //it->pSelect->removeRow(selected.row()); - m_mapTotal[_curMeta][_curProject].mapProperty[strGroup].mCheckState[pItem->text()].checkState = false; //选择状态设为1 + ProjectModelManager::instance().getData()[_curMeta][_curProject].mapProperty[strGroup].mCheckState[pItem->text()].checkState = false; //选择状态设为1 } } } @@ -599,151 +385,6 @@ void projectModelDlg::onRevokeClicked() ui->treeView_base->expandAll(); } -/*void projectModelDlg::onBaseModelIndexChanged(const QString& str) -{ - if(_curMeta == str) //选择未改变 - { - return; - } - if(ui->stackedWidget->currentIndex() !=1) //选择元模时隐藏iconlist - { - ui->stackedWidget->setCurrentIndex(1); - } - ui->treeView_base->setModel(nullptr); - ui->treeView_sub->setModel(nullptr); - MapMeta::Iterator iter = m_mapTotal.find(str); - if(iter != m_mapTotal.end()) - { - //先清空已有 - _curMeta = str; - _curProject = ""; - _curProperty = ""; - ui->cb_projectModel->clear(); - ui->cb_property->clear(); - MapProject project = iter.value(); - for(MapProject::Iterator it = project.begin();it != project.end();++it) - { - ui->cb_projectModel->addItem(it.key()); - } - } -}*/ - -/*void projectModelDlg::onProjectIndexChanged(const QString& str) -{ - if(_curMeta.isEmpty()) - { - QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请先选择元模型")); - } - else - { - if(_curProject == str) //选择未改变 - { - return; - } - ui->treeView_base->setModel(nullptr); - ui->treeView_sub->setModel(nullptr); - MapMeta::Iterator iter = m_mapTotal.find(_curMeta); - if(iter != m_mapTotal.end()) - { - MapProject project = iter.value(); - MapProject::Iterator it= project.find(str); - if(it != project.end()) - { - _curProject = str; - _curProperty = ""; - ui->cb_property->clear(); - MapProperty property = it.value().mapProperty; - for(MapProperty::Iterator ite = property.begin();ite != property.end();++ite) - { - ui->cb_property->addItem(ite.key()); - } - } - - QString sFirst = ui->cb_property->itemText(0); //点选工程模后默认选中第一条属性 - onPropertyIndexChanged(sFirst); - } - updateIconList(); - } -}*/ - -/*void projectModelDlg::onPropertyIndexChanged(const QString& str) -{ - if(_curProject.isEmpty()) - { - QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请先选择工程模型")); - } - else - { - if(_curProperty == str) - { - return; - } - ui->treeView_base->setModel(nullptr); - ui->treeView_sub->setModel(nullptr); - MapMeta::Iterator iter = m_mapTotal.find(_curMeta); - if(iter != m_mapTotal.end()) - { - MapProject project = iter.value(); - MapProject::Iterator it= project.find(_curProject); - if(it != project.end()) - { - MapProperty property = it.value().mapProperty; - MapProperty::Iterator ite = property.find(str); - if(ite != property.end()) - { - _curProperty = str; - ui->treeView_base->setModel(nullptr); - ui->treeView_sub->setModel(nullptr); - QStandardItemModel* pBase = ite.value().pBase; - QStandardItemModel* pSelect = ite.value().pSelect; - ui->treeView_base->setModel(pBase); - ui->treeView_sub->setModel(pSelect); - } - } - } - } -}*/ - -/*void projectModelDlg::onIconClicked(const QModelIndex &index) -{ - QStandardItemModel *model = dynamic_cast(ui->listView_icon->model()); - if(model) - { - QStandardItem* pItem = model->itemFromIndex(index); - int id = pItem->data(Qt::UserRole).toInt(); - m_mapTotal[_curMeta][_curProject].nType = id; - } -}*/ - -/*void projectModelDlg::onIndexClicked(const QModelIndex &index) -{ - // 获取模型 - QStandardItemModel *model = qobject_cast(ui->treeView_model->model()); - if (!model) { - return; - } - - // 判断是否为第二级节点 - if (index.parent().isValid()) { // 父索引有效,说明是第二级节点 - QString sMeta = model->data(index.parent(), Qt::DisplayRole).toString(); - QString sProject = model->data(index, Qt::DisplayRole).toString(); - - ui->cb_baseModel->setCurrentText(sMeta); //无法编辑combobox的会跳转到该内容 - onBaseModelIndexChanged(sMeta); //Base的改变会清空_project - - ui->cb_projectModel->setCurrentText(sProject); - onProjectIndexChanged(sProject); - - _curMeta = sMeta; - _curProject = sProject; - } else { - QString sMeta = model->data(index, Qt::DisplayRole).toString(); - ui->cb_baseModel->setCurrentText(sMeta); //无法编辑combobox的会跳转到该内容 - onBaseModelIndexChanged(sMeta); - _curMeta = sMeta; - _curProject = ""; - } -}*/ void projectModelDlg::onIndexRbtnClicked(const QPoint &pos) { @@ -927,7 +568,7 @@ void projectModelDlg::onTableItemClicked(QTableWidgetItem *item) ui->treeView_sub->setModel(nullptr); MapMeta::Iterator it; - for(it = m_mapTotal.begin();it != m_mapTotal.end();++it) + for(it = ProjectModelManager::instance().getData().begin();it != ProjectModelManager::instance().getData().end();++it) { MapProject proj = it.value(); MapProject::Iterator iter; @@ -956,7 +597,7 @@ void projectModelDlg::onTableItemClicked(QTableWidgetItem *item) ui->treeView_sub->setModel(nullptr); MapMeta::Iterator it; - for(it = m_mapTotal.begin();it != m_mapTotal.end();++it) + for(it = ProjectModelManager::instance().getData().begin();it != ProjectModelManager::instance().getData().end();++it) { MapProject proj = it.value(); MapProject::Iterator iter; @@ -990,7 +631,7 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri int col = index.column(); if(col == TD_ProjectModel) { - if(ifProjectExsit(value)) + if(ProjectModelManager::instance().ifProjectExsit(value)) { QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"模型名已存在")); QTableWidgetItem* pItem = ui->tableWidget_model->item(index.row(),index.column()); @@ -998,15 +639,15 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri pItem->setText(QString::fromWCharArray(L"未命名")); return; } - if(m_mapTotal.contains(_curMeta)) //判断元模存在 + if(ProjectModelManager::instance().getData().contains(_curMeta)) //判断元模存在 { - if(m_mapTotal[_curMeta].contains(_curProject)) //已经存在 + if(ProjectModelManager::instance().getData()[_curMeta].contains(_curProject)) //已经存在 { if(_curProject == value) //工程模名称未变 return; else{ //工程模名称变化,更新存储 - PropertyModel proModel = m_mapTotal[_curMeta].take(_curProject); - m_mapTotal[_curMeta].insert(value,proModel); + PropertyModel proModel = ProjectModelManager::instance().getData()[_curMeta].take(_curProject); + ProjectModelManager::instance().getData()[_curMeta].insert(value,proModel); _curProject = value; } } @@ -1021,22 +662,22 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri } else if(col == TD_MetaModel) { - if(m_mapTotal.contains(_curMeta)) //判断元模存在 + if(ProjectModelManager::instance().getData().contains(_curMeta)) //判断元模存在 { - if(m_mapTotal[_curMeta].contains(_curProject)) //工程模已经存在 + if(ProjectModelManager::instance().getData()[_curMeta].contains(_curProject)) //工程模已经存在 { if(_curMeta == value) //选择相同元模 return; else{ //元模变化,删除旧model - PropertyModel proModel = m_mapTotal[_curMeta].take(_curProject); //从结构中取出 + PropertyModel proModel = ProjectModelManager::instance().getData()[_curMeta].take(_curProject); //从结构中取出 ui->treeView_base->setModel(nullptr); ui->treeView_sub->setModel(nullptr); delete proModel.pBase; //置空旧model delete proModel.pSelect; proModel.pBase = new QStandardItemModel(this); proModel.pSelect = new QStandardItemModel(this); - proModel.mapProperty = addNewProject(value,_curProject,proModel); //挂接新元模数据 - m_mapTotal[value].insert(_curProject,proModel); //插入到新位置 + proModel.mapProperty = ProjectModelManager::instance().addNewProject(value,_curProject,proModel); //挂接新元模数据 + ProjectModelManager::instance().getData()[value].insert(_curProject,proModel); //插入到新位置 ui->treeView_base->setModel(proModel.pBase); ui->treeView_sub->setModel(proModel.pSelect); ui->treeView_base->expandAll(); @@ -1046,8 +687,8 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri } else //新建 { - _curModel.mapProperty = addNewProject(value,_curProject,_curModel); - m_mapTotal[value].insert(_curProject,_curModel); + _curModel.mapProperty = ProjectModelManager::instance().addNewProject(value,_curProject,_curModel); + ProjectModelManager::instance().getData()[value].insert(_curProject,_curModel); ui->treeView_base->setModel(nullptr); ui->treeView_sub->setModel(nullptr); @@ -1060,8 +701,8 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri } else { - _curModel.mapProperty = addNewProject(value,_curProject,_curModel); - m_mapTotal[value].insert(_curProject,_curModel); + _curModel.mapProperty = ProjectModelManager::instance().addNewProject(value,_curProject,_curModel); + ProjectModelManager::instance().getData()[value].insert(_curProject,_curModel); ui->treeView_base->setModel(nullptr); ui->treeView_sub->setModel(nullptr); @@ -1074,7 +715,7 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri } else if(col == TD_ComponentType) { - m_mapTotal[_curMeta][_curProject].nType = _mapType.value(value); + ProjectModelManager::instance().getData()[_curMeta][_curProject].nType = _mapType.value(value); firstColumnItem->setData(Qt::UserRole,TS_edit); } } @@ -1083,15 +724,15 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri int col = index.column(); if(col == TD_ProjectModel) { - if(m_mapTotal[_curMeta].contains(_curProject)) //已经存在 + if(ProjectModelManager::instance().getData()[_curMeta].contains(_curProject)) //已经存在 { if(_curProject == value) //工程模名称未变 return; else{ //工程模名称变化,更新存储 - PropertyModel proModel = m_mapTotal[_curMeta].take(_curProject); + PropertyModel proModel = ProjectModelManager::instance().getData()[_curMeta].take(_curProject); if(!proModel.formerProject.sName.isEmpty()) //曾用工程模名不为空 proModel.formerProject.bChanged = true; - m_mapTotal[_curMeta].insert(value,proModel); + ProjectModelManager::instance().getData()[_curMeta].insert(value,proModel); _curProject = value; firstColumnItem->setData(Qt::UserRole,TS_edit); } @@ -1099,12 +740,12 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri } else if(col == TD_MetaModel) { - if(m_mapTotal[_curMeta].contains(_curProject)) //已经存在 + if(ProjectModelManager::instance().getData()[_curMeta].contains(_curProject)) //已经存在 { if(_curMeta == value) //选择相同元模 return; else{ //元模变化,删除旧model - PropertyModel proModel = m_mapTotal[_curMeta].take(_curProject); //从结构中取出 + PropertyModel proModel = ProjectModelManager::instance().getData()[_curMeta].take(_curProject); //从结构中取出 if(!proModel.formerMeta.sName.isEmpty()) //曾用元模名不为空 proModel.formerMeta.bChanged = true; ui->treeView_base->setModel(nullptr); @@ -1113,8 +754,8 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri delete proModel.pSelect; proModel.pBase = new QStandardItemModel(this); proModel.pSelect = new QStandardItemModel(this); - proModel.mapProperty = addNewProject(value,_curProject,proModel); //挂接新元模数据 - m_mapTotal[value].insert(_curProject,proModel); //插入到新位置 + proModel.mapProperty = ProjectModelManager::instance().addNewProject(value,_curProject,proModel); //挂接新元模数据 + ProjectModelManager::instance().getData()[value].insert(_curProject,proModel); //插入到新位置 ui->treeView_base->setModel(proModel.pBase); ui->treeView_sub->setModel(proModel.pSelect); ui->treeView_base->expandAll(); @@ -1126,222 +767,13 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri } else if(col == TD_ComponentType) { - m_mapTotal[_curMeta][_curProject].nType = _mapType.value(value); + ProjectModelManager::instance().getData()[_curMeta][_curProject].nType = _mapType.value(value); firstColumnItem->setData(Qt::UserRole,TS_edit); } } } } -//============================================================================= -QStringList projectModelDlg::getModelList() const -{ - QMap modelMap = DataBase::GetInstance()->ModelType(); - - QSet modelSet; - for(auto &model:modelMap) - { - modelSet.insert(model.modelType); - } - - return QStringList(modelSet.values()); -} - -QStringList projectModelDlg::getGroupList(const QString& sM) const -{ - QMap modelType = DataBase::GetInstance()->ModelType(); - QMap modelGroupMap = DataBase::GetInstance()->ModelGroup(); - QMap groupMap = DataBase::GetInstance()->AttributeGroup(); - - int metaId = 0; - for(auto &meta:modelType) - { - if(sM == meta.modelType) //查找元模对应的id - { - metaId = meta.id; - break; - } - } - - QList lstGroupId; - for(auto &group:modelGroupMap) //找到元模id对应的属性组id - { - if(group.modelTypeId == metaId) - { - lstGroupId.push_back(group.attributeGroupId); - } - } - - QStringList groupList; - for(auto &id:lstGroupId) //从属性组中找到id对应的组名 - { - groupList.append(groupMap[id].groupType); - } - - return groupList; -} - -QStringList projectModelDlg::getPublicGroupList() const -{ - QMap modelAttPublic = DataBase::GetInstance()->ModelAttributePublic(); - QMap groupMap = DataBase::GetInstance()->AttributeGroup(); - - QSet setGroup; - for(auto &model:modelAttPublic) - { - setGroup.insert(model.attributeGroupId); - } - - QStringList groupList; - for(auto &id:setGroup) - { - groupList.append(groupMap[id].groupType); - } - return groupList; -} - -QStringList projectModelDlg::getAttributeList(const QString& sM,const QString& sG) const -{ - QMap modelType = DataBase::GetInstance()->ModelType(); - //QMap modelGroupMap = DataBase::GetInstance()->ModelGroup(); - QMap groupMap = DataBase::GetInstance()->AttributeGroup(); - QMap modelAttMap = DataBase::GetInstance()->ModelAttribute(); - QMap attMap = DataBase::GetInstance()->Attribute(); - - int metaId = -1; - for(auto &meta:modelType) - { - if(sM == meta.modelType) //查找元模对应的id - { - metaId = meta.id; - break; - } - } - - int groupId = -1; - for(auto &attGroup:groupMap) - { - if(attGroup.groupType == sG) //返回参数属性组名对应的id - { - groupId = attGroup.id; - break; - } - } - - QStringList lst; - for(auto &mt:modelAttMap) - { - if(mt.modelTypeId == metaId && mt.attributeGroupId == groupId) - { - lst.append(attMap[mt.attributeId].attribute); - } - } - - return lst; -} - -QStringList projectModelDlg::getPublicAttributeList(const QString& group) -{ - QMap modelAttPublic = DataBase::GetInstance()->ModelAttributePublic(); - QMap groupMap = DataBase::GetInstance()->AttributeGroup(); - QMap attMap = DataBase::GetInstance()->Attribute(); - - int groupId = -1; - for(auto &attGroup:groupMap) - { - if(attGroup.groupType == group) //返回参数属性组名对应的id - { - groupId = attGroup.id; - break; - } - } - - QStringList lst; - for(auto &mt:modelAttPublic) - { - if(mt.attributeGroupId == groupId) - { - lst.append(attMap[mt.attributeId].attribute); - } - } - - return lst; -} - -void projectModelDlg::setItemAttribute(const QString& name,QStandardItem* p) -{ - QMap attMap = DataBase::GetInstance()->Attribute(); - QMap dt = DataBase::GetInstance()->DataType(); - - for(auto &att:attMap) - { - QString sType = dt[att.dataTypeId].dataType; //获得属性id对应的属性名 - if(name == att.attribute) - { - p->setData(att.id,Id); - p->setData(att.attribute,Attribute); - p->setData(att.attributeName,AttributeName); - p->setData(sType,DataType); //不直接使用id,拼接完成str - p->setData(att.lengthPrecision,LengthPrecision); - p->setData(att.scale,Scale); - p->setData(att.isNotNull,IsNotNull); - p->setData(att.defaultValue,DefaultValue); - p->setData(att.valueRange,ValueRange); - p->setData(att.isVisible,IsVisible); - return; - } - } -} - -QPair projectModelDlg::combinePropertySql(const QStandardItem* pItem) -{ - QMap dt = DataBase::GetInstance()->DataType(); - - int id = pItem->data(Id).toInt(); - QString attribute = pItem->data(Attribute).toString(); - QString dataType = pItem->data(DataType).toString(); - int lengthPrecision = pItem->data(LengthPrecision).toInt(); - int scale = pItem->data(Scale).toInt(); - QString defaultValue = pItem->data(DefaultValue).toString(); - QString valueRange = pItem->data(ValueRange).toString(); - int isNotNull = pItem->data(IsNotNull).toInt(); - - bool needsQuotes = stringDataTypes.contains(dataType); - // 处理数据类型及其长度精度 - QString dataTypePart = dataType; - if (lengthPrecision > 0) { - dataTypePart += QString("(%1").arg(lengthPrecision); - if (scale > 0) { - dataTypePart += QString(",%1").arg(scale); - } - dataTypePart += ")"; - } - - // 开始拼接SQL - QString sql = QString("%1 %2").arg(attribute, dataTypePart); - - // 处理约束条件 - if (isNotNull != -1) { - sql += " NOT NULL"; - } - - if (!defaultValue.isEmpty()) { - QString defValue = defaultValue; - if (needsQuotes && defValue != "null" && defValue != "NULL") { - // 转义单引号并包裹 - defValue.replace("'", "''"); - defValue = QString("'%1'").arg(defValue); - } - sql += QString(" DEFAULT %1").arg(defValue); - } - - /*if (isPrimaryKey != 0) { - sql += " PRIMARY KEY"; - }*/ - - return qMakePair(sql,dataTypePart); -} - QString projectModelDlg::getProjectName() const { return _curProject; @@ -1352,353 +784,19 @@ QString projectModelDlg::getMetaName() const return _curMeta; } -bool projectModelDlg::ifProjectEqual(QMap map) -{ - //todo:判断关联的模型类型 - MapProperty curPro = m_mapTotal[_curMeta][_curProject].mapProperty; - - QMap::Iterator iter; - for(iter = curPro.begin();iter != curPro.end();++iter) - { - if(iter->isPublic) //公共组跳过判断 - continue; - if(!map.contains(iter.key())) //已存在的模型中不包含该属性组 - { - QMap curCheckState = iter.value().mCheckState; - for(auto &val:curCheckState) - { - if(val.checkState) //该属性组不在模型中且被勾选 - return false; - } - continue; //该属性组不在模型中且未被勾选,不做判断 - } - else - { - QJsonObject dbCheckState = map[iter.key()]; //数据库中该属性组的勾选状态 - QMap curCheckState = iter.value().mCheckState; //当前程序中的勾选状态 - - QJsonArray nodesJsonArray = dbCheckState["checkState"].toArray(); - if(nodesJsonArray.size() != curCheckState.size()) //属性个数对不上,模型不同 - return false; - for (QJsonValueRef nodeJson : nodesJsonArray) - { - QJsonObject node = nodeJson.toObject(); - QString propertyName = node["name"].toString(); - int nState = node["checked"].toInt(); - if(curCheckState[propertyName].checkState != nState) //相同属性选中状态不同 - return false; - } - } - } - return true; -} - -QString projectModelDlg::modifyProjectModel(QMap mapOld) -{ - QString sRes; - MapProperty curPro = m_mapTotal[_curMeta][_curProject].mapProperty; - QStandardItemModel* pSelectModel = m_mapTotal[_curMeta][_curProject].pSelect; - QStandardItemModel* pBaseModel = m_mapTotal[_curMeta][_curProject].pBase; - int nType = m_mapTotal[_curMeta][_curProject].nType; - - QMap::Iterator iter; - for(iter = curPro.begin();iter != curPro.end();++iter) //遍历当前模型所有属性组 - { - QMap curCheckState = iter.value().mCheckState; //当前程序中的属性勾选状态 - bool isNull = true; //当前属性组是否未空 - for(auto &val:curCheckState) - { - if(val.checkState){ - isNull = false; //当前程序模型有勾选,不为空 - break; - } - } - if(isNull){ - if(mapOld.contains(iter.key())){ //当前模型勾选为空且库模型中包含此属性组,移除库中该属性组表 - QMap map = DataBase::GetInstance()->getProjectTableName(_curProject); - bool res = DataBase::GetInstance()->deleteTable(map[iter.key()]); - if(res){ - DataBase::GetInstance()->deleteRecordFromManager(_curProject,iter.key()); - sRes = QString::fromWCharArray(L"修改模型成功"); - } - } - } - else{ - QList lstSelected = getGroupSub(pSelectModel,iter.key()); - QList lstBase = getGroupSub(pBaseModel,iter.key()); - if(mapOld.contains(iter.key())){ //新旧模型中都存在,修改模型 - QMap oldSchema; //库中模型 属性名/数据类型 - QMap newSchema; //现有模型 - - QJsonObject obj = mapOld[iter.key()]; - QJsonArray nodesJsonArray = obj["checkState"].toArray(); - - for (QJsonValueRef nodeJson : nodesJsonArray) - { - QJsonObject node = nodeJson.toObject(); - QString propertyName = node["name"].toString(); - int nState = node["checked"].toInt(); - QString dataType = node["type"].toString(); - - if(nState) - oldSchema.insert(propertyName,dataType); - } - - QMap::Iterator it; - for(it = curCheckState.begin(); it != curCheckState.end();++it) - { - if(it->checkState){ - newSchema.insert(it.key(),it->dataType); - } - } - if(oldSchema == newSchema) - continue; - - QMap map = DataBase::GetInstance()->getProjectTableName(_curProject); - - bool res = DataBase::GetInstance()->modifyProjectTable(map[iter.key()],oldSchema,newSchema); - - QJsonObject objState = getSelectedState(lstSelected,lstBase); - DataBase::GetInstance()->updateCheckState(map[iter.key()],objState); - if(res) - { - sRes = QString::fromWCharArray(L"修改模型成功"); - } - } - else{ //非空且库模型中不存在,新增 - bool res = createPropertyTable(_curProject,iter.key(),lstSelected,lstBase,nType); - if(res) - { - sRes = QString::fromWCharArray(L"修改模型成功"); - } - } - } - } - return sRes; -} - -bool projectModelDlg::renameProjectModel(const QString& strCur,QMap datas) -{ - for(auto &data:datas) - { - QString sTable = data.metaModel + QString("_") + strCur + QString("_")+data.groupName; - - DataBase::GetInstance()->updateProjectName(sTable,strCur,data.name); - DataBase::GetInstance()->alterTableName(data.name,sTable); - } -} - -void projectModelDlg::updateComponentModelName(const QString& strOld,const QString& strNew) -{ - DataBase::GetInstance()->updateComponentModelName(strOld,strNew); -} -/*void projectModelDlg::updateIconList() -{ - if(ui->stackedWidget->currentIndex() !=0) - { - ui->stackedWidget->setCurrentIndex(0); - } - MapProject mp = m_mapTotal[_curMeta]; - int nType = mp[_curProject].nType; - QStandardItemModel *model = dynamic_cast(ui->listView_icon->model()); - if(model) - { - for (int row = 0; row < model->rowCount(); ++row) - { - QStandardItem* pItem = model->item(row); - int id = pItem->data(Qt::UserRole).toInt(); - if(nType == id) //使用存储的序列号更新list - { - QModelIndex index = model->index(id,0); - ui->listView_icon->setCurrentIndex(index); - - return; - } - } - } -}*/ +//============================================================================= void projectModelDlg::removeProjectData(const QString& sMeta,const QString& sProject,int role) { - if(role == TS_create && !m_mapTotal.contains(sMeta)){ //创建且未加入到管理 + if(role == TS_create && !ProjectModelManager::instance().getData().contains(sMeta)){ //创建且未加入到管理 delete _curModel.pBase; delete _curModel.pSelect; } else{ - delete m_mapTotal[sMeta][sProject].pBase; //手动释放 - delete m_mapTotal[sMeta][sProject].pSelect; - m_mapTotal[sMeta].remove(sProject); + ProjectModelManager::instance().deleteData(sMeta,sProject); } } -QString projectModelDlg::getItemDataType(const QStandardItem* pItem) -{ - QString dataType = pItem->data(DataType).toString(); - int lengthPrecision = pItem->data(LengthPrecision).toInt(); - int scale = pItem->data(Scale).toInt(); - - QString dataTypePart = dataType; - if (lengthPrecision > 0) { - dataTypePart += QString("(%1").arg(lengthPrecision); - if (scale > 0) { - dataTypePart += QString(",%1").arg(scale); - } - dataTypePart += ")"; - } - return dataTypePart; -} - -int projectModelDlg::createPropertyTable(const QString& sProject,const QString& sGroup,QList lstSelect,QList lstBase,int nLinkType,bool isPublic) -{ - if(!isPublic) - { - QString sName = _curMeta + QString("_") + sProject + QString("_")+sGroup; - - QStringList fields; - fields.append("id SERIAL NOT NULL PRIMARY KEY"); - fields.append("global_uuid uuid NOT NULL DEFAULT gen_random_uuid()"); - fields.append("attribute_group VARCHAR(64) NOT NULL"); - - for(auto &item:lstSelect) - { - QPair pair = combinePropertySql(item); //拼接单句sql - fields.append(pair.first); - } - - QJsonObject objState = getSelectedState(lstSelect,lstBase); - - if(!DataBase::GetInstance()->createDynamicTable(sName,fields)) - { - return int(AlertInfo::fail); - } - else - { - DataBase::GetInstance()->insertProjectManager(sName,sProject,_curMeta,sGroup,nLinkType,objState); - return int(AlertInfo::success); - } - } - else - { - QString sName = sGroup; - - QStringList fields; - fields.append("id SERIAL NOT NULL PRIMARY KEY"); - fields.append("global_uuid uuid NOT NULL DEFAULT gen_random_uuid()"); - //fields.append("attribute_group VARCHAR(64) NOT NULL"); - - for(auto &item:lstSelect) - { - QString attribute = item->data(Attribute).toString(); - if(attribute.contains("global_uuid")) - continue; - QPair pair = combinePropertySql(item); //拼接单句sql - fields.append(pair.first); - } - - QJsonObject objState = getSelectedState(lstSelect,lstBase); - - if(!DataBase::GetInstance()->ifDynamicTableExist(sName)) - { - bool val = DataBase::GetInstance()->createDynamicTable(sName,fields); - if(val) - { - DataBase::GetInstance()->insertProjectManager(sName,sName,"NULL",sGroup,0,objState,true); - return int(AlertInfo::success); - } - else { - return int(AlertInfo::fail); - } - } - else - { - return int(AlertInfo::exist); - } - } -} - -QJsonObject projectModelDlg::getSelectedState(QList select,QList base) -{ - QJsonObject objState; - QJsonArray arrState; - - for(auto &item:select) - { - QString dataType = item->data(DataType).toString(); - int lengthPrecision = item->data(LengthPrecision).toInt(); - int scale = item->data(Scale).toInt(); - QString defaultValue = item->data(DefaultValue).toString(); - int isVisible = item->data(IsVisible).toInt(); - - QString dataTypePart = dataType; //拼接数据类型 - if (lengthPrecision > 0) { - dataTypePart += QString("(%1").arg(lengthPrecision); - if (scale > 0) { - dataTypePart += QString(",%1").arg(scale); - } - dataTypePart += ")"; - } - - QJsonObject node; //保存已选择状态 - node["name"] = item->text(); - node["checked"] = 1; - node["type"] = dataTypePart; - node["defaultValue"] = defaultValue; - node["lengthPrecision"] = lengthPrecision; - node["isVisible"] = isVisible; - arrState.append(node); - } - - for(auto &item:base) - { - QString dataType = item->data(DataType).toString(); - int lengthPrecision = item->data(LengthPrecision).toInt(); - int scale = item->data(Scale).toInt(); - QString defaultValue = item->data(DefaultValue).toString(); - int isVisible = item->data(IsVisible).toInt(); - - QString dataTypePart = dataType; //拼接数据类型 - if (lengthPrecision > 0) { - dataTypePart += QString("(%1").arg(lengthPrecision); - if (scale > 0) { - dataTypePart += QString(",%1").arg(scale); - } - dataTypePart += ")"; - } - - QJsonObject node; //保存未选择状态 - node["name"] = item->text(); - node["checked"] = 0; - node["type"] = dataTypePart; - node["defaultValue"] = defaultValue; - node["lengthPrecision"] = lengthPrecision; - node["isVisible"] = isVisible; - arrState.append(node); - } - - objState["checkState"] = arrState; - return objState; -} - -QList projectModelDlg::getGroupSub(QStandardItemModel* pModel,const QString& str) -{ - QList lst; - if(!pModel) - return lst; - QList items = pModel->findItems(str); - if (!items.isEmpty()) { - // 存在该文本的项 - QStandardItem* item = items[0]; - for (int row = 0; row < item->rowCount(); ++row) { - // 默认获取第 0 列的子项 - QStandardItem* child = item->child(row, 0); - if (child) { - lst.append(child); - } - } - } - return lst; -} - void projectModelDlg::setupUI() { QStringList headerText; @@ -1734,7 +832,7 @@ projectState projectModelDlg::couldSave() } else { - bool val = ifProjectEqual(map); + bool val = ProjectModelManager::instance().ifProjectEqual(_curMeta,_curProject,map); if(val){ return Exist; } @@ -1771,15 +869,3 @@ int projectModelDlg::getModelEditState() } return res; } - -bool projectModelDlg::ifProjectExsit(const QString& sPro) -{ - for(auto &meta:m_mapTotal) - { - if(meta.contains(sPro)) - { - return true; - } - } - return false; -}