Browse Source

导出效能评估结果。

Ulricy 1 year ago
parent
commit
fc4b1406d6
2 changed files with 134 additions and 0 deletions
  1. 132 0
      QFD/common/ExportReportManager.cpp
  2. 2 0
      QFD/common/ExportReportManager.h

+ 132 - 0
QFD/common/ExportReportManager.cpp

@@ -11,6 +11,8 @@
 #include <dbService/SchemeInfoService.h>
 #include <dbService/SchemeProcessService.h>
 #include <dbService/MindWeightService.h>
+#include <dbService/GradeInfoService.h>
+#include <dbService/EffectResultService.h>
 
 #include <QWord/QWord.h>
 #include <QWord/QWordDemo.h>
@@ -75,6 +77,7 @@ bool ExportReportManager::exportReport()
         insertEffiConfigData();
         insertEffiSchemeData();
         insertEffiWeightData();
+        insertEffiResult();
     }
 
     m_word->setVisible(true);
@@ -749,6 +752,135 @@ void ExportReportManager::insertEffiWeightData()
     }
 }
 
+void ExportReportManager::insertEffiResult()
+{
+    QList<GradeInfo *> gradeInfoList;
+    int type      = m_schemeType == 1 ? 0 : 1;
+    bool gradeRet = GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, m_proj->id, type);
+    if (gradeRet == false) {
+        return;
+    }
+    QStringList gradeNames;
+    for (int i = 0; i < gradeInfoList.size(); ++i) {
+        gradeNames.append(gradeInfoList[i]->gradeValue);
+    }
+
+    QList<EffectResult> effList;
+    bool effRet = EffectResultService().queryDataList(effList, m_proj->id);
+    if (effRet == false) {
+        return;
+    }
+
+    QMap<int, QMap<QString, QList<double>>> effData;
+    QMap<int, QString> schemeNames;
+    int levels = 0;
+    for (EffectResult effect : effList) {
+        if (effData.keys().contains(effect.schemeId) == false) {
+            effData[effect.schemeId]     = QMap<QString, QList<double>>();
+            schemeNames[effect.schemeId] = effect.schemeName;
+        }
+        QStringList values = effect.value.split(",");
+        levels             = values.size();
+        QList<double> valueList;
+        for (int v = 0; v < values.size(); ++v) {
+            valueList.append(values[v].toDouble());
+        }
+
+        effData[effect.schemeId][effect.indexName] = valueList;
+    }
+
+    QList<CNodeData> nodeList;
+    bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 8);
+    if (ret == false) {
+        return;
+    }
+
+    CMind *mind = new CMind();
+    mind->setNodeList(nodeList);
+
+    QList<CNodeData> leaveNodes = mind->leaves();
+    int rowCount                = leaveNodes.size() + 1;
+    int columnCount             = mind->levels() + schemeNames.size() - 1;
+
+    //    bmEvalTable
+    QAxObject *table = insertTable("bmEvalTable", rowCount, columnCount);
+    if (table == nullptr) {
+        delete mind;
+        return;
+    }
+
+    for (int i = 2; i <= mind->levels(); ++i) {
+        if (i < mind->levels()) {
+            setCellString(table, 1, i - 1, QString("%1级指标\n(能力项)").arg(i - 1));
+        } else {
+            setCellString(table, 1, i - 1, QString("指标"));
+        }
+
+        QList<CNodeData> nodes = mind->nodesInLevel(i);
+        int rowPos             = 2;
+        for (int j = 0; j < nodes.size(); ++j) {
+            CNodeData node = nodes[j];
+            int leaves     = mind->leavesCountOfNode(node);
+            int textPos    = (rowPos + leaves / 2);
+            setCellString(table, textPos, i - 1, node.name);
+
+            if (leaves > 1) {
+                mergeCells(table, rowPos, i - 1, leaves, 1);
+            }
+
+            rowPos += leaves;
+        }
+    }
+
+    for (int i = 0; i < schemeNames.size(); ++i) {
+        setCellString(table, 1, i + mind->levels(),
+                      schemeNames[schemeNames.keys()[i]] + "\n(" + gradeNames.join(",") + ")");
+        for (int j = 0; j < leaveNodes.size(); ++j) {
+            CNodeData node       = leaveNodes[j];
+            QList<double> values = effData[schemeNames.keys()[i]][node.name];
+            int bestIndex        = 0;
+            QString score;
+            for (int k = 0; k < values.size(); ++k) {
+                if (values[k] > values[bestIndex]) {
+                    bestIndex = k;
+                }
+                score += QString::number(values[k], 'f', 1).replace(".0", "").replace("nan", "0");
+                if (k < values.size() - 1) {
+                    score += ",";
+                }
+            }
+            QString rand  = gradeNames[bestIndex];
+            QString value = rand + "(" + score + ")";
+            setCellString(table, j + 2, i + mind->levels(), value);
+        }
+    }
+
+    QStringList retList;
+    int bestGrade       = 0;
+    int bestSchemeIndex = 0;
+    for (int i = 0; i < schemeNames.size(); ++i) {
+        int grade            = 0;
+        QList<double> values = effData[schemeNames.keys()[i]]["综合"];
+        for (int j = 0; j < values.size(); ++j) {
+            if (values[j] > values[grade]) {
+                grade = j;
+            }
+        }
+        QString ret = schemeNames[schemeNames.keys()[i]] + "的综合评价等级为" + gradeNames[grade];
+        retList.append(ret);
+        if (grade > bestGrade) {
+            bestGrade       = grade;
+            bestSchemeIndex = i;
+        }
+    }
+
+    QString bestScheme = schemeNames[schemeNames.keys()[bestSchemeIndex]];
+    QString conclusion = "根据评估结果," + retList.join(",") + "。所以" + bestScheme + "更优。";
+    insertText("bmEffiConclusion", conclusion);
+
+    delete mind;
+}
+
 bool ExportReportManager::insertText(const QString &bookmark, const QString &text)
 {
     bool ret              = false;

+ 2 - 0
QFD/common/ExportReportManager.h

@@ -51,6 +51,8 @@ private:
     void insertEffiSchemeData();
     // 填充效能评估权重数据
     void insertEffiWeightData();
+    // 填充效能评估结果
+    void insertEffiResult();
 
     // 在一个书签位置插入文字
     bool insertText(const QString &bookmark, const QString &text);