#pragma once #include #include "Defines.h" #include "IxSerDes.h" #include "IxDynObj.h" #include "iDataPool_global.h" class iXmlTable; // 数据模型对象类的抽象基类 class I_DATAPOOL_EXPORT ZxDataObject : public QObject , virtual public IxDynObj , virtual public IxSerDes { Q_OBJECT public: ZxDataObject(ZxDataObject* pParent); ZxDataObject(const ZxDataObject& other); virtual ~ZxDataObject(); // 接口,子类必须实现 virtual ZxDataObject* clone() = 0; virtual QString type() const = 0; // 操作符 virtual ZxDataObject& operator = (const ZxDataObject& other); virtual bool operator == (const ZxDataObject& other) const; virtual bool operator != (const ZxDataObject& other) const; public: // 加载保存 virtual bool load(); virtual void ensureLoaded() const; virtual bool save(); // 该函数是加载子类对象,仅仅加载code之类的关键信息 // 比如在建立树时,创建该节点。 virtual bool createChildren(); // 序列化 virtual void onSerialize(ZxSerializer* ser); virtual void onDeserialize(ZxSerializer* ser); // Icon virtual QIcon getIcon(bool expanded = false) const; // 获取新建的默认ID virtual QString getDefaultCode(ZxDataObject* pParent/* = NULL*/); // 由于原先函数总是出这样那样的问题,故增加一种新的方式 // 直接读取表格中Key字段进行判断 virtual QString getDefaultCodeEx(); virtual bool getCurObjTags(QStringList& list); //检查名字不能重复(名字字段) virtual bool checkUniqueObjName(QString sFiledName, QString sName); // TODO 20231231 Old virtual bool isParentType(const QString &type) const; virtual bool isChildType(const QString &type) const; virtual bool isAncestorType(const QString &type) const; virtual bool isDescendantType(const QString &type) const; virtual QStringList getParameterNames(void) const; virtual VecInt getDataTypes(void) const; public: // 对象编码 virtual void setCode(const QString& sCode); virtual QString getCode(void) const; // 名称 virtual void setName(const QString& sName); virtual QString getName(void) const; // 是否load virtual void setLoaded(bool b); virtual bool isLoaded(void) const; // 修改状态 virtual void setModified(bool bModified = true); virtual bool isModified(void) const; // 可见 virtual void setVisible(bool b); virtual bool isVisible(void) const; public: //父对象 virtual void setParent(ZxDataObject* pParent); virtual ZxDataObject* getParent(void) const; virtual ZxDataObject* getRoot(void) const; //顶级祖先 // 子对象相关操作 virtual qint32 getChildrenCount(const QString& type = "") const; virtual qint32 indexOfChild(ZxDataObject* pObject) const; virtual ZxDataObject* getChild(QString sType, QString sCode); virtual ZxDataObject* getChild(qint32 index) const; virtual qint32 appendChildren(const ZxDataObjectList &lstGmObjects); virtual bool appendChild(ZxDataObject* pObject); virtual bool insertChild(ZxDataObject* pObject, int nPos); virtual void removeChild(qint32 index, bool bDeleteLater = false); virtual void removeChild(ZxDataObject* pObject, bool bDeleteLater = false); virtual void clearChildren(const QString& type = "", bool bDeleteLater = true); virtual void removeChildren(const ZxDataObjectList &lstGmObjects, \ bool bDeleteLater = true); virtual ZxDataObject* findChild(QString type, const QString& code); // 查找相关子对象 ZxDataObject* getPreviousChild(ZxDataObject* pObject) const; ZxDataObject* getNextChild(ZxDataObject* pObject) const; // 子对象批量操作 virtual ZxDataObjectList getChildren(QString sType = "", \ QStringList listCodes = QStringList()) const; // 子对象可见 virtual void setHasVisibleChildren(bool b); virtual bool hasVisibleChildren(void) const; virtual ZxDataObjectList getVisibleChildren() const; // 把父子层级关系全部放入数据,以方便应用 static ZxDataObjectList parseObjsToVec(ZxDataObjectList& vecOlds); public: // 数据库相关 virtual void checkXmlTable(); // 根据type选定XmlTable结构体 virtual QString getTableName(); // 表名 virtual QString getTableNameBy(QString sType); QStringList getKeyFields(); //主键 virtual QString getSqlR(); //Load时的SQL virtual QString getSqlW(); virtual QStringList getKeyValues(); //筛选时获得主键的值。 // 名称重命名,存入数据库 virtual bool renameInDb(QString sNewName, QString sOldName); // 删除该Code的数据库内容 virtual bool deleteInDb(); // 对附属关联的数据大字段ID的统一微调 virtual void adjustDataID(QString& sDataID); // 加载数据 virtual bool loadData(VVecVariant& vvec, \ QString &sLog, \ bool bTopOneOnly = true); virtual bool loadData(QString& sSql, \ VVecVariant& vvec, \ QString &sLog, \ bool bTopOneOnly = true); // 保存 virtual bool saveData(VVecVariant& vvec, QString& sLog); protected: // 加载数据 /// @brief 加载数据的实现函数 /// @param bWellDbPreferred 是否优先从单井db文件里面获取,20220616,目前只被pvt中间过程数据调用 bool _load(QString& sSql, VVecVariant& vvec, \ QString& sLog, bool bTopOneOnly = true, \ bool bWellDbPreferred = false); //加载数据 public: // 解析与组织 virtual bool parseData(VecVariant vec); virtual bool sumUpData(VecVariant& vec); // 暂时保留 // 确定对象是否有效 virtual bool isValid() const; // m_bUnableSP virtual bool isUnableSP(); virtual void setUnableSP(bool b); QStringList getTableFieldNames(bool bEn); protected: QString m_sCode; //对象标识\序号\编号\编码 QString m_sName; //对象名称, 包括分组\分类\名称 bool m_bModified; //对象数据修改标记 bool m_bLoaded; //数据及索引是否已经加载 bool m_bHasVisibleChildren; //在m_bLoaded为FALSE时, 标记是否有子节点 bool m_bVisible; //是否在数据树上显示 ZxDataObject* m_pParent; //对象的父对象指针 ZxDataObjectList m_vecChildren; //对象的子对象列表 iXmlTable* m_pTableDefine; //xml中的配置 bool m_bUnableSP; //临时变量不参与序列化 QString m_sCth; //临时变量不参与序列化 };