Gotoclass.tsx 7.7 KB

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