Browse Source

feat:修改手动分班

DESKTOP-USV654P\pc 8 months ago
parent
commit
bcacea849b

+ 5 - 1
src/services/apis/BandingTaskClassController.ts

@@ -32,6 +32,9 @@ export async function getBandingTaskClassClassStudent(params:any,mode: ErrorMess
 /** 分班确认列表 GET /banding/bandingTaskClass/class-sure */
 export async function getBandingTaskClassClassSure(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.get<API.BandingTaskClassSureListVo[]>
         ({url: '/banding/bandingTaskClass/class-sure', params:params},{errorMessageMode:mode});}
+/** 根据专业和年级查询班级 GET /banding/bandingTaskClass/classListParam */
+export async function getBandingTaskClassClassListParam(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.get<API.BandingTaskClassVo[]>
+        ({url: '/banding/bandingTaskClass/classListParam', params:params},{errorMessageMode:mode});}
 /** 导出学生列表 GET /banding/bandingTaskClass/export */
 export async function getBandingTaskClassExport(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.download<any>
         ({url: '/banding/bandingTaskClass/export',responseType:'blob', params:params},{errorMessageMode:mode});}
@@ -53,7 +56,8 @@ export async function postBandingTaskClassRemoveStudent(params:API.ChangeClassDt
 ,mode: ErrorMessageMode = 'modal'){ return defHttp.post<any>
         ({url: '/banding/bandingTaskClass/remove-student', data:params},{errorMessageMode:mode});}
 /** 重置功能 POST /banding/bandingTaskClass/reset */
-export async function postBandingTaskClassReset(params:string,mode: ErrorMessageMode = 'modal'){ return defHttp.post<any>
+export async function postBandingTaskClassReset(params:API.SureBandingTaskDto
+,mode: ErrorMessageMode = 'modal'){ return defHttp.post<any>
         ({url: '/banding/bandingTaskClass/reset', data:params},{errorMessageMode:mode});}
 /** 满足学生 GET /banding/bandingTaskClass/satisfy-student */
 export async function getBandingTaskClassSatisfyStudent(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.get<API.PageInput[]>

+ 3 - 0
src/services/apis/BaseStudentInfoController.ts

@@ -27,4 +27,7 @@ export async function getBasestudentinfoMobilePage(params:any,mode: ErrorMessage
 /** 学生列表人数统计 GET /student/basestudentinfo/mobile-page-statistics */
 export async function getBasestudentinfoMobilePageStatistics(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.get<API.BaseStudentInfoPageDataVo>
         ({url: '/student/basestudentinfo/mobile-page-statistics', params:params},{errorMessageMode:mode});}
+/** 根据姓名或者身份证号查询详情信息 GET /student/basestudentinfo/studentinfoByKeyWord */
+export async function getBasestudentinfoStudentinfoByKeyWord(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.get<API.BaseStudentSompleInfoVo[]>
+        ({url: '/student/basestudentinfo/studentinfoByKeyWord', params:params},{errorMessageMode:mode});}
             

+ 3 - 0
src/services/apis/StundentFaceProcessController.ts

@@ -28,6 +28,9 @@ export async function postStundentFaceProcessBatchImport(params:any,mode: ErrorM
 /** 根据id查询学生人脸信息审核信息 GET /personnel/stundentFaceProcess/info */
 export async function getStundentFaceProcessInfo(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.get<API.StundentFaceProcessVo>
         ({url: '/personnel/stundentFaceProcess/info', params:params},{errorMessageMode:mode});}
+/** 根据用户id查询学生人脸信息审核信息 GET /personnel/stundentFaceProcess/info-userId */
+export async function getStundentFaceProcessInfoUserId(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.get<API.StundentFaceProcessVo>
+        ({url: '/personnel/stundentFaceProcess/info-userId', params:params},{errorMessageMode:mode});}
 /** 学生人脸信息审核列表(分页) GET /personnel/stundentFaceProcess/page */
 export async function getStundentFaceProcessPage(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.get<API.PageOutput<API.StundentFaceProcessPageVo>>
         ({url: '/personnel/stundentFaceProcess/page', params:params},{errorMessageMode:mode});}

+ 29 - 0
src/services/typing.d.ts

@@ -4972,6 +4972,8 @@ score?: number;
 secondAmbition?: string;
 /** 学生来源 */
 source?: string;
+/** 学生来源中文 */
+sourceCn?: string;
 /** 班级状态(0:未分配, 1:已分配) */
 status?: number;
 /** 住宿类型 */
@@ -4998,8 +5000,14 @@ treeType?: number;
 type BaseNewStudentVo = {
 /** 身份证号 */
 credentialNumber?: string;
+/** 家庭地址 */
+familyAddress?: string;
+/** 家庭电话 */
+familyMobile?: string;
 /** 第一志愿 */
 firstAmbition?: string;
+/** 第一志愿id */
+firstAmbitionId?: string;
 /** 性别 */
 gender?: string;
 /** 毕业班级 */
@@ -5019,6 +5027,8 @@ name?: string;
 score?: number;
 /** 第二志愿 */
 secondAmbition?: string;
+/** 第二志愿 */
+secondAmbitionId?: string;
 sortCode?: number;
 /** 学生来源 */
 source?: string;
@@ -6595,6 +6605,23 @@ level?: number;
 sortCode?: number;
 }
 
+type BaseStudentSompleInfoVo = {
+/** 班级名称 */
+className?: string;
+/** 身份证号 */
+credentialNumber?: string;
+/** 启用状态(0:禁用 1:启用) */
+enabledMark?: number;
+/** 主键编号 */
+id?: string;
+/** 本人电话 */
+mobile?: string;
+/** 学生姓名 */
+studentName?: string;
+/** 班主任名称 */
+teacherName?: string;
+}
+
 type BaseStudentTreeVo = {
 /** children */
 children?: BaseStudentTreeVo[];
@@ -13817,6 +13844,8 @@ subjectGroupCourseList?: SubjectGroupCoursePageVo[];
 }
 
 type SureBandingTaskDto = {
+/** 任务id */
+bandingTaskId?: string;
 /** id */
 id?: string;
 }

+ 19 - 6
src/views/educational/basicInformation/components/data.config.ts

@@ -2,6 +2,7 @@ import { BasicColumn, FormSchema } from '/@/components/Table';
 import { requestMagicApi } from '/@/api/magicApi';
 import { getMajorSetOption } from '/@/api/userMagic';
 import { getDataOption } from '/@/api/system/dic';
+import { getBandingTaskClassClassListParam } from '/@/services/apis/BandingTaskClassController';
 export const tableColumns: BasicColumn[] = [
   {
     title: '毕业学校',
@@ -241,6 +242,13 @@ export const formSchema: FormSchema[] = [
 ];
 
 export const formDivisionSchema: FormSchema[] = [
+  {
+    label: '分班学生',
+    field: 'studentIds',
+    component: 'Input',
+    colProps: { span: 24 },
+    slot: 'studentIds',
+  },
   {
     label: '年级',
     field: 'gradeId',
@@ -256,7 +264,6 @@ export const formDivisionSchema: FormSchema[] = [
     field: 'majorSetId',
     label: '专业',
     component: 'ApiSelect',
-    required: true,
     componentProps: ({ formActionType }) => {
       return {
         getPopupContainer: () => document.body,
@@ -272,10 +279,15 @@ export const formDivisionSchema: FormSchema[] = [
         onChange: async (vlaue) => {
           const { getFieldsValue, updateSchema } = formActionType;
           const formData = getFieldsValue();
-          const classData = await requestMagicApi({
-            url: 'educational/class-by',
-            query: { grade_id: formData.gradeId, major_set_id: vlaue },
-          } as any);
+          const classData = await getBandingTaskClassClassListParam({
+            gradeId: formData.gradeId,
+            majorSetId: vlaue,
+          });
+          classData.map((item) => {
+            item['label'] = item.name;
+            item['value'] = item.id;
+            return item;
+          });
           updateSchema({
             field: 'classId',
             componentProps: {
@@ -291,7 +303,8 @@ export const formDivisionSchema: FormSchema[] = [
   {
     label: '班级',
     field: 'classId',
-    component: 'ApiSelect',
+    component: 'Select',
+    required: true,
     componentProps: ({ formModel }) => {
       return {
         getPopupContainer: () => document.body,

+ 66 - 63
src/views/educational/basicInformation/components/division.vue

@@ -1,77 +1,80 @@
+<template>
+  <BasicModal
+    @ok="handleSubmit"
+    :destroyOnClose="true"
+    :maskClosable="false"
+    v-bind="$attrs"
+    @register="registerModal"
+    :title="getTitle"
+    :width="1002"
+    showFooter
+  >
+    <BasicForm @register="registerForm">
+      <template #studentIds>
+        <div class="flex" style="flex-wrap: wrap">
+          <div v-for="(item, index) in modelRef" :key="index">
+            <div style="margin: 4px" v-if="index < 6"> {{ item.name }}</div>
+          </div>
+          <div style="margin: 4px" v-if="modelRef.length > 6"> ... 等{{ modelRef.length }}个 </div>
+        </div>
+      </template>
+    </BasicForm>
+  </BasicModal>
+</template>
 <script setup lang="ts">
-  import { ref } from 'vue';
+  import { ref, computed, unref } from 'vue';
   import { useMessage } from '/@/hooks/web/useMessage';
-  import BasicForm from '/@/components/Form/src/BasicForm.vue';
-  import { useForm } from '/@/components/Form';
-  import { formSchema } from './data.config';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, useForm } from '/@/components/Form/index';
+  import { formDivisionSchema } from './data.config';
   import {
-    postAppBaseappfunction,
-    putAppBaseappfunction,
-  } from '/@/services/apis/BaseAppFunctionController';
-  import BasicModal from '/@/components/Modal/src/BasicModal.vue';
-  import { useModalInner } from '/@/components/Modal';
-  const taskId = ref('');
-  const isUpdate = ref();
-  const [register, { closeModal }] = useModalInner(async (data) => {
-    taskId.value = data.id;
-    isUpdate.value = data.isUpdate;
-    if (isUpdate.value) {
-      title.value = '修改配置';
-    } else if (taskId.value) {
-      title.value = '查看配置';
-    } else {
-      title.value = '新增配置';
-    }
-    await setFieldsValue({ ...data });
-  });
-  const handleClose = () => {
-    closeModal();
-  };
+    postStudentBaseNewStudent,
+    putStudentBaseNewStudent,
+  } from '/@/services/apis/BaseNewStudentController';
+  import { postBandingTaskClassChangeClass } from '/@/services/apis/BandingTaskClassController';
+
+  const isUpdate = ref(true);
+  const modelRef = ref<Recordable[]>([]);
+  const emit = defineEmits(['success', 'register']);
   const { createMessage } = useMessage();
-  const emit = defineEmits(['success']);
-  const [formReg, { validateFields, setFieldsValue, resetFields }] = useForm({
-    schemas: formSchema,
-    layout: 'vertical',
+  const [registerForm, { validate, resetFields }] = useForm({
+    labelWidth: 100,
+    schemas: formDivisionSchema,
     showActionButtonGroup: false,
   });
-  const title = ref('手动分班');
+
+  const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {
+    resetFields();
+    setModalProps({ confirmLoading: false });
+    isUpdate.value = !!data?.isUpdate;
+    modelRef.value = [...data.baseData];
+  });
+
+  const getTitle = computed(() => (!unref(isUpdate) ? '手动分班' : '手动分班'));
   const handleSubmit = async () => {
-    const data = await validateFields();
     try {
-      if (isUpdate.value) {
-        data.id = taskId.value;
-        await putAppBaseappfunction({ ...(data as API.UpdateBaseAppFunctionDto) });
-        createMessage.success('修改成功');
-      } else {
-        if (taskId.value) {
-          closeModal();
-          return false;
-        }
-        await postAppBaseappfunction({ ...(data as API.AddBaseAppFunctionDto) });
-        createMessage.success('新增成功');
-      }
-      emit('success');
-      await resetFields();
+      const values = await validate();
+      setModalProps({ confirmLoading: true });
+
+      const newStudentIds: string[] = [];
+
+      modelRef.value.forEach((item) => {
+        newStudentIds.push(item.id);
+      });
+
+      const postParams = {
+        newStudentIds: newStudentIds,
+        bandingTaskClassId: values.classId,
+      };
+      await postBandingTaskClassChangeClass(postParams as API.ChangeClassDto);
+
+      createMessage.success('操作成功');
       closeModal();
-    } catch (error) {
-      createMessage.error(error.message);
+      emit('success');
+    } finally {
+      setModalProps({ confirmLoading: false });
     }
   };
 </script>
 
-<template>
-  <BasicModal
-    show-footer
-    @close="handleClose"
-    @ok="handleSubmit"
-    destroyOnClose
-    v-bind="$attrs"
-    @register="register"
-    :title="title"
-    width="50%"
-  >
-    <BasicForm @register="formReg" />
-  </BasicModal>
-</template>
-
 <style scoped lang="less"></style>

+ 17 - 2
src/views/educational/basicInformation/index.vue

@@ -5,6 +5,7 @@
   import FormEdit from './components/edit.vue';
   import ClassTree from './components/tree.vue';
   import FormImport from './components/import.vue';
+  import FormDivision from './components/division.vue';
   import StudentImport from './components/import1.vue';
   import { useModal } from '/@/components/Modal';
   import { reactive } from 'vue';
@@ -20,8 +21,9 @@
   const [registerImportModal, { openModal: openImportModal }] = useModal();
 
   const [registerStudentImportModal, { openModal: openStudentImportModal }] = useModal();
+  const [registerDivisionModal, { openModal: openDivisionModal }] = useModal();
 
-  const [registerTable, { reload }] = useTable({
+  const [registerTable, { reload, getSelectRows }] = useTable({
     api: getBaseNewStudentPage,
     title: '新生列表',
     rowKey: 'id',
@@ -42,6 +44,9 @@
       slots: { customRender: 'action' },
       fixed: 'right',
     },
+    rowSelection: {
+      type: 'checkbox',
+    },
   });
   const handleEdit = (record: any, isUpdate: boolean) => {
     if (isUpdate === false) {
@@ -83,6 +88,15 @@
       createMessage.warning('请选择招生计划');
     }
   };
+
+  const handleDivision = () => {
+    const data = getSelectRows();
+    if (data.length === 0) {
+      createMessage.warning('请选择的学生');
+      return;
+    }
+    openDivisionModal(true, { isUpdate: false, baseData: [...data] });
+  };
 </script>
 
 <template>
@@ -91,7 +105,7 @@
     <BasicTable class="w-2/3 xl:w-3/4" @register="registerTable" :searchInfo="searchInfo">
       <template #toolbar>
         <a-button type="primary" @click="handleEdit({}, false)">新增</a-button>
-        <a-button type="primary" @click="handleEdit({}, false)">手动分班</a-button>
+        <a-button type="primary" @click="handleDivision">手动分班</a-button>
         <a-button type="primary" @click="handelStudenImport">学生导入</a-button>
         <a-button type="primary" @click="handelImport">成绩导入</a-button>
       </template>
@@ -111,6 +125,7 @@
     <FormEdit @register="registerModal" @success="handleSuccess" />
     <FormImport @register="registerImportModal" @success="handleSuccess" />
     <StudentImport @register="registerStudentImportModal" @success="handleSuccess" />
+    <FormDivision @register="registerDivisionModal" @success="handleSuccess" />
   </PageWrapper>
 </template>