evaluationRecords.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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 numeral from 'numeral';
  14. import { useECharts } from '@/hooks/web/useECharts';
  15. import Pagination from '/src/components/pagination';
  16. import { getPracticeRecordList } from '../api';
  17. import {
  18. getNowDateAndMonday,
  19. getNowDateAndSunday,
  20. getTimes
  21. } from '/src/utils/dateFormat';
  22. import { vaildUrl } from '@/utils/urlUtils';
  23. import CDatePicker from '/src/components/CDatePicker';
  24. import { useUserStore } from '/src/store/modules/users';
  25. import TheEmpty from '/src/components/TheEmpty';
  26. export default defineComponent({
  27. name: 'student-practiceData',
  28. props: {
  29. studentId: {
  30. type: String,
  31. default: ''
  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. onMounted(() => {
  178. getList();
  179. console.log(props.studentId);
  180. });
  181. return () => (
  182. <>
  183. <NForm label-placement="left" inline>
  184. <NFormItem>
  185. <CDatePicker
  186. v-model:value={timer.value}
  187. separator={'至'}
  188. type="daterange"
  189. timerValue={timer.value}></CDatePicker>
  190. </NFormItem>
  191. <NFormItem>
  192. <NSpace justify="end">
  193. <NButton type="primary" class="searchBtn" onClick={search}>
  194. 搜索
  195. </NButton>
  196. <NButton type="primary" ghost class="resetBtn" onClick={onReset}>
  197. 重置
  198. </NButton>
  199. </NSpace>
  200. </NFormItem>
  201. </NForm>
  202. <div class={styles.tableWrap}>
  203. <NDataTable
  204. v-slots={{
  205. empty:()=><TheEmpty></TheEmpty>
  206. }}
  207. class={styles.classTable}
  208. loading={state.loading}
  209. columns={columns()}
  210. data={state.tableList}></NDataTable>
  211. <Pagination
  212. v-model:page={state.pagination.page}
  213. v-model:pageSize={state.pagination.rows}
  214. v-model:pageTotal={state.pagination.pageTotal}
  215. onList={getList}
  216. sync
  217. />
  218. </div>
  219. <NModal
  220. v-model:show={payForm.detailVisiable}
  221. preset="card"
  222. class={['modalTitle background', styles.reportModel]}
  223. title={'评测报告'}>
  224. <iframe
  225. width={'100%'}
  226. height={'450px'}
  227. frameborder="0"
  228. src={reportSrc.value}></iframe>
  229. </NModal>
  230. </>
  231. );
  232. }
  233. });