index.tsx 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. import { defineComponent, reactive, onMounted, ref, nextTick } from 'vue';
  2. import styles from './index.module.less';
  3. import {
  4. NButton,
  5. NDataTable,
  6. NForm,
  7. NFormItem,
  8. NImage,
  9. NModal,
  10. NSelect,
  11. NSpace,
  12. useDialog,
  13. useMessage
  14. } from 'naive-ui';
  15. import SearchInput from '@/components/searchInput';
  16. import CSelect from '@/components/CSelect';
  17. import Pagination from '@/components/pagination';
  18. import { classGroupList, deleteClass, getSubject } from './api';
  19. import CreateClass from './modals/createClass';
  20. import RestStudentBox from './modals/restStudentBox';
  21. import TrainDetail from './modals/Gotoclass';
  22. import { getgradeNumList, classArray } from './contants';
  23. import add from '@/views/studentList/images/add.png';
  24. import ClassGuide from '@/custom-plugins/guide-page/class-guide';
  25. import { useRouter } from 'vue-router';
  26. import { rowDark } from 'naive-ui/es/legacy-grid/styles';
  27. import TheEmpty from '/src/components/TheEmpty';
  28. import TheTooltip from '/src/components/TheTooltip';
  29. import PreviewWindow from '../preview-window';
  30. import { state as globalState } from '/src/state';
  31. import { courseSchedulePage } from '../home/api';
  32. import ResetSubject from './modals/resetSubject';
  33. import { fscreen } from '/src/utils';
  34. import UpdateSubject from './modals/updateSubject';
  35. export default defineComponent({
  36. name: 'class-classList',
  37. setup(props, { emit }) {
  38. const state = reactive({
  39. searchForm: {
  40. keyword: null as any,
  41. currentClass: null,
  42. currentGradeNum: null,
  43. subjectId: null
  44. },
  45. orchestraType: null,
  46. courseTypeCode: null,
  47. loading: false,
  48. pagination: {
  49. page: 1,
  50. rows: 10,
  51. pageTotal: 6
  52. },
  53. gradeNumList: [] as any,
  54. tableList: [] as any,
  55. studentVisible: false,
  56. activeRow: null as any,
  57. showaddClass: false,
  58. goCourseVisiable: false,
  59. removeVisiable: false,
  60. removeRow: {} as any,
  61. previewModal: false,
  62. previewParams: {} as any,
  63. lastCourse: null as any,
  64. subjectList: [] as any,
  65. showResetClass: false,
  66. showSubjectClass: false
  67. });
  68. const formRef = ref();
  69. const dialog = useDialog();
  70. const message = useMessage();
  71. const router = useRouter();
  72. const search = () => {
  73. state.pagination.page = 1;
  74. getList();
  75. console.log('search', state);
  76. };
  77. const showGuide = ref(false);
  78. state.gradeNumList = getgradeNumList();
  79. const onReset = () => {
  80. state.searchForm = {
  81. keyword: null as any,
  82. currentClass: null,
  83. currentGradeNum: null,
  84. subjectId: null
  85. };
  86. getList();
  87. };
  88. const removeClass = async () => {
  89. try {
  90. await deleteClass({ ids: state.removeRow.id });
  91. getList();
  92. message.success(`删除成功`);
  93. state.removeVisiable = false;
  94. } catch (e) {
  95. console.log(e);
  96. }
  97. };
  98. const getList = async () => {
  99. // classGroupList
  100. state.loading = true;
  101. try {
  102. const res = await classGroupList({
  103. ...state.searchForm,
  104. ...state.pagination
  105. });
  106. state.tableList = res.data.rows;
  107. state.pagination.pageTotal = res.data.total;
  108. state.loading = false;
  109. setTimeout(() => {
  110. if (state.tableList.length > 0) {
  111. showGuide.value = true;
  112. }
  113. }, 500);
  114. } catch (e) {
  115. state.loading = false;
  116. console.log(e);
  117. }
  118. console.log('getList');
  119. };
  120. const getSubjectList = async () => {
  121. const res = await getSubject({ page: 1, rows: 9999 });
  122. state.subjectList = res.data.rows.map((item: any) => {
  123. return {
  124. value: item.id,
  125. label: item.name
  126. };
  127. });
  128. state.subjectList.unshift({ value: null, label: '选择声部' });
  129. };
  130. const columns = () => {
  131. return [
  132. {
  133. title: '班级名称',
  134. key: 'name',
  135. width: '20%'
  136. },
  137. {
  138. title: '班级声部',
  139. key: 'subjectName',
  140. width: '20%'
  141. },
  142. {
  143. title: '学生人数',
  144. key: 'preStudentNum',
  145. width: '20%'
  146. },
  147. {
  148. title: '上次学习',
  149. key: 'lastStudy',
  150. width: '20%',
  151. render(row: any) {
  152. return row.lastStudy ? (
  153. <TheTooltip
  154. maxWidth={300}
  155. showContentWidth={300}
  156. content={row.lastStudy}
  157. />
  158. ) : (
  159. '--'
  160. );
  161. }
  162. },
  163. {
  164. title: '操作',
  165. key: 'id',
  166. render(row: any, index: number) {
  167. return (
  168. <div>
  169. <NSpace>
  170. {index == 0 ? (
  171. <div id="class-0">
  172. <NButton
  173. type="primary"
  174. text
  175. onClick={() => {
  176. router.push({
  177. path: '/classDetail',
  178. query: { name: row.name, id: row.id }
  179. });
  180. }}>
  181. 详情
  182. </NButton>
  183. </div>
  184. ) : (
  185. <NButton
  186. type="primary"
  187. text
  188. onClick={() => {
  189. router.push({
  190. path: '/classDetail',
  191. query: { name: row.name, id: row.id }
  192. });
  193. }}>
  194. 详情
  195. </NButton>
  196. )}
  197. <NButton
  198. type="primary"
  199. text
  200. onClick={() => resetClassSubject(row)}>
  201. 修改声部
  202. </NButton>
  203. {index == 0 ? (
  204. <NButton
  205. type="primary"
  206. {...{ id: 'class-1' }}
  207. text
  208. onClick={() => {
  209. startResetStudent(row);
  210. }}>
  211. 学生调整
  212. </NButton>
  213. ) : (
  214. <NButton
  215. type="primary"
  216. text
  217. onClick={() => {
  218. startResetStudent(row);
  219. }}>
  220. 学生调整
  221. </NButton>
  222. )}
  223. {index == 0 ? (
  224. <NButton
  225. {...{ id: 'class-2' }}
  226. disabled={!(row.preStudentNum > 0)}
  227. type="primary"
  228. text
  229. onClick={() => classesBegin(row)}>
  230. 开始上课
  231. </NButton>
  232. ) : (
  233. <NButton
  234. disabled={!(row.preStudentNum > 0)}
  235. type="primary"
  236. text
  237. onClick={() => classesBegin(row)}>
  238. 开始上课
  239. </NButton>
  240. )}
  241. {!(row.preStudentNum > 0) ? (
  242. <p
  243. style={{ color: '#EA4132', cursor: 'pointer' }}
  244. onClick={() => {
  245. state.removeVisiable = true;
  246. state.removeRow = row;
  247. }}>
  248. 删除
  249. </p>
  250. ) : null}
  251. </NSpace>
  252. </div>
  253. );
  254. }
  255. }
  256. ];
  257. };
  258. const startResetStudent = (row: any) => {
  259. state.activeRow = row;
  260. state.studentVisible = true;
  261. };
  262. const classesBegin = async (row: any) => {
  263. try {
  264. console.log(row, 'row');
  265. // 判断是否有声部
  266. if (row.subjectId) {
  267. //
  268. router.push({
  269. path: '/prepare-lessons',
  270. query: {
  271. lastUseCoursewareId: row.lessonCoursewareId,
  272. unit: row.lessonCoursewareKnowledgeDetailId,
  273. subjectId: row.subjectId,
  274. name: row.name, // 班级名称
  275. classGroupId: row.id // 班级编号
  276. }
  277. });
  278. } else {
  279. state.showSubjectClass = true;
  280. state.activeRow = row;
  281. }
  282. } catch (e) {
  283. console.log(e);
  284. }
  285. };
  286. const resetClassSubject = (row: any) => {
  287. state.activeRow = row;
  288. state.showResetClass = true;
  289. };
  290. onMounted(() => {
  291. getList();
  292. getSubjectList();
  293. });
  294. return () => (
  295. <div class={styles.listWrap}>
  296. <div class={styles.searchList}>
  297. <NForm label-placement="left" inline ref={formRef}>
  298. <NFormItem>
  299. <SearchInput
  300. {...{ placeholder: '请输入班级名称' }}
  301. class={styles.searchInput}
  302. searchWord={state.searchForm.keyword}
  303. onChangeValue={(val: string) =>
  304. (state.searchForm.keyword = val)
  305. }></SearchInput>
  306. </NFormItem>
  307. <NFormItem>
  308. <CSelect
  309. {...({
  310. options: state.gradeNumList,
  311. placeholder: '选择年级',
  312. clearable: true,
  313. inline: true
  314. } as any)}
  315. v-model:value={state.searchForm.currentGradeNum}></CSelect>
  316. </NFormItem>
  317. <NFormItem>
  318. <CSelect
  319. {...({
  320. options: classArray,
  321. placeholder: '选择班级',
  322. clearable: true,
  323. inline: true
  324. } as any)}
  325. v-model:value={state.searchForm.currentClass}></CSelect>
  326. </NFormItem>
  327. <NFormItem>
  328. <CSelect
  329. {...({
  330. options: state.subjectList,
  331. placeholder: '选择声部',
  332. clearable: true,
  333. inline: true
  334. } as any)}
  335. v-model:value={state.searchForm.subjectId}></CSelect>
  336. </NFormItem>
  337. <NFormItem>
  338. <NSpace justify="end">
  339. <NButton type="primary" class="searchBtn" onClick={search}>
  340. 搜索
  341. </NButton>
  342. <NButton
  343. type="primary"
  344. ghost
  345. class="resetBtn"
  346. onClick={onReset}>
  347. 重置
  348. </NButton>
  349. </NSpace>
  350. </NFormItem>
  351. </NForm>
  352. </div>
  353. <NButton
  354. class={styles.addBtn}
  355. type="primary"
  356. onClick={() => (state.showaddClass = true)}
  357. v-slots={{
  358. icon: () => (
  359. <>
  360. <NImage
  361. class={styles.addBtnIcon}
  362. previewDisabled
  363. src={add}></NImage>
  364. </>
  365. )
  366. }}>
  367. 创建班级
  368. </NButton>
  369. <div class={styles.tableWrap}>
  370. <NDataTable
  371. v-slots={{
  372. empty: () => <TheEmpty></TheEmpty>
  373. }}
  374. class={styles.classTable}
  375. loading={state.loading}
  376. columns={columns()}
  377. data={state.tableList}></NDataTable>
  378. <Pagination
  379. v-model:page={state.pagination.page}
  380. v-model:pageSize={state.pagination.rows}
  381. v-model:pageTotal={state.pagination.pageTotal}
  382. onList={getList}
  383. sync
  384. />
  385. </div>
  386. <NModal
  387. v-model:show={state.studentVisible}
  388. preset="card"
  389. class={['modalTitle background', styles.studentVisible]}
  390. title={'学员调整'}>
  391. <RestStudentBox
  392. activeRow={state.activeRow}
  393. onClose={() => (state.studentVisible = false)}
  394. onGetList={() => getList()}></RestStudentBox>
  395. </NModal>
  396. <NModal
  397. v-model:show={state.showaddClass}
  398. style={{ width: '500px' }}
  399. preset="card"
  400. class={['modalTitle background']}
  401. title={'创建班级'}>
  402. {state.showaddClass ? (
  403. <CreateClass
  404. gradeNumList={state.gradeNumList}
  405. classArray={classArray}
  406. subjectList={state.subjectList}
  407. onGetList={() => getList()}
  408. onClose={() => (state.showaddClass = false)}
  409. />
  410. ) : null}
  411. </NModal>
  412. <NModal
  413. v-model:show={state.showResetClass}
  414. style={{ width: '500px' }}
  415. preset="card"
  416. class={['modalTitle background']}
  417. title={'修改声部'}>
  418. {state.showResetClass ? (
  419. <ResetSubject
  420. activeRow={state.activeRow}
  421. subjectList={state.subjectList}
  422. onGetList={() => getList()}
  423. onClose={() => (state.showResetClass = false)}
  424. />
  425. ) : null}
  426. </NModal>
  427. <NModal
  428. v-model:show={state.showSubjectClass}
  429. style={{ width: '500px' }}
  430. preset="card"
  431. class={['modalTitle background']}
  432. title={'修改声部'}>
  433. {state.showSubjectClass ? (
  434. <UpdateSubject
  435. activeRow={state.activeRow}
  436. onGetList={() => getList()}
  437. onConfirm={(item: any) => {
  438. //
  439. router.push({
  440. path: '/prepare-lessons',
  441. query: {
  442. ...item
  443. }
  444. });
  445. }}
  446. onClose={() => (state.showSubjectClass = false)}
  447. />
  448. ) : null}
  449. </NModal>
  450. {/* 上课弹窗 */}
  451. <PreviewWindow
  452. v-model:show={state.previewModal}
  453. type="attend"
  454. params={state.previewParams}
  455. />
  456. <NModal
  457. v-model:show={state.removeVisiable}
  458. preset="card"
  459. class={['modalTitle', styles.removeVisiable]}
  460. title={'删除班级'}>
  461. <div class={styles.studentRemove}>
  462. <p>
  463. 确定要删除班级么?
  464. <span>删除班级信息将会清空</span>。
  465. </p>
  466. <NSpace class={styles.btnGroup} justify="center">
  467. <NButton round type="primary" onClick={removeClass}>
  468. 确定
  469. </NButton>
  470. <NButton round onClick={() => (state.removeVisiable = false)}>
  471. 取消
  472. </NButton>
  473. </NSpace>
  474. </div>
  475. </NModal>
  476. {showGuide.value ? <ClassGuide></ClassGuide> : null}
  477. </div>
  478. );
  479. }
  480. });