Browse Source

导入专家数据存储数据库

chengxr 1 year ago
parent
commit
96a971a87e

+ 1 - 1
ExpertClient/EXDataTableView.cpp

@@ -207,7 +207,7 @@ int EXDataTableView::currentPage() const
 
 void EXDataTableView::setCurrentPage(int p)
 {
-    if (p < 1 || p >= m_mind1->levels()) {
+    if (p < 1 || p > m_models.size()) {
         return;
     }
     m_currentPage = p;

+ 0 - 7
ExpertClient/EXDataTableView.h

@@ -109,13 +109,6 @@ private:
     QVBoxLayout *m_layout     = nullptr;
     QHBoxLayout *m_pageLayout = nullptr;
 
-    bool m_isSettingTable = false;
-
-    QStringList m_hNodes;
-    QStringList m_vNodes;
-
-    QVector<NodeMatrixInfo *> m_values;
-
     EXDataTableComboDelegate *m_comboDelegate;
 
     PushButton *m_save = nullptr;

+ 15 - 3
QFD/widgets/ConfigExpertDataWidget.cpp

@@ -123,8 +123,10 @@ void ConfigExpertDataWidget::initLayout()
                   "QPushButton::pressed {background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #dadbde, "
                   "stop: 1 #f6f7fa);}"
                   "QListWidget {border: 1px solid rgba(0, 0, 0, 0.073);}"
-                  "QListView::item {background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #ffffff, stop: 0.9 "
-                  "#ffffff,stop: 1 #eeeeee);height:44;}"
+                  //                  "QListView::item {background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0
+                  //                  #ffffff, stop: 0.9 "
+                  //                  "#ffffff,stop: 1 #eeeeee);height:44;}"
+                  "QListView::item {height:44;}"
                   "QDoubleSpinBox {border: 1px solid rgba(0, 0, 0, 0.173);}"
                   "#addedListTitleLabel {font:bold; font-size:12px;}"
                   "#expListTitleLabel {font:bold; font-size:12px;}");
@@ -134,6 +136,7 @@ void ConfigExpertDataWidget::connectSignalsAndSlots()
 {
     connect(m_saveButton, &QPushButton::clicked, this, &ConfigExpertDataWidget::slotSave);
     connect(m_refreshButton, &QPushButton::clicked, this, &ConfigExpertDataWidget::slotRefresh);
+    connect(m_configListWidget, &QListWidget::itemClicked, this, &ConfigExpertDataWidget::slotUserConfigClicked);
 }
 
 void ConfigExpertDataWidget::setProcess(SchemePlanManager::SchemeProcessInfo process)
@@ -270,7 +273,16 @@ void ConfigExpertDataWidget::slotRemoveConfig(UserConfig *config)
 
 void ConfigExpertDataWidget::slotImportData(UserConfig *config)
 {
-    qDebug() << __FUNCTION__ << __LINE__ << config->userName << endl;
+    int index = m_configList.indexOf(config);
+    m_configListWidget->setItemSelected(m_configListWidget->item(index), true);
+    emit sigImportData(config);
+}
+
+void ConfigExpertDataWidget::slotUserConfigClicked()
+{
+    int s              = m_configListWidget->currentRow();
+    UserConfig *config = m_configList[s];
+    emit sigConfigSelected(config);
 }
 
 ConfigListItemWidget::ConfigListItemWidget(QWidget *parent) : QWidget(parent)

+ 3 - 0
QFD/widgets/ConfigExpertDataWidget.h

@@ -117,6 +117,8 @@ public:
     void loadData();
 
 signals:
+    void sigImportData(UserConfig *config);
+    void sigConfigSelected(UserConfig *config);
 
 protected:
     virtual void showEvent(QShowEvent *event) override;
@@ -133,6 +135,7 @@ private slots:
     void slotAddUser(QFUser *user);
     void slotRemoveConfig(UserConfig *config);
     void slotImportData(UserConfig *config);
+    void slotUserConfigClicked();
 
 private:
     SchemePlanManager::SchemeProcessInfo m_process;

+ 150 - 11
QFD/widgets/DataCollectionWidget.cpp

@@ -14,6 +14,10 @@
 #include "dbService/SchemeProcessService.h"
 #include "dbService/ClassSet.h"
 #include "dbService/CNodeDataService.h"
+#include "dbService/NodeMatrixService.h"
+#include "dbService/UserService.h"
+
+#include <xlsxdocument.h>
 
 #include <CNode.h>
 
@@ -22,6 +26,8 @@
 #include <QTabWidget>
 #include <QBoxLayout>
 #include <QMap>
+#include <QFileDialog>
+#include <QMessageBox>
 
 #include <QDebug>
 
@@ -42,6 +48,9 @@ DataCollectionWidget::DataCollectionWidget(ProjectInfo *proj, QWidget *parent) :
     connect(m_calcBtn, &PushButton::clicked, this, &DataCollectionWidget::slotCalc);
 
     connect(m_tab, &QTabWidget::currentChanged, this, &DataCollectionWidget::slotTabCurrentChanged);
+    connect(m_configExpert, &ConfigExpertDataWidget::sigImportData, this, &DataCollectionWidget::slotImportData);
+    connect(m_configExpert, &ConfigExpertDataWidget::sigConfigSelected, this,
+            &DataCollectionWidget::slotConfigSelected);
 }
 
 void DataCollectionWidget::setType(int type)
@@ -102,7 +111,7 @@ void DataCollectionWidget::setupTabWidget()
 
                 DataTableWidget *table = new DataTableWidget(importEffiEvalDataProcess, this);
                 table->mind1()->setNodeList(nodeListMap[i]);
-                table->setCurrentPage(1);
+                table->setupModels();
                 m_tab->addTab(table, indexName + " - " + "收集效能评估数据");
             }
 
@@ -120,9 +129,7 @@ void DataCollectionWidget::setupTabWidget()
                 if (i == ProjectManager::TechIndex) {
                     table->mind2()->setNodeList(nodeListMap[ProjectManager::AbilityIndex]);
                 }
-                QList<NodeMatrixInfo> list = EvalDataManager::dataSample(process, table->mind1(), table->mind2());
-                table->setData(list);
-                table->setCurrentPage(1);
+                table->setupModels();
 
                 QString processName = SchemePlanManager::processName(process);
                 m_tab->addTab(table, indexName + " - " + processName);
@@ -160,15 +167,147 @@ void DataCollectionWidget::slotCalc()
     if (table == nullptr) {
         return;
     }
+}
+
+void DataCollectionWidget::slotImportData(UserConfig *config)
+{
+    QFileDialog::Options options;
+    options |= QFileDialog::DontUseNativeDialog;
+    QString selectedFilter;
+    QString fileName =
+            QFileDialog::getOpenFileName(this, "选择文件", "", "文件(*.csv *.xls *.xlsx)", &selectedFilter, options);
 
-    QStringList nodes     = table->hNodes();
-    QVector<qreal> values = table->values();
-    qDebug() << __FUNCTION__ << __LINE__ << nodes << endl;
-    qDebug() << __FUNCTION__ << __LINE__ << values << endl;
-    if (values.count() != nodes.count() * nodes.count()) {
+    bool fileValid = true;
+    if (fileName.isEmpty() || fileName.size() <= 0) {
+        fileValid = false;
         return;
     }
+    //校验提醒
+    QStringList strList = fileName.split("/");
+    QStringList names   = strList.at(strList.size() - 1).split("-");
+    if (names.at(0) != config->userName) {
+        QMessageBox::warning(this, tr("失败"), tr("请确认专家名称"));
+        fileValid = false;
+        return;
+    }
+
+    DataTableWidget *table = (DataTableWidget *)m_tab->currentWidget();
+    QString indexName      = ProjectManager::nameOfIndexType((ProjectManager::IndexType)table->process().indexType);
+    if (names.at(1) != indexName) {
+        QMessageBox::warning(this, tr("失败"), tr("请确认工程类型"));
+        fileValid = false;
+        return;
+    }
+    if (names.at(2).split(".").at(0) != m_proj->projectName) {
+        QMessageBox::warning(this, tr("失败"), tr("请确认工程名称"));
+        fileValid = false;
+        return;
+    }
+
+    //读取文件内容
+    QXlsx::Document xlsxR(fileName);
+    QStringList str = xlsxR.sheetNames();
+    qDebug() << __FUNCTION__ << __LINE__ << fileValid << str << endl;
+
+    int size      = 0;
+    bool userinfo = false;
+    if (str.contains("专家信息")) {
+        size     = str.size() - 1;
+        userinfo = true;
+    } else {
+        size = str.size();
+    }
+    //遍历sheet页
+    QList<NodeMatrixInfo *> nodeMatrxInfoList;
+    for (int i = 0; i < size; i++) {
+        QString mark = "1";
+        if (i != 0) {
+            mark = "2";
+        }
+        xlsxR.selectSheet(str.at(i));
+        if (xlsxR.load()) {
+            int row = xlsxR.dimension().lastRow();
+            int col = xlsxR.dimension().lastColumn();
+            for (int r = 2; r <= row; r++) {
+                for (int c = 2; c <= col; c++) {
+                    QString abscissa;
+                    QString ordinate;
+                    QString nodeValue;
+                    QXlsx::Cell *cellAbscissa = xlsxR.cellAt(r, 1);
+                    if (cellAbscissa != NULL) {
+                        QVariant var = cellAbscissa->readValue();
+                        abscissa     = var.toString();
+                    }
+                    QXlsx::Cell *cellOrdinate = xlsxR.cellAt(1, c);
+                    if (cellOrdinate != NULL) {
+                        QVariant var = cellOrdinate->readValue();
+                        ordinate     = var.toString();
+                    }
+                    QXlsx::Cell *value = xlsxR.cellAt(r, c);
+                    if (value != NULL) {
+                        QVariant var = value->readValue();
+                        nodeValue    = var.toString();
+                    }
+                    NodeMatrixInfo *nodeInfo = new NodeMatrixInfo();
+                    nodeInfo->expertId       = QString::number(config->userId);
+                    nodeInfo->expertName     = config->userName;
+                    nodeInfo->abscissa       = abscissa;
+                    nodeInfo->ordinate       = ordinate;
+                    nodeInfo->nodeValue      = nodeValue;
+                    nodeInfo->engineerId     = config->engineerId;
+                    nodeInfo->mark           = mark;
+                    nodeInfo->tableMsg       = indexName;
+                    nodeInfo->mindId         = table->process().dSource;
+                    nodeInfo->writeDate      = QDateTime::currentDateTime();
+                    if (i != 0) {
+                        nodeInfo->node = "1." + QString::number(i) + "." + QString::number(r - 1);
+                    } else {
+                        nodeInfo->node = "1." + QString::number(r - 1);
+                    }
+                    nodeMatrxInfoList.append(nodeInfo);
+                }
+            }
+        }
+    }
+
+    // 更新数据库
+    if (NodeMatrixService().QueryNodeMatrixListByExpertIdAndEngineerId(QString::number(config->userId),
+                                                                       config->engineerId, indexName)) {
+        NodeMatrixService().UpdateNodeMatrixNodeValueList(nodeMatrxInfoList);
+        qDebug() << __FUNCTION__ << __LINE__ << "import data update" << endl;
+    } else {
+        NodeMatrixService().AddNodeMatrixInfoList(nodeMatrxInfoList);
+        qDebug() << __FUNCTION__ << __LINE__ << "import data add" << endl;
+    }
+
+    //如果有专家信息更新用户
+    if (userinfo) {
+        xlsxR.selectSheet(str[size]);
+        QFUser user;
+
+        if (UserService().QueryUserInfoById(&user, xlsxR.cellAt(2, 1)->readValue().toInt())) {
+            user.workPosition = xlsxR.cellAt(2, 3)->readValue().toString();
+            user.post         = xlsxR.cellAt(2, 4)->readValue().toString();
+            user.major        = xlsxR.cellAt(2, 5)->readValue().toString();
+            user.phone        = xlsxR.cellAt(2, 6)->readValue().toString();
+            user.writeTime    = xlsxR.cellAt(2, 7)->readValue().toString();
+            user.remark       = xlsxR.cellAt(2, 8)->readValue().toString();
+
+            UserService().UpdateUserInfo(user);
+        }
+    }
+
+    QMessageBox::information(this, tr("成功"), tr("数据保存成功"));
+}
+
+void DataCollectionWidget::slotConfigSelected(UserConfig *config)
+{
+    DataTableWidget *table = (DataTableWidget *)m_tab->currentWidget();
+    QList<NodeMatrixInfo *> data;
+    QString indexName = ProjectManager::nameOfIndexType((ProjectManager::IndexType)table->process().indexType);
+    NodeMatrixService().QueryNodeMatrixListByExpertIdAndEngineerId(&data, config->engineerId, config->userId,
+                                                                   indexName);
 
-    HierarchicalAnalysis *a = new HierarchicalAnalysis(nodes, values);
-    qDebug() << __FUNCTION__ << __LINE__ << a->getWeights() << endl;
+    qDebug() << __FUNCTION__ << __LINE__ << config->engineerId << config->userId << indexName << data.size() << endl;
+    table->setData(data);
 }

+ 7 - 0
QFD/widgets/DataCollectionWidget.h

@@ -6,6 +6,9 @@
 class ConfigExpertDataWidget;
 class ConfigMeasureDataWidget;
 
+class UserConfig;
+class QFUser;
+
 class PushButton;
 
 class QTabWidget;
@@ -30,6 +33,10 @@ private slots:
     void slotTabCurrentChanged(int index);
     void slotCalc();
 
+    void slotImportData(UserConfig *config);
+
+    void slotConfigSelected(UserConfig *config);
+
 signals:
 
 private:

+ 120 - 53
QFD/widgets/DataTableWidget.cpp

@@ -5,6 +5,7 @@
 #include "ProjectManager.h"
 #include <dbService/CNodeDataService.h>
 #include <dbService/ClassSet.h>
+#include <dbService/NodeMatrixService.h>
 
 #include <Widgets/Button.h>
 #include <QBoxLayout>
@@ -20,6 +21,19 @@
 
 #include <QDebug>
 
+static const char *kDataTabName = "tabName";
+
+DataTableItemModel::DataTableItemModel(QObject *parent) : QStandardItemModel(parent) { }
+
+QVariant DataTableItemModel::data(const QModelIndex &index, int role) const
+{
+    QVariant value = QStandardItemModel::data(index, role);
+    if (Qt::TextAlignmentRole == role) {
+        value = Qt::AlignCenter;
+    }
+    return value;
+}
+
 DataTableWidget::DataTableWidget(SchemePlanManager::SchemeProcessInfo process, QWidget *parent)
     : QWidget(parent), m_process(process)
 {
@@ -68,28 +82,91 @@ void DataTableWidget::connectSignalsAndSlots()
     connect(m_dataTab, &QTabWidget::currentChanged, this, &DataTableWidget::slotTabCurrentChanged);
 }
 
+void DataTableWidget::setupModels()
+{
+    //     按照脑图层级创建各个表的 models
+    m_models.clear();
+    QList<CNodeData> hHeaders;
+    QList<CNodeData> vHeaders;
+
+    for (int i = 1; i < m_mind1->levels(); i++) {
+        QList<DataTableItemModel *> modelList;
+
+        // 方案优选和综合效能的评估数据采集页面只有一级, 不用切换页面
+        // 方案优选显示指标量纲和指标类型
+        // 综合效能显示指标类型
+        if (m_process.type == SchemePlanManager::ImportEvalData
+            && (m_process.indexType == ProjectManager::OptimalIndex
+                || m_process.indexType == ProjectManager::EfficiencyIndex)) {
+            DataTableItemModel *model = new DataTableItemModel(this);
+
+            int hIndex          = -1;
+            QStandardItem *item = new QStandardItem("指标量纲");
+            model->setHorizontalHeaderItem(++hIndex, item);
+
+            if (m_process.indexType == ProjectManager::OptimalIndex) {
+                QStandardItem *item = new QStandardItem("指标类型");
+                model->setHorizontalHeaderItem(++hIndex, item);
+            }
+
+            if (m_process.indexType == ProjectManager::EfficiencyIndex) {
+                qDebug() << __FUNCTION__ << __LINE__ << "===" << endl;
+            }
+
+            vHeaders = m_mind1->leaves();
+
+            updateModel(model, hHeaders, vHeaders, hIndex);
+            modelList.append(model);
+            m_models[i] = modelList;
+            break;
+        }
+
+        QList<CNodeData> nodes = m_mind1->nodesInLevel(i);
+        for (int j = 0; j < nodes.count(); j++) {
+            CNodeData node            = nodes[j];
+            DataTableItemModel *model = new DataTableItemModel(this);
+
+            if (m_process.type == SchemePlanManager::ImportWeightData) {
+                hHeaders = m_mind1->subNodes(node);
+                if (m_process.dSource == SchemePlanManager::FromExpert) {
+                    vHeaders = hHeaders;
+                }
+            }
+
+            if (m_process.type == SchemePlanManager::ImportEvalData) {
+                if (m_process.indexType == ProjectManager::TechIndex) {
+                    hHeaders = m_mind1->subNodes(node);
+                    vHeaders = m_mind2->leaves();
+                }
+            }
+
+            model->setProperty(kDataTabName, node.name);
+            updateModel(model, hHeaders, vHeaders);
+            modelList.append(model);
+        }
+        m_models[i] = modelList;
+    }
+
+    setCurrentPage(1);
+}
+
 void DataTableWidget::setupTabWidget()
 {
-    /// 创建 tableView 并添加进 tabWidget
-    /// 这个过程中会触发 tabWidget 的 currentChanged,
-    /// 所以使用 m_isSettingTable 标记此过程, 以采取必要措施来规避一些异常操作
-    m_isSettingTable = true;
     m_dataTab->clear();
-    for (CNodeData n : m_mind1->nodesInLevel(m_currentPage)) {
-        QTableView *t = new QTableView(m_dataTab);
+
+    QList<DataTableItemModel *> list = m_models[m_currentPage];
+    for (int j = 0; j < list.size(); j++) {
+        DataTableItemModel *model = list[j];
+        QTableView *t             = new QTableView(m_dataTab);
         t->setAlternatingRowColors(m_mind2->nodeList().count() > 0);
         t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
         t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
         t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
         t->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
         t->setSelectionMode(QAbstractItemView::SingleSelection);
-
-        m_dataTab->addTab(t, n.name);
-
-        QStandardItemModel *model = new QStandardItemModel(t);
         t->setModel(model);
+        m_dataTab->addTab(t, model->property(kDataTabName).toString());
     }
-    m_isSettingTable = false;
 }
 
 int DataTableWidget::currentPage() const
@@ -99,20 +176,20 @@ int DataTableWidget::currentPage() const
 
 void DataTableWidget::setCurrentPage(int p)
 {
-    if (p < 1 || p >= m_mind1->levels()) {
+    if (p < 1 || p > m_models.size()) {
         return;
     }
     m_currentPage = p;
     m_previous->setEnabled(p > 1);
-    m_next->setEnabled(p < m_mind1->levels() - 1);
+    m_next->setEnabled(p < m_models.size());
     setupTabWidget();
 
-    m_pageLab->setText(QString("共 %1 页, 当前第 %2 页").arg(m_mind1->levels() - 1).arg(p));
-    updateCurrentTable();
+    m_pageLab->setText(QString("共 %1 页, 当前第 %2 页").arg(m_models.size()).arg(p));
 }
 
 void DataTableWidget::updateCurrentTable()
 {
+    return;
     int c             = m_dataTab->currentIndex();
     QTableView *table = (QTableView *)m_dataTab->widget(c);
 
@@ -120,10 +197,6 @@ void DataTableWidget::updateCurrentTable()
         return;
     }
 
-    m_hNodes.clear();
-    m_vNodes.clear();
-    m_values.clear();
-
     QStandardItemModel *model = (QStandardItemModel *)table->model();
 
     /// 设置顶部水平方向标题
@@ -142,7 +215,6 @@ void DataTableWidget::updateCurrentTable()
             QStandardItem *item = new QStandardItem(node.name);
             item->setToolTip(node.remark);
             model->setHorizontalHeaderItem(++hIndex, item);
-            m_hNodes.append(node.name);
         }
     }
     // 导入方案优选评估或效能评估的评估数据时, 需要显示量纲
@@ -180,7 +252,6 @@ void DataTableWidget::updateCurrentTable()
         item->setToolTip(node.remark);
         model->setVerticalHeaderItem(i, item);
         table->setRowHeight(i, 35);
-        m_vNodes.append(node.name);
     }
 
     /// 填充量纲和指标类型
@@ -212,18 +283,11 @@ void DataTableWidget::updateCurrentTable()
                     item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);  // 单元格文字居中
                     item->setBackground(QBrush(QColor("white")));
 
-                    for (NodeMatrixInfo info : m_data) {
-                        if (info.abscissa.toInt() == hNode.id && info.ordinate.toInt() == vNode.id) {
-                            item->setText(info.nodeValue);
+                    for (NodeMatrixInfo *info : m_data) {
+                        if (info->abscissa.toInt() == hNode.id && info->ordinate.toInt() == vNode.id) {
+                            item->setText(info->nodeValue);
                             model->setItem(i, j, item);
 
-                            if (info.nodeValue.contains("/")) {
-                                qreal v = info.nodeValue.mid(2, 1).toDouble();
-                                m_values.append(1.0 / v);
-                            } else {
-                                m_values.append(info.nodeValue.toDouble());
-                            }
-
                             break;
                         }
                     }
@@ -240,9 +304,9 @@ void DataTableWidget::updateCurrentTable()
                 item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);  // 单元格文字居中
                 item->setBackground(QBrush(QColor("white")));
 
-                for (NodeMatrixInfo info : m_data) {
-                    if (info.abscissa.toInt() == hNode.id) {
-                        item->setText(info.nodeValue);
+                for (NodeMatrixInfo *info : m_data) {
+                    if (info->abscissa.toInt() == hNode.id) {
+                        item->setText(info->nodeValue);
                         model->setItem(row, j, item);
                         break;
                     }
@@ -260,9 +324,9 @@ void DataTableWidget::updateCurrentTable()
                     item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);  // 单元格文字居中
                     item->setBackground(QBrush(QColor("white")));
 
-                    for (NodeMatrixInfo info : m_data) {
-                        if (info.abscissa.toInt() == hNode.id && info.ordinate.toInt() == vNode.id) {
-                            item->setText(info.nodeValue);
+                    for (NodeMatrixInfo *info : m_data) {
+                        if (info->abscissa.toInt() == hNode.id && info->ordinate.toInt() == vNode.id) {
+                            item->setText(info->nodeValue);
                             model->setItem(i, j, item);
                             break;
                         }
@@ -275,21 +339,6 @@ void DataTableWidget::updateCurrentTable()
     }
 }
 
-QStringList DataTableWidget::hNodes() const
-{
-    return m_hNodes;
-}
-
-QStringList DataTableWidget::vNodes() const
-{
-    return m_vNodes;
-}
-
-QVector<qreal> DataTableWidget::values() const
-{
-    return m_values;
-}
-
 CMind *DataTableWidget::mind1() const
 {
     return m_mind1;
@@ -300,11 +349,29 @@ CMind *DataTableWidget::mind2() const
     return m_mind2;
 }
 
-void DataTableWidget::setData(QList<NodeMatrixInfo> data)
+void DataTableWidget::setData(QList<NodeMatrixInfo *> data)
 {
     m_data = data;
 }
 
+void DataTableWidget::updateModel(DataTableItemModel *model, QList<CNodeData> &hHeaders, QList<CNodeData> &vHeaders,
+                                  int hStart, int vStart)
+{
+    for (int i = 0; i < hHeaders.size(); i++) {
+        CNodeData node      = hHeaders[i];
+        QStandardItem *item = new QStandardItem(node.name);
+        item->setToolTip(node.remark);
+        model->setHorizontalHeaderItem(i + hStart, item);
+    }
+
+    for (int i = 0; i < vHeaders.size(); i++) {
+        CNodeData node      = vHeaders[i];
+        QStandardItem *item = new QStandardItem(node.name);
+        item->setToolTip(node.remark);
+        model->setVerticalHeaderItem(i + vStart, item);
+    }
+}
+
 void DataTableWidget::slotPrevious()
 {
     setCurrentPage(m_currentPage - 1);

+ 19 - 13
QFD/widgets/DataTableWidget.h

@@ -4,8 +4,10 @@
 #include <QWidget>
 
 #include "SchemePlanManager.h"
+#include <CNode.h>
 
 #include <dbService/ClassSet.h>
+#include <QStandardItemModel>
 
 class DataTableComboDelegate;
 
@@ -19,6 +21,14 @@ class QTabWidget;
 class QVBoxLayout;
 class QHBoxLayout;
 
+class DataTableItemModel : public QStandardItemModel
+{
+public:
+    explicit DataTableItemModel(QObject *parent = nullptr);
+
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+};
+
 /**
  * @brief The DataTableWidget class
  * 数据表, 整体上是包含多个 QTableView 的 QTabWidget
@@ -41,6 +51,8 @@ public:
 
     void connectSignalsAndSlots();
 
+    void setupModels();
+
     void setupTabWidget();
 
     int currentPage() const;
@@ -49,17 +61,14 @@ public:
 
     void updateCurrentTable();
 
-    QStringList hNodes() const;
-    QStringList vNodes() const;
-
-    QVector<qreal> values() const;
-
     CMind *mind1() const;
     CMind *mind2() const;
 
-    void setData(QList<NodeMatrixInfo> data);
+    void setData(QList<NodeMatrixInfo *> data);
 
-signals:
+private:
+    void updateModel(DataTableItemModel *model, QList<CNodeData> &hHeaders, QList<CNodeData> &vHeaders, int hStart = 0,
+                     int vStart = 0);
 
 public slots:
     void slotPrevious();
@@ -69,6 +78,8 @@ public slots:
 private:
     SchemePlanManager::SchemeProcessInfo m_process;
 
+    QMap<int, QList<DataTableItemModel *>> m_models;
+
     int m_currentPage = 0;
 
     CMind *m_mind1 = nullptr;
@@ -87,12 +98,7 @@ private:
 
     DataTableComboDelegate *m_comboDelegate = nullptr;
 
-    QList<NodeMatrixInfo> m_data;
-
-    QStringList m_hNodes;
-    QStringList m_vNodes;
-
-    QVector<qreal> m_values;
+    QList<NodeMatrixInfo *> m_data;
 };
 
 #endif  // DATATABLEWIDGET_H