Gotoclass.tsx 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. import { defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from '../index.module.less';
  3. import {
  4. NButton,
  5. NForm,
  6. NFormItem,
  7. NSelect,
  8. NSpace,
  9. useMessage
  10. } from 'naive-ui';
  11. import {
  12. bookVersionPage,
  13. lessonCoursewarePage,
  14. queryCourseware
  15. } from '@/views/prepare-lessons/api';
  16. import { useRouter } from 'vue-router';
  17. import { useThrottleFn } from '@vueuse/core';
  18. import { getCourseChapter } from '../api';
  19. import { useCatchStore } from '/src/store/modules/catchData';
  20. export default defineComponent({
  21. name: 'train-update',
  22. emits: ['close'],
  23. props: {
  24. activeRow: {
  25. type: Object,
  26. default: () => ({ id: '', currentGradeNum: '' })
  27. }
  28. },
  29. setup(props, { emit }) {
  30. // 'practice' | 'evaluation'
  31. const forms = reactive({
  32. bookVersionId: null,
  33. classGroupId: null,
  34. category: null,
  35. chapter: null,
  36. subjectId: null,
  37. musicTagList: [] as any,
  38. loading: false,
  39. list: [] as any,
  40. chapterList: [] as any,
  41. unit: null,
  42. unitList: [],
  43. subjectList: [] as any
  44. });
  45. const router = useRouter();
  46. const catchStore = useCatchStore();
  47. const message = useMessage();
  48. const gotoClassPage = () => {
  49. formsRef.value.validate(async (error: any) => {
  50. if (error) return;
  51. const { data } = await queryCourseware({
  52. coursewareDetailKnowledgeId: forms.chapter,
  53. subjectId: forms.subjectId,
  54. page: 1,
  55. rows: 99
  56. });
  57. console.log('gotoClassPage', data);
  58. if (data.rows && data.rows.length > 0) {
  59. const { href } = router.resolve({
  60. path: '/attend-class',
  61. query: {
  62. type: 'class',
  63. classGroupId: props.activeRow.id,
  64. subjectId: forms.subjectId,
  65. detailId: forms.chapter
  66. }
  67. });
  68. emit('close');
  69. window.open(href, +new Date() + '');
  70. } else {
  71. message.error('当前章节没有课件,请重新学则');
  72. }
  73. });
  74. /**
  75. * query: {
  76. type: 'class',
  77. classGroupId: item.id,
  78. subjectId: prepareStore.getSubjectId,
  79. detailId: prepareStore.getSelectKey // 章节id
  80. }
  81. */
  82. };
  83. const formsRef = ref();
  84. const throttledFn = useThrottleFn(() => getLessonCourseware(), 500);
  85. const getLessonCourseware = async () => {
  86. forms.category = null;
  87. forms.unit = null;
  88. forms.category = null;
  89. forms.chapter = null;
  90. forms.loading = true;
  91. if (forms.bookVersionId) {
  92. try {
  93. const { data } = await lessonCoursewarePage({
  94. page: 1,
  95. rows: 99,
  96. type: 'COURSEWARE',
  97. enableFlag: 1,
  98. bookVersionId: forms.bookVersionId,
  99. currentGradeNum: props.activeRow.currentGradeNum
  100. });
  101. forms.list = data.rows.map((item: any) => {
  102. return {
  103. label: item.name,
  104. value: item.id
  105. };
  106. });
  107. } catch {
  108. //
  109. }
  110. } else {
  111. forms.list = [];
  112. }
  113. forms.loading = false;
  114. };
  115. const getVersion = async () => {
  116. forms.unit = null;
  117. forms.chapter = null;
  118. try {
  119. const { data } = await bookVersionPage({
  120. page: 1,
  121. rows: 99,
  122. type: 'COURSEWARE'
  123. });
  124. const temp = data.rows || [];
  125. temp.forEach((item: any) => {
  126. forms.musicTagList.push({
  127. id: item.id,
  128. name: item.name
  129. });
  130. });
  131. } catch {
  132. //
  133. }
  134. };
  135. const getunitList = async () => {
  136. forms.unit = null;
  137. forms.chapter = null;
  138. try {
  139. if (forms.category) {
  140. const res = await getCourseChapter(forms.category);
  141. forms.unitList = res.data.lessonList.map((item: any) => {
  142. return { ...item, label: item.name, value: item.id };
  143. });
  144. } else {
  145. forms.unitList = [];
  146. }
  147. } catch (e) {
  148. console.log(e);
  149. }
  150. };
  151. const getchapterList = () => {
  152. forms.chapter = null;
  153. if (forms.unit) {
  154. const item: any = forms.unitList.find((item: any) => {
  155. return item.id === forms.unit;
  156. });
  157. forms.chapterList = item.knowledgeList.map((know: any) => {
  158. return { ...know, label: know.name, value: know.id };
  159. });
  160. console.log('getchapterList', item);
  161. } else {
  162. forms.chapterList = [];
  163. }
  164. console.log('getchapterList');
  165. };
  166. onMounted(async () => {
  167. await catchStore.getSubjects();
  168. forms.subjectList = catchStore.getSubjectList.map((item: any) => {
  169. return {
  170. label: item.name,
  171. value: item.id
  172. };
  173. });
  174. getVersion();
  175. });
  176. return () => (
  177. <div class={styles.trainUpdate}>
  178. <NForm
  179. labelAlign="left"
  180. labelPlacement="left"
  181. ref={formsRef}
  182. model={forms}>
  183. <NFormItem
  184. path="bookVersionId"
  185. rule={[{ required: true, message: '选择教材版本' }]}>
  186. <NSelect
  187. placeholder="选择教材版本"
  188. clearable
  189. options={[...forms.musicTagList]}
  190. labelField="name"
  191. valueField="id"
  192. v-model:value={forms.bookVersionId}
  193. onUpdate:value={() => throttledFn()}
  194. />
  195. </NFormItem>
  196. <NFormItem
  197. path="category"
  198. rule={[{ required: true, message: '请选择册别' }]}>
  199. <NSelect
  200. {...({
  201. options: [...forms.list],
  202. placeholder: '选择册别',
  203. clearable: true
  204. } as any)}
  205. disabled={!forms.bookVersionId}
  206. v-model:value={forms.category}
  207. onUpdate:value={() => getunitList()}></NSelect>
  208. </NFormItem>
  209. <NFormItem
  210. path="unit"
  211. rule={[{ required: true, message: '请选择单元' }]}>
  212. <NSelect
  213. disabled={!forms.category}
  214. {...({
  215. options: [...forms.unitList],
  216. placeholder: '选择单元',
  217. clearable: true
  218. } as any)}
  219. v-model:value={forms.unit}
  220. onUpdate:value={() => getchapterList()}></NSelect>
  221. </NFormItem>
  222. <NFormItem
  223. path="chapter"
  224. rule={[{ required: true, message: '请选择章节' }]}>
  225. <NSelect
  226. disabled={!forms.unit}
  227. {...({
  228. options: [...forms.chapterList],
  229. placeholder: '选择章节',
  230. clearable: true
  231. } as any)}
  232. v-model:value={forms.chapter}></NSelect>
  233. </NFormItem>
  234. <NFormItem
  235. path="subjectId"
  236. rule={[{ required: true, message: '请选择乐器' }]}>
  237. <NSelect
  238. {...({
  239. options: [...forms.subjectList],
  240. placeholder: '选择乐器',
  241. clearable: true
  242. } as any)}
  243. v-model:value={forms.subjectId}></NSelect>
  244. </NFormItem>
  245. <NSpace class={styles.updateBtnGroup}>
  246. <NButton strong type="default" round onClick={() => emit('close')}>
  247. 取消
  248. </NButton>
  249. <NButton
  250. strong
  251. type="primary"
  252. round
  253. onClick={() => gotoClassPage()}>
  254. 确认
  255. </NButton>
  256. </NSpace>
  257. </NForm>
  258. </div>
  259. );
  260. }
  261. });