evaluationRecords.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. import { Ref, defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from '../index.module.less';
  3. import {
  4. NButton,
  5. NDataTable,
  6. NForm,
  7. NFormItem,
  8. NModal,
  9. NNumberAnimation,
  10. NSpace,
  11. NTag
  12. } from 'naive-ui';
  13. import { useECharts } from '@/hooks/web/useECharts';
  14. import Pagination from '/src/components/pagination';
  15. import { getPracticeRecordList } from '../api';
  16. import {
  17. getNowDateAndMonday,
  18. getNowDateAndSunday,
  19. getTimes
  20. } from '/src/utils/dateFormat';
  21. import { vaildUrl } from '@/utils/urlUtils';
  22. import CDatePicker from '/src/components/CDatePicker';
  23. import { useUserStore } from '/src/store/modules/users';
  24. import TheEmpty from '/src/components/TheEmpty';
  25. export default defineComponent({
  26. name: 'student-practiceData',
  27. props: {
  28. studentId: {
  29. type: String,
  30. default: ''
  31. },
  32. classGroupId: {
  33. type: String,
  34. default: ''
  35. }
  36. },
  37. setup(props) {
  38. const userStore = useUserStore();
  39. const chartRef = ref<HTMLDivElement | null>(null);
  40. const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
  41. const practiceFlag = ref(true);
  42. const payForm = reactive({
  43. height: '360px',
  44. width: '100%',
  45. practiceDurationAvg: 0,
  46. practiceDays: 0,
  47. practiceDurationTotal: 0,
  48. dateList: [],
  49. timeList: [],
  50. detailVisiable: false
  51. });
  52. const reportSrc = ref('');
  53. const state = reactive({
  54. loading: false,
  55. pagination: {
  56. page: 1,
  57. rows: 10,
  58. pageTotal: 4
  59. },
  60. tableList: [] as any,
  61. goCourseVisiable: false
  62. });
  63. const timer = ref<[number, number]>([
  64. getNowDateAndMonday(new Date().getTime()),
  65. getNowDateAndSunday(new Date().getTime())
  66. ]);
  67. const columns = () => {
  68. return [
  69. {
  70. title: '时间',
  71. key: 'createTime'
  72. },
  73. {
  74. title: '评测曲目',
  75. key: 'musicSheetName',
  76. render(row: any) {
  77. return <span>{row.musicSheetName}</span>;
  78. }
  79. },
  80. // 入门:BEGINNER/进阶:ADVANCED/大师:PERFORMER"
  81. {
  82. title: '评测难度',
  83. key: 'heardLevel',
  84. render(row: any) {
  85. return (
  86. <>
  87. {row.heardLevel == null ? <span>--</span> : null}
  88. {row.heardLevel == 'BEGINNER' ? (
  89. <NTag type="info">入门级</NTag>
  90. ) : null}
  91. {row.heardLevel == 'ADVANCED' ? (
  92. <NTag type="warning">进阶级</NTag>
  93. ) : null}
  94. {row.heardLevel == 'PERFORMER' ? (
  95. <NTag type="error">大师级</NTag>
  96. ) : null}
  97. </>
  98. );
  99. }
  100. },
  101. {
  102. title: '评测分数',
  103. key: 'score',
  104. render(row: any) {
  105. return <span>{row.score}</span>;
  106. }
  107. },
  108. {
  109. title: '音准',
  110. key: 'intonation',
  111. render(row: any) {
  112. return <span>{row.intonation}</span>;
  113. }
  114. },
  115. {
  116. title: '节奏',
  117. key: 'cadence',
  118. render(row: any) {
  119. return <span>{row.cadence}</span>;
  120. }
  121. },
  122. {
  123. title: '完整度',
  124. key: 'integrity',
  125. render(row: any) {
  126. return <span>{row.integrity}</span>;
  127. }
  128. },
  129. {
  130. title: '操作',
  131. key: 'id',
  132. render(row: any) {
  133. return (
  134. <NButton
  135. text
  136. type="primary"
  137. onClick={() => {
  138. gotoRecode(row);
  139. }}>
  140. 评测报告
  141. </NButton>
  142. );
  143. }
  144. }
  145. ];
  146. };
  147. const getList = async () => {
  148. const res = await getPracticeRecordList({
  149. userId: props.studentId,
  150. ...state.pagination,
  151. classGroupId: props.classGroupId,
  152. feature: 'EVALUATION',
  153. ...getTimes(timer.value, ['startTime', 'endTime'], 'YYYY-MM-DD')
  154. });
  155. state.tableList = res.data.rows;
  156. console.log(state.tableList, 'state.tableList ');
  157. state.pagination.pageTotal = res.data.total;
  158. };
  159. const gotoRecode = (row: any) => {
  160. console.log(row.id, 'gotoRecode');
  161. const tockn = userStore.getToken;
  162. reportSrc.value =
  163. vaildUrl() +
  164. `/instrument/#/evaluat-report?id=${row.id}&Authorization=${tockn}`;
  165. payForm.detailVisiable = true;
  166. };
  167. const search = () => {
  168. getList();
  169. };
  170. const onReset = () => {
  171. timer.value = [
  172. getNowDateAndMonday(new Date().getTime()),
  173. getNowDateAndSunday(new Date().getTime())
  174. ];
  175. search();
  176. };
  177. const iframeRef = ref();
  178. onMounted(() => {
  179. getList();
  180. console.log(props.studentId);
  181. });
  182. return () => (
  183. <>
  184. <NForm label-placement="left" inline>
  185. <NFormItem>
  186. <CDatePicker
  187. v-model:value={timer.value}
  188. separator={'至'}
  189. type="daterange"
  190. timerValue={timer.value}></CDatePicker>
  191. </NFormItem>
  192. <NFormItem>
  193. <NSpace justify="end">
  194. <NButton type="primary" class="searchBtn" onClick={search}>
  195. 搜索
  196. </NButton>
  197. <NButton type="primary" ghost class="resetBtn" onClick={onReset}>
  198. 重置
  199. </NButton>
  200. </NSpace>
  201. </NFormItem>
  202. </NForm>
  203. <div class={styles.tableWrap}>
  204. <NDataTable
  205. v-slots={{
  206. empty: () => <TheEmpty></TheEmpty>
  207. }}
  208. class={styles.classTable}
  209. loading={state.loading}
  210. columns={columns()}
  211. data={state.tableList}></NDataTable>
  212. <Pagination
  213. v-model:page={state.pagination.page}
  214. v-model:pageSize={state.pagination.rows}
  215. v-model:pageTotal={state.pagination.pageTotal}
  216. onList={getList}
  217. sync
  218. />
  219. </div>
  220. <NModal
  221. v-model:show={payForm.detailVisiable}
  222. preset="card"
  223. class={['modalTitle background', styles.reportModel]}
  224. title={'评测报告'}>
  225. <div class={styles.reportContainer} style={{ lineHeight: 0 }}>
  226. <iframe
  227. width={'100%'}
  228. height={'450px'}
  229. ref={iframeRef}
  230. frameborder="0"
  231. src={reportSrc.value}></iframe>
  232. </div>
  233. </NModal>
  234. </>
  235. );
  236. }
  237. });