index.tsx 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  1. import { defineComponent, onMounted, reactive, watch } from 'vue';
  2. import styles from './index.module.less';
  3. import {
  4. NButton,
  5. NModal,
  6. NScrollbar,
  7. NSelect,
  8. NSpace,
  9. NSpin,
  10. useMessage,
  11. useDialog
  12. } from 'naive-ui';
  13. import CardType from '/src/components/card-type';
  14. import AttendClass from '/src/views/prepare-lessons/model/attend-class';
  15. import { usePrepareStore } from '/src/store/modules/prepareLessons';
  16. import { useCatchStore } from '/src/store/modules/catchData';
  17. import TheEmpty from '/src/components/TheEmpty';
  18. import {
  19. courseScheduleStart,
  20. queryCourseware,
  21. saveCourseware,
  22. teacherKnowledgeMaterialDelete
  23. } from '../../../api';
  24. import Draggable from 'vuedraggable';
  25. import iconDelete from '../../../images/icon-delete.png';
  26. import iconAddMusic from '../../../images/icon-add-music.png';
  27. import { onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router';
  28. import deepClone from '/src/helpers/deep-clone';
  29. import CardPreview from '/src/components/card-preview';
  30. import PreviewWindow from '/src/views/preview-window';
  31. import { state } from '/src/state';
  32. import SubjectSync from '../../../model/subject-sync';
  33. import { eventGlobal } from '/src/utils';
  34. export default defineComponent({
  35. name: 'courseware-modal',
  36. setup() {
  37. const catchStore = useCatchStore();
  38. const prepareStore = usePrepareStore();
  39. const route = useRoute();
  40. const router = useRouter();
  41. const dialog = useDialog();
  42. const message = useMessage();
  43. const localStorageSubjectId = localStorage.getItem(
  44. 'prepareLessonSubjectId'
  45. );
  46. const forms = reactive({
  47. className: route.query.name as any,
  48. classGroupId: route.query.classGroupId,
  49. preStudentNum: route.query.preStudentNum,
  50. courseScheduleSubjectId: route.query.courseScheduleSubjectId,
  51. // 选取参数带的,后取缓存
  52. subjectId: route.query.subjectId
  53. ? Number(route.query.subjectId)
  54. : localStorageSubjectId
  55. ? Number(localStorageSubjectId)
  56. : null,
  57. coursewareList: [] as any,
  58. loadingStatus: false,
  59. showAttendClass: false,
  60. attendClassType: 'change', //
  61. removeIds: [] as any, // 临时删除的编号
  62. drag: false,
  63. isEdit: false, // 是否更新数据
  64. editSubjectIds: '', // 声部编号
  65. removeVisiable: false,
  66. removeVisiable1: false,
  67. subjectSyncVisiable: false, // 同步声部
  68. show: false,
  69. item: {} as any,
  70. previewModal: false,
  71. previewParams: {
  72. type: '',
  73. subjectId: '',
  74. detailId: ''
  75. } as any
  76. });
  77. // 获取列表
  78. const getList = async () => {
  79. forms.loadingStatus = true;
  80. try {
  81. // 判断是否有选择对应的课件 或声部
  82. if (!prepareStore.getSelectKey || !prepareStore.getSubjectId)
  83. return (forms.loadingStatus = false);
  84. const { data } = await queryCourseware({
  85. coursewareDetailKnowledgeId: prepareStore.getSelectKey,
  86. subjectId: prepareStore.getSubjectId,
  87. page: 1,
  88. rows: 99
  89. });
  90. const tempRows = data.rows || [];
  91. const temp: any = [];
  92. tempRows.forEach((row: any) => {
  93. temp.push({
  94. id: row.id,
  95. materialId: row.materialId,
  96. coverImg: row.coverImg,
  97. type: row.materialType,
  98. title: row.materialName,
  99. isCollect: !!row.favoriteFlag,
  100. isSelected: row.source === 'PLATFORM' ? true : false,
  101. content: row.content,
  102. removeFlag: row.removeFlag
  103. });
  104. });
  105. prepareStore.setCoursewareList(temp || []);
  106. const tempCourse: any = [];
  107. temp.forEach((item: any) => {
  108. if (!forms.removeIds.includes(item.id)) {
  109. tempCourse.push(item);
  110. }
  111. });
  112. forms.coursewareList = tempCourse;
  113. } catch {
  114. //
  115. }
  116. forms.loadingStatus = false;
  117. };
  118. // 监听选择的key 左侧选择了其它的课
  119. watch(
  120. () => prepareStore.getSelectKey,
  121. () => {
  122. forms.drag = false;
  123. prepareStore.setIsEditResource(false);
  124. getList();
  125. }
  126. );
  127. // 声部变化时
  128. watch(
  129. () => prepareStore.getSubjectId,
  130. () => {
  131. getList();
  132. }
  133. );
  134. watch(
  135. () => prepareStore.getIsAddResource,
  136. (val: boolean) => {
  137. if (val) {
  138. getList();
  139. prepareStore.setIsAddResource(false);
  140. }
  141. }
  142. );
  143. // 监听列表变化,如果变化了,则弹选择声部的
  144. watch(
  145. () => forms.coursewareList,
  146. () => {
  147. if (forms.drag) {
  148. forms.isEdit = true;
  149. }
  150. },
  151. {
  152. deep: true
  153. }
  154. );
  155. // 删除
  156. const onDelete = (item: any) => {
  157. //
  158. forms.removeIds.push(item.id);
  159. const index = forms.coursewareList.findIndex(
  160. (c: any) => c.id === item.id
  161. );
  162. forms.coursewareList.splice(index, 1);
  163. forms.isEdit = true;
  164. // prepareStore.setCoursewareList(forms.coursewareList);
  165. // console.log(prepareStore.getCoursewareList, 'getCourseware');
  166. };
  167. // 完成编辑
  168. const onOverEdit = async () => {
  169. try {
  170. const temp: any = [];
  171. forms.coursewareList.forEach((item: any) => {
  172. temp.push({
  173. materialName: item.title,
  174. materialType: item.type,
  175. materialId: item.materialId,
  176. id: item.id
  177. });
  178. });
  179. // 保存课件
  180. // 判断是否编辑,如果编辑则取选择的声部
  181. await saveCourseware({
  182. coursewareDetailKnowledgeId: prepareStore.getSelectKey,
  183. lessonCoursewareId: prepareStore.getLessonCoursewareId,
  184. lessonCoursewareDetailId: prepareStore.getLessonCoursewareDetailId,
  185. subjectId: forms.isEdit
  186. ? forms.editSubjectIds
  187. : prepareStore.getSubjectId,
  188. materialList: [...temp]
  189. });
  190. forms.drag = false;
  191. message.success('编辑成功');
  192. forms.removeVisiable = false;
  193. prepareStore.setIsEditResource(false);
  194. // 重置临时删除编号
  195. forms.removeIds = [];
  196. await getList();
  197. } catch {
  198. //
  199. }
  200. };
  201. // 预览上课
  202. const onPreviewAttend = () => {
  203. // 获取上架的数据
  204. let count = 0;
  205. forms.coursewareList.forEach((item: any) => {
  206. if (!item.removeFlag) {
  207. count++;
  208. }
  209. });
  210. if (count <= 0) {
  211. message.error('课件不能为空');
  212. return;
  213. }
  214. // 判断是否在应用里面
  215. if (window.matchMedia('(display-mode: standalone)').matches) {
  216. state.application = window.matchMedia(
  217. '(display-mode: standalone)'
  218. ).matches;
  219. forms.previewModal = true;
  220. fscreen();
  221. forms.previewParams = {
  222. type: 'preview',
  223. subjectId: prepareStore.getSubjectId,
  224. detailId: prepareStore.getSelectKey,
  225. lessonCourseId: prepareStore.getBaseCourseware.id
  226. };
  227. } else {
  228. const { href } = router.resolve({
  229. path: '/attend-class',
  230. query: {
  231. type: 'preview',
  232. subjectId: prepareStore.getSubjectId,
  233. detailId: prepareStore.getSelectKey,
  234. lessonCourseId: prepareStore.getBaseCourseware.id
  235. }
  236. });
  237. window.open(href, +new Date() + '');
  238. }
  239. };
  240. const fscreen = () => {
  241. const el: any = document.documentElement;
  242. const documentDom: any = document;
  243. const isFullscreen =
  244. documentDom.fullScreen ||
  245. documentDom.mozFullScreen ||
  246. documentDom.webkitIsFullScreen;
  247. if (!isFullscreen) {
  248. //进入全屏
  249. (el.requestFullscreen && el.requestFullscreen()) ||
  250. (el.mozRequestFullScreen && el.mozRequestFullScreen()) ||
  251. (el.webkitRequestFullscreen && el.webkitRequestFullscreen()) ||
  252. (el.msRequestFullscreen && el.msRequestFullscreen());
  253. }
  254. };
  255. // 单个删除
  256. const onRemove = async (item: any) => {
  257. try {
  258. dialog.warning({
  259. title: '提示',
  260. content: '该资源已下架,是否删除?',
  261. positiveText: '确定',
  262. negativeText: '取消',
  263. onPositiveClick: async () => {
  264. forms.removeIds.push(item.id);
  265. await teacherKnowledgeMaterialDelete({ ids: item.id });
  266. message.success('删除成功');
  267. getList();
  268. }
  269. });
  270. } catch {
  271. //
  272. }
  273. };
  274. watch(
  275. () => prepareStore.getSubjectList,
  276. () => {
  277. checkSubjectIds();
  278. }
  279. );
  280. const checkSubjectIds = () => {
  281. const subjectList = prepareStore.getSubjectList;
  282. // 并且没有声部时才会更新
  283. if (subjectList.length > 0) {
  284. // 并且声部在列表中
  285. const localStorageSubjectId = localStorage.getItem(
  286. 'prepareLessonSubjectId'
  287. );
  288. // 先取 上次上课声部,在取班级声部 最后取缓存
  289. const subjectId =
  290. forms.courseScheduleSubjectId ||
  291. forms.subjectId ||
  292. localStorageSubjectId
  293. ? Number(
  294. forms.courseScheduleSubjectId ||
  295. forms.subjectId ||
  296. localStorageSubjectId
  297. )
  298. : null;
  299. // 判断浏览器上面是否有
  300. const index = subjectList.findIndex(
  301. (subject: any) => subject.id == subjectId
  302. );
  303. if (subjectId && index >= 0) {
  304. prepareStore.setSubjectId(subjectId);
  305. } else {
  306. // 判断是否有缓存
  307. prepareStore.setSubjectId(subjectList[0].id);
  308. }
  309. // 保存
  310. localStorage.setItem(
  311. 'prepareLessonSubjectId',
  312. prepareStore.getSubjectId as any
  313. );
  314. }
  315. };
  316. watch(
  317. () => route.query,
  318. async () => {
  319. forms.className = route.query.name as any;
  320. forms.classGroupId = route.query.classGroupId as any;
  321. forms.preStudentNum = route.query.preStudentNum as any;
  322. forms.subjectId = route.query.subjectId
  323. ? Number(route.query.subjectId)
  324. : null;
  325. prepareStore.setClassGroupId(forms.classGroupId as any);
  326. checkSubjectIds();
  327. await getList();
  328. }
  329. );
  330. onMounted(async () => {
  331. prepareStore.setClassGroupId(route.query.classGroupId as any);
  332. // 获取教材分类列表
  333. checkSubjectIds();
  334. await getList();
  335. // 动态添加数据
  336. eventGlobal.on('onPrepareAddItem', (item: any) => {
  337. forms.drag = true;
  338. forms.coursewareList.push(item);
  339. prepareStore.setCoursewareList(forms.coursewareList);
  340. forms.isEdit = true;
  341. });
  342. });
  343. return () => (
  344. <div class={styles.coursewareModal}>
  345. <div class={styles.btnGroup}>
  346. {forms.drag ? (
  347. <NSpace>
  348. <span class={styles.tips}>拖动可将资源进行排序哦~</span>
  349. </NSpace>
  350. ) : (
  351. <NSpace>
  352. {forms.classGroupId && (
  353. <div class={styles.btnItem}>
  354. <span class={styles.btnTitle}>上课班级:</span>
  355. <div
  356. onClick={() => {
  357. forms.showAttendClass = true;
  358. forms.attendClassType = 'change';
  359. }}>
  360. <NSelect
  361. placeholder="选择声部"
  362. labelField="name"
  363. valueField="id"
  364. class={styles.btnClassList}
  365. value={forms.className}
  366. disabled
  367. />
  368. </div>
  369. </div>
  370. )}
  371. <div class={styles.btnItem}>
  372. <span class={styles.btnTitle}>声部:</span>
  373. <NSelect
  374. placeholder="选择声部"
  375. class={styles.btnSubjectList}
  376. options={prepareStore.getSubjectList}
  377. labelField="name"
  378. valueField="id"
  379. value={prepareStore.getSubjectId}
  380. onUpdate:value={(val: any) => {
  381. prepareStore.setSubjectId(val);
  382. // 保存
  383. localStorage.setItem('prepareLessonSubjectId', val);
  384. getList();
  385. }}
  386. />
  387. </div>
  388. </NSpace>
  389. )}
  390. {/* 编辑 */}
  391. {!forms.drag ? (
  392. <NSpace>
  393. <NButton
  394. type="default"
  395. onClick={() => {
  396. forms.drag = true;
  397. prepareStore.setIsEditResource(true);
  398. // forms.subjectSyncVisiable = true;
  399. }}>
  400. 编辑
  401. </NButton>
  402. </NSpace>
  403. ) : (
  404. <NSpace>
  405. <NButton
  406. type="error"
  407. onClick={() => {
  408. forms.removeVisiable1 = true;
  409. }}>
  410. 清空资源
  411. </NButton>
  412. <NButton
  413. type="error"
  414. onClick={() => {
  415. forms.drag = false;
  416. forms.isEdit = false;
  417. prepareStore.setIsEditResource(false);
  418. forms.removeIds = [];
  419. getList();
  420. }}>
  421. 取消编辑
  422. </NButton>
  423. <NButton
  424. type="default"
  425. onClick={() => {
  426. if (forms.isEdit) {
  427. forms.subjectSyncVisiable = true;
  428. } else {
  429. forms.removeVisiable = true;
  430. }
  431. }}>
  432. 完成编辑
  433. </NButton>
  434. </NSpace>
  435. )}
  436. </div>
  437. <NScrollbar
  438. class={[
  439. styles.listContainer,
  440. forms.drag ? styles.listContainerDrag : ''
  441. ]}
  442. {...{ id: 'lessons-2' }}>
  443. <NSpin show={forms.loadingStatus}>
  444. <div
  445. class={[
  446. styles.listSection
  447. // !forms.loadingStatus && forms.coursewareList.length <= 0
  448. // ? styles.emptySection
  449. // : ''
  450. ]}
  451. onDragenter={(e: any) => {
  452. e.preventDefault();
  453. }}
  454. onDragover={(e: any) => {
  455. e.preventDefault();
  456. }}
  457. onDrop={(e: any) => {
  458. let dropItem = e.dataTransfer.getData('text');
  459. dropItem = dropItem ? JSON.parse(dropItem) : {};
  460. // 判断是否有数据
  461. if (dropItem.id) {
  462. eventGlobal.emit('onPrepareAddItem', {
  463. materialId: dropItem.id,
  464. coverImg: dropItem.coverImg,
  465. type: dropItem.type,
  466. title: dropItem.title,
  467. isCollect: dropItem.isCollect,
  468. isSelected: dropItem.isSelected,
  469. content: dropItem.content,
  470. removeFlag: false
  471. });
  472. }
  473. }}>
  474. {forms.coursewareList.length > 0 && (
  475. <>
  476. {forms.drag ? (
  477. <Draggable
  478. v-model:modelValue={forms.coursewareList}
  479. itemKey="id"
  480. componentData={{
  481. itemKey: 'id',
  482. tag: 'div',
  483. animation: 200,
  484. group: 'description',
  485. disabled: false
  486. }}
  487. class={styles.list}>
  488. {{
  489. item: (element: any) => {
  490. const item = element.element;
  491. return (
  492. <div
  493. data-id={item.id}
  494. class={[
  495. styles.itemWrap,
  496. styles.itemBlock,
  497. 'row-nav'
  498. ]}>
  499. <div class={styles.itemWrapBox}>
  500. <CardType
  501. class={[styles.itemContent]}
  502. isShowCollect={false}
  503. offShelf={item.removeFlag ? true : false}
  504. onOffShelf={() => onRemove(item)}
  505. item={item}
  506. />
  507. <div class={styles.itemOperation}>
  508. <img
  509. src={iconDelete}
  510. class={styles.iconDelete}
  511. onClick={(e: MouseEvent) => {
  512. e.stopPropagation();
  513. onDelete(item);
  514. }}
  515. />
  516. </div>
  517. </div>
  518. </div>
  519. );
  520. }
  521. }}
  522. </Draggable>
  523. ) : (
  524. <div class={styles.list}>
  525. {forms.coursewareList.map((item: any) => (
  526. <div class={styles.itemWrap}>
  527. <div class={styles.itemWrapBox}>
  528. <CardType
  529. class={[styles.itemContent, 'handle']}
  530. isShowCollect={false}
  531. item={item}
  532. offShelf={item.removeFlag ? true : false}
  533. onOffShelf={() => onRemove(item)}
  534. disabledMouseHover={false}
  535. onClick={() => {
  536. if (item.type === 'IMG') return;
  537. forms.show = true;
  538. forms.item = item;
  539. }}
  540. />
  541. </div>
  542. </div>
  543. ))}
  544. <div class={styles.itemWrap}>
  545. <div class={styles.itemWrapBox}>
  546. <div
  547. class={[
  548. styles.itemContent,
  549. styles.addMusicItem,
  550. 'handle'
  551. ]}
  552. onClick={() => {
  553. // 直接跳转到制谱页面 (临时存储数据)
  554. sessionStorage.setItem(
  555. 'notation-open-create',
  556. '1'
  557. );
  558. router.push('/notation');
  559. }}>
  560. <img src={iconAddMusic} />
  561. <p class={styles.addMusicName}>开始制谱</p>
  562. </div>
  563. </div>
  564. </div>
  565. </div>
  566. )}
  567. </>
  568. )}
  569. {/* {!forms.loadingStatus && forms.coursewareList.length <= 0 && (
  570. <TheEmpty description="暂无课件" />
  571. )} */}
  572. {forms.coursewareList.length <= 0 && (
  573. <div class={styles.list}>
  574. <div class={styles.itemWrap}>
  575. <div class={styles.itemWrapBox}>
  576. <div
  577. class={[
  578. styles.itemContent,
  579. styles.addMusicItem,
  580. 'handle'
  581. ]}
  582. onClick={() => {
  583. // 直接跳转到制谱页面 (临时存储数据)
  584. sessionStorage.setItem('notation-open-create', '1');
  585. router.push('/notation');
  586. }}>
  587. <img src={iconAddMusic} />
  588. <p class={styles.addMusicName}>开始制谱</p>
  589. </div>
  590. </div>
  591. </div>
  592. </div>
  593. )}
  594. </div>
  595. </NSpin>
  596. </NScrollbar>
  597. {!forms.drag ? (
  598. <div
  599. class={[styles.btnGroup, styles.btnGroupClass]}
  600. style={{ justifyContent: 'flex-end' }}>
  601. <NSpace justify="end">
  602. <NButton type="primary" onClick={onPreviewAttend}>
  603. 预览课件
  604. </NButton>
  605. <NButton
  606. {...{ id: 'lessons-3' }}
  607. type="error"
  608. class={styles.btnClassStart}
  609. onClick={async () => {
  610. let count = 0;
  611. forms.coursewareList.forEach((item: any) => {
  612. if (!item.removeFlag) {
  613. count++;
  614. }
  615. });
  616. if (count <= 0) {
  617. message.error('课件不能为空');
  618. return;
  619. }
  620. if (forms.classGroupId) {
  621. // 开始上课
  622. const res = await courseScheduleStart({
  623. lessonCoursewareKnowledgeDetailId: prepareStore.selectKey,
  624. classGroupId: forms.classGroupId,
  625. subjectId: prepareStore.getSubjectId
  626. });
  627. if (
  628. window.matchMedia('(display-mode: standalone)').matches
  629. ) {
  630. state.application = window.matchMedia(
  631. '(display-mode: standalone)'
  632. ).matches;
  633. forms.previewModal = true;
  634. fscreen();
  635. forms.previewParams = {
  636. type: 'class',
  637. classGroupId: forms.classGroupId,
  638. subjectId: prepareStore.getSubjectId,
  639. detailId: prepareStore.getSelectKey,
  640. classId: res.data,
  641. lessonCourseId: prepareStore.getBaseCourseware.id,
  642. preStudentNum: forms.preStudentNum
  643. };
  644. } else {
  645. const { href } = router.resolve({
  646. path: '/attend-class',
  647. query: {
  648. type: 'class',
  649. classGroupId: forms.classGroupId,
  650. subjectId: prepareStore.getSubjectId,
  651. detailId: prepareStore.getSelectKey,
  652. classId: res.data,
  653. lessonCourseId: prepareStore.getBaseCourseware.id,
  654. preStudentNum: forms.preStudentNum
  655. }
  656. });
  657. window.open(href, +new Date() + '');
  658. }
  659. } else {
  660. forms.showAttendClass = true;
  661. forms.attendClassType = 'change';
  662. }
  663. }}>
  664. 开始上课
  665. </NButton>
  666. </NSpace>
  667. </div>
  668. ) : (
  669. ''
  670. )}
  671. <NModal
  672. v-model:show={forms.showAttendClass}
  673. preset="card"
  674. showIcon={false}
  675. class={['modalTitle background', styles.attendClassModal]}
  676. title={'选择班级'}
  677. blockScroll={false}>
  678. <AttendClass
  679. onClose={() => (forms.showAttendClass = false)}
  680. type={forms.attendClassType}
  681. onPreview={(item: any) => {
  682. if (window.matchMedia('(display-mode: standalone)').matches) {
  683. state.application = window.matchMedia(
  684. '(display-mode: standalone)'
  685. ).matches;
  686. forms.previewModal = true;
  687. forms.previewParams = {
  688. ...item
  689. };
  690. } else {
  691. const { href } = router.resolve({
  692. path: '/attend-class',
  693. query: {
  694. ...item
  695. }
  696. });
  697. window.open(href, +new Date() + '');
  698. }
  699. }}
  700. onConfirm={async (item: any) => {
  701. if (forms.classGroupId) {
  702. forms.className = item.name;
  703. forms.classGroupId = item.classGroupId;
  704. forms.preStudentNum = item.preStudentNum;
  705. forms.subjectId = item.subjectId;
  706. forms.courseScheduleSubjectId = item.courseScheduleSubjectId;
  707. forms.showAttendClass = false;
  708. prepareStore.setClassGroupId(item.classGroupId);
  709. console.log(forms, 'forms', item);
  710. checkSubjectIds();
  711. // 声部切换时
  712. eventGlobal.emit('onChangeClass', {
  713. lastUseCoursewareId: item.lastUseCoursewareId,
  714. unit: item.unit
  715. });
  716. } else {
  717. const res = await courseScheduleStart({
  718. lessonCoursewareKnowledgeDetailId: prepareStore.selectKey,
  719. classGroupId: item.classGroupId,
  720. subjectId: prepareStore.getSubjectId
  721. });
  722. forms.showAttendClass = false;
  723. if (window.matchMedia('(display-mode: standalone)').matches) {
  724. state.application = window.matchMedia(
  725. '(display-mode: standalone)'
  726. ).matches;
  727. forms.previewModal = true;
  728. forms.previewParams = {
  729. type: 'class',
  730. classId: res.data, // 上课编号
  731. classGroupId: item.classGroupId,
  732. preStudentNum: item.preStudentNum,
  733. subjectId: prepareStore.getSubjectId,
  734. detailId: prepareStore.getSelectKey,
  735. lessonCourseId: prepareStore.getBaseCourseware.id
  736. };
  737. setTimeout(() => {
  738. fscreen();
  739. }, 200);
  740. } else {
  741. const { href } = router.resolve({
  742. path: '/attend-class',
  743. query: {
  744. type: 'class',
  745. classId: res.data, // 上课编号
  746. classGroupId: item.classGroupId,
  747. preStudentNum: item.preStudentNum,
  748. subjectId: prepareStore.getSubjectId,
  749. detailId: prepareStore.getSelectKey,
  750. lessonCourseId: prepareStore.getBaseCourseware.id
  751. }
  752. });
  753. window.open(href, +new Date() + '');
  754. }
  755. }
  756. }}
  757. />
  758. </NModal>
  759. {/* 弹窗查看 */}
  760. <CardPreview v-model:show={forms.show} item={forms.item} />
  761. <NModal
  762. v-model:show={forms.removeVisiable}
  763. preset="card"
  764. class={['modalTitle', styles.removeVisiable]}
  765. title={'提示'}>
  766. <div class={styles.studentRemove}>
  767. <p>是否完成编辑?</p>
  768. <NSpace class={styles.btnGroupModal} justify="center">
  769. <NButton round type="primary" onClick={onOverEdit}>
  770. 确定
  771. </NButton>
  772. <NButton round onClick={() => (forms.removeVisiable = false)}>
  773. 取消
  774. </NButton>
  775. </NSpace>
  776. </div>
  777. </NModal>
  778. <NModal
  779. v-model:show={forms.removeVisiable1}
  780. preset="card"
  781. class={['modalTitle', styles.removeVisiable1]}
  782. title={'清空资源'}>
  783. <div class={styles.studentRemove}>
  784. <p>
  785. 请确认是否要清空资源?
  786. <span>点击确认后所有的素材内容 将被清空掉。</span>
  787. </p>
  788. <NSpace class={styles.btnGroupModal} justify="center">
  789. <NButton
  790. round
  791. type="primary"
  792. onClick={() => {
  793. forms.coursewareList.forEach((item: any) => {
  794. forms.removeIds.push(item.id);
  795. });
  796. forms.coursewareList = [];
  797. forms.removeVisiable1 = false;
  798. forms.isEdit = true;
  799. // prepareStore.setCoursewareList([]);
  800. }}>
  801. 确定
  802. </NButton>
  803. <NButton round onClick={() => (forms.removeVisiable1 = false)}>
  804. 取消
  805. </NButton>
  806. </NSpace>
  807. </div>
  808. </NModal>
  809. <PreviewWindow
  810. v-model:show={forms.previewModal}
  811. type="attend"
  812. params={forms.previewParams}
  813. />
  814. {/* 完成编辑时,选择声部 */}
  815. <NModal
  816. v-model:show={forms.subjectSyncVisiable}
  817. preset="card"
  818. class={['modalTitle background', styles.subjectSyncModal]}
  819. title={'同步声部'}>
  820. <SubjectSync
  821. subjectId={prepareStore.getSubjectId as any}
  822. onClose={() => (forms.subjectSyncVisiable = false)}
  823. onConfirm={async (subjectIds: any) => {
  824. //
  825. try {
  826. forms.editSubjectIds = subjectIds.join(',');
  827. await onOverEdit();
  828. forms.subjectSyncVisiable = false;
  829. } catch {
  830. //
  831. }
  832. }}
  833. />
  834. </NModal>
  835. </div>
  836. );
  837. }
  838. });