ExportReportManager.cpp 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672
  1. #include "ExportReportManager.h"
  2. #include "ProjectManager.h"
  3. #include "SchemePlanManager.h"
  4. #include "CMindView.h"
  5. #include <view/PlotView.h>
  6. #include <dbService/ClassSet.h>
  7. #include <dbService/SchemeInfoService.h>
  8. #include <dbService/CNodeDataService.h>
  9. #include <dbService/SchemeInfoService.h>
  10. #include <dbService/SchemeProcessService.h>
  11. #include <dbService/MindWeightService.h>
  12. #include <dbService/GradeInfoService.h>
  13. #include <dbService/GradeIndexInfoService.h>
  14. #include <dbService/EffectIndexInfoService.h>
  15. #include <dbService/EffectResultService.h>
  16. #include <dbService/MindScoreService.h>
  17. #include <QWord/QWord.h>
  18. #include <QWord/QWordDemo.h>
  19. #include <QDir>
  20. #include <QDate>
  21. #include <QLabel>
  22. #include <QImageWriter>
  23. #include <QDebug>
  24. ExportReportManager::ExportReportManager(QObject *parent) : QObject(parent)
  25. {
  26. m_word = new QWord(this);
  27. }
  28. ExportReportManager::~ExportReportManager()
  29. {
  30. delete m_word;
  31. }
  32. ProjectInfo *ExportReportManager::proj() const
  33. {
  34. return m_proj;
  35. }
  36. void ExportReportManager::setProj(ProjectInfo *proj)
  37. {
  38. m_proj = proj;
  39. }
  40. int ExportReportManager::evalType() const
  41. {
  42. return m_evalType;
  43. }
  44. void ExportReportManager::setEvalType(int type)
  45. {
  46. m_evalType = type;
  47. }
  48. bool ExportReportManager::exportReport()
  49. {
  50. bool createRet = createWord();
  51. if (createRet == false) {
  52. qDebug() << __FUNCTION__ << __LINE__ << m_word->getStrErrorInfo() << endl;
  53. return false;
  54. }
  55. insertProjectInfo();
  56. if (m_evalType == ProjectManager::DemandEval) {
  57. insertDemandAlg();
  58. insertDemandIndex();
  59. insertDemandTechIndex();
  60. insertDemandWeight();
  61. insertDemandEval();
  62. }
  63. if (m_evalType == ProjectManager::OptimalEval) {
  64. insertSchemeDesignInfo();
  65. insertSchemeIndex();
  66. insertSchemeAlgInfo();
  67. insertSchemeData();
  68. insertSchemeWeightData();
  69. }
  70. if (m_evalType == ProjectManager::EfficiencyEval) {
  71. insertEffiIndex();
  72. insertEffiAlgInfo();
  73. insertEffiConfigData();
  74. insertEffiSchemeData();
  75. insertEffiWeightData();
  76. insertEffiResult();
  77. }
  78. m_word->setVisible(true);
  79. QAxObject *doc = m_word->getWordApp()->querySubObject("ActiveDocument");
  80. doc->dynamicCall("SaveAs(const QString&))", QDir::toNativeSeparators(m_word->getFilePath()));
  81. m_word->close();
  82. return true;
  83. }
  84. bool ExportReportManager::createWord()
  85. {
  86. delete m_word;
  87. m_word = new QWord(this);
  88. // 报告文件夹路径
  89. QString curPath = QDir::currentPath();
  90. QString dateStr = QDate::currentDate().toString("yyyy-MM-dd");
  91. QString reportDir = curPath + "/reports/" + dateStr + "/";
  92. QDir dir(reportDir);
  93. if (!dir.exists()) {
  94. dir.mkpath(reportDir);
  95. }
  96. // 根据模板创建 word 文档
  97. QString typeStr = ProjectManager::reportNameOfEvalType((ProjectManager::EvalType)m_evalType);
  98. QString tempPath = curPath + "/report_templates/" + typeStr + ".docx";
  99. if (!QFile::exists(tempPath)) {
  100. qDebug() << __FUNCTION__ << __LINE__ << "Report template not found" << endl;
  101. return false;
  102. }
  103. QString fileName = m_proj->projectName + "_" + typeStr + ".docx";
  104. QString filePath = reportDir + fileName;
  105. if (QFile::exists(filePath)) {
  106. QFile::remove(filePath);
  107. }
  108. bool ret = QFile::copy(tempPath, filePath);
  109. if (ret) {
  110. ret = m_word->open(filePath, false);
  111. } else {
  112. qDebug() << __FUNCTION__ << __LINE__ << "Copy report template failed" << endl;
  113. }
  114. return ret;
  115. }
  116. void ExportReportManager::insertProjectInfo()
  117. {
  118. insertText("bmProjName", m_proj->projectName);
  119. insertText("bmProjUnit", m_proj->estimateDept);
  120. QString dateStr = QDate::currentDate().toString("yyyy年MM月");
  121. insertText("bmProjDate", dateStr);
  122. insertText("bmEvalPurpose", m_proj->estimateObjective);
  123. }
  124. void ExportReportManager::insertDemandAlg()
  125. {
  126. // bmWeightAlg bmEvalAlg
  127. // bmWeightAlgDscpt bmEvalAlgDscpt
  128. QList<SchemePlanManager::SchemeProcessInfo> processList;
  129. bool processRet = SchemeProcessService().QueryAllByProjectIdAndIndexType(processList, m_proj->id, 1);
  130. if (processRet == false) {
  131. return;
  132. }
  133. for (int i = 0; i < processList.size(); ++i) {
  134. if (processList[i].type == SchemePlanManager::CalculateWeight) {
  135. SchemePlanManager::Algorithm alg = processList[i].algorithm;
  136. QString algStr = SchemePlanManager::nameOfAlgorithm(alg);
  137. insertText("bmWeightAlg", algStr);
  138. QString dscrpt = SchemePlanManager::descriptionOfAlgorithm(alg);
  139. insertText("bmWeightAlgDscpt", dscrpt);
  140. }
  141. }
  142. processRet = SchemeProcessService().QueryAllByProjectIdAndIndexType(processList, m_proj->id, 2);
  143. if (processRet == false) {
  144. return;
  145. }
  146. for (int i = 0; i < processList.size(); ++i) {
  147. if (processList[i].type == SchemePlanManager::RunEvaluate) {
  148. SchemePlanManager::Algorithm alg = processList[i].algorithm;
  149. QString algStr = SchemePlanManager::nameOfAlgorithm(alg);
  150. insertText("bmEvalAlg", algStr);
  151. QString dscrpt = SchemePlanManager::descriptionOfAlgorithm(alg);
  152. insertText("bmEvalAlgDscpt", dscrpt);
  153. }
  154. }
  155. }
  156. void ExportReportManager::insertDemandIndex()
  157. {
  158. insertText("bmProjName21", m_proj->projectName);
  159. insertText("bmProjName22", m_proj->projectName);
  160. QList<CNodeData> nodeList;
  161. bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 1);
  162. if (ret == false) {
  163. return;
  164. }
  165. CMind *mind = new CMind();
  166. mind->setNodeList(nodeList);
  167. QList<CNodeData> leaveNodes = mind->leaves();
  168. int rowCount = leaveNodes.size() + 1;
  169. int columnCount = mind->levels();
  170. // bmIndexTable
  171. QAxObject *table = insertTable("bmIndexTable", rowCount, columnCount);
  172. if (table == nullptr) {
  173. delete mind;
  174. return;
  175. }
  176. for (int i = 2; i <= mind->levels(); ++i) {
  177. if (i < mind->levels()) {
  178. setCellString(table, 1, i - 1, QString("%1级指标").arg(i - 1));
  179. } else {
  180. setCellString(table, 1, i - 1, QString("指标"));
  181. setCellString(table, 1, i, QString("量纲"));
  182. }
  183. QList<CNodeData> nodes = mind->nodesInLevel(i);
  184. int rowPos = 2;
  185. for (int j = 0; j < nodes.size(); ++j) {
  186. CNodeData node = nodes[j];
  187. int leaves = mind->leavesCountOfNode(node);
  188. int textPos = (rowPos + leaves / 2);
  189. setCellString(table, textPos, i - 1, node.name);
  190. if (leaves > 1) {
  191. mergeCells(table, rowPos, i - 1, leaves, 1);
  192. }
  193. rowPos += leaves;
  194. }
  195. }
  196. for (int i = 0; i < leaveNodes.size(); ++i) {
  197. CNodeData node = leaveNodes[i];
  198. setCellString(table, i + 2, columnCount, node.dimension);
  199. }
  200. delete mind;
  201. CMindView *m = new CMindView();
  202. m->setNodeList(nodeList);
  203. m->refreshItems();
  204. int sceneWidth = m->sceneRect().width();
  205. int sceneHeight = m->sceneRect().height();
  206. QRectF sourceRect = QRectF(0, 0, sceneWidth, sceneHeight);
  207. QRectF targetRect = QRectF(10, 10, sceneWidth, sceneHeight);
  208. QPixmap pixmap(QSize(sceneWidth + 20, sceneHeight + 20));
  209. pixmap.fill(QColor(244, 244, 255));
  210. QPainter painter(&pixmap);
  211. painter.setRenderHints(QPainter::Antialiasing);
  212. m->scene()->render(&painter, targetRect, sourceRect);
  213. delete m;
  214. QString imgName = QString("%1_%2_index").arg(m_proj->id).arg(1);
  215. QString path = saveImage(imgName, pixmap);
  216. QImageWriter writer(path);
  217. writer.setFormat("PNG");
  218. ret = writer.write(pixmap.toImage());
  219. if (ret) {
  220. QAxObject *bmWeightPic = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmIndexPic");
  221. if (bmWeightPic != nullptr) {
  222. bmWeightPic->dynamicCall("Select(void)");
  223. QAxObject *range = bmWeightPic->querySubObject("Range");
  224. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  225. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", path);
  226. if (shape != nullptr) {
  227. int w = pixmap.width();
  228. int h = pixmap.height();
  229. if (w > 400) {
  230. h = h * 400 / w;
  231. w = 400;
  232. }
  233. shape->setProperty("Width", w);
  234. shape->setProperty("Height", h);
  235. }
  236. }
  237. }
  238. }
  239. void ExportReportManager::insertDemandTechIndex()
  240. {
  241. insertText("bmProjName31", m_proj->projectName);
  242. insertText("bmProjName32", m_proj->projectName);
  243. QList<CNodeData> nodeList;
  244. bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 2);
  245. if (ret == false) {
  246. return;
  247. }
  248. CMind *mind = new CMind();
  249. mind->setNodeList(nodeList);
  250. QList<CNodeData> leaveNodes = mind->leaves();
  251. int rowCount = leaveNodes.size() + 1;
  252. int columnCount = mind->levels() - 1;
  253. // bmIndexTable
  254. QAxObject *table = insertTable("bmTechTable", rowCount, columnCount);
  255. if (table == nullptr) {
  256. delete mind;
  257. return;
  258. }
  259. for (int i = 2; i <= mind->levels(); ++i) {
  260. if (i < mind->levels()) {
  261. setCellString(table, 1, i - 1, QString("%1级指标").arg(i - 1));
  262. } else {
  263. setCellString(table, 1, i - 1, QString("指标"));
  264. }
  265. QList<CNodeData> nodes = mind->nodesInLevel(i);
  266. int rowPos = 2;
  267. for (int j = 0; j < nodes.size(); ++j) {
  268. CNodeData node = nodes[j];
  269. int leaves = mind->leavesCountOfNode(node);
  270. int textPos = (rowPos + leaves / 2);
  271. setCellString(table, textPos, i - 1, node.name);
  272. if (leaves > 1) {
  273. mergeCells(table, rowPos, i - 1, leaves, 1);
  274. }
  275. rowPos += leaves;
  276. }
  277. }
  278. delete mind;
  279. CMindView *m = new CMindView();
  280. m->setNodeList(nodeList);
  281. m->refreshItems();
  282. int sceneWidth = m->sceneRect().width();
  283. int sceneHeight = m->sceneRect().height();
  284. QRectF sourceRect = QRectF(0, 0, sceneWidth, sceneHeight);
  285. QRectF targetRect = QRectF(10, 10, sceneWidth, sceneHeight);
  286. QPixmap pixmap(QSize(sceneWidth + 20, sceneHeight + 20));
  287. pixmap.fill(QColor(244, 244, 255));
  288. QPainter painter(&pixmap);
  289. painter.setRenderHints(QPainter::Antialiasing);
  290. m->scene()->render(&painter, targetRect, sourceRect);
  291. delete m;
  292. QString imgName = QString("%1_%2_index").arg(m_proj->id).arg(2);
  293. QString path = saveImage(imgName, pixmap);
  294. QImageWriter writer(path);
  295. writer.setFormat("PNG");
  296. ret = writer.write(pixmap.toImage());
  297. if (ret) {
  298. QAxObject *bmWeightPic = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmTechPic");
  299. if (bmWeightPic != nullptr) {
  300. bmWeightPic->dynamicCall("Select(void)");
  301. QAxObject *range = bmWeightPic->querySubObject("Range");
  302. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  303. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", path);
  304. if (shape != nullptr) {
  305. int w = pixmap.width();
  306. int h = pixmap.height();
  307. if (w > 400) {
  308. h = h * 400 / w;
  309. w = 400;
  310. }
  311. shape->setProperty("Width", w);
  312. shape->setProperty("Height", h);
  313. }
  314. }
  315. }
  316. }
  317. void ExportReportManager::insertDemandWeight()
  318. {
  319. // 指标权重表:bmWeightTable,指标权重图:bmWeightPic
  320. QList<CNodeData> nodeList;
  321. bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 1);
  322. if (ret == false) {
  323. return;
  324. }
  325. CMind *mind = new CMind();
  326. mind->setNodeList(nodeList);
  327. QList<CNodeData> leaveNodes = mind->leaves();
  328. int rowCount = leaveNodes.size() + 1;
  329. int columnCount = mind->levels();
  330. // bmIndexTable
  331. QAxObject *table = insertTable("bmWeightTable", rowCount, columnCount);
  332. if (table == nullptr) {
  333. delete mind;
  334. return;
  335. }
  336. for (int i = 2; i <= mind->levels(); ++i) {
  337. if (i < mind->levels()) {
  338. setCellString(table, 1, i - 1, QString("%1级指标").arg(i - 1));
  339. } else {
  340. setCellString(table, 1, i - 1, QString("指标"));
  341. setCellString(table, 1, i, QString("权重值"));
  342. }
  343. QList<CNodeData> nodes = mind->nodesInLevel(i);
  344. int rowPos = 2;
  345. for (int j = 0; j < nodes.size(); ++j) {
  346. CNodeData node = nodes[j];
  347. int leaves = mind->leavesCountOfNode(node);
  348. int textPos = (rowPos + leaves / 2);
  349. setCellString(table, textPos, i - 1, node.name);
  350. if (leaves > 1) {
  351. mergeCells(table, rowPos, i - 1, leaves, 1);
  352. }
  353. rowPos += leaves;
  354. }
  355. }
  356. delete mind;
  357. MindWeightInfo info;
  358. ret = MindWeightService().queryWeightData(&info, m_proj->id, 1);
  359. if (ret == false) {
  360. return;
  361. }
  362. if (info.id < 0) {
  363. return;
  364. }
  365. QMap<QString, double> weightData;
  366. QStringList weightList = info.weight.split(";");
  367. for (QString keyValueStr : weightList) {
  368. QStringList keyValue = keyValueStr.split(":");
  369. if (keyValue.size() == 2) {
  370. weightData[keyValue.first()] = keyValue.last().toDouble();
  371. }
  372. }
  373. QVector<PlotView::Data> values;
  374. for (int i = 0; i < leaveNodes.size(); ++i) {
  375. CNodeData node = leaveNodes[i];
  376. QString value = QString("%1").arg(weightData[node.name]);
  377. setCellString(table, i + 2, columnCount, value);
  378. PlotView::Data data { node.name, weightData[node.name] };
  379. values.append(data);
  380. }
  381. PlotView *plot = new PlotView(PlotView::HistogramHorizontal, values, "");
  382. plot->setFixedSize(QSize(600, 600));
  383. plot->plot();
  384. QPixmap pixmap = plot->grab();
  385. plot->deleteLater();
  386. if (pixmap.isNull()) {
  387. return;
  388. }
  389. QString imgName = QString("%1_%2_weight_plot").arg(m_proj->id).arg(1);
  390. QString path = saveImage(imgName, pixmap);
  391. QAxObject *bmWeightPic = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmWeightPic");
  392. if (bmWeightPic != nullptr) {
  393. bmWeightPic->dynamicCall("Select(void)");
  394. QAxObject *range = bmWeightPic->querySubObject("Range");
  395. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  396. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", path);
  397. if (shape != nullptr) {
  398. shape->setProperty("Width", 400);
  399. shape->setProperty("Height", 400);
  400. }
  401. }
  402. }
  403. void ExportReportManager::insertDemandEval()
  404. {
  405. MindScoreInfo info;
  406. bool ret = MindScoreService().queryScoreData(&info, m_proj->id);
  407. if (ret == false || info.id < 0) {
  408. return;
  409. }
  410. QMap<QString, QString> scoreData;
  411. QStringList keyValueStringList = info.score.split(";");
  412. for (QString keyValueString : keyValueStringList) {
  413. QStringList keyValue = keyValueString.split(":");
  414. if (keyValue.size() == 2) {
  415. scoreData[keyValue.first()] = keyValue.last();
  416. }
  417. }
  418. QList<CNodeData> nodeList;
  419. ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 2);
  420. if (ret == false) {
  421. return;
  422. }
  423. CMind *mind = new CMind();
  424. mind->setNodeList(nodeList);
  425. QList<CNodeData> leaveNodes = mind->leaves();
  426. int rowCount = leaveNodes.size() + 1;
  427. int columnCount = mind->levels();
  428. // bmEvalTable
  429. QAxObject *table = insertTable("bmEvalTable", rowCount, columnCount);
  430. if (table == nullptr) {
  431. delete mind;
  432. return;
  433. }
  434. for (int i = 2; i <= mind->levels(); ++i) {
  435. if (i < mind->levels()) {
  436. setCellString(table, 1, i - 1, QString("%1级指标").arg(i - 1));
  437. } else {
  438. setCellString(table, 1, i - 1, QString("指标"));
  439. setCellString(table, 1, i, QString("重要度"));
  440. }
  441. QList<CNodeData> nodes = mind->nodesInLevel(i);
  442. int rowPos = 2;
  443. for (int j = 0; j < nodes.size(); ++j) {
  444. CNodeData node = nodes[j];
  445. int leaves = mind->leavesCountOfNode(node);
  446. int textPos = (rowPos + leaves / 2);
  447. setCellString(table, textPos, i - 1, node.name);
  448. if (leaves > 1) {
  449. mergeCells(table, rowPos, i - 1, leaves, 1);
  450. }
  451. rowPos += leaves;
  452. }
  453. }
  454. delete mind;
  455. QVector<PlotView::Data> values;
  456. for (int i = 0; i < leaveNodes.size(); ++i) {
  457. CNodeData node = leaveNodes[i];
  458. QString value = scoreData[node.name];
  459. setCellString(table, i + 2, columnCount, value);
  460. PlotView::Data data { node.name, value.toDouble() };
  461. values.append(data);
  462. }
  463. PlotView *plot = new PlotView(PlotView::HistogramHorizontal, values, "");
  464. plot->setFixedSize(QSize(600, 600));
  465. plot->plot();
  466. QPixmap pixmap = plot->grab();
  467. plot->deleteLater();
  468. if (pixmap.isNull()) {
  469. return;
  470. }
  471. QString imgName = QString("%1_%2_priority_plot").arg(m_proj->id).arg(1);
  472. QString path = saveImage(imgName, pixmap);
  473. QAxObject *bmWeightPic = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmEvalPic");
  474. if (bmWeightPic != nullptr) {
  475. bmWeightPic->dynamicCall("Select(void)");
  476. QAxObject *range = bmWeightPic->querySubObject("Range");
  477. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  478. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", path);
  479. if (shape != nullptr) {
  480. shape->setProperty("Width", 400);
  481. shape->setProperty("Height", 400);
  482. }
  483. }
  484. QString viTech;
  485. double score = 0;
  486. for (QString key : scoreData.keys()) {
  487. if (scoreData[key].toDouble() > score) {
  488. score = scoreData[key].toDouble();
  489. viTech = key;
  490. }
  491. }
  492. insertText("bmVITech1", viTech);
  493. insertText("bmVITech2", viTech);
  494. }
  495. void ExportReportManager::insertSchemeDesignInfo()
  496. {
  497. QList<SchemaEval *> schemeList;
  498. bool ret = SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, 0);
  499. if (ret == false) {
  500. qDebug() << __FUNCTION__ << __LINE__ << "query" << endl;
  501. return;
  502. }
  503. for (int i = schemeList.size() - 1; i >= 0; --i) {
  504. // 插入图片
  505. QAxObject *bmSchemes = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmSchemes");
  506. if (bmSchemes != nullptr) {
  507. bmSchemes->dynamicCall("Select(void)");
  508. QAxObject *range = bmSchemes->querySubObject("Range");
  509. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  510. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", schemeList[i]->filePath);
  511. if (shape != nullptr) {
  512. shape->setProperty("Width", 200);
  513. shape->setProperty("Height", 200);
  514. }
  515. }
  516. m_word->insertMoveDown();
  517. // 插入图片标题
  518. QString remark = schemeList[i]->remark;
  519. int picTtlIndex = remark.lastIndexOf("(图");
  520. QString subStr = remark.mid(picTtlIndex + 1, 8);
  521. QString picTtl = "";
  522. if (subStr.contains(")")) {
  523. picTtl = subStr.split(")").first();
  524. }
  525. m_word->setFontName(QString::fromLocal8Bit("黑体"));
  526. m_word->setFontSize(9);
  527. m_word->setParagraphAlignment(0);
  528. m_word->insertText(picTtl + " " + "阵地位置图");
  529. m_word->insertMoveDown();
  530. // 插入方案描述
  531. insertText("bmSchemes", schemeList[i]->name + ":" + schemeList[i]->remark);
  532. if (i != 0) {
  533. m_word->insertMoveDown();
  534. }
  535. }
  536. }
  537. void ExportReportManager::insertSchemeIndex()
  538. {
  539. insertText("bmProjName31", m_proj->projectName);
  540. insertText("bmProjName32", m_proj->projectName);
  541. QList<CNodeData> nodeList;
  542. bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 4);
  543. if (ret == false) {
  544. return;
  545. }
  546. CMind *mind = new CMind();
  547. mind->setNodeList(nodeList);
  548. QList<CNodeData> leaveNodes = mind->leaves();
  549. int rowCount = leaveNodes.size() + 1;
  550. int columnCount = mind->levels();
  551. // bmIndexTable
  552. QAxObject *table = insertTable("bmIndexTable", rowCount, columnCount);
  553. if (table == nullptr) {
  554. delete mind;
  555. return;
  556. }
  557. for (int i = 2; i <= mind->levels(); ++i) {
  558. if (i < mind->levels()) {
  559. setCellString(table, 1, i - 1, QString("%1级指标\n(能力项)").arg(i - 1));
  560. } else {
  561. setCellString(table, 1, i - 1, QString("指标"));
  562. setCellString(table, 1, i, QString("量纲"));
  563. }
  564. QList<CNodeData> nodes = mind->nodesInLevel(i);
  565. int rowPos = 2;
  566. for (int j = 0; j < nodes.size(); ++j) {
  567. CNodeData node = nodes[j];
  568. int leaves = mind->leavesCountOfNode(node);
  569. int textPos = (rowPos + leaves / 2);
  570. setCellString(table, textPos, i - 1, node.name);
  571. if (leaves > 1) {
  572. mergeCells(table, rowPos, i - 1, leaves, 1);
  573. }
  574. rowPos += leaves;
  575. }
  576. }
  577. for (int i = 0; i < leaveNodes.size(); ++i) {
  578. CNodeData node = leaveNodes[i];
  579. setCellString(table, i + 2, columnCount, node.dimension);
  580. }
  581. delete mind;
  582. CMindView *m = new CMindView();
  583. m->setNodeList(nodeList);
  584. m->refreshItems();
  585. int sceneWidth = m->sceneRect().width();
  586. int sceneHeight = m->sceneRect().height();
  587. QRectF sourceRect = QRectF(0, 0, sceneWidth, sceneHeight);
  588. QRectF targetRect = QRectF(10, 10, sceneWidth, sceneHeight);
  589. QPixmap pixmap(QSize(sceneWidth + 20, sceneHeight + 20));
  590. pixmap.fill(QColor(244, 244, 255));
  591. QPainter painter(&pixmap);
  592. painter.setRenderHints(QPainter::Antialiasing);
  593. m->scene()->render(&painter, targetRect, sourceRect);
  594. delete m;
  595. QString imgName = QString("%1_%2_index").arg(m_proj->id).arg(4);
  596. QString path = saveImage(imgName, pixmap);
  597. QImageWriter writer(path);
  598. writer.setFormat("PNG");
  599. ret = writer.write(pixmap.toImage());
  600. if (ret) {
  601. QAxObject *bmWeightPic = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmIndexPic");
  602. if (bmWeightPic != nullptr) {
  603. bmWeightPic->dynamicCall("Select(void)");
  604. QAxObject *range = bmWeightPic->querySubObject("Range");
  605. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  606. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", path);
  607. if (shape != nullptr) {
  608. int w = pixmap.width();
  609. int h = pixmap.height();
  610. if (w > 400) {
  611. h = h * 400 / w;
  612. w = 400;
  613. }
  614. shape->setProperty("Width", w);
  615. shape->setProperty("Height", h);
  616. }
  617. }
  618. }
  619. }
  620. void ExportReportManager::insertSchemeData()
  621. {
  622. insertText("bmProjName41", m_proj->projectName);
  623. QList<CNodeData> nodeList;
  624. bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 4);
  625. if (ret == false) {
  626. return;
  627. }
  628. CMind *mind = new CMind();
  629. mind->setNodeList(nodeList);
  630. QMap<int, QMap<QString, double>> schemeData;
  631. QMap<int, QString> schemeNames;
  632. QList<SchemaEval *> schemeList;
  633. ret = SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, m_schemeType);
  634. if (ret == false || schemeList.size() <= 0) {
  635. delete mind;
  636. return;
  637. }
  638. for (SchemaEval *scheme : schemeList) {
  639. if (schemeData.keys().contains(scheme->id) == false) {
  640. schemeData[scheme->id] = QMap<QString, double>();
  641. }
  642. QStringList keyValueStringList = scheme->valueStr.split(";");
  643. for (QString keyValueStr : keyValueStringList) {
  644. QStringList keyValue = keyValueStr.split(":");
  645. if (keyValue.size() == 2) {
  646. schemeData[scheme->id][keyValue.first()] = keyValue.last().toDouble();
  647. }
  648. }
  649. schemeNames[scheme->id] = scheme->name;
  650. }
  651. QList<CNodeData> leaveNodes = mind->leaves();
  652. int rowCount = leaveNodes.size() + 1;
  653. int columnCount = schemeNames.keys().size() + 1;
  654. delete mind;
  655. // bmSchemeDataTable
  656. QAxObject *table = insertTable("bmSchemeDataTable", rowCount, columnCount);
  657. if (table == nullptr) {
  658. return;
  659. }
  660. QList<int> schemeIds = schemeNames.keys();
  661. for (int i = 0; i < schemeIds.size() + 1; ++i) {
  662. if (i == 0) {
  663. setCellString(table, 1, i + 1, "指标");
  664. } else {
  665. setCellString(table, 1, i + 1, schemeNames[schemeIds[i - 1]]);
  666. }
  667. }
  668. for (int i = 0; i < leaveNodes.size(); ++i) {
  669. CNodeData node = leaveNodes[i];
  670. setCellString(table, i + 2, 1, node.name);
  671. for (int j = 0; j < schemeIds.size(); ++j) {
  672. QString value = QString("%1").arg(schemeData[schemeIds[j]][node.name]);
  673. setCellString(table, i + 2, j + 2, value);
  674. }
  675. }
  676. // 指标权重表:bmEvalTable,指标权重图:bmEvalPic
  677. QAxObject *scoreTable = insertTable("bmEvalTable", schemeList.size() + 1, 2);
  678. if (scoreTable == nullptr) {
  679. return;
  680. }
  681. QVector<PlotView::Data> values;
  682. setCellString(scoreTable, 1, 2, "得分");
  683. for (int i = 0; i < schemeList.size(); ++i) {
  684. setCellString(scoreTable, i + 2, 1, schemeList[i]->name);
  685. QString str = QString::number(schemeList[i]->score, 'f', 2);
  686. setCellString(scoreTable, i + 2, 2, str);
  687. PlotView::Data data { schemeList[i]->name, schemeList[i]->score };
  688. values.append(data);
  689. }
  690. PlotView *plot = new PlotView(PlotView::HistogramHorizontal, values, "");
  691. plot->setFixedSize(QSize(600, 600));
  692. plot->plot();
  693. QPixmap pixmap = plot->grab();
  694. plot->deleteLater();
  695. if (pixmap.isNull()) {
  696. return;
  697. }
  698. QString imgName = QString("%1_%2_eval").arg(m_proj->id).arg(4);
  699. QString path = saveImage(imgName, pixmap);
  700. QAxObject *bmWeightPic = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmEvalPic");
  701. if (bmWeightPic != nullptr) {
  702. bmWeightPic->dynamicCall("Select(void)");
  703. QAxObject *range = bmWeightPic->querySubObject("Range");
  704. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  705. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", path);
  706. if (shape != nullptr) {
  707. shape->setProperty("Width", 400);
  708. shape->setProperty("Height", 400);
  709. }
  710. }
  711. // bmSchemeConclusion
  712. QString scores;
  713. int bestIndex = 0;
  714. for (int i = 0; i < schemeList.size(); ++i) {
  715. QString str = QString::number(schemeList[i]->score, 'f', 2);
  716. scores += QString("%1%2,").arg(schemeList[i]->name).arg(str);
  717. if (schemeList[i]->score > schemeList[bestIndex]->score) {
  718. bestIndex = i;
  719. }
  720. }
  721. QString conclusion = QString("经评估分析,%1个方案得分分别为:%2%3为最优方案。")
  722. .arg(schemeList.size())
  723. .arg(scores)
  724. .arg(schemeList[bestIndex]->name);
  725. insertText("bmSchemeConclusion", conclusion);
  726. }
  727. void ExportReportManager::insertSchemeAlgInfo()
  728. {
  729. // bmWeightAlg bmEvalAlg
  730. // bmWeightAlgDscpt bmEvalAlgDscpt
  731. QList<SchemePlanManager::SchemeProcessInfo> processList;
  732. bool processRet = SchemeProcessService().QueryAllByProjectIdAndIndexType(processList, m_proj->id, 4);
  733. if (processRet == false) {
  734. return;
  735. }
  736. for (int i = 0; i < processList.size(); ++i) {
  737. if (processList[i].type == SchemePlanManager::CalculateWeight) {
  738. SchemePlanManager::Algorithm alg = processList[i].algorithm;
  739. QString algStr = SchemePlanManager::nameOfAlgorithm(alg);
  740. insertText("bmWeightAlg", algStr);
  741. QString dscrpt = SchemePlanManager::descriptionOfAlgorithm(alg);
  742. insertText("bmWeightAlgDscpt", dscrpt);
  743. }
  744. if (processList[i].type == SchemePlanManager::RunEvaluate) {
  745. SchemePlanManager::Algorithm alg = processList[i].algorithm;
  746. QString algStr = SchemePlanManager::nameOfAlgorithm(alg);
  747. insertText("bmEvalAlg", algStr);
  748. QString dscrpt = SchemePlanManager::descriptionOfAlgorithm(alg);
  749. insertText("bmEvalAlgDscpt", dscrpt);
  750. }
  751. }
  752. }
  753. void ExportReportManager::insertSchemeWeightData()
  754. {
  755. // 指标权重表:bmWeightTable,指标权重图:bmWeightPic
  756. QList<CNodeData> nodeList;
  757. bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 4);
  758. if (ret == false) {
  759. return;
  760. }
  761. CMind *mind = new CMind();
  762. mind->setNodeList(nodeList);
  763. QList<CNodeData> leaveNodes = mind->leaves();
  764. int rowCount = leaveNodes.size() + 1;
  765. int columnCount = mind->levels();
  766. // bmIndexTable
  767. QAxObject *table = insertTable("bmWeightTable", rowCount, columnCount);
  768. if (table == nullptr) {
  769. delete mind;
  770. return;
  771. }
  772. for (int i = 2; i <= mind->levels(); ++i) {
  773. if (i < mind->levels()) {
  774. setCellString(table, 1, i - 1, QString("%1级指标\n(能力项)").arg(i - 1));
  775. } else {
  776. setCellString(table, 1, i - 1, QString("指标"));
  777. setCellString(table, 1, i, QString("权重值"));
  778. }
  779. QList<CNodeData> nodes = mind->nodesInLevel(i);
  780. int rowPos = 2;
  781. for (int j = 0; j < nodes.size(); ++j) {
  782. CNodeData node = nodes[j];
  783. int leaves = mind->leavesCountOfNode(node);
  784. int textPos = (rowPos + leaves / 2);
  785. setCellString(table, textPos, i - 1, node.name);
  786. if (leaves > 1) {
  787. mergeCells(table, rowPos, i - 1, leaves, 1);
  788. }
  789. rowPos += leaves;
  790. }
  791. }
  792. delete mind;
  793. MindWeightInfo info;
  794. ret = MindWeightService().queryWeightData(&info, m_proj->id, 4);
  795. if (ret == false) {
  796. return;
  797. }
  798. if (info.id < 0) {
  799. return;
  800. }
  801. QMap<QString, double> weightData;
  802. QStringList weightList = info.weight.split(";");
  803. for (QString keyValueStr : weightList) {
  804. QStringList keyValue = keyValueStr.split(":");
  805. if (keyValue.size() == 2) {
  806. weightData[keyValue.first()] = keyValue.last().toDouble();
  807. }
  808. }
  809. QVector<PlotView::Data> values;
  810. for (int i = 0; i < leaveNodes.size(); ++i) {
  811. CNodeData node = leaveNodes[i];
  812. QString value = QString("%1").arg(weightData[node.name]);
  813. setCellString(table, i + 2, columnCount, value);
  814. PlotView::Data data { node.name, weightData[node.name] };
  815. values.append(data);
  816. }
  817. PlotView *plot = new PlotView(PlotView::HistogramHorizontal, values, "");
  818. plot->setFixedSize(QSize(600, 600));
  819. plot->plot();
  820. QPixmap pixmap = plot->grab();
  821. plot->deleteLater();
  822. if (pixmap.isNull()) {
  823. return;
  824. }
  825. QString imgName = QString("%1_%2_weight_plot").arg(m_proj->id).arg(4);
  826. QString path = saveImage(imgName, pixmap);
  827. QAxObject *bmWeightPic = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmWeightPic");
  828. if (bmWeightPic != nullptr) {
  829. bmWeightPic->dynamicCall("Select(void)");
  830. QAxObject *range = bmWeightPic->querySubObject("Range");
  831. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  832. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", path);
  833. if (shape != nullptr) {
  834. shape->setProperty("Width", 400);
  835. shape->setProperty("Height", 400);
  836. }
  837. }
  838. }
  839. void ExportReportManager::insertEffiIndex()
  840. {
  841. insertText("bmProjName21", m_proj->projectName);
  842. insertText("bmProjName22", m_proj->projectName);
  843. QList<CNodeData> nodeList;
  844. bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 8);
  845. if (ret == false) {
  846. return;
  847. }
  848. CMind *mind = new CMind();
  849. mind->setNodeList(nodeList);
  850. QList<CNodeData> leaveNodes = mind->leaves();
  851. int rowCount = leaveNodes.size() + 1;
  852. int columnCount = mind->levels();
  853. // bmIndexTable
  854. QAxObject *table = insertTable("bmIndexTable", rowCount, columnCount);
  855. if (table == nullptr) {
  856. delete mind;
  857. return;
  858. }
  859. for (int i = 2; i <= mind->levels(); ++i) {
  860. if (i < mind->levels()) {
  861. setCellString(table, 1, i - 1, QString("%1级指标\n(能力项)").arg(i - 1));
  862. } else {
  863. setCellString(table, 1, i - 1, QString("指标"));
  864. setCellString(table, 1, i, QString("量纲"));
  865. }
  866. QList<CNodeData> nodes = mind->nodesInLevel(i);
  867. int rowPos = 2;
  868. for (int j = 0; j < nodes.size(); ++j) {
  869. CNodeData node = nodes[j];
  870. int leaves = mind->leavesCountOfNode(node);
  871. int textPos = (rowPos + leaves / 2);
  872. setCellString(table, textPos, i - 1, node.name);
  873. if (leaves > 1) {
  874. mergeCells(table, rowPos, i - 1, leaves, 1);
  875. }
  876. rowPos += leaves;
  877. }
  878. }
  879. for (int i = 0; i < leaveNodes.size(); ++i) {
  880. CNodeData node = leaveNodes[i];
  881. setCellString(table, i + 2, columnCount, node.dimension);
  882. }
  883. delete mind;
  884. CMindView *m = new CMindView();
  885. m->setNodeList(nodeList);
  886. m->refreshItems();
  887. int sceneWidth = m->sceneRect().width();
  888. int sceneHeight = m->sceneRect().height();
  889. QRectF sourceRect = QRectF(0, 0, sceneWidth, sceneHeight);
  890. QRectF targetRect = QRectF(10, 10, sceneWidth, sceneHeight);
  891. QPixmap pixmap(QSize(sceneWidth + 20, sceneHeight + 20));
  892. pixmap.fill(QColor(244, 244, 255));
  893. QPainter painter(&pixmap);
  894. painter.setRenderHints(QPainter::Antialiasing);
  895. m->scene()->render(&painter, targetRect, sourceRect);
  896. delete m;
  897. QString imgName = QString("%1_%2_index").arg(m_proj->id).arg(8);
  898. QString path = saveImage(imgName, pixmap);
  899. QImageWriter writer(path);
  900. writer.setFormat("PNG");
  901. ret = writer.write(pixmap.toImage());
  902. if (ret) {
  903. QAxObject *bmWeightPic = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmIndexPic");
  904. if (bmWeightPic != nullptr) {
  905. bmWeightPic->dynamicCall("Select(void)");
  906. QAxObject *range = bmWeightPic->querySubObject("Range");
  907. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  908. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", path);
  909. if (shape != nullptr) {
  910. int w = pixmap.width();
  911. int h = pixmap.height();
  912. if (w > 400) {
  913. h = h * 400 / w;
  914. w = 400;
  915. }
  916. shape->setProperty("Width", w);
  917. shape->setProperty("Height", h);
  918. }
  919. }
  920. }
  921. }
  922. void ExportReportManager::insertEffiAlgInfo()
  923. {
  924. // bmWeightAlg bmEvalAlg
  925. // bmWeightAlgDscpt bmEvalAlgDscpt
  926. QList<SchemePlanManager::SchemeProcessInfo> processList;
  927. bool processRet = SchemeProcessService().QueryAllByProjectIdAndIndexType(processList, m_proj->id, 8);
  928. if (processRet == false) {
  929. return;
  930. }
  931. for (int i = 0; i < processList.size(); ++i) {
  932. if (processList[i].type == SchemePlanManager::CalculateWeight) {
  933. SchemePlanManager::Algorithm alg = processList[i].algorithm;
  934. QString algStr = SchemePlanManager::nameOfAlgorithm(alg);
  935. insertText("bmWeightAlg", algStr);
  936. QString dscrpt = SchemePlanManager::descriptionOfAlgorithm(alg);
  937. insertText("bmWeightAlgDscpt", dscrpt);
  938. }
  939. if (processList[i].type == SchemePlanManager::RunEvaluate) {
  940. SchemePlanManager::Algorithm alg = processList[i].algorithm;
  941. if (alg == SchemePlanManager::MEA) {
  942. m_schemeType = 1;
  943. } else {
  944. m_schemeType = 2;
  945. }
  946. QString algStr = SchemePlanManager::nameOfAlgorithm(alg);
  947. insertText("bmEvalAlg", algStr);
  948. QString dscrpt = SchemePlanManager::descriptionOfAlgorithm(alg);
  949. insertText("bmEvalAlgDscpt", dscrpt);
  950. }
  951. }
  952. }
  953. void ExportReportManager::insertEffiConfigData()
  954. {
  955. // bmProjName31, bmProjName32, bmConfigTable
  956. insertText("bmProjName31", m_proj->projectName);
  957. insertText("bmProjName32", m_proj->projectName);
  958. QList<GradeInfo *> gradeInfoList;
  959. int type = m_schemeType == 1 ? 0 : 1;
  960. bool ret = GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, m_proj->id, type);
  961. if (ret == false || gradeInfoList.size() <= 0) {
  962. return;
  963. }
  964. QStringList gradeNames;
  965. for (int i = 0; i < gradeInfoList.size(); ++i) {
  966. gradeNames.append(gradeInfoList[i]->gradeValue);
  967. }
  968. QMap<QString, QString> gradeInfoData;
  969. if (m_schemeType == 1) {
  970. QList<GradeIndexInfo *> gradeIndexInfoList;
  971. ret = GradeIndexInfoService().QueryGradeIndexInfoByProjectId(&gradeIndexInfoList, m_proj->id);
  972. if (ret == false || gradeIndexInfoList.size() <= 0) {
  973. return;
  974. }
  975. for (int i = gradeIndexInfoList.size() - 1; i >= 0; --i) {
  976. QString name = gradeIndexInfoList[i]->gradeIndexName;
  977. QString value = gradeInfoData[name];
  978. if (gradeNames.size() > gradeIndexInfoList[i]->gradeLevel - 1) {
  979. QString grade = gradeNames[gradeIndexInfoList[i]->gradeLevel - 1];
  980. if (value.contains(grade)) {
  981. continue;
  982. } else {
  983. value += grade;
  984. }
  985. } else {
  986. continue;
  987. }
  988. value += ":";
  989. value += gradeIndexInfoList[i]->gradeIndexValue;
  990. if (gradeIndexInfoList[i]->gradeLevel > 1) {
  991. value += "\n";
  992. }
  993. gradeInfoData[name] = value;
  994. }
  995. } else {
  996. QList<EffectIndexInfo *> effectIndexInfoList;
  997. ret = EffectIndexInfoService().QueryEffectIndexInfoByProjectId(&effectIndexInfoList, m_proj->id);
  998. if (ret == false) {
  999. return;
  1000. }
  1001. for (EffectIndexInfo *info : effectIndexInfoList) {
  1002. QStringList valueList = info->effectIndexValue.split(",");
  1003. QString value;
  1004. for (int i = valueList.size() - 1; i >= 0; --i) {
  1005. if (gradeNames.size() > i) {
  1006. value += gradeNames[i];
  1007. }
  1008. value += ":";
  1009. value += (valueList[i].replace(":", ","));
  1010. if (i > 0) {
  1011. value += "\n";
  1012. }
  1013. gradeInfoData[info->effectIndexName] = value;
  1014. }
  1015. }
  1016. }
  1017. QList<CNodeData> nodeList;
  1018. ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 8);
  1019. if (ret == false) {
  1020. return;
  1021. }
  1022. CMind *mind = new CMind();
  1023. mind->setNodeList(nodeList);
  1024. QList<CNodeData> leaveNodes = mind->leaves();
  1025. int rowCount = leaveNodes.size() + 1;
  1026. int columnCount = mind->levels();
  1027. // bmConfigTable
  1028. QAxObject *table = insertTable("bmConfigTable", rowCount, columnCount);
  1029. if (table == nullptr) {
  1030. delete mind;
  1031. return;
  1032. }
  1033. for (int i = 2; i <= mind->levels(); ++i) {
  1034. if (i < mind->levels()) {
  1035. setCellString(table, 1, i - 1, QString("%1级指标\n(能力项)").arg(i - 1));
  1036. } else {
  1037. setCellString(table, 1, i - 1, QString("指标"));
  1038. setCellString(table, 1, i, QString("效能分级"));
  1039. }
  1040. QList<CNodeData> nodes = mind->nodesInLevel(i);
  1041. int rowPos = 2;
  1042. for (int j = 0; j < nodes.size(); ++j) {
  1043. CNodeData node = nodes[j];
  1044. int leaves = mind->leavesCountOfNode(node);
  1045. int textPos = (rowPos + leaves / 2);
  1046. setCellString(table, textPos, i - 1, node.name);
  1047. if (leaves > 1) {
  1048. mergeCells(table, rowPos, i - 1, leaves, 1);
  1049. }
  1050. rowPos += leaves;
  1051. }
  1052. }
  1053. for (int i = 0; i < leaveNodes.size(); ++i) {
  1054. CNodeData node = leaveNodes[i];
  1055. QString value = QString("%1").arg(gradeInfoData[node.name]);
  1056. setCellString(table, i + 2, columnCount, value);
  1057. }
  1058. delete mind;
  1059. }
  1060. void ExportReportManager::insertEffiSchemeData()
  1061. {
  1062. QList<CNodeData> nodeList;
  1063. bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 8);
  1064. if (ret == false) {
  1065. return;
  1066. }
  1067. CMind *mind = new CMind();
  1068. mind->setNodeList(nodeList);
  1069. QMap<int, QMap<QString, double>> schemeData;
  1070. QMap<int, QString> schemeNames;
  1071. QList<SchemaEval *> schemeList;
  1072. ret = SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, m_schemeType);
  1073. if (ret == false || schemeList.size() <= 0) {
  1074. delete mind;
  1075. return;
  1076. }
  1077. for (SchemaEval *scheme : schemeList) {
  1078. if (m_schemeType == 2 && scheme->name != "建设前" && scheme->name != "建设后") {
  1079. continue;
  1080. }
  1081. if (schemeData.keys().contains(scheme->id) == false) {
  1082. schemeData[scheme->id] = QMap<QString, double>();
  1083. }
  1084. QStringList keyValueStringList = scheme->valueStr.split(";");
  1085. for (QString keyValueStr : keyValueStringList) {
  1086. QStringList keyValue = keyValueStr.split(":");
  1087. if (keyValue.size() == 2) {
  1088. schemeData[scheme->id][keyValue.first()] = keyValue.last().toDouble();
  1089. }
  1090. }
  1091. schemeNames[scheme->id] = scheme->name;
  1092. }
  1093. QList<CNodeData> leaveNodes = mind->leaves();
  1094. int rowCount = leaveNodes.size() + 1;
  1095. int columnCount = schemeNames.keys().size() + 1;
  1096. delete mind;
  1097. // bmSchemeDataTable
  1098. QAxObject *table = insertTable("bmEffiDataTable", rowCount, columnCount);
  1099. if (table == nullptr) {
  1100. return;
  1101. }
  1102. QList<int> schemeIds = schemeNames.keys();
  1103. for (int i = 0; i < schemeIds.size() + 1; ++i) {
  1104. if (i == 0) {
  1105. setCellString(table, 1, i + 1, "指标");
  1106. } else {
  1107. setCellString(table, 1, i + 1, schemeNames[schemeIds[i - 1]]);
  1108. }
  1109. }
  1110. for (int i = 0; i < leaveNodes.size(); ++i) {
  1111. CNodeData node = leaveNodes[i];
  1112. setCellString(table, i + 2, 1, node.name);
  1113. for (int j = 0; j < schemeIds.size(); ++j) {
  1114. QString value = QString("%1").arg(schemeData[schemeIds[j]][node.name]);
  1115. setCellString(table, i + 2, j + 2, value);
  1116. }
  1117. }
  1118. }
  1119. void ExportReportManager::insertEffiWeightData()
  1120. {
  1121. // 指标权重表:bmWeightTable,指标权重图:bmWeightPic
  1122. QList<CNodeData> nodeList;
  1123. bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 8);
  1124. if (ret == false) {
  1125. return;
  1126. }
  1127. CMind *mind = new CMind();
  1128. mind->setNodeList(nodeList);
  1129. QList<CNodeData> leaveNodes = mind->leaves();
  1130. int rowCount = leaveNodes.size() + 1;
  1131. int columnCount = mind->levels();
  1132. // bmIndexTable
  1133. QAxObject *table = insertTable("bmWeightTable", rowCount, columnCount);
  1134. if (table == nullptr) {
  1135. delete mind;
  1136. return;
  1137. }
  1138. for (int i = 2; i <= mind->levels(); ++i) {
  1139. if (i < mind->levels()) {
  1140. setCellString(table, 1, i - 1, QString("%1级指标\n(能力项)").arg(i - 1));
  1141. } else {
  1142. setCellString(table, 1, i - 1, QString("指标"));
  1143. setCellString(table, 1, i, QString("权重值"));
  1144. }
  1145. QList<CNodeData> nodes = mind->nodesInLevel(i);
  1146. int rowPos = 2;
  1147. for (int j = 0; j < nodes.size(); ++j) {
  1148. CNodeData node = nodes[j];
  1149. int leaves = mind->leavesCountOfNode(node);
  1150. int textPos = (rowPos + leaves / 2);
  1151. setCellString(table, textPos, i - 1, node.name);
  1152. if (leaves > 1) {
  1153. mergeCells(table, rowPos, i - 1, leaves, 1);
  1154. }
  1155. rowPos += leaves;
  1156. }
  1157. }
  1158. delete mind;
  1159. MindWeightInfo info;
  1160. ret = MindWeightService().queryWeightData(&info, m_proj->id, 8);
  1161. if (ret == false) {
  1162. return;
  1163. }
  1164. if (info.id < 0) {
  1165. return;
  1166. }
  1167. QMap<QString, double> weightData;
  1168. QStringList weightList = info.weight.split(";");
  1169. for (QString keyValueStr : weightList) {
  1170. QStringList keyValue = keyValueStr.split(":");
  1171. if (keyValue.size() == 2) {
  1172. weightData[keyValue.first()] = keyValue.last().toDouble();
  1173. }
  1174. }
  1175. QVector<PlotView::Data> values;
  1176. for (int i = 0; i < leaveNodes.size(); ++i) {
  1177. CNodeData node = leaveNodes[i];
  1178. QString value = QString("%1").arg(weightData[node.name]);
  1179. setCellString(table, i + 2, columnCount, value);
  1180. PlotView::Data data { node.name, weightData[node.name] };
  1181. values.append(data);
  1182. }
  1183. PlotView *plot = new PlotView(PlotView::HistogramHorizontal, values, "");
  1184. plot->setFixedSize(QSize(600, 600));
  1185. plot->plot();
  1186. QPixmap pixmap = plot->grab();
  1187. plot->deleteLater();
  1188. if (pixmap.isNull()) {
  1189. return;
  1190. }
  1191. QString imgName = QString("%1_%2_weight_plot").arg(m_proj->id).arg(8);
  1192. QString path = saveImage(imgName, pixmap);
  1193. QAxObject *bmWeightPic = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmWeightPic");
  1194. if (bmWeightPic != nullptr) {
  1195. bmWeightPic->dynamicCall("Select(void)");
  1196. QAxObject *range = bmWeightPic->querySubObject("Range");
  1197. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  1198. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", path);
  1199. if (shape != nullptr) {
  1200. shape->setProperty("Width", 400);
  1201. shape->setProperty("Height", 400);
  1202. }
  1203. }
  1204. }
  1205. void ExportReportManager::insertEffiResult()
  1206. {
  1207. QList<GradeInfo *> gradeInfoList;
  1208. int type = m_schemeType == 1 ? 0 : 1;
  1209. bool gradeRet = GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, m_proj->id, type);
  1210. if (gradeRet == false) {
  1211. return;
  1212. }
  1213. QStringList gradeNames;
  1214. for (int i = 0; i < gradeInfoList.size(); ++i) {
  1215. gradeNames.append(gradeInfoList[i]->gradeValue);
  1216. }
  1217. QList<EffectResult> effList;
  1218. bool effRet = EffectResultService().queryDataList(effList, m_proj->id);
  1219. if (effRet == false) {
  1220. return;
  1221. }
  1222. QMap<int, QMap<QString, QList<double>>> effData;
  1223. QMap<int, QString> schemeNames;
  1224. int levels = 0;
  1225. for (EffectResult effect : effList) {
  1226. if (effData.keys().contains(effect.schemeId) == false) {
  1227. effData[effect.schemeId] = QMap<QString, QList<double>>();
  1228. schemeNames[effect.schemeId] = effect.schemeName;
  1229. }
  1230. QStringList values = effect.value.split(",");
  1231. levels = values.size();
  1232. QList<double> valueList;
  1233. for (int v = 0; v < values.size(); ++v) {
  1234. valueList.append(values[v].toDouble());
  1235. }
  1236. effData[effect.schemeId][effect.indexName] = valueList;
  1237. }
  1238. QList<CNodeData> nodeList;
  1239. bool ret = CNodeDataService().QueryAllValid(nodeList, m_proj->id, 8);
  1240. if (ret == false) {
  1241. return;
  1242. }
  1243. CMind *mind = new CMind();
  1244. mind->setNodeList(nodeList);
  1245. QList<CNodeData> leaveNodes = mind->leaves();
  1246. int rowCount = leaveNodes.size() + 1;
  1247. int columnCount = mind->levels() + schemeNames.size() - 1;
  1248. // bmEvalTable
  1249. QAxObject *table = insertTable("bmEvalTable", rowCount, columnCount);
  1250. if (table == nullptr) {
  1251. delete mind;
  1252. return;
  1253. }
  1254. for (int i = 2; i <= mind->levels(); ++i) {
  1255. if (i < mind->levels()) {
  1256. setCellString(table, 1, i - 1, QString("%1级指标\n(能力项)").arg(i - 1));
  1257. } else {
  1258. setCellString(table, 1, i - 1, QString("指标"));
  1259. }
  1260. QList<CNodeData> nodes = mind->nodesInLevel(i);
  1261. int rowPos = 2;
  1262. for (int j = 0; j < nodes.size(); ++j) {
  1263. CNodeData node = nodes[j];
  1264. int leaves = mind->leavesCountOfNode(node);
  1265. int textPos = (rowPos + leaves / 2);
  1266. setCellString(table, textPos, i - 1, node.name);
  1267. if (leaves > 1) {
  1268. mergeCells(table, rowPos, i - 1, leaves, 1);
  1269. }
  1270. rowPos += leaves;
  1271. }
  1272. }
  1273. for (int i = 0; i < schemeNames.size(); ++i) {
  1274. setCellString(table, 1, i + mind->levels(),
  1275. schemeNames[schemeNames.keys()[i]] + "\n(" + gradeNames.join(",") + ")");
  1276. for (int j = 0; j < leaveNodes.size(); ++j) {
  1277. CNodeData node = leaveNodes[j];
  1278. QList<double> values = effData[schemeNames.keys()[i]][node.name];
  1279. int bestIndex = 0;
  1280. QString score;
  1281. for (int k = 0; k < values.size(); ++k) {
  1282. if (values[k] >= values[bestIndex]) {
  1283. bestIndex = k;
  1284. }
  1285. score += QString::number(values[k], 'f', 1).replace(".0", "").replace("nan", "0");
  1286. if (k < values.size() - 1) {
  1287. score += ",";
  1288. }
  1289. }
  1290. QString rand = gradeNames[bestIndex];
  1291. QString value = rand + "(" + score + ")";
  1292. setCellString(table, j + 2, i + mind->levels(), value);
  1293. }
  1294. }
  1295. // 指标权重图:bmEvalPic
  1296. for (int i = schemeNames.size() - 1; i >= 0; --i) {
  1297. QString schemeName = schemeNames[schemeNames.keys()[i]];
  1298. QList<double> values = effData[schemeNames.keys()[i]]["综合"];
  1299. QVector<PlotView::Data> plotValues;
  1300. for (int j = 0; j < values.size(); ++j) {
  1301. PlotView::Data data { schemeName + "-" + gradeNames[j], values[j] };
  1302. plotValues.append(data);
  1303. }
  1304. PlotView *plot = new PlotView(PlotView::HistogramHorizontal, plotValues, "");
  1305. plot->setFixedSize(QSize(600, 600));
  1306. plot->plot();
  1307. QPixmap pixmap = plot->grab();
  1308. plot->deleteLater();
  1309. if (pixmap.isNull()) {
  1310. return;
  1311. }
  1312. QString imgName = QString("%1_%2_%3_eval").arg(m_proj->id).arg(8).arg(schemeName);
  1313. QString path = saveImage(imgName, pixmap);
  1314. QAxObject *bmWeightPic = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", "bmEvalPic");
  1315. if (bmWeightPic != nullptr) {
  1316. bmWeightPic->dynamicCall("Select(void)");
  1317. QAxObject *range = bmWeightPic->querySubObject("Range");
  1318. QAxObject *inlineShapes = range->querySubObject("InlineShapes");
  1319. QAxObject *shape = inlineShapes->querySubObject("AddPicture(const QString&)", path);
  1320. if (shape != nullptr) {
  1321. shape->setProperty("Width", 400);
  1322. shape->setProperty("Height", 400);
  1323. }
  1324. }
  1325. }
  1326. QStringList retList;
  1327. int bestGrade = 0;
  1328. int bestSchemeIndex = 0;
  1329. for (int i = 0; i < schemeNames.size(); ++i) {
  1330. int grade = 0;
  1331. QList<double> values = effData[schemeNames.keys()[i]]["综合"];
  1332. for (int j = 0; j < values.size(); ++j) {
  1333. if (values[j] > values[grade]) {
  1334. grade = j;
  1335. }
  1336. }
  1337. QString ret = schemeNames[schemeNames.keys()[i]] + "的综合评价等级为" + gradeNames[grade];
  1338. retList.append(ret);
  1339. if (grade > bestGrade) {
  1340. bestGrade = grade;
  1341. bestSchemeIndex = i;
  1342. }
  1343. }
  1344. QString bestScheme = schemeNames[schemeNames.keys()[bestSchemeIndex]];
  1345. QString conclusion = "根据评估结果," + retList.join(",") + "。所以" + bestScheme + "更优。";
  1346. insertText("bmEffiConclusion", conclusion);
  1347. delete mind;
  1348. }
  1349. bool ExportReportManager::insertText(const QString &bookmark, const QString &text)
  1350. {
  1351. bool ret = false;
  1352. QAxObject *bmProjName = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", bookmark);
  1353. if (bmProjName != nullptr) {
  1354. bmProjName->dynamicCall("Select(void)");
  1355. QAxObject *range = bmProjName->querySubObject("Range");
  1356. ret = range->setProperty("Text", text);
  1357. }
  1358. return ret;
  1359. }
  1360. QAxObject *ExportReportManager::insertTable(QString bookmark, int row, int column)
  1361. {
  1362. QAxObject *bmTable = m_word->getDocument()->querySubObject("Bookmarks(QVariant)", bookmark);
  1363. if (bmTable) {
  1364. bmTable->dynamicCall("Select(void)");
  1365. QAxObject *selection = m_word->getWordApp()->querySubObject("Selection");
  1366. if (!selection)
  1367. return nullptr;
  1368. selection->dynamicCall("InsertAfter(QString&)", "\n");
  1369. // selection->dynamicCall("MoveLeft(int)", 1);
  1370. selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphCenter");
  1371. // selection->dynamicCall("TypeText(QString&)", "Table Test"); //设置标题
  1372. QAxObject *range = selection->querySubObject("Range");
  1373. QAxObject *tables = m_word->getDocument()->querySubObject("Tables");
  1374. QAxObject *table = tables->querySubObject("Add(QVariant,int,int)", range->asVariant(), row, column);
  1375. if (!tables)
  1376. return nullptr;
  1377. for (int i = 1; i <= 6; i++) {
  1378. QString str = QString("Borders(-%1)").arg(i);
  1379. QAxObject *borders = table->querySubObject(str.toLocal8Bit().constData());
  1380. borders->dynamicCall("SetLineStyle(int)", 1);
  1381. }
  1382. return table;
  1383. }
  1384. return nullptr;
  1385. }
  1386. void ExportReportManager::setCellString(QAxObject *table, int row, int column, const QString &text)
  1387. {
  1388. if (table == nullptr) {
  1389. return;
  1390. }
  1391. table->querySubObject("Cell(int,int)", row, column)->querySubObject("Range")->dynamicCall("SetText(QString)", text);
  1392. }
  1393. void ExportReportManager::mergeCells(QAxObject *table, int row, int column, int rowSpan, int columnSpan)
  1394. {
  1395. if (table == nullptr) {
  1396. return;
  1397. }
  1398. QAxObject *startCell = table->querySubObject("Cell(int, int)", row, column);
  1399. QAxObject *endCell = table->querySubObject("Cell(int, int)", row + rowSpan - 1, column + columnSpan - 1);
  1400. if (nullptr == startCell) {
  1401. return;
  1402. }
  1403. if (nullptr == endCell) {
  1404. return;
  1405. }
  1406. startCell->querySubObject("Merge(LPDISPATCH)", endCell->asVariant());
  1407. }
  1408. QString ExportReportManager::saveImage(const QString &name, const QPixmap &pixmap)
  1409. {
  1410. QString curPath = QDir::currentPath();
  1411. QString dateStr = QDate::currentDate().toString("yyyy-MM-dd");
  1412. QString picDir = curPath + "/report_pics/" + dateStr + "/";
  1413. QDir dir(picDir);
  1414. if (!dir.exists()) {
  1415. dir.mkpath(picDir);
  1416. }
  1417. QString filePath = picDir + name + ".png";
  1418. QImageWriter writer(filePath);
  1419. writer.setFormat("PNG");
  1420. bool ret = writer.write(pixmap.toImage());
  1421. if (ret) {
  1422. return filePath;
  1423. } else {
  1424. return "";
  1425. }
  1426. }