Browse Source

数据采集

chengxr 1 year ago
parent
commit
4991cf86a0

+ 158 - 180
ExpertClient/EXDataTableView.cpp

@@ -26,6 +26,19 @@
 
 #include <QDebug>
 
+static const char *kTabName = "tabName";
+
+EXDataItemModel::EXDataItemModel(QObject *parent) : QStandardItemModel(parent) { }
+
+QVariant EXDataItemModel::data(const QModelIndex &index, int role) const
+{
+    QVariant value = QStandardItemModel::data(index, role);
+    if (Qt::TextAlignmentRole == role) {
+        value = Qt::AlignCenter;
+    }
+    return value;
+}
+
 EXDataTableView::EXDataTableView(SchemePlanManager::SchemeProcessInfo process, QWidget *parent)
     : QWidget(parent), m_process(process)
 {
@@ -87,45 +100,104 @@ void EXDataTableView::connectSignalsAndSlots()
     connect(m_save, &PushButton::clicked, this, &EXDataTableView::slotSave);
 }
 
+void EXDataTableView::setupModels()
+{
+    //     按照脑图层级创建各个表的 models
+    m_models.clear();
+    QList<CNodeData> hHeaders;
+    QList<CNodeData> vHeaders;
+
+    for (int i = 1; i < m_mind1->levels(); i++) {
+        QList<EXDataItemModel *> modelList;
+
+        // 方案优选和综合效能的评估数据采集页面只有一级, 不用切换页面
+        if (m_process.type == SchemePlanManager::ImportEvalData
+            && (m_process.indexType == ProjectManager::OptimalIndex
+                || m_process.indexType == ProjectManager::EfficiencyIndex)) {
+            vHeaders               = m_mind1->leaves();
+            EXDataItemModel *model = new EXDataItemModel(this);
+            updateModel(model, hHeaders, vHeaders);
+            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];
+            EXDataItemModel *model = new EXDataItemModel(this);
+
+            if (m_process.type == SchemePlanManager::ImportWeightData) {
+                hHeaders = m_mind1->subNodes(node);
+                vHeaders = hHeaders;
+                for (int i = 0; i < vHeaders.count(); i++) {
+                    CNodeData vNode = vHeaders[i];
+                    for (int j = 0; j < hHeaders.count(); j++) {
+                        CNodeData hNode     = hHeaders[j];
+                        QStandardItem *item = new QStandardItem();
+                        item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
+                        item->setEditable(false);
+                        if (i == j) {
+                            item->setText("1");
+                        }
+                        if (i >= j) {
+                            item->setBackground(QBrush(QColor("lightgray")));
+                        }
+                        model->setItem(i, j, item);
+                    }
+                }
+            }
+
+            if (m_process.type == SchemePlanManager::ImportEvalData) {
+                if (m_process.indexType == ProjectManager::TechIndex) {
+                    hHeaders = m_mind1->subNodes(node);
+                    vHeaders = m_mind2->leaves();
+                    for (int i = 0; i < vHeaders.count(); i++) {
+                        CNodeData vNode = vHeaders[i];
+                        for (int j = 0; j < hHeaders.count(); j++) {
+                            CNodeData hNode     = hHeaders[j];
+                            QStandardItem *item = new QStandardItem();
+                            item->setText("0");
+                            model->setItem(i, j, item);
+                        }
+                    }
+                }
+            }
+
+            model->setProperty(kTabName, node.name);
+            updateModel(model, hHeaders, vHeaders);
+            modelList.append(model);
+        }
+        m_models[i] = modelList;
+    }
+
+    setCurrentPage(1);
+}
+
 void EXDataTableView::setupTabWidget()
 {
-    /// 创建 tableView 并添加进 tabWidget
-    /// 这个过程中会触发 tabWidget 的 currentChanged,
-    /// 所以使用 m_isSettingTable 标记此过程, 以采取必要措施来规避一些异常操作
-    m_isSettingTable = true;
     m_dataTab->clear();
 
-    QList<CNodeData> nodeList = m_mind1->nodesInLevel(m_currentPage);
-
-    for (int i = 0; i < nodeList.count(); i++) {
-        CNodeData n   = nodeList[i];
-        QTableView *t = new QTableView(m_dataTab);
+    QList<EXDataItemModel *> list = m_models[m_currentPage];
+    for (int j = 0; j < list.size(); j++) {
+        EXDataItemModel *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);
-
-        QList<QStandardItemModel *> modelList;
-        if (m_models.keys().contains(m_currentPage)) {
-            modelList = m_models[m_currentPage];
-        }
-        QStandardItemModel *model;
-        if (modelList.count() <= i) {
-            model = new QStandardItemModel(t);
-            modelList.append(model);
-        } else {
-            model = modelList[i];
-        }
-        m_models[m_currentPage] = modelList;
-
         t->setModel(model);
+        m_dataTab->addTab(t, model->property(kTabName).toString());
         connect(t, &QTableView::clicked, this, &EXDataTableView::slotItemClicked);
+
+        if (m_process.type == SchemePlanManager::ImportEvalData) {
+            if (m_process.indexType == ProjectManager::TechIndex) {
+                t->setItemDelegate(m_comboDelegate);
+            }
+        }
     }
-    m_isSettingTable = false;
 }
 
 int EXDataTableView::currentPage() const
@@ -140,129 +212,10 @@ void EXDataTableView::setCurrentPage(int p)
     }
     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();
-}
-
-void EXDataTableView::updateCurrentTable()
-{
-    int c             = m_dataTab->currentIndex();
-    QTableView *table = (QTableView *)m_dataTab->widget(c);
-
-    if (table == nullptr || table->model() == nullptr || m_isSettingTable) {
-        return;
-    }
-
-    m_hNodes.clear();
-    m_vNodes.clear();
-    m_values.clear();
-
-    QStandardItemModel *model = (QStandardItemModel *)table->model();
-
-    /// 设置顶部水平方向标题
-    int hIndex         = -1;
-    int dimensionIndex = -1;  // 量纲所在列
-    int typeIndex      = -1;  // 指标类型所在列
-
-    // 指标
-    CNodeData n            = m_mind1->nodesInLevel(m_currentPage)[c];
-    QList<CNodeData> hList = m_mind1->subNodes(n);
-    // 以下情况需要显示指标
-    // 导入权重分析数据
-    // 导入需求分析评估的评估数据
-    if (m_process.type == SchemePlanManager::ImportWeightData || m_process.indexType == ProjectManager::TechIndex) {
-        for (CNodeData node : hList) {
-            QStandardItem *item = new QStandardItem(node.name);
-            item->setToolTip(node.remark);
-            model->setHorizontalHeaderItem(++hIndex, item);
-            m_hNodes.append(node.name);
-        }
-    }
-    // 导入方案优选评估或效能评估的评估数据时, 需要显示量纲
-    if (m_process.type == SchemePlanManager::ImportEvalData
-        && (m_process.indexType == ProjectManager::OptimalIndex
-            || m_process.indexType == ProjectManager::EfficiencyIndex)) {
-        QStandardItem *item = new QStandardItem("指标量纲");
-        model->setHorizontalHeaderItem(++hIndex, item);
-        dimensionIndex = hIndex;
-    }
-    // 导入方案优选评估的评估数据时, 需要显示指标类型
-    if (m_process.type == SchemePlanManager::ImportEvalData && m_process.indexType == ProjectManager::OptimalIndex) {
-        QStandardItem *item = new QStandardItem("指标类型");
-        model->setHorizontalHeaderItem(++hIndex, item);
-        typeIndex = hIndex;
-    }
-
-    /// 设置左侧垂直方向标题
-    QList<CNodeData> vList;
-    // 导入权重分析的专家数据时, 显示指标
-    if (m_process.type == SchemePlanManager::ImportWeightData) {
-        vList = hList;
-    }
-    // 导入评估数据时, 显示最后一级指标
-    if (m_process.type == SchemePlanManager::ImportEvalData) {
-        if (m_process.indexType == ProjectManager::TechIndex) {
-            vList = m_mind2->leaves();
-        } else {
-            vList = m_mind1->leaves();
-        }
-    }
-    for (int i = 0; i < vList.count(); i++) {
-        CNodeData node      = vList[i];
-        QStandardItem *item = new QStandardItem(QString("  %1  ").arg(node.name));
-        item->setToolTip(node.remark);
-        model->setVerticalHeaderItem(i, item);
-        table->setRowHeight(i, 35);
-        m_vNodes.append(node.name);
-    }
-
-    /// 填充量纲和指标类型
-    for (int i = 0; i < vList.count(); i++) {
-        CNodeData vNode  = vList[i];
-        QStandardItem *d = new QStandardItem();
-        d->setData(Qt::AlignCenter, Qt::TextAlignmentRole);  // 单元格文字居中
-        if (dimensionIndex >= 0) {
-            d->setText(vNode.dimension);
-            model->setItem(i, dimensionIndex, d);
-        }
-
-        if (typeIndex >= 0) {
-            model->setItem(i, typeIndex, d);
-        }
-        table->setRowHeight(i, 35);
-    }
-
-    if (m_process.type == SchemePlanManager::ImportWeightData) {
-        for (int i = 0; i < vList.count(); i++) {
-            CNodeData vNode = vList[i];
-            for (int j = 0; j < hList.count(); j++) {
-                CNodeData hNode     = hList[i];
-                QStandardItem *item = new QStandardItem();
-                item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
-                item->setEditable(false);
-                if (i == j) {
-                    item->setText("1");
-                }
-                if (i >= j) {
-                    item->setBackground(QBrush(QColor("lightgray")));
-                }
-                model->setItem(i, j, item);
-            }
-        }
-    }
-    if (m_process.type == SchemePlanManager::ImportEvalData || m_process.indexType == ProjectManager::TechIndex) {
-        for (int i = 0; i < vList.count(); i++) {
-            for (int j = 0; j < hList.count(); j++) {
-                QStandardItem *item = new QStandardItem();
-                item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
-                model->setItem(i, j, item);
-                table->setItemDelegate(m_comboDelegate);
-            }
-        }
-    }
+    m_pageLab->setText(QString("共 %1 页, 当前第 %2 页").arg(m_models.size()).arg(p));
 }
 
 CMind *EXDataTableView::mind1() const
@@ -277,8 +230,6 @@ CMind *EXDataTableView::mind2() const
 
 void EXDataTableView::exportData()
 {
-    qDebug() << __FUNCTION__ << __LINE__ << endl;
-
     //文件夹路径
     QFileDialog::Options options;
     options |= QFileDialog::DontUseNativeDialog;
@@ -289,8 +240,6 @@ void EXDataTableView::exportData()
     QString fileName = m_user->userName + "-"
             + ProjectManager::nameOfIndexType((ProjectManager::IndexType)m_process.indexType) + "-"
             + m_proj->projectName;
-    // QString filePath = "";
-    // filePath         = QCoreApplication::applicationDirPath();
     QDir dirReportPath(filePath);
     if (!dirReportPath.exists()) {
         if (dirReportPath.mkpath(filePath)) {
@@ -304,44 +253,56 @@ void EXDataTableView::exportData()
         file.remove();
     }
 
-    for (int i = 1; i < m_mind1->levels(); i++) {
-        if (m_models.keys().contains(i) == false) {
-            continue;
-        }
-        QList<CNodeData> nodes = m_mind1->nodesInLevel(i);
+    for (int i = 1; i <= m_models.size(); i++) {
+        QList<EXDataItemModel *> mList = m_models[i];
+        for (int j = 0; j < mList.count(); j++) {
+            EXDataItemModel *model = mList[j];
+            m_export->addSheet(model->property(kTabName).toString());
 
-        for (int j = 0; j < m_models[i].count(); j++) {
-            CNodeData node            = nodes[j];
-            QStandardItemModel *model = m_models[i][j];
-            m_export->addSheet(node.name);
             int row = model->rowCount();
             int col = model->columnCount();
-
             m_export->setColumnWidth(1, 20);
             for (int c = 2; c < col + 2; c++) {
-                QStandardItem *head = model->horizontalHeaderItem(c - 2);
-                m_export->write(1, c, head->text());
-                m_export->setColumnWidth(c, head->text().size() == 0 ? 40 : head->text().size() * 4);
+                QStandardItem *hHead = model->horizontalHeaderItem(c - 2);
+                m_export->write(1, c, hHead->text());
+                m_export->setColumnWidth(c, hHead->text().size() == 0 ? 40 : hHead->text().size() * 4);
             }
             for (int r = 2; r < row + 2; r++) {
-                QStandardItem *head = model->verticalHeaderItem(r - 2);
-                m_export->write(r, 1, head->text());
-
+                QStandardItem *vHead = model->verticalHeaderItem(r - 2);
+                m_export->write(r, 1, vHead->text());
                 for (int c = 2; c < col + 2; c++) {
-                    QStandardItem *head = model->item(r - 2, c - 2);
-                    m_export->write(r, c, head->text());
+                    QStandardItem *item = model->item(r - 2, c - 2);
+                    m_export->write(r, c, item->text());
                 }
             }
         }
-
-        m_export->saveAs(filePath);
     }
+
+    m_export->addSheet("专家信息");
+    m_export->write(1, 1, "ID");
+    m_export->write(1, 2, "账号");
+    m_export->write(1, 3, "单位");
+    m_export->write(1, 4, "职务");
+    m_export->write(1, 5, "专业");
+    m_export->write(1, 6, "联系方式");
+    m_export->write(1, 7, "填写时间");
+    m_export->write(1, 8, "备注");
+    m_export->write(2, 1, m_user->id);
+    m_export->write(2, 2, m_user->userName);
+    m_export->write(2, 3, m_user->workPosition);
+    m_export->write(2, 4, m_user->post);
+    m_export->write(2, 5, m_user->major);
+    m_export->write(2, 6, m_user->phone);
+    m_export->write(2, 7, m_user->writeTime);
+    m_export->write(2, 8, m_user->remark);
+
+    m_export->saveAs(filePath);
 }
 void EXDataTableView::editItemData(const QModelIndex &index, const QString &val)
 {
-    int c                     = m_dataTab->currentIndex();
-    QTableView *table         = (QTableView *)m_dataTab->widget(c);
-    QStandardItemModel *model = (QStandardItemModel *)table->model();
+    int c                  = m_dataTab->currentIndex();
+    QTableView *table      = (QTableView *)m_dataTab->widget(c);
+    EXDataItemModel *model = (EXDataItemModel *)table->model();
     model->itemFromIndex(index)->setText(val);
     QString symmetry;
     if (val.startsWith("1/")) {
@@ -356,6 +317,23 @@ void EXDataTableView::editItemData(const QModelIndex &index, const QString &val)
     model->item(index.column(), index.row())->setText(symmetry);
 }
 
+void EXDataTableView::updateModel(EXDataItemModel *model, QList<CNodeData> &hHeaders, QList<CNodeData> &vHeaders)
+{
+    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, 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, item);
+    }
+}
+
 void EXDataTableView::slotPrevious()
 {
     setCurrentPage(m_currentPage - 1);
@@ -369,7 +347,7 @@ void EXDataTableView::slotNext()
 void EXDataTableView::slotTabCurrentChanged(int c)
 {
     Q_UNUSED(c)
-    updateCurrentTable();
+    //    updateCurrentTable();
 }
 
 void EXDataTableView::slotItemClicked(const QModelIndex &index)
@@ -384,8 +362,8 @@ void EXDataTableView::slotItemClicked(const QModelIndex &index)
 
     QStringList l = { "1/9", "1/7", "1/5", "1/3", "1", "3", "5", "7", "9" };
 
-    QTableView *table         = (QTableView *)sender();
-    QStandardItemModel *model = (QStandardItemModel *)table->model();
+    QTableView *table      = (QTableView *)sender();
+    EXDataItemModel *model = (EXDataItemModel *)table->model();
     //    SchemeBar *scheme =
     //            new SchemeBar(model->item(index.row(), 0)->text(),
     //            model->horizontalHeaderItem(index.column())->text(), l);
@@ -407,9 +385,9 @@ void EXDataTableView::slotItemClicked(const QModelIndex &index)
 void EXDataTableView::slotSave()
 {
     return;
-    int c                     = m_dataTab->currentIndex();
-    QTableView *table         = (QTableView *)m_dataTab->widget(c);
-    QStandardItemModel *model = (QStandardItemModel *)table->model();
+    int c                  = m_dataTab->currentIndex();
+    QTableView *table      = (QTableView *)m_dataTab->widget(c);
+    EXDataItemModel *model = (EXDataItemModel *)table->model();
 
     QList<NodeMatrixInfo *> values;
 

+ 15 - 3
ExpertClient/EXDataTableView.h

@@ -10,6 +10,8 @@
 
 #include <xlsxdocument.h>
 
+#include <QStandardItemModel>
+
 class QFUser;
 
 class CMind;
@@ -26,6 +28,14 @@ class EXDataTableComboDelegate;
 
 class QStandardItemModel;
 
+class EXDataItemModel : public QStandardItemModel
+{
+public:
+    explicit EXDataItemModel(QObject *parent = nullptr);
+
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+};
+
 /**
  * @brief The DataTableWidget class
  * 数据表, 整体上是包含多个 QTableView 的 QTabWidget
@@ -50,14 +60,14 @@ public:
 
     void connectSignalsAndSlots();
 
+    void setupModels();
+
     void setupTabWidget();
 
     int currentPage() const;
 
     void setCurrentPage(int p);
 
-    void updateCurrentTable();
-
     CMind *mind1() const;
     CMind *mind2() const;
 
@@ -66,6 +76,8 @@ public:
 private:
     void editItemData(const QModelIndex &index, const QString &val);
 
+    void updateModel(EXDataItemModel *model, QList<CNodeData> &hHeaders, QList<CNodeData> &vHeaders);
+
 private slots:
     void slotPrevious();
     void slotNext();
@@ -76,7 +88,7 @@ private slots:
 private:
     SchemePlanManager::SchemeProcessInfo m_process;
 
-    QMap<int, QList<QStandardItemModel *>> m_models;
+    QMap<int, QList<EXDataItemModel *>> m_models;
 
     QXlsx::Document *m_export;
 

+ 2 - 1
ExpertClient/EXDataView.cpp

@@ -103,7 +103,8 @@ void EXDataView::setupTabWidget()
                 if (i == ProjectManager::TechIndex) {
                     table->mind2()->setNodeList(nodeListMap[ProjectManager::AbilityIndex]);
                 }
-                table->setCurrentPage(1);
+                //                table->setCurrentPage(1);
+                table->setupModels();
 
                 QString processName = SchemePlanManager::processName(process);
                 m_tab->addTab(table, indexName + " - " + processName);

+ 0 - 4
ExpertClient/MainWindow.cpp

@@ -28,10 +28,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
         return;
     }
 
-    for (UserConfig *cfg : cfgList) {
-        qDebug() << __FUNCTION__ << __LINE__ << cfg->userId << cfg->userName << endl;
-    }
-
     EXProjectView *projView = new EXProjectView(proj, this);
     setCentralWidget(projView);
 }