SchemePlanManager.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include "SchemePlanManager.h"
  2. #include "ProjectManager.h"
  3. #include <QMetaEnum>
  4. #include <QDebug>
  5. QString SchemePlanManager::stringFromDataSource(SchemePlanManager::SchemeDataSource src)
  6. {
  7. switch (src) {
  8. case NoData:
  9. return "无";
  10. case FromExpert:
  11. return "导入专家数据";
  12. case FromMeasurement:
  13. return "添加实测数据";
  14. case FromScheme:
  15. return "专家导入";
  16. }
  17. }
  18. QString SchemePlanManager::nameOfAlgorithm(SchemePlanManager::Algorithm alg)
  19. {
  20. switch (alg) {
  21. case NoAlg:
  22. return "无";
  23. case PrincipalComponents:
  24. return "主成分分析法";
  25. case Entropy:
  26. return "熵值法";
  27. case AHP:
  28. return "层次分析法";
  29. case HWM:
  30. return "层次加权法";
  31. case SPA:
  32. return "集对分析法";
  33. case MEA:
  34. return "物元分析法";
  35. case GCE:
  36. return "灰色聚类评估法";
  37. case WeightedSum:
  38. return "加权求和法";
  39. }
  40. }
  41. QString SchemePlanManager::descriptionOfAlgorithm(SchemePlanManager::Algorithm alg)
  42. {
  43. switch (alg) {
  44. case NoAlg:
  45. return "";
  46. case PrincipalComponents:
  47. return "主成分分析法";
  48. case Entropy:
  49. return "熵值法";
  50. case AHP:
  51. return "第一步,产生评价值\n决策人构造评价矩阵A。A矩阵中,若因素i与因素j的比较判断值为a(ij)"
  52. ",则因素i与因素j的比较判断值为a(ji)=1/"
  53. "a(ij)。\n第二步,本征向量法求解\n第三步,一致性检验\n第四步,方案排序";
  54. case HWM:
  55. return "层次加权法";
  56. case SPA:
  57. return "集对分析法";
  58. case MEA:
  59. return "物元分析法";
  60. case GCE:
  61. return "灰色聚类评估法";
  62. case WeightedSum:
  63. return "加权求和法";
  64. }
  65. }
  66. QString SchemePlanManager::stringFromIndexCostType(SchemePlanManager::IndexCostType t)
  67. {
  68. switch (t) {
  69. case IndexCostTypeCost:
  70. return "成本型";
  71. case IndexCostTypeBenefit:
  72. return "效益型";
  73. }
  74. }
  75. QString SchemePlanManager::processName(const SchemeProcessInfo &process)
  76. {
  77. QList<QString> l1 = { "构建权重分析指标体系", "收集权重分析数据", "指标体系优化", "指标权重计算", "", "",
  78. "分析结果展示", "生成分析评估报告" };
  79. QList<QString> l2 = {
  80. "构建技术措施指标体系", "", "", "", "收集评估数据", "评估计算", "评估结果展示", "生成评估报告"
  81. };
  82. QList<QString> l3 = { "构建方案优选指标体系", "收集方案优选权重分析数据",
  83. "指标体系优化", "指标权重计算",
  84. "评估数据采集", "方案优选计算",
  85. "方案优选结果展示", "生成方案优选报告" };
  86. QList<QString> l4 = { "构建效能评估指标体系", "收集效能评估权重分析数据", "指标体系优化",
  87. "效能评估权重计算", "收集效能评估数据", "效能评估计算",
  88. "效能评估结果展示", "生成效能评估报告" };
  89. QList<QList<QString>> names = { l1, l2, l3, l4 };
  90. /// 获取指标类型枚举值 index
  91. /// 由于枚举值不是连续自然数, 故不能作为下表来索引数组
  92. /// 故须使用 index 替代
  93. int index = 0;
  94. QMetaEnum indexEnum = QMetaEnum::fromType<ProjectManager::IndexType>();
  95. for (int i = 0; i < indexEnum.keyCount(); i++) {
  96. if (indexEnum.value(i) == process.indexType) {
  97. index = i;
  98. break;
  99. }
  100. }
  101. if (index >= 0 && index < names.count() && process.type >= 0 && process.type < names[index].count()) {
  102. return names[index][process.type];
  103. }
  104. return "";
  105. }
  106. QString SchemePlanManager::processDescription(const SchemePlanManager::SchemeProcessInfo &process)
  107. {
  108. switch (process.type) {
  109. case IndexSystem:
  110. return "在指标体系设计页面,录入项目包含的指标,注意指标名称不能重复。";
  111. case ImportWeightData:
  112. case ImportEvalData: {
  113. if (process.dSource == FromExpert) {
  114. return "在评估数据采集页面给项目配置专家和权重。从评估项目管理页面找到对应的项目,导出资源包分发给专家。收"
  115. "集到专家填写的数据后,在评估数据采集页面导入专家数据。";
  116. } else if (process.dSource == FromMeasurement) {
  117. return "在评估数据采集页面添加实测数据。";
  118. } else if (process.dSource == FromScheme) {
  119. return "在评估数据采集页面添加专家方案。";
  120. }
  121. break;
  122. }
  123. case OptimizeIndex:
  124. return "";
  125. case CalculateWeight: {
  126. QString algName = nameOfAlgorithm(process.algorithm);
  127. return QString("使用%1计算各个指标的权重。").arg(algName);
  128. }
  129. case RunEvaluate: {
  130. QString algName = nameOfAlgorithm(process.algorithm);
  131. if (process.indexType == ProjectManager::TechIndex) {
  132. return QString("使用%1进行技术措施重要度评估。").arg(algName);
  133. } else if (process.indexType == ProjectManager::OptimalIndex) {
  134. return QString("使用%1进行方案优选评估。").arg(algName);
  135. } else if (process.indexType == ProjectManager::EfficiencyIndex) {
  136. return QString("使用%1进行综合效能评估。").arg(algName);
  137. }
  138. }
  139. case ShowEvalResult: {
  140. if (process.indexType == ProjectManager::AbilityIndex) {
  141. return "在评估数据处理页面查看权重分析结果";
  142. } else {
  143. return "在评估数据处理页面查看评估结果";
  144. }
  145. case GenerateReport:
  146. return "";
  147. default:
  148. break;
  149. }
  150. }
  151. return "";
  152. }
  153. QList<SchemePlanManager::SchemeDataSource>
  154. SchemePlanManager::processOptionalDataSource(const SchemeProcessInfo &process)
  155. {
  156. if (process.type == ImportEvalData && process.indexType == ProjectManager::EfficiencyIndex) {
  157. return { FromMeasurement };
  158. }
  159. if (process.type == ImportEvalData && process.indexType == ProjectManager::OptimalIndex) {
  160. return { FromScheme };
  161. }
  162. if (process.type == ImportWeightData || process.type == ImportEvalData) {
  163. return { FromExpert, FromMeasurement };
  164. }
  165. return {};
  166. }
  167. /**
  168. * 根据指标体系类型和方案步骤类型, 返回可选算法
  169. * date: 2023-11-03 by chengxr
  170. */
  171. QList<SchemePlanManager::Algorithm> SchemePlanManager::processOptionalAlgorithms(const SchemeProcessInfo &process)
  172. {
  173. switch (process.type) {
  174. case OptimizeIndex:
  175. return { PrincipalComponents };
  176. case CalculateWeight: {
  177. return { AHP, Entropy, PrincipalComponents };
  178. }
  179. case RunEvaluate: {
  180. if (process.indexType == ProjectManager::TechIndex) {
  181. return { WeightedSum };
  182. } else if (process.indexType == ProjectManager::OptimalIndex) {
  183. return { HWM, SPA };
  184. } else if (process.indexType == ProjectManager::EfficiencyIndex) {
  185. return { MEA, GCE };
  186. }
  187. return {};
  188. }
  189. case IndexSystem:
  190. case ImportWeightData:
  191. case ImportEvalData:
  192. case ShowEvalResult:
  193. case GenerateReport:
  194. return {};
  195. }
  196. }
  197. bool SchemePlanManager::processIsOptional(const SchemeProcessInfo &process)
  198. {
  199. return (process.type == GenerateReport);
  200. }
  201. SchemePlanManager::SchemePlanManager(QObject *parent) : QObject(parent) { }