|
@@ -0,0 +1,397 @@
|
|
|
|
+import {
|
|
|
|
+ NButton,
|
|
|
|
+ NSpace,
|
|
|
|
+ useMessage,
|
|
|
|
+ NCheckboxGroup,
|
|
|
|
+ NCheckbox,
|
|
|
|
+ NRow,
|
|
|
|
+ NImage,
|
|
|
|
+ NInput,
|
|
|
|
+ NScrollbar,
|
|
|
|
+ NDropdown
|
|
|
|
+} from 'naive-ui';
|
|
|
|
+import { computed, defineComponent, onMounted, reactive, ref } from 'vue';
|
|
|
|
+import styles from '../index.module.less';
|
|
|
|
+import SearchInput from '@/components/searchInput';
|
|
|
|
+import smallArrow from '../images/smallArrow.png';
|
|
|
|
+import transArrrow from '../images/transArrrow.png';
|
|
|
|
+import transArrowActive from '../images/transArrowActive.png';
|
|
|
|
+import { getCLassStudent, classGroupList, adjustStudent } from '../api';
|
|
|
|
+export default defineComponent({
|
|
|
|
+ props: {
|
|
|
|
+ activeRow: {
|
|
|
|
+ type: Object,
|
|
|
|
+ default: () => ({ id: '' })
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ name: 'RestStudentBox',
|
|
|
|
+ emits: ['close', 'getList'],
|
|
|
|
+ setup(props, { emit }) {
|
|
|
|
+ const message = useMessage();
|
|
|
|
+ const data = reactive({
|
|
|
|
+ uploading: false
|
|
|
|
+ });
|
|
|
|
+ const options = ref([] as any);
|
|
|
|
+
|
|
|
|
+ const chioseOptions = ref([] as any);
|
|
|
|
+ const formRef = ref();
|
|
|
|
+ const handleSubmit = async () => {
|
|
|
|
+ data.uploading = true;
|
|
|
|
+ };
|
|
|
|
+ const classList = ref([] as any);
|
|
|
|
+ console.log(props.activeRow, 'activeRow');
|
|
|
|
+ const targetClass = reactive({
|
|
|
|
+ name: '',
|
|
|
|
+ id: ''
|
|
|
|
+ });
|
|
|
|
+ const currentchioseStudent = ref([] as any);
|
|
|
|
+ const currentStudentList = ref([] as any);
|
|
|
|
+ const currentSearch = ref(null as any);
|
|
|
|
+
|
|
|
|
+ const targetchioseStudent = ref([] as any);
|
|
|
|
+ const targetStudentList = ref([] as any);
|
|
|
|
+ const targetSearch = ref(null as any);
|
|
|
|
+ //
|
|
|
|
+ const submitList = ref([] as any);
|
|
|
|
+ /**
|
|
|
|
+ * 这里干3件事 1.获取当前班的学生
|
|
|
|
+ * 2.查询所有的班级列表 并且排查当前班级
|
|
|
|
+ * 3.默认选择第一个班级 并且查出此班的学生
|
|
|
|
+ */
|
|
|
|
+ const chioseStudnet = (val: any) => {
|
|
|
|
+ console.log(val);
|
|
|
|
+ };
|
|
|
|
+ const getAllClassList = async () => {
|
|
|
|
+ try {
|
|
|
|
+ const res = await classGroupList({ page: 1, rows: 9999 });
|
|
|
|
+ classList.value = res.data.rows.map((item: any) => {
|
|
|
|
+ return {
|
|
|
|
+ label: item.name,
|
|
|
|
+ key: item.id,
|
|
|
|
+ disabled: item.id == props.activeRow.id
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ if (classList.value[0].disabled) {
|
|
|
|
+ targetClass.name = classList.value[1].label;
|
|
|
|
+ targetClass.id = classList.value[1].key;
|
|
|
|
+ } else {
|
|
|
|
+ targetClass.name = classList.value[0].label;
|
|
|
|
+ targetClass.id = classList.value[0].key;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const tarRes = await getCLassStudentList(targetClass.id);
|
|
|
|
+ targetStudentList.value = tarRes.data.rows.map((item: any) => {
|
|
|
|
+ return {
|
|
|
|
+ label: item.nickname + '(' + item.id + ')',
|
|
|
|
+ value: item.id
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ } catch (e) {
|
|
|
|
+ console.log(e);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ const getCLassStudentList = async (id: string | number) => {
|
|
|
|
+ return await getCLassStudent({
|
|
|
|
+ page: 1,
|
|
|
|
+ rows: 999,
|
|
|
|
+ classGroupId: id
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ const chioseClass = async (val: any) => {
|
|
|
|
+ classList.value.forEach((item: any) => {
|
|
|
|
+ if (item.key == val) {
|
|
|
|
+ targetClass.name = item.label;
|
|
|
|
+ targetClass.id = item.key;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ const res = await getCLassStudentList(val);
|
|
|
|
+ targetStudentList.value = res.data.rows.map((item: any) => {
|
|
|
|
+ return {
|
|
|
|
+ label: item.nickname + '(' + item.id + ')',
|
|
|
|
+ value: item.id
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ console.log(submitList.value, 'submitList.value');
|
|
|
|
+ // 判断一下 targetStudentList.value 和 submitList 对比
|
|
|
|
+ targetStudentList.value = targetStudentList.value.filter(
|
|
|
|
+ (item: any) =>
|
|
|
|
+ !submitList.value.some((ele: any) => ele.value === item.value)
|
|
|
|
+ );
|
|
|
|
+ // 如果 如果submitList 学生的toClassId 和targetClassId相同 则添加
|
|
|
|
+ submitList.value.forEach((ele: any) => {
|
|
|
|
+ if (ele.toClassId == targetClass.id) {
|
|
|
|
+ console.log(ele.toClassId, ele);
|
|
|
|
+ targetStudentList.value.push({
|
|
|
|
+ label: ele.label,
|
|
|
|
+ value: ele.value
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ // 有2下 如果submitList 学生 和 targetStudentList 学生id相同 则删除
|
|
|
|
+ };
|
|
|
|
+ const currentFitterList = computed(() => {
|
|
|
|
+ const oraginArr = currentStudentList.value || [];
|
|
|
|
+ const list = oraginArr.filter((item: any) => {
|
|
|
|
+ return item.label.indexOf(currentSearch.value || '') != -1;
|
|
|
|
+ });
|
|
|
|
+ return list;
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ const targetFitterList = computed(() => {
|
|
|
|
+ const oraginArr = targetStudentList.value || [];
|
|
|
|
+ const list = oraginArr.filter((item: any) => {
|
|
|
|
+ return item.label.indexOf(targetSearch.value || '') != -1;
|
|
|
|
+ });
|
|
|
|
+ return list;
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ const chioseAllCurrentStudent = () => {
|
|
|
|
+ if (
|
|
|
|
+ currentFitterList.value.length === currentchioseStudent.value.length
|
|
|
|
+ ) {
|
|
|
|
+ // 说明要取消全选
|
|
|
|
+ currentchioseStudent.value = [];
|
|
|
|
+ } else {
|
|
|
|
+ currentchioseStudent.value = currentFitterList.value.map(
|
|
|
|
+ (item: any) => {
|
|
|
|
+ return item.value;
|
|
|
|
+ }
|
|
|
|
+ );
|
|
|
|
+ // 全选
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const chioseAllTargetStudent = () => {
|
|
|
|
+ if (targetFitterList.value.length === targetchioseStudent.value.length) {
|
|
|
|
+ // 说明要取消全选
|
|
|
|
+ targetchioseStudent.value = [];
|
|
|
|
+ } else {
|
|
|
|
+ targetchioseStudent.value = targetFitterList.value.map((item: any) => {
|
|
|
|
+ return item.value;
|
|
|
|
+ });
|
|
|
|
+ // 全选
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ const toTargetList = () => {
|
|
|
|
+ const subStudetn = currentStudentList.value.filter((item: any) => {
|
|
|
|
+ return currentchioseStudent.value.indexOf(item.value) != -1;
|
|
|
|
+ });
|
|
|
|
+ if (subStudetn.length > 0) {
|
|
|
|
+ const arr = subStudetn.map((item: any) => {
|
|
|
|
+ return {
|
|
|
|
+ ...item,
|
|
|
|
+ studentId: item.value,
|
|
|
|
+ toClassId: targetClass.id
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ submitList.value = submitList.value.filter(
|
|
|
|
+ (item: any) => !arr.some((ele: any) => ele.value === item.value)
|
|
|
|
+ );
|
|
|
|
+ submitList.value = submitList.value.concat(arr);
|
|
|
|
+ }
|
|
|
|
+ // 接下来 删除 currentStudentList里的这三个学生
|
|
|
|
+ currentStudentList.value = currentStudentList.value.filter(
|
|
|
|
+ (item: any) => !subStudetn.some((ele: any) => ele.value === item.value)
|
|
|
|
+ );
|
|
|
|
+ subStudetn.forEach((item: any) => {
|
|
|
|
+ targetStudentList.value.push(item);
|
|
|
|
+ });
|
|
|
|
+ currentchioseStudent.value = [];
|
|
|
|
+ };
|
|
|
|
+ const toCurrentList = () => {
|
|
|
|
+ const subStudetn = targetStudentList.value.filter((item: any) => {
|
|
|
|
+ return targetchioseStudent.value.indexOf(item.value) != -1;
|
|
|
|
+ });
|
|
|
|
+ if (subStudetn.length > 0) {
|
|
|
|
+ const arr = subStudetn.map((item: any) => {
|
|
|
|
+ return {
|
|
|
|
+ ...item,
|
|
|
|
+ studentId: item.value,
|
|
|
|
+ toClassId: props.activeRow.id
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ submitList.value = submitList.value.filter(
|
|
|
|
+ (item: any) => !arr.some((ele: any) => ele.value === item.value)
|
|
|
|
+ );
|
|
|
|
+ submitList.value = submitList.value.concat(arr);
|
|
|
|
+ }
|
|
|
|
+ targetStudentList.value = targetStudentList.value.filter(
|
|
|
|
+ (item: any) => !subStudetn.some((ele: any) => ele.value === item.value)
|
|
|
|
+ );
|
|
|
|
+ subStudetn.forEach((item: any) => {
|
|
|
|
+ currentStudentList.value.push(item);
|
|
|
|
+ });
|
|
|
|
+ targetchioseStudent.value = [];
|
|
|
|
+ // 过去 所以
|
|
|
|
+ console.log(submitList.value, ' submitList.value===>');
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const submitStudent = async () => {
|
|
|
|
+ if (submitList.value < 1) {
|
|
|
|
+ emit('close');
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ const res = await adjustStudent(submitList.value);
|
|
|
|
+ emit('close');
|
|
|
|
+ emit('getList');
|
|
|
|
+ } catch (e) {
|
|
|
|
+ console.log(e);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ onMounted(async () => {
|
|
|
|
+ getAllClassList();
|
|
|
|
+ const res = await getCLassStudentList(props.activeRow.id as string);
|
|
|
|
+ currentStudentList.value = res.data.rows.map((item: any) => {
|
|
|
|
+ return {
|
|
|
|
+ label: item.nickname + '(' + item.id + ')',
|
|
|
|
+ value: item.id
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ return () => (
|
|
|
|
+ <div class={[styles.container, styles.resetStudentWrap]}>
|
|
|
|
+ <div class={styles.studentTransfer}>
|
|
|
|
+ <div class={styles.studentTransferList}>
|
|
|
|
+ <div class={styles.studentLeft}>
|
|
|
|
+ <div class={styles.listTop}>
|
|
|
|
+ <p>{props.activeRow.name}</p>
|
|
|
|
+ <span>(当前班级)</span>
|
|
|
|
+ </div>
|
|
|
|
+ <div class={styles.listCore}>
|
|
|
|
+ <NRow class={styles.chioseCheckAllBox}>
|
|
|
|
+ <NCheckbox
|
|
|
|
+ onUpdateChecked={val => {
|
|
|
|
+ chioseAllCurrentStudent();
|
|
|
|
+ }}
|
|
|
|
+ checked={
|
|
|
|
+ currentFitterList.value.length ===
|
|
|
|
+ currentchioseStudent.value.length
|
|
|
|
+ }
|
|
|
|
+ indeterminate={
|
|
|
|
+ currentchioseStudent.value.length > 0 &&
|
|
|
|
+ currentFitterList.value.length !==
|
|
|
|
+ currentchioseStudent.value.length
|
|
|
|
+ }
|
|
|
|
+ label="全选"></NCheckbox>
|
|
|
|
+ </NRow>
|
|
|
|
+ <NRow>
|
|
|
|
+ <SearchInput
|
|
|
|
+ {...{ placeholder: '请输入学生姓名' }}
|
|
|
|
+ class={styles.searchInput}
|
|
|
|
+ searchWord={currentSearch.value}
|
|
|
|
+ onChangeValue={(val: string) =>
|
|
|
|
+ (currentSearch.value = val)
|
|
|
|
+ }></SearchInput>
|
|
|
|
+ </NRow>
|
|
|
|
+ <NScrollbar style="max-height: 204px;min-height: 204px;margin-top:14px;">
|
|
|
|
+ <NCheckboxGroup v-model:value={currentchioseStudent.value}>
|
|
|
|
+ {currentFitterList.value.map((item: any) => (
|
|
|
|
+ <NRow class={styles.chioseCheckBox}>
|
|
|
|
+ <NCheckbox
|
|
|
|
+ value={item.value}
|
|
|
|
+ label={item.label}></NCheckbox>
|
|
|
|
+ </NRow>
|
|
|
|
+ ))}
|
|
|
|
+ </NCheckboxGroup>
|
|
|
|
+ </NScrollbar>
|
|
|
|
+ </div>
|
|
|
|
+ <div class={[styles.bottomLeft, styles.bottom]}>
|
|
|
|
+ <div class={styles.bottomWrap}>
|
|
|
|
+ 共{currentStudentList.value.length}名学生
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class={styles.chioseBox}>
|
|
|
|
+ <div
|
|
|
|
+ class={[styles.chioseBtn, styles.chioseBtnRight]}
|
|
|
|
+ onClick={() => toTargetList()}></div>
|
|
|
|
+ <div
|
|
|
|
+ class={styles.chioseBtn}
|
|
|
|
+ onClick={() => toCurrentList()}></div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class={styles.studentRight}>
|
|
|
|
+ <div class={styles.listTop}>
|
|
|
|
+ <NDropdown
|
|
|
|
+ key="111"
|
|
|
|
+ v-model:value={targetClass.id}
|
|
|
|
+ options={classList.value}
|
|
|
|
+ onSelect={(value: any) => {
|
|
|
|
+ chioseClass(value);
|
|
|
|
+ }}
|
|
|
|
+ scrollable>
|
|
|
|
+ <div>
|
|
|
|
+ {targetClass.name}
|
|
|
|
+ <NImage
|
|
|
|
+ class={styles.smallArrow}
|
|
|
|
+ src={smallArrow}
|
|
|
|
+ previewDisabled></NImage>
|
|
|
|
+ </div>
|
|
|
|
+ </NDropdown>
|
|
|
|
+ </div>
|
|
|
|
+ <div class={styles.listCore}>
|
|
|
|
+ <NRow class={styles.chioseCheckAllBox}>
|
|
|
|
+ <NCheckbox
|
|
|
|
+ onUpdateChecked={val => {
|
|
|
|
+ chioseAllTargetStudent();
|
|
|
|
+ }}
|
|
|
|
+ checked={
|
|
|
|
+ targetFitterList.value.length ===
|
|
|
|
+ targetchioseStudent.value.length
|
|
|
|
+ }
|
|
|
|
+ indeterminate={
|
|
|
|
+ targetchioseStudent.value.length > 0 &&
|
|
|
|
+ targetFitterList.value.length !==
|
|
|
|
+ targetchioseStudent.value.length
|
|
|
|
+ }
|
|
|
|
+ label="全选"></NCheckbox>
|
|
|
|
+ </NRow>
|
|
|
|
+ <NRow>
|
|
|
|
+ <SearchInput
|
|
|
|
+ {...{ placeholder: '请输入学生姓名' }}
|
|
|
|
+ class={styles.searchInput}
|
|
|
|
+ searchWord={targetSearch.value}
|
|
|
|
+ onChangeValue={(val: string) =>
|
|
|
|
+ (targetSearch.value = val)
|
|
|
|
+ }></SearchInput>
|
|
|
|
+ </NRow>
|
|
|
|
+ <NScrollbar style="max-height: 204px;min-height: 204px;margin-top:14px;">
|
|
|
|
+ <NCheckboxGroup v-model:value={targetchioseStudent.value}>
|
|
|
|
+ {targetFitterList.value.map((item: any) => (
|
|
|
|
+ <NRow class={styles.chioseCheckBox}>
|
|
|
|
+ <NCheckbox
|
|
|
|
+ value={item.value}
|
|
|
|
+ label={item.label}></NCheckbox>
|
|
|
|
+ </NRow>
|
|
|
|
+ ))}
|
|
|
|
+ </NCheckboxGroup>
|
|
|
|
+ </NScrollbar>
|
|
|
|
+ </div>
|
|
|
|
+ <div class={[styles.bottomRight, styles.bottom]}>
|
|
|
|
+ <div class={styles.bottomWrap}>
|
|
|
|
+ 共{targetStudentList.value.length}名学生
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <NSpace class={styles.btnGroup} justify="center">
|
|
|
|
+ <NButton round onClick={() => emit('close')}>
|
|
|
|
+ 取消
|
|
|
|
+ </NButton>
|
|
|
|
+ <NButton
|
|
|
|
+ round
|
|
|
|
+ loading={data.uploading}
|
|
|
|
+ type="primary"
|
|
|
|
+ onClick={() => {
|
|
|
|
+ submitStudent();
|
|
|
|
+ }}>
|
|
|
|
+ 保存
|
|
|
|
+ </NButton>
|
|
|
|
+ </NSpace>
|
|
|
|
+ </div>
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+});
|