assign-homework.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. import {
  2. PropType,
  3. defineComponent,
  4. onMounted,
  5. reactive,
  6. ref,
  7. toRef
  8. } from 'vue';
  9. import styles from './index.module.less';
  10. import {
  11. NButton,
  12. NDatePicker,
  13. NForm,
  14. NFormItem,
  15. NInput,
  16. NModal,
  17. NScrollbar,
  18. NSelect,
  19. NSpace,
  20. useMessage
  21. } from 'naive-ui';
  22. import { BOOK_DATA } from '/src/views/natural-resources/model/add-teaching';
  23. import { classGroupPage, lessonTrainingAdd } from '../../../api';
  24. import dayjs from 'dayjs';
  25. import { classGroupList } from '/src/views/home/api';
  26. import { gradeToCN } from '/src/utils/contants';
  27. import { usePrepareStore } from '/src/store/modules/prepareLessons';
  28. import AssignStudent from './assign-student';
  29. import { state } from '/src/state';
  30. import { nextTick } from 'process';
  31. import useDrag from '@/hooks/useDrag';
  32. import Dragbom from '@/hooks/useDrag/dragbom';
  33. import { useUserStore } from '@/store/modules/users';
  34. import { api_getCurrentGradeYear } from '/src/views/studentList/api';
  35. export default defineComponent({
  36. name: 'assign-homework',
  37. props: {
  38. classGroupId: {
  39. type: String,
  40. default: ''
  41. },
  42. courseScheduleId: {
  43. type: String,
  44. default: ''
  45. },
  46. /** 课件编号 */
  47. chapterLessonCoursewareId: {
  48. type: String,
  49. default: ''
  50. },
  51. item: {
  52. type: Object,
  53. default: () => ({})
  54. },
  55. /** 初始数据 */
  56. trainList: {
  57. type: Array,
  58. default: () => []
  59. },
  60. homeworkType: {
  61. type: String as PropType<'CLASSWORK' | 'HOMEWORK'>,
  62. default: 'CLASSWORK'
  63. },
  64. from: {
  65. // 来自哪里
  66. type: String,
  67. default: ''
  68. }
  69. },
  70. emits: ['close', 'confirm'],
  71. setup(props, { emit }) {
  72. const message = useMessage();
  73. const prepareStore = usePrepareStore();
  74. const forms = reactive({
  75. gradeYear: '' as any,
  76. currentTime: dayjs(dayjs().format('YYYY-MM-DD')).valueOf(),
  77. homeworkObj: 'CLASS' as 'PERSON' | 'CLASS',
  78. homeworkType: props.homeworkType,
  79. workVisiable: false,
  80. id: null as any,
  81. uploading: false,
  82. title: props.item.title,
  83. courseScheduleId: props.courseScheduleId || null,
  84. chapterLessonCoursewareId: props.chapterLessonCoursewareId || null,
  85. gradeList: [] as any,
  86. classList: [] as any,
  87. currentGradeNum: null,
  88. expireDate: dayjs().add(7, 'day').format('YYYY-MM-DD HH:mm') as any, // 默认7天
  89. classGroupId: null as any,
  90. studentList: [] as any,
  91. selectIds: [] as any
  92. });
  93. const formsRef = ref();
  94. // 获取年级班级
  95. const getClassGroupList = async () => {
  96. try {
  97. const defaultSelectClassGroupId =
  98. props.classGroupId || prepareStore.getClassGroupId;
  99. const { data } = await classGroupList({
  100. upgradeFlag: true,
  101. gradeYear: forms.gradeYear
  102. });
  103. const cList = data || [];
  104. const gradeList: any = [];
  105. cList.forEach((item: any) => {
  106. const classList: any = [];
  107. item.classGroupList.forEach((i: any) => {
  108. classList.push({
  109. label: i.currentClass + '班',
  110. value: i.id,
  111. lastStudy: i.lastStudy,
  112. preStudentNum: i.preStudentNum
  113. });
  114. if (i.id === defaultSelectClassGroupId) {
  115. forms.currentGradeNum = i.currentGradeNum;
  116. forms.classGroupId = [i.id];
  117. }
  118. });
  119. gradeList.push({
  120. label: gradeToCN[item.currentGradeNum],
  121. value: item.currentGradeNum,
  122. childrens: classList
  123. });
  124. });
  125. forms.gradeList = gradeList;
  126. if (forms.currentGradeNum) {
  127. getClassList();
  128. }
  129. } catch {
  130. //
  131. }
  132. };
  133. const getClassList = async () => {
  134. try {
  135. forms.gradeList.forEach((item: any) => {
  136. if (item.value === forms.currentGradeNum) {
  137. forms.classList = item.childrens;
  138. }
  139. });
  140. } catch {
  141. //
  142. }
  143. };
  144. const onSubmit = async () => {
  145. formsRef.value?.validate(async (err: any) => {
  146. if (err) {
  147. return;
  148. }
  149. forms.uploading = true;
  150. try {
  151. const trainList: any = props.item.lessonPreTrainingDetails || [];
  152. const details: any[] = [];
  153. trainList.forEach((item: any) => {
  154. details.push({
  155. trainingType: item.trainingType,
  156. musicId: item.musicId,
  157. trainingConfigJsonObject: item.trainingConfigJson
  158. });
  159. });
  160. const params = {
  161. name: forms.title,
  162. homeworkObj: forms.homeworkObj,
  163. homeworkType: forms.homeworkType,
  164. lessonTrainingDetails: details,
  165. expireDate: dayjs(forms.expireDate).format('YYYY-MM-DD HH:mm:ss'),
  166. classGroupId: forms.classGroupId
  167. ? forms.classGroupId.join(',')
  168. : null,
  169. studentIds: null as any,
  170. courseScheduleId: forms.courseScheduleId,
  171. chapterLessonCoursewareId: forms.chapterLessonCoursewareId // 课件编号
  172. };
  173. if (forms.homeworkObj === 'PERSON') {
  174. params.classGroupId = '';
  175. const ids: any[] = [];
  176. forms.studentList.forEach((item: any) => {
  177. ids.push(item.id);
  178. });
  179. params.studentIds = ids.join(',');
  180. }
  181. await lessonTrainingAdd(params);
  182. message.success('布置成功');
  183. emit('close');
  184. emit('confirm');
  185. } catch {
  186. //
  187. }
  188. forms.uploading = false;
  189. });
  190. };
  191. const getCurrentGradeYear = async () => {
  192. try {
  193. const { data } = await api_getCurrentGradeYear({});
  194. console.log(data);
  195. forms.gradeYear = data;
  196. } catch {
  197. //
  198. }
  199. };
  200. onMounted(async () => {
  201. await getCurrentGradeYear();
  202. await getClassGroupList();
  203. });
  204. // 选择学生
  205. let assignHomeworkStuBoxDragData: any;
  206. let assignHomeworkStuBoxClass: string;
  207. if (props.from === 'class') {
  208. const users = useUserStore();
  209. assignHomeworkStuBoxClass = 'assignHomeworkStuBoxClass_drag';
  210. assignHomeworkStuBoxDragData = useDrag(
  211. [
  212. `${assignHomeworkStuBoxClass}>.n-card-header`,
  213. `${assignHomeworkStuBoxClass} .bom_drag`
  214. ],
  215. assignHomeworkStuBoxClass,
  216. toRef(forms, 'workVisiable'),
  217. users.info.id
  218. );
  219. }
  220. return () => (
  221. <div class={styles.assignHomeworkContainer}>
  222. <NForm
  223. ref={formsRef}
  224. model={forms}
  225. labelAlign="right"
  226. labelWidth={'auto'}
  227. labelPlacement="left">
  228. <NFormItem
  229. label="布置方式"
  230. path="homeworkObj"
  231. rule={[{ required: true, message: '请选择布置方式' }]}>
  232. <NSpace>
  233. <NButton
  234. secondary
  235. class={[
  236. styles.switch,
  237. forms.homeworkObj === 'CLASS' ? styles.active : ''
  238. ]}
  239. onClick={() => (forms.homeworkObj = 'CLASS')}>
  240. 按班级布置
  241. </NButton>
  242. <NButton
  243. secondary
  244. class={[
  245. styles.switch,
  246. forms.homeworkObj === 'PERSON' ? styles.active : ''
  247. ]}
  248. onClick={() => (forms.homeworkObj = 'PERSON')}>
  249. 按学生布置
  250. </NButton>
  251. </NSpace>
  252. </NFormItem>
  253. <NFormItem
  254. label="作业标题"
  255. path="title"
  256. rule={[
  257. {
  258. required: true,
  259. message: '请输入作业标题',
  260. trigger: 'blur'
  261. }
  262. ]}>
  263. <NInput
  264. v-model:value={forms.title}
  265. placeholder="请选择作业标题"
  266. clearable
  267. />
  268. </NFormItem>
  269. <NFormItem
  270. label="年级"
  271. path="currentGradeNum"
  272. rule={[
  273. {
  274. required: true,
  275. message: '请选择年级',
  276. trigger: 'change',
  277. type: 'number'
  278. }
  279. ]}>
  280. <NSelect
  281. disabled={props.classGroupId ? true : false}
  282. v-model:value={forms.currentGradeNum}
  283. placeholder="请选择年级"
  284. options={forms.gradeList}
  285. clearable
  286. onUpdate:value={() => {
  287. forms.classGroupId = null;
  288. getClassList();
  289. }}
  290. />
  291. </NFormItem>
  292. {forms.homeworkObj === 'CLASS' ? (
  293. <NFormItem
  294. label="班级"
  295. path="classGroupId"
  296. rule={[
  297. {
  298. required: true,
  299. message: '请选择班级',
  300. trigger: 'change',
  301. type: 'array'
  302. }
  303. ]}>
  304. <NSelect
  305. disabled={props.classGroupId ? true : false}
  306. options={forms.classList}
  307. v-model:value={forms.classGroupId}
  308. placeholder="请选择班级"
  309. clearable
  310. multiple
  311. />
  312. </NFormItem>
  313. ) : (
  314. <NFormItem
  315. label="学生"
  316. path="studentList"
  317. rule={[
  318. {
  319. required: true,
  320. message: '请选择学生',
  321. trigger: 'change',
  322. type: 'array'
  323. }
  324. ]}
  325. class={styles.studentSection}>
  326. <span
  327. class={[
  328. styles.selectStudentBtn,
  329. !forms.currentGradeNum && styles.disabled
  330. ]}
  331. onClick={() => {
  332. if (!forms.currentGradeNum) {
  333. return;
  334. }
  335. const tempIds: any = [];
  336. forms.studentList.forEach((item: any) => {
  337. tempIds.push(item.id);
  338. });
  339. forms.selectIds = tempIds;
  340. forms.workVisiable = true;
  341. }}>
  342. 选择学生
  343. </span>
  344. {forms.studentList.length > 0 && (
  345. <NScrollbar class={styles.studentList}>
  346. <span class={styles.firstName}>
  347. 当前选中({forms.studentList.length || 0}):
  348. </span>
  349. {forms.studentList.map((item: any, index: number) => (
  350. <span class={styles.studentItem}>
  351. {item.name}{' '}
  352. <i
  353. class={styles.iconDelete}
  354. onClick={() => {
  355. forms.studentList.splice(index, 1);
  356. }}></i>
  357. </span>
  358. ))}
  359. </NScrollbar>
  360. )}
  361. </NFormItem>
  362. )}
  363. <NFormItem
  364. label="截止时间"
  365. path="expireDate"
  366. rule={[
  367. { required: true, message: '请选择截止时间', trigger: 'change' }
  368. ]}>
  369. <NDatePicker
  370. v-model:formatted-value={forms.expireDate}
  371. type="datetime"
  372. clearable
  373. // valueFormat="yyyy-MM-dd HH:mm"
  374. format="yyyy-MM-dd HH:mm"
  375. style={{ width: '100%' }}
  376. isDateDisabled={(ts: number) => {
  377. return ts < forms.currentTime;
  378. }}
  379. />
  380. </NFormItem>
  381. <NSpace class={styles.updateBtnGroup}>
  382. <NButton strong type="default" round onClick={() => emit('close')}>
  383. 取消布置
  384. </NButton>
  385. <NButton
  386. strong
  387. type="primary"
  388. round
  389. disabled={forms.uploading}
  390. loading={forms.uploading}
  391. onClick={onSubmit}>
  392. 确认布置
  393. </NButton>
  394. </NSpace>
  395. </NForm>
  396. <NModal
  397. v-model:show={forms.workVisiable}
  398. style={
  399. props.from === 'class'
  400. ? {
  401. width: '640px',
  402. ...assignHomeworkStuBoxDragData.styleDrag.value
  403. }
  404. : {
  405. width: '640px'
  406. }
  407. }
  408. preset="card"
  409. showIcon={false}
  410. class={['modalTitle background', assignHomeworkStuBoxClass]}
  411. title={'选择学生'}
  412. blockScroll={false}>
  413. <AssignStudent
  414. classGroupId={props.classGroupId}
  415. currentGradeNum={forms.currentGradeNum as any}
  416. selectIds={forms.selectIds}
  417. studentList={forms.studentList}
  418. classList={forms.classList}
  419. onClose={() => (forms.workVisiable = false)}
  420. onConfirm={(val: any) => {
  421. forms.studentList = val || [];
  422. forms.workVisiable = false;
  423. }}
  424. />
  425. {props.from === 'class' && <Dragbom></Dragbom>}
  426. </NModal>
  427. </div>
  428. );
  429. }
  430. });