index.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import { defineComponent, onMounted, reactive, watch } from "vue";
  2. import styles from "./index.module.less";
  3. import state from "/src/state";
  4. import icon1 from "../icons/1.png";
  5. import { storeData } from "/src/store";
  6. import { evaluatingData } from "/src/view/evaluating";
  7. import icons from "../icons/index.json";
  8. import imgs from "./index.json";
  9. import iconBadge from "./img/icon-badge.svg";
  10. import icon_expression0 from "./img/icon_expression0.svg";
  11. import icon_expression1 from "./img/icon_expression1.svg";
  12. import icon_expression2 from "./img/icon_expression2.svg";
  13. import icon_expression3 from "./img/icon_expression3.svg";
  14. import icon_expression4 from "./img/icon_expression4.svg";
  15. import { getQuery } from "/src/utils/queryString";
  16. import { browser, getBehaviorId } from "/src/utils";
  17. import { api_musicPracticeRecordSave } from "../../api";
  18. import { getAudioDuration } from "/src/view/audio-list";
  19. export default defineComponent({
  20. name: "evaluatResult",
  21. emits: ["close"],
  22. setup(props, { emit }) {
  23. const query = getQuery();
  24. const data = reactive({
  25. saveLoading: true,
  26. });
  27. /** 添加评测记录 */
  28. const handleAddRecord = async () => {
  29. // console.log("结束", evaluatingData.resultData);
  30. const body = {
  31. deviceType: browser().android ? "ANDROID" : "IOS", // 设备类型
  32. intonation: evaluatingData.resultData.intonation, // 音准
  33. cadence: evaluatingData.resultData.cadence, // 节奏
  34. integrity: evaluatingData.resultData.integrity, // 完成度
  35. scoreData: JSON.stringify(evaluatingData.resultData.scoreData), // 评测数据
  36. behaviorId: getBehaviorId(), // 行为id
  37. sourceTime: getAudioDuration(), // 音频时长
  38. partIndex: state.partIndex, // 音轨
  39. speed: state.speed, // 速度
  40. practiceSource: query.workRecord ? "LESSON_TRAINING" : "EVALUATION", // 练习来源
  41. score: evaluatingData.resultData.score, // 分数
  42. clientType: storeData.user.clientType, // 客户端类型
  43. musicSheetId: state.examSongId, // 乐谱id
  44. feature: "EVALUATION", // 特征
  45. playTime: evaluatingData.resultData.playTime / 1000, // 播放时长
  46. heardLevel: state.setting.evaluationDifficulty, // 听力等级
  47. recordFilePath: evaluatingData.resultData.url, // 录音文件路径
  48. };
  49. data.saveLoading = true;
  50. const res = await api_musicPracticeRecordSave(body);
  51. if (res?.code === 200){
  52. evaluatingData.resultData.recordId = res.data
  53. }
  54. data.saveLoading = false;
  55. };
  56. onMounted(() => {
  57. handleAddRecord();
  58. });
  59. watch(() => evaluatingData.resulstMode, (val) => {
  60. if (val) {
  61. handleAddRecord();
  62. }
  63. })
  64. return () => (
  65. <div class={styles.evaluatResult}>
  66. <div class={styles.closeBtn} onClick={() => emit("close")}>
  67. <img src={icons["arrow-left-background"]} />
  68. </div>
  69. {
  70. !state.isHideEvaluatReportSaveBtn &&
  71. <div class={styles.headerButton}>
  72. <div class={[styles.headBtn, evaluatingData.resultData.recordId ? '' : styles.disabled]} onClick={() => emit("close", "update")}>
  73. 保存演奏
  74. </div>
  75. </div>
  76. }
  77. <div class={styles.fraction}>
  78. <img class={styles.bg} src={imgs.bg} />
  79. <div class={styles.top}>
  80. {evaluatingData.resultData.score > 79 && (
  81. <img style={{}} class={styles.badge} src={iconBadge} />
  82. )}
  83. <div class={styles.text}>
  84. <div>
  85. <span class={styles.num}>{evaluatingData.resultData.score}</span>分
  86. </div>
  87. <div style={{ marginLeft: "6px" }}>{evaluatingData.resultData.clxmome}</div>
  88. </div>
  89. <img
  90. style={{ display: evaluatingData.resultData.leve === 0 ? "" : "none" }}
  91. class={styles.rightBadge}
  92. src={icon_expression0}
  93. />
  94. <img
  95. style={{ display: evaluatingData.resultData.leve === 1 ? "" : "none" }}
  96. class={styles.rightBadge}
  97. src={icon_expression1}
  98. />
  99. <img
  100. style={{ display: evaluatingData.resultData.leve === 2 ? "" : "none" }}
  101. class={styles.rightBadge}
  102. src={icon_expression2}
  103. />
  104. <img
  105. style={{ display: evaluatingData.resultData.leve === 3 ? "" : "none" }}
  106. class={styles.rightBadge}
  107. src={icon_expression3}
  108. />
  109. <img
  110. style={{ display: evaluatingData.resultData.leve === 4 ? "" : "none" }}
  111. class={styles.rightBadge}
  112. src={icon_expression4}
  113. />
  114. </div>
  115. {state.isPercussion ? (
  116. <div class={styles.percussion}>
  117. <img class={styles.leftIcon} src={evaluatingData.resultData.img || icon1} />
  118. <div class={styles.scoreDes}>
  119. <span class={styles.scoreNum}>{evaluatingData.resultData.score}</span>分
  120. <span style={{ marginLeft: "8px" }}>{evaluatingData.resultData.mome}</span>
  121. </div>
  122. </div>
  123. ) : (
  124. <div class={styles.detail}>
  125. <div class={styles.progressitem}>
  126. <div class={styles.intonation}>音准</div>
  127. <span>{evaluatingData.resultData.intonation}分</span>
  128. </div>
  129. <div class={styles.progressitem}>
  130. <div class={styles.cadence}>节奏</div>
  131. <span>{evaluatingData.resultData.cadence}分</span>
  132. </div>
  133. <div class={styles.progressitem}>
  134. <div class={styles.integrity}>完成度</div>
  135. <span>{evaluatingData.resultData.integrity}分</span>
  136. </div>
  137. </div>
  138. )}
  139. <div class={styles.tips}>{evaluatingData.resultData.clxtip}</div>
  140. <div class={styles.ctrls}>
  141. <img
  142. style={{ display: query.workRecord ? "none" : "" }}
  143. src={imgs.btn1}
  144. class={styles.ctrlsBtn}
  145. onClick={() => emit("close", "practise")}
  146. />
  147. <img src={imgs.btn2} class={styles.ctrlsBtn} onClick={() => emit("close", "tryagain")} />
  148. <img
  149. src={imgs.btn3}
  150. class={[styles.ctrlsBtn, data.saveLoading ? styles.disablued : ""]}
  151. onClick={() => emit("close", "look")}
  152. />
  153. </div>
  154. </div>
  155. </div>
  156. );
  157. },
  158. });