Browse Source

修改专家配置;
测试权重分析算法;

chengxr 1 year ago
parent
commit
f6db7460ed

+ 13 - 0
QFD/common/EvalDataManager.cpp

@@ -16,6 +16,19 @@ QList<NodeMatrixInfo> EvalDataManager::dataSample(SchemePlanManager::SchemeProce
     unsigned seed = 1;
     srand(seed);
 
+    //    for (int lev = 1; lev < mind1->levels(); lev++) {
+    //        QList<CNodeData> nodes = mind1->nodesInLevel(lev);
+    //        for (int i = 0; i < nodes.count(); i++) {
+    //            CNodeData node            = nodes[i];  // 父节点
+    //            QList<CNodeData> subNodes = mind1->subNodes(node);
+    //            for (int i = 0; i < subNodes.count(); i++) {
+    //                CNodeData subNode = subNodes[i];  // 子节点
+    //            }
+    //        }
+    //    }
+
+    //    return list;
+
     // 权重数据
     if (process.type == SchemePlanManager::ImportWeightData) {
         // 来自专家数据, 子指标间的权重比

+ 2 - 0
QFD/common/QFDAlert.cpp

@@ -52,6 +52,8 @@ void QFDAlert::showAlertWithCode(int code, QWidget *w)
         msg = "删除失败";
     } else if (code == QF_CODE_EVAL_NOT_SUPPORTED) {
         msg = "不支持的评估类型";
+    } else if (code == QF_CODE_WEIGHTSUM_ERROR) {
+        msg = "已配置专家的权重和不等于1";
     }
 
     if (!msg.isEmpty()) {

+ 7 - 4
QFD/dbService/ClassSet.h

@@ -33,6 +33,8 @@ const int QF_CODE_PROJ_DELETE_FALIED = 2026;
 
 const int QF_CODE_EVAL_NOT_SUPPORTED = 2030;
 
+const int QF_CODE_WEIGHTSUM_ERROR = 2040;
+
 /**
  * @projectName   QFD
  * @author        cyh
@@ -259,10 +261,11 @@ class UserConfig
 {
 public:
     int id = -1;
-    int userId;          //用户id
-    QString userName;    //用户名称
-    int engineerId;      //工程id
-    double weight;       //工程权重
+    int userId;        //用户id
+    QString userName;  //用户名称
+    int engineerId;    //工程id
+    double weight;     //工程权重
+    int isValid = 1;
     QString createTime;  //创建时间
     QString updateTime;  //更新时间
 };

+ 5 - 5
QFD/dbService/UserConfigService.cpp

@@ -11,11 +11,11 @@ int UserConfigService::AddUserConfig(const UserConfig &cfg)
     int returnId = -1;
     try {
         Transaction t(SqlDBHelper::getDatabase());
-        InsertQuery query = t.insertInto("t_user_config (user_id, engineer_id, "
-                                         "weight, create_time, update_time,user_name)");
-        NonQueryResult result =
-                query.values(cfg.userId, cfg.engineerId, cfg.weight, cfg.createTime, cfg.updateTime, cfg.userName)
-                        .exec();
+        InsertQuery query     = t.insertInto("t_user_config (user_id, engineer_id, "
+                                         "weight, create_time, update_time,user_name, is_valid)");
+        NonQueryResult result = query.values(cfg.userId, cfg.engineerId, cfg.weight, cfg.createTime, cfg.updateTime,
+                                             cfg.userName, cfg.isValid)
+                                        .exec();
         t.commit();
         returnId = result.lastInsertId().toInt();
 

+ 57 - 3
QFD/widgets/ConfigExpertDataWidget.cpp

@@ -153,7 +153,7 @@ void ConfigExpertDataWidget::loadData()
 
     qDeleteAll(m_configList);
     m_configList.clear();
-    if (!UserConfigService().QueryAllUserConfig(&m_configList)) {
+    if (!UserConfigService().QueryUserConfigListInfoByEngineerId(&m_configList, m_process.projectId)) {
         QFDAlert::showAlertWithCode(QF_CODE_DATA_ERROR, this);
         return;
     }
@@ -206,10 +206,36 @@ void ConfigExpertDataWidget::refreshExpList()
         widget->setUser(expert);
         widget->setIndex(i + 1);
         m_expListWidget->setItemWidget(item, widget);
+
+        for (UserConfig *config : m_configList) {
+            if (config->userId == expert->id) {
+                widget->setAdded(true);
+                break;
+            }
+        }
     }
 }
 
-void ConfigExpertDataWidget::slotSave() { }
+void ConfigExpertDataWidget::slotSave()
+{
+    int sum = 0;
+    for (int i = 0; i < m_configListWidget->count(); i++) {
+        QListWidgetItem *item        = m_configListWidget->item(i);
+        ConfigListItemWidget *widget = (ConfigListItemWidget *)m_configListWidget->itemWidget(item);
+        sum += widget->spinValue();
+        widget->userConfig()->weight = widget->spinValue();
+    }
+
+    if (sum != 100) {
+        QFDAlert::showAlertWithCode(QF_CODE_WEIGHTSUM_ERROR, this);
+        return;
+    }
+
+    for (UserConfig *config : m_configList) {
+        UserConfigService().UpdateUserConfig(*config);
+    }
+    loadData();
+}
 
 void ConfigExpertDataWidget::slotRefresh()
 {
@@ -219,11 +245,27 @@ void ConfigExpertDataWidget::slotRefresh()
 void ConfigExpertDataWidget::slotAddUser(QFUser *user)
 {
     qDebug() << __FUNCTION__ << __LINE__ << user->userName << endl;
+
+    for (UserConfig *config : m_configList) {
+        if (config->userId == user->id) {
+            return;
+        }
+    }
+
+    UserConfig cfg;
+    cfg.userId     = user->id;
+    cfg.userName   = user->userName;
+    cfg.engineerId = m_process.projectId;
+    cfg.weight     = m_configList.count() > 0 ? 0 : 100;
+    UserConfigService().AddUserConfig(cfg);
+    loadData();
 }
 
 void ConfigExpertDataWidget::slotRemoveConfig(UserConfig *config)
 {
     qDebug() << __FUNCTION__ << __LINE__ << config->userName << endl;
+    UserConfigService().DeleteUserConfigById(config->id);
+    loadData();
 }
 
 void ConfigExpertDataWidget::slotImportData(UserConfig *config)
@@ -250,11 +292,18 @@ void ConfigListItemWidget::setUserConfig(UserConfig *config)
     m_weight->setValue(m_config->weight);
 }
 
+int ConfigListItemWidget::spinValue() const
+{
+    return m_weight->value();
+}
+
 void ConfigListItemWidget::initWidget()
 {
     m_name   = new QLabel(this);
     m_weight = new QSpinBox(this);
     m_weight->setSuffix("%");
+    m_weight->setMaximum(100);
+    m_weight->setMinimum(0);
     m_import = new QPushButton(NEWFLICON(FluentIcon, DOWNLOAD)->icon(), "", this);
     m_import->setFixedSize(QSize(25, 25));
     m_import->setIconSize(QSize(15, 15));
@@ -315,6 +364,11 @@ void ExpertListItemWidget::setIndex(int index)
     m_index->setText(QString("%1").arg(index));
 }
 
+void ExpertListItemWidget::setAdded(bool added)
+{
+    m_add->setHidden(added);
+}
+
 void ExpertListItemWidget::initWidget()
 {
     m_index = new QLabel(this);
@@ -322,7 +376,7 @@ void ExpertListItemWidget::initWidget()
     m_add   = new QPushButton(NEWFLICON(FluentIcon, ADD)->icon(), "", this);
     m_add->setFixedSize(QSize(25, 25));
     m_add->setIconSize(QSize(10, 10));
-    m_add->setToolTip("移除");
+    m_add->setToolTip("添加");
 }
 
 void ExpertListItemWidget::initLayout()

+ 4 - 0
QFD/widgets/ConfigExpertDataWidget.h

@@ -34,6 +34,8 @@ public:
     UserConfig *userConfig() const;
     void setUserConfig(UserConfig *config);
 
+    int spinValue() const;
+
 signals:
     void sigImport(UserConfig *config);
     void sigRemove(UserConfig *config);
@@ -73,6 +75,8 @@ public:
 
     void setIndex(int index);
 
+    void setAdded(bool added);
+
 signals:
     void sigAddUser(QFUser *user);
 

+ 27 - 0
QFD/widgets/DataCollectionWidget.cpp

@@ -5,6 +5,7 @@
 #include "ConfigMeasureDataWidget.h"
 
 #include "EvalDataManager.h"
+#include "algorithm/HierarchicalAnalysis.h"
 
 #include "GreyClusteringConfigWidget.h"  // 灰色聚类配置
 #include "GreyClusteringSampleTable.h"   // 灰色聚类评估
@@ -16,6 +17,8 @@
 
 #include <CNode.h>
 
+#include <Widgets/Button.h>
+
 #include <QTabWidget>
 #include <QBoxLayout>
 #include <QMap>
@@ -33,6 +36,11 @@ DataCollectionWidget::DataCollectionWidget(ProjectInfo *proj, QWidget *parent) :
     m_configExpert->setHidden(true);
     m_configMeasure->setHidden(true);
 
+    m_calcBtn = new PushButton("更新数据");
+    m_topLayout->addStretch();
+    m_topLayout->addWidget(m_calcBtn);
+    connect(m_calcBtn, &PushButton::clicked, this, &DataCollectionWidget::slotCalc);
+
     connect(m_tab, &QTabWidget::currentChanged, this, &DataCollectionWidget::slotTabCurrentChanged);
 }
 
@@ -145,3 +153,22 @@ void DataCollectionWidget::slotTabCurrentChanged(int index)
         m_configMeasure->setHidden(true);
     }
 }
+
+void DataCollectionWidget::slotCalc()
+{
+    DataTableWidget *table = dynamic_cast<DataTableWidget *>(m_tab->currentWidget());
+    if (table == nullptr) {
+        return;
+    }
+
+    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()) {
+        return;
+    }
+
+    HierarchicalAnalysis *a = new HierarchicalAnalysis(nodes, values);
+    qDebug() << __FUNCTION__ << __LINE__ << a->getWeights() << endl;
+}

+ 3 - 0
QFD/widgets/DataCollectionWidget.h

@@ -28,12 +28,15 @@ private:
 
 private slots:
     void slotTabCurrentChanged(int index);
+    void slotCalc();
 
 signals:
 
 private:
     ConfigExpertDataWidget *m_configExpert   = nullptr;
     ConfigMeasureDataWidget *m_configMeasure = nullptr;
+
+    PushButton *m_calcBtn = nullptr;
 };
 
 #endif  // DATACOLLECTIONWIDGET_H

+ 29 - 4
QFD/widgets/DataTableWidget.cpp

@@ -120,6 +120,10 @@ void DataTableWidget::updateCurrentTable()
         return;
     }
 
+    m_hNodes.clear();
+    m_vNodes.clear();
+    m_values.clear();
+
     QStandardItemModel *model = (QStandardItemModel *)table->model();
 
     /// 设置顶部水平方向标题
@@ -138,6 +142,7 @@ void DataTableWidget::updateCurrentTable()
             QStandardItem *item = new QStandardItem(node.name);
             item->setToolTip(node.remark);
             model->setHorizontalHeaderItem(++hIndex, item);
+            m_hNodes.append(node.name);
         }
     }
     // 导入方案优选评估或效能评估的评估数据时, 需要显示量纲
@@ -175,13 +180,13 @@ void DataTableWidget::updateCurrentTable()
         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->setEditable(false);
         d->setData(Qt::AlignCenter, Qt::TextAlignmentRole);  // 单元格文字居中
         if (dimensionIndex >= 0) {
             d->setText(vNode.dimension);
@@ -206,12 +211,19 @@ void DataTableWidget::updateCurrentTable()
                     QStandardItem *item = new QStandardItem();
                     item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);  // 单元格文字居中
                     item->setBackground(QBrush(QColor("white")));
-                    item->setEditable(false);
 
                     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;
                         }
                     }
@@ -227,7 +239,6 @@ void DataTableWidget::updateCurrentTable()
                 QStandardItem *item = new QStandardItem();
                 item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);  // 单元格文字居中
                 item->setBackground(QBrush(QColor("white")));
-                item->setEditable(false);
 
                 for (NodeMatrixInfo info : m_data) {
                     if (info.abscissa.toInt() == hNode.id) {
@@ -248,7 +259,6 @@ void DataTableWidget::updateCurrentTable()
                     QStandardItem *item = new QStandardItem();
                     item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);  // 单元格文字居中
                     item->setBackground(QBrush(QColor("white")));
-                    item->setEditable(false);
 
                     for (NodeMatrixInfo info : m_data) {
                         if (info.abscissa.toInt() == hNode.id && info.ordinate.toInt() == vNode.id) {
@@ -265,6 +275,21 @@ 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;

+ 10 - 0
QFD/widgets/DataTableWidget.h

@@ -49,6 +49,11 @@ public:
 
     void updateCurrentTable();
 
+    QStringList hNodes() const;
+    QStringList vNodes() const;
+
+    QVector<qreal> values() const;
+
     CMind *mind1() const;
     CMind *mind2() const;
 
@@ -83,6 +88,11 @@ private:
     DataTableComboDelegate *m_comboDelegate = nullptr;
 
     QList<NodeMatrixInfo> m_data;
+
+    QStringList m_hNodes;
+    QStringList m_vNodes;
+
+    QVector<qreal> m_values;
 };
 
 #endif  // DATATABLEWIDGET_H