report.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. "use strict";
  2. const common_vendor = require("../../common/vendor.js");
  3. const common_assets = require("../../common/assets.js");
  4. const api_assessment = require("../../api/assessment.js");
  5. const _sfc_main = {
  6. __name: "report",
  7. setup(__props) {
  8. const loading = common_vendor.ref(true);
  9. const evaluationId = common_vendor.ref("");
  10. const displayTotalScore = common_vendor.ref(0);
  11. const evaluationName = common_vendor.ref("测评报告");
  12. const submitTime = common_vendor.ref("");
  13. const radarData = common_vendor.ref({ categories: [], series: [] });
  14. const abilityResults = common_vendor.ref([]);
  15. common_vendor.onLoad(async (options) => {
  16. evaluationId.value = options.id || options.assessmentId || "";
  17. if (!evaluationId.value) {
  18. common_vendor.index.showToast({ title: "参数错误", icon: "none" });
  19. loading.value = false;
  20. return;
  21. }
  22. await loadData();
  23. });
  24. const loadData = async () => {
  25. if (!evaluationId.value || evaluationId.value === "undefined") {
  26. loading.value = false;
  27. return;
  28. }
  29. try {
  30. const userInfo = common_vendor.index.getStorageSync("userInfo") || {};
  31. const studentId = userInfo.studentId || userInfo.id;
  32. if (!studentId) {
  33. common_vendor.index.showToast({ title: "请先登录", icon: "none" });
  34. return;
  35. }
  36. const res = await api_assessment.getEvaluationResult(evaluationId.value, studentId);
  37. if (res.code === 200 && res.data) {
  38. const data = res.data;
  39. abilityResults.value = data.abilityResults || [];
  40. radarData.value = data.radarChart || { categories: [], series: [] };
  41. if (data.totalScore) {
  42. displayTotalScore.value = Math.round(Number(data.totalScore));
  43. } else if (radarData.value.series.length > 0) {
  44. const sum = radarData.value.series.reduce((s, val) => s + (Number(val) || 0), 0);
  45. displayTotalScore.value = Math.round(sum / radarData.value.series.length);
  46. }
  47. evaluationName.value = data.evaluationName || "测评报告";
  48. submitTime.value = (/* @__PURE__ */ new Date()).toLocaleString();
  49. }
  50. } catch (e) {
  51. common_vendor.index.__f__("error", "at pages/assessment/report.vue:141", "加载报告失败:", e);
  52. } finally {
  53. loading.value = false;
  54. }
  55. };
  56. const viewAbilityDetail = (item) => {
  57. if (item.inquireLink) {
  58. common_vendor.index.setStorageSync("temp_report_url", item.inquireLink);
  59. common_vendor.index.navigateTo({
  60. url: "/pages/assessment/quiz?from=report"
  61. });
  62. } else {
  63. common_vendor.index.showToast({ title: "暂无详情", icon: "none" });
  64. }
  65. };
  66. const getPoint = (angle, radius) => {
  67. const x = 50 + radius * Math.cos((angle - 90) * Math.PI / 180);
  68. const y = 50 + radius * Math.sin((angle - 90) * Math.PI / 180);
  69. return { x, y };
  70. };
  71. const getPentagonPath = (radius) => {
  72. const count = Math.max(radarData.value.categories.length, 3);
  73. const points = [];
  74. for (let i = 0; i < count; i++) {
  75. const { x, y } = getPoint(i * (360 / count), radius);
  76. points.push(`${x}% ${y}%`);
  77. }
  78. return `polygon(${points.join(", ")})`;
  79. };
  80. const axesStyles = common_vendor.computed(() => {
  81. const count = Math.max(radarData.value.categories.length, 3);
  82. return Array.from({ length: count }).map((_, i) => ({
  83. transform: `rotate(${i * (360 / count) - 90}deg)`
  84. }));
  85. });
  86. const polygonClipPath = common_vendor.computed(() => {
  87. const series = radarData.value.series;
  88. const count = series.length;
  89. if (count < 3)
  90. return "none";
  91. const points = series.map((score, i) => {
  92. const minRadius = 20;
  93. const rawRadius = Math.min(Number(score) || 0, 100) / 100 * 50;
  94. const radius = Math.max(rawRadius, minRadius);
  95. const { x, y } = getPoint(i * (360 / count), radius);
  96. return `${x}% ${y}%`;
  97. });
  98. return `polygon(${points.join(", ")})`;
  99. });
  100. const nodePositions = common_vendor.computed(() => {
  101. const { categories, series } = radarData.value;
  102. const count = categories.length;
  103. return categories.map((name, i) => {
  104. const score = series[i];
  105. const minRadius = 20;
  106. const rawRadius = Math.min(Number(score) || 0, 100) / 100 * 50;
  107. const radius = Math.max(rawRadius, minRadius);
  108. const pos = getPoint(i * (360 / count), radius);
  109. const angle = i * (360 / count);
  110. let labelStyle = { position: "absolute" };
  111. if (angle === 0)
  112. labelStyle.bottom = "40rpx";
  113. else if (angle < 180)
  114. labelStyle.left = "40rpx";
  115. else
  116. labelStyle.right = "40rpx";
  117. return {
  118. x: pos.x,
  119. y: pos.y,
  120. name,
  121. score,
  122. labelStyle
  123. };
  124. });
  125. });
  126. return (_ctx, _cache) => {
  127. return common_vendor.e({
  128. a: loading.value
  129. }, loading.value ? {} : {
  130. b: "rotate(" + (-135 + displayTotalScore.value * 2.7) + "deg)",
  131. c: common_vendor.f(41, (i, k0, i0) => {
  132. return {
  133. a: i,
  134. b: "rotate(" + (-120 + (i - 1) * 6) + "deg)"
  135. };
  136. }),
  137. d: "rotate(" + (-135 + displayTotalScore.value * 2.7) + "deg)",
  138. e: common_vendor.t(displayTotalScore.value),
  139. f: common_vendor.t(evaluationName.value),
  140. g: common_vendor.t(submitTime.value),
  141. h: common_vendor.f([1, 2, 3, 4, 5], (i, k0, i0) => {
  142. return {
  143. a: i,
  144. b: common_vendor.n("pg-" + i),
  145. c: getPentagonPath(i * 20)
  146. };
  147. }),
  148. i: common_vendor.f(axesStyles.value, (axis, index, i0) => {
  149. return {
  150. a: index,
  151. b: common_vendor.s(axis)
  152. };
  153. }),
  154. j: polygonClipPath.value,
  155. k: common_vendor.f(nodePositions.value, (node, index, i0) => {
  156. return {
  157. a: common_vendor.t(node.name),
  158. b: common_vendor.s(node.labelStyle),
  159. c: common_vendor.t(node.score),
  160. d: common_vendor.s(node.scoreStyle),
  161. e: index,
  162. f: node.x + "%",
  163. g: node.y + "%"
  164. };
  165. }),
  166. l: common_vendor.f(abilityResults.value, (item, index, i0) => {
  167. return {
  168. a: common_vendor.t(item.name),
  169. b: common_vendor.t(item.isPass ? "已达标" : "未达标"),
  170. c: common_vendor.n(item.isPass ? "pass" : "fail"),
  171. d: common_vendor.t(item.score),
  172. e: index,
  173. f: common_vendor.o(($event) => viewAbilityDetail(item), index)
  174. };
  175. }),
  176. m: common_assets._imports_0$6
  177. });
  178. };
  179. }
  180. };
  181. const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__scopeId", "data-v-d9ddd4c0"]]);
  182. wx.createPage(MiniProgramPage);
  183. //# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/assessment/report.js.map