assign-homework.tsx 11 KB

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