assign-homework.tsx 11 KB

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