Sfoglia il codice sorgente

fix: change basicInformation

DESKTOP-USV654P\pc 1 settimana fa
parent
commit
6a23b5e71f

+ 1 - 1
Makefile

@@ -12,7 +12,7 @@ build:
 
 commit:
 	git add . && \
-	git commit --no-verify -m "fix: change extbookSubscription"
+	git commit --no-verify -m "fix: change basicInformation"
 
 checkPre:
 	git checkout pre

+ 37 - 0
src/services/apis/BaseCourseSubjectController.ts

@@ -0,0 +1,37 @@
+// @ts-ignore
+/* eslint-disable */
+
+// 该文件自动生成,请勿手动修改!
+import { defHttp } from '/@/utils/http/axios';
+import { ErrorMessageMode } from '/#/axios';
+            // --------------------------------------------------------------------------
+            // Base Course Subject Controller
+            // --------------------------------------------------------------------------
+
+            ;
+
+
+            /** 新增课程学科 POST /base/baseCourseSubject */
+export async function postBaseBaseCourseSubject(params:API.AddBaseCourseSubjectDto
+,mode: ErrorMessageMode = 'modal'){ return defHttp.post<any>
+        ({url: '/base/baseCourseSubject', data:params},{errorMessageMode:mode});}
+/** 修改课程学科 PUT /base/baseCourseSubject */
+export async function putBaseBaseCourseSubject(params:API.UpdateBaseCourseSubjectDto
+,mode: ErrorMessageMode = 'modal'){ return defHttp.put<any>
+        ({url: '/base/baseCourseSubject', data:params},{errorMessageMode:mode});}
+/** 删除课程学科 DELETE /base/baseCourseSubject */
+export async function deleteBaseBaseCourseSubject(params:string[],mode: ErrorMessageMode = 'modal'){ return defHttp.delete<any>
+        ({url: '/base/baseCourseSubject', data:params},{errorMessageMode:mode});}
+/** 导出 GET /base/baseCourseSubject/export */
+export async function getBaseCourseSubjectExport(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.download<any>
+        ({url: '/base/baseCourseSubject/export',responseType:'blob', params:params},{errorMessageMode:mode});}
+/** 导入 POST /base/baseCourseSubject/import */
+export async function postBaseCourseSubjectImport(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.post<any>
+        ({url: '/base/baseCourseSubject/import',headers:{'Content-Type':'multipart/form-data'}, data:params},{errorMessageMode:mode});}
+/** 根据id查询课程学科信息 GET /base/baseCourseSubject/info */
+export async function getBaseCourseSubjectInfo(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.get<API.BaseCourseSubjectVo>
+        ({url: '/base/baseCourseSubject/info', params:params},{errorMessageMode:mode});}
+/** 课程学科列表(分页) GET /base/baseCourseSubject/page */
+export async function getBaseCourseSubjectPage(params:any,mode: ErrorMessageMode = 'modal'){ return defHttp.get<API.PageOutput<API.BaseCourseSubjectPageVo>>
+        ({url: '/base/baseCourseSubject/page', params:params},{errorMessageMode:mode});}
+            

+ 4 - 0
src/services/apis/BaseNewStudentController.ts

@@ -26,6 +26,10 @@ export async function deleteStudentBaseNewStudent(params:string[],mode: ErrorMes
 export async function postBaseNewStudentActiveAccount(params:API.ActiveAccountDto
 ,mode: ErrorMessageMode = 'modal'){ return defHttp.post<any>
         ({url: '/student/baseNewStudent/active-account', data:params},{errorMessageMode:mode});}
+/** 修改分班状态 POST /student/baseNewStudent/change-banding-status */
+export async function postBaseNewStudentChangeBandingStatus(params:API.ChangeBandingStatusDto
+,mode: ErrorMessageMode = 'modal'){ return defHttp.post<any>
+        ({url: '/student/baseNewStudent/change-banding-status', data:params},{errorMessageMode:mode});}
 /** 删除新生(保留新生信息,删除基础信息) DELETE /student/baseNewStudent/deleteByUserIds */
 export async function deleteBaseNewStudentDeleteByUserIds(params:API.DeleteNewStudentDto
 ,mode: ErrorMessageMode = 'modal'){ return defHttp.delete<any>

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

@@ -27,6 +27,7 @@ import * as BandingTaskClassController from './BandingTaskClassController';
 import * as BandingTaskMajorConditionController from './BandingTaskMajorConditionController';
 import * as BaseClassCourseController from './BaseClassCourseController';
 import * as BaseClassDynamicsController from './BaseClassDynamicsController';
+import * as BaseCourseSubjectController from './BaseCourseSubjectController';
 import * as CourseSubjectDetailController from './CourseSubjectDetailController';
 import * as OdsZzxxgkjcsjController from './OdsZzxxgkjcsjController';
 import * as WhitelistManagementController from './WhitelistManagementController';
@@ -281,6 +282,8 @@ BandingTaskMajorConditionController,
 BaseClassCourseController,
 /** Base Class Dynamics Controller */
 BaseClassDynamicsController,
+/** Base Course Subject Controller */
+BaseCourseSubjectController,
 /** Course Subject Detail Controller */
 CourseSubjectDetailController,
 /** Ods Zzxxgkjcsj Controller */

+ 134 - 1
src/services/typing.d.ts

@@ -733,6 +733,19 @@ orgId?: string;
 teacherId?: string;
 }
 
+type AddBaseCourseSubjectDto = {
+/** 标签id(base_label) */
+baseLabelId?: string;
+/** 课程学科代码 */
+code?: string;
+/** courseSubjectDetail子表 */
+courseSubjectDetailList?: AddCourseSubjectDetailDto[];
+/** 课程学科名称 */
+name?: string;
+/** 备注 */
+remark?: string;
+}
+
 type AddBaseMajorCategorDto = {
 /** 专业分类代码 */
 code?: string;
@@ -745,6 +758,8 @@ remark?: string;
 }
 
 type AddBaseNewStudentDto = {
+/** 户籍所属市 */
+city?: string;
 /** 身份证号 */
 credentialNumber?: string;
 /** 招生计划id(enrollment_plan) */
@@ -765,10 +780,22 @@ graduateSchool?: string;
 height?: number;
 /** 是否可调配(0:否,1:是) */
 isAdjust?: number;
+/** 是否可以分班(0:否,1:是) */
+isCanBanding?: number;
 /** 手机号 */
 mobile?: string;
+/** 户籍所属区 */
+myarea?: string;
 /** 学生姓名 */
 name?: string;
+/** 缴费状态(已缴费、未缴费) */
+paymnystate?: string;
+/** 应届生、往届生 */
+previous?: string;
+/** 户籍所属省 */
+province?: string;
+/** 备注 */
+remarks?: string;
 /** 成绩 */
 score?: number;
 /** 第二志愿 */
@@ -780,6 +807,8 @@ source?: string;
 status?: number;
 /** 住宿类型 */
 stduyStatus?: string;
+/** 招生季(1春招、2秋招) */
+userdef6?: number;
 /** 体重 */
 weight?: number;
 }
@@ -3783,7 +3812,7 @@ discount?: number;
 inStockNum?: number;
 /** 当前征订任务征订项出库数量 */
 outStockNum?: number;
-/** 实际价格(元) */
+/** 小计(元) */
 price?: number;
 /** 序号 */
 sortCode?: number;
@@ -5819,6 +5848,46 @@ id?: string;
 status?: number;
 }
 
+type BaseCourseSubjectPageVo = {
+/** 标签id(base_label) */
+baseLabelId?: string;
+/** 课程学科代码 */
+code?: string;
+/** 创建时间 */
+createDate?: string;
+/** 创建人 */
+createUserId?: string;
+/** 删除标记 */
+deleteMark?: number;
+/** 有效标志 */
+enabledMark?: number;
+/** 主键 */
+id?: string;
+/** 修改时间 */
+modifyDate?: string;
+/** 修改人 */
+modifyUserId?: string;
+/** 课程学科名称 */
+name?: string;
+/** 备注 */
+remark?: string;
+}
+
+type BaseCourseSubjectVo = {
+/** 标签id(base_label) */
+baseLabelId?: string;
+/** 课程学科代码 */
+code?: string;
+/** courseSubjectDetail子表 */
+courseSubjectDetailList?: CourseSubjectDetailVo[];
+/** 主键 */
+id?: string;
+/** 课程学科名称 */
+name?: string;
+/** 备注 */
+remark?: string;
+}
+
 type BaseDepMajorGradeClassStudenTreeVo = {
 /** children */
 children?: BaseDepMajorGradeClassStudenTreeVo[];
@@ -5897,6 +5966,8 @@ majorGradationIdCn?: string;
 }
 
 type BaseNewStudentPageVo = {
+/** 户籍所属市 */
+city?: string;
 /** 班级名称 */
 className?: string;
 createDate?: string;
@@ -5921,12 +5992,24 @@ height?: number;
 id?: string;
 /** 是否可调配(0:否,1:是) */
 isAdjust?: number;
+/** 是否可以分班(0:否,1:是) */
+isCanBanding?: number;
 /** 是否已报到(1:是 0:否) */
 isReport?: number;
 /** 手机号 */
 mobile?: string;
+/** 户籍所属区 */
+myarea?: string;
 /** 学生姓名 */
 name?: string;
+/** 缴费状态(已缴费、未缴费) */
+paymnystate?: string;
+/** 应届生、往届生 */
+previous?: string;
+/** 户籍所属省 */
+province?: string;
+/** 备注 */
+remarks?: string;
 /** 报到时间 */
 reportTime?: string;
 /** 成绩 */
@@ -5947,6 +6030,8 @@ stduyStatusCn?: string;
 teacherName?: string;
 /** 学生userId */
 userId?: string;
+/** 招生季(1春招、2秋招) */
+userdef6?: number;
 /** 体重 */
 weight?: number;
 }
@@ -8336,6 +8421,15 @@ remark?: string;
 status?: number;
 }
 
+type ChangeBandingStatusDto = {
+/** 主键id */
+id?: string;
+/** 是否可以分班(0:否,1:是) */
+isCanBanding?: number;
+/** 备注 */
+remarks?: string;
+}
+
 type ChangeClassDto = {
 /** 班级id */
 bandingTaskClassId?: string;
@@ -13430,6 +13524,14 @@ total?: number;
 totalPage?: number;
 }
 
+type PageOutput<BaseCourseSubjectPageVo> = {
+currentPage?: number;
+list?: BaseCourseSubjectPageVo[];
+pageSize?: number;
+total?: number;
+totalPage?: number;
+}
+
 type PageOutput<BaseMajorCategorPageVo> = {
 currentPage?: number;
 list?: BaseMajorCategorPageVo[];
@@ -19910,6 +20012,21 @@ orgId?: string;
 teacherId?: string;
 }
 
+type UpdateBaseCourseSubjectDto = {
+/** 标签id(base_label) */
+baseLabelId?: string;
+/** 课程学科代码 */
+code?: string;
+/** courseSubjectDetail子表 */
+courseSubjectDetailList?: AddCourseSubjectDetailDto[];
+/** 主键 */
+id?: string;
+/** 课程学科名称 */
+name?: string;
+/** 备注 */
+remark?: string;
+}
+
 type UpdateBaseMajorCategorDto = {
 /** 专业分类代码 */
 code?: string;
@@ -19924,6 +20041,8 @@ remark?: string;
 }
 
 type UpdateBaseNewStudentDto = {
+/** 户籍所属市 */
+city?: string;
 /** 身份证号 */
 credentialNumber?: string;
 /** 招生计划id(enrollment_plan) */
@@ -19945,10 +20064,22 @@ height?: number;
 id?: string;
 /** 是否可调配(0:否,1:是) */
 isAdjust?: number;
+/** 是否可以分班(0:否,1:是) */
+isCanBanding?: number;
 /** 手机号 */
 mobile?: string;
+/** 户籍所属区 */
+myarea?: string;
 /** 学生姓名 */
 name?: string;
+/** 缴费状态(已缴费、未缴费) */
+paymnystate?: string;
+/** 应届生、往届生 */
+previous?: string;
+/** 户籍所属省 */
+province?: string;
+/** 备注 */
+remarks?: string;
 /** 成绩 */
 score?: number;
 /** 第二志愿 */
@@ -19960,6 +20091,8 @@ source?: string;
 status?: number;
 /** 住宿类型 */
 stduyStatus?: string;
+/** 招生季(1春招、2秋招) */
+userdef6?: number;
 /** 体重 */
 weight?: number;
 }

+ 51 - 0
src/views/educational/basicInformation/components/data.config.ts

@@ -4,6 +4,15 @@ import { getMajorSetOption } from '/@/api/userMagic';
 import { getDataOption } from '/@/api/system/dic';
 import { getBandingTaskClassClassListParam } from '/@/services/apis/BandingTaskClassController';
 export const tableColumns: BasicColumn[] = [
+  {
+    title: '状态',
+    dataIndex: 'isCanBanding',
+    align: 'left',
+    width: 80,
+    customRender: ({ record }) => {
+      return record.isCanBanding === 0 ? '不分班' : '参与分班';
+    },
+  },
   {
     title: '毕业学校',
     dataIndex: 'graduateSchool',
@@ -103,6 +112,48 @@ export const tableColumns: BasicColumn[] = [
     align: 'left',
     width: 120,
   },
+  {
+    title: '分班类型',
+    dataIndex: 'teacherName1',
+    align: 'left',
+    width: 100,
+  },
+  {
+    title: '分班备注',
+    dataIndex: 'remarks',
+    align: 'left',
+    width: 200,
+  },
+  {
+    title: '缴费状态',
+    dataIndex: 'paymnystate',
+    align: 'left',
+    width: 80,
+  },
+  {
+    title: '是否往届生',
+    dataIndex: 'previous',
+    align: 'left',
+    width: 100,
+  },
+  {
+    title: '户籍所属省',
+    dataIndex: 'province',
+    align: 'left',
+    width: 120,
+  },
+  {
+    title: '户籍所属市',
+    dataIndex: 'city',
+    align: 'left',
+    width: 120,
+  },
+  {
+    title: '户籍所属区',
+    dataIndex: 'myarea',
+    align: 'left',
+    width: 120,
+  },
 ];
 
 export const formSchema: FormSchema[] = [

+ 69 - 0
src/views/educational/basicInformation/components/editState.vue

@@ -0,0 +1,69 @@
+<template>
+  <BasicModal
+    @ok="handleSubmit"
+    :destroyOnClose="true"
+    :maskClosable="false"
+    v-bind="$attrs"
+    @register="registerModal"
+    :title="getTitle"
+    :width="1002"
+    showFooter
+  >
+    <BasicForm @register="registerForm" />
+  </BasicModal>
+</template>
+<script setup lang="ts">
+  import { ref, computed, unref } from 'vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, useForm } from '/@/components/Form/index';
+  import { postBaseNewStudentChangeBandingStatus } from '/@/services/apis/BaseNewStudentController';
+
+  const isUpdate = ref(true);
+  const modelRef = ref<Recordable>({});
+  const emit = defineEmits(['success', 'register']);
+  const { createMessage } = useMessage();
+  const [registerForm, { validate, resetFields }] = useForm({
+    labelWidth: 100,
+    schemas: [
+      {
+        label: '备注',
+        field: 'remarks',
+        required: true,
+        colProps: { span: 24 },
+        component: 'Input',
+      },
+    ],
+    showActionButtonGroup: false,
+  });
+
+  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 () => {
+    try {
+      const values = await validate();
+      setModalProps({ confirmLoading: true });
+      const postParams = {
+        id: unref(modelRef).id,
+        isCanBanding: unref(modelRef).isCanBanding === 0 ? 1 : 0,
+        remarks: values.remarks,
+      };
+
+      await postBaseNewStudentChangeBandingStatus(postParams);
+
+      createMessage.success('操作成功');
+      closeModal();
+      emit('success');
+    } finally {
+      setModalProps({ confirmLoading: false });
+    }
+  };
+</script>
+
+<style scoped lang="less"></style>

+ 21 - 4
src/views/educational/basicInformation/index.vue

@@ -14,10 +14,12 @@
     getBaseNewStudentPage,
   } from '/@/services/apis/BaseNewStudentController';
   import { useMessage } from '/@/hooks/web/useMessage';
+  import FormEditState from './components/editState.vue';
 
   const searchInfo = reactive<Recordable>({});
 
   const [registerModal, { openModal }] = useModal();
+  const [registerStateModal, { openModal: openStateModal }] = useModal();
 
   const { createConfirm, createMessage } = useMessage();
 
@@ -41,7 +43,7 @@
     immediate: true,
     canResize: true,
     actionColumn: {
-      width: 120,
+      width: 100,
       title: '操作',
       dataIndex: 'action',
       slots: { customRender: 'action' },
@@ -67,7 +69,14 @@
       },
     });
   };
-
+  const handleChangeState = (record: any) => {
+    openStateModal(true, {
+      isUpdate: true,
+      baseData: {
+        ...record,
+      },
+    });
+  };
   function handleSelect(id) {
     searchInfo.enrollmentPlanId = id;
     reload();
@@ -127,9 +136,9 @@
     <ClassTree class="w-1/3 xl:w-1/4" @select="handleSelect" />
     <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" v-if="false" @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" v-if="false" @click="handelStudenImport">学生导入</a-button>
         <a-button type="primary" @click="handelImport">成绩导入</a-button>
       </template>
       <template #action="{ record }">
@@ -140,12 +149,19 @@
                 label: '编辑',
                 disabled: record.status === 1,
                 onClick: handleEdit.bind(null, record, true),
+                ifShow: false,
+              },
+              {
+                label: record.isCanBanding === 0 ? '参与分班' : '不分班',
+
+                onClick: handleChangeState.bind(null, record),
               },
               {
                 label: '删除',
                 color: 'error',
                 disabled: record.status === 1,
                 onClick: handleDelete.bind(null, record),
+                ifShow: false,
               },
             ]"
           />
@@ -153,6 +169,7 @@
       </template>
     </BasicTable>
     <FormEdit @register="registerModal" @success="handleSuccess" />
+    <FormEditState @register="registerStateModal" @success="handleSuccess" />
     <FormImport @register="registerImportModal" @success="handleSuccess" />
     <StudentImport @register="registerStudentImportModal" @success="handleSuccess" />
     <FormDivision @register="registerDivisionModal" @success="handleSuccess" />

+ 220 - 0
src/views/teachingManager/courseSubject/data.config.ts

@@ -0,0 +1,220 @@
+import { BasicColumn, FormSchema } from '/@/components/Table';
+import { getDataOption } from '/@/api/system/dic';
+
+export const stateOptions = [
+  { label: '草稿', value: 0 },
+  { label: '进行中', value: 1 },
+  { label: '已结束', value: 2 },
+];
+
+export const tableColumns: BasicColumn[] = [
+  {
+    title: '课程学科名称',
+    dataIndex: 'name',
+    align: 'left',
+  },
+  {
+    title: '课程学科代码',
+    dataIndex: 'code',
+    align: 'left',
+    width: 150,
+  },
+  {
+    title: '创建时间',
+    dataIndex: 'createDate',
+    align: 'left',
+    width: 180,
+  },
+];
+
+export const searchFormSchema: FormSchema[] = [
+  {
+    field: 'name',
+    label: '课程学科名称',
+    component: 'Input',
+    colProps: { span: 8 },
+  },
+  {
+    field: 'code',
+    label: '课程学科代码',
+    component: 'Input',
+    colProps: { span: 8 },
+  },
+];
+
+export const formSchema: FormSchema[] = [
+  {
+    label: '课程学科名称',
+    field: 'name',
+    component: 'Input',
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    label: '课程学科代码',
+    field: 'code',
+    component: 'Input',
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    field: 'courseCategory',
+    label: '课程类别',
+    component: 'ApiSelect',
+    componentProps: {
+      getPopupContainer: () => document.body,
+      api: getDataOption,
+      params: { code: 'course_category' },
+    },
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    field: 'courseNature',
+    label: '课程性质',
+    component: 'ApiSelect',
+    componentProps: {
+      getPopupContainer: () => document.body,
+      api: getDataOption,
+      params: { code: 'course_nature' },
+    },
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    field: 'courseAttribute',
+    label: '课程属性',
+    component: 'ApiSelect',
+    componentProps: {
+      getPopupContainer: () => document.body,
+      api: getDataOption,
+      params: { code: 'course_attribute' },
+    },
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    field: 'courseType',
+    label: '课程分类',
+    component: 'ApiSelect',
+    componentProps: {
+      getPopupContainer: () => document.body,
+      api: getDataOption,
+      params: { code: 'course_type' },
+    },
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    field: 'subjectQuality',
+    label: '学科类别',
+    component: 'ApiSelect',
+    componentProps: {
+      getPopupContainer: () => document.body,
+      api: getDataOption,
+      params: { code: 'subject_quality' },
+    },
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    field: 'coreCourse',
+    label: '是否专业核心课',
+    component: 'ApiSelect',
+    componentProps: {
+      getPopupContainer: () => document.body,
+      api: getDataOption,
+      params: { code: 'SFDM' },
+    },
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    label: '理论教学时数',
+    field: 'theoryTime',
+    component: 'InputNumber',
+    colProps: { span: 12 },
+    required: true,
+  },
+  {
+    label: '实践教学时数',
+    field: 'practiceTime',
+    component: 'InputNumber',
+    colProps: { span: 12 },
+    required: true,
+  },
+  {
+    field: 'onlineCourse',
+    label: '是否有线上课程',
+    component: 'ApiSelect',
+    componentProps: {
+      getPopupContainer: () => document.body,
+      api: getDataOption,
+      params: { code: 'SFDM' },
+    },
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    label: '线上课程网址',
+    field: 'courseUrl',
+    component: 'Input',
+    colProps: { span: 12 },
+    required: true,
+  },
+  {
+    field: 'ideologyDemo',
+    label: '是否思政示范课程',
+    component: 'ApiSelect',
+    componentProps: {
+      getPopupContainer: () => document.body,
+      api: getDataOption,
+      params: { code: 'SFDM' },
+    },
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    field: 'courseResource',
+    label: '主要开设虚拟设计主要选用课程资源',
+    component: 'ApiSelect',
+    componentProps: {
+      getPopupContainer: () => document.body,
+      api: getDataOption,
+      params: { code: 'course_resource' },
+    },
+    required: true,
+    colProps: { span: 12 },
+  },
+  {
+    label: '虚拟仿真实训课时数',
+    field: 'emulationTime',
+    component: 'InputNumber',
+    colProps: { span: 12 },
+    required: true,
+  },
+  {
+    label: '主要开设虚拟仿真实训项目名称',
+    field: 'emulationName',
+    component: 'Input',
+    colProps: { span: 12 },
+  },
+  {
+    label: '主要开设实验项目名称',
+    field: 'experimentName',
+    component: 'Input',
+    colProps: { span: 12 },
+  },
+  {
+    label: '主要开设实训项目名称',
+    field: 'trainingName',
+    component: 'Input',
+    colProps: { span: 12 },
+  },
+  {
+    label: '主要开设实习项目名称',
+    field: 'internshipName',
+    component: 'Input',
+    colProps: { span: 12 },
+  },
+];

+ 96 - 0
src/views/teachingManager/courseSubject/edit.vue

@@ -0,0 +1,96 @@
+<template>
+  <BasicModal
+    @ok="handleSubmit"
+    :destroyOnClose="true"
+    :maskClosable="false"
+    v-bind="$attrs"
+    @register="registerModal"
+    :title="getTitle"
+    :width="1002"
+  >
+    <BasicForm @register="registerForm" />
+  </BasicModal>
+</template>
+<script setup lang="ts">
+  import { ref, computed, unref } from 'vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, useForm } from '/@/components/Form/index';
+  import { formSchema } from './data.config';
+
+  import {
+    getBaseCourseSubjectInfo,
+    postBaseBaseCourseSubject,
+    putBaseBaseCourseSubject,
+  } from '/@/services/apis/BaseCourseSubjectController';
+
+  const isUpdate = ref(true);
+  const modelRef = ref<Recordable>({});
+  const emit = defineEmits(['success', 'register']);
+  const { createMessage } = useMessage();
+
+  const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+    labelWidth: 350,
+    layout: 'vertical',
+    schemas: formSchema,
+    wrapperCol: { span: 22 },
+    showActionButtonGroup: false,
+  });
+
+  const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {
+    resetFields();
+    setModalProps({ confirmLoading: false });
+    isUpdate.value = !!data?.isUpdate;
+    modelRef.value = { ...data.baseData };
+
+    if (unref(isUpdate)) {
+      const resData = await getBaseCourseSubjectInfo({ id: data.baseData.id });
+
+      modelRef.value = { ...resData };
+      if (resData.courseSubjectDetailList?.length > 0) {
+        setFieldsValue({
+          ...resData,
+          ...resData.courseSubjectDetailList[0],
+        });
+      } else {
+        setFieldsValue({
+          ...resData,
+        });
+      }
+    }
+  });
+
+  const getTitle = computed(() => (!unref(isUpdate) ? '添加报到计划' : '编辑报到计划'));
+  const handleSubmit = async () => {
+    try {
+      const values = await validate();
+      setModalProps({ confirmLoading: true });
+      const postParams = unref(modelRef);
+
+      const formData = {
+        name: values['name'],
+        code: values['code'],
+        courseSubjectDetailList: [],
+      };
+      delete values['name'];
+      delete values['code'];
+      formData.courseSubjectDetailList.push({ ...values });
+
+      Object.assign(postParams, formData);
+
+      if (unref(isUpdate)) {
+        await putBaseBaseCourseSubject(postParams as API.UpdateBaseCourseSubjectDto);
+      } else {
+        await postBaseBaseCourseSubject(postParams as API.AddBaseCourseSubjectDto);
+      }
+
+      createMessage.success('操作成功');
+      closeModal();
+      emit('success');
+    } finally {
+      setModalProps({ confirmLoading: false });
+    }
+  };
+</script>
+
+<style scoped lang="less"></style>

+ 97 - 0
src/views/teachingManager/courseSubject/index.vue

@@ -0,0 +1,97 @@
+<script setup lang="ts">
+  import { PageWrapper } from '/@/components/Page';
+  import { useTable, BasicTable, TableAction } from '/@/components/Table';
+  import { searchFormSchema, tableColumns } from './data.config';
+  import { useModal } from '/@/components/Modal';
+  import FormEdit from './edit.vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import {
+    deleteBaseBaseCourseSubject,
+    getBaseCourseSubjectPage,
+  } from '/@/services/apis/BaseCourseSubjectController';
+
+  const [registerModal, { openModal }] = useModal();
+  const { createConfirm, createMessage } = useMessage();
+
+  const [registerTable, { reload }] = useTable({
+    api: getBaseCourseSubjectPage,
+    title: '课程学科管理',
+    rowKey: 'id',
+    columns: tableColumns,
+    formConfig: {
+      labelWidth: 150,
+      schemas: searchFormSchema,
+    },
+    useSearchForm: true,
+    showTableSetting: true,
+    bordered: true,
+    immediate: true,
+    canResize: true,
+    actionColumn: {
+      width: 120,
+      title: '操作',
+      dataIndex: 'action',
+      slots: { customRender: 'action' },
+      fixed: 'right',
+    },
+  });
+
+  const handleEdit = (record: any, isUpdate: boolean) => {
+    openModal(true, {
+      isUpdate: isUpdate,
+      baseData: {
+        ...record,
+      },
+    });
+  };
+  const handleDelete = (record: any) => {
+    createConfirm({
+      iconType: 'warning',
+      title: '温馨提醒',
+      content: '是否删除该记录?',
+      onOk: async () => {
+        try {
+          await deleteBaseBaseCourseSubject([record.id]);
+          createMessage.success('删除成功');
+          await reload();
+        } catch (e) {
+          createMessage.error('删除失败');
+        }
+      },
+      okText: '确认',
+      cancelText: '取消',
+    });
+  };
+
+  const handleSuccess = () => {
+    reload();
+  };
+</script>
+
+<template>
+  <PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <a-button type="primary" @click="handleEdit({}, false)">新增</a-button>
+      </template>
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              label: '编辑',
+              onClick: handleEdit.bind(null, record, true),
+            },
+            {
+              label: '删除',
+              color: 'error',
+              onClick: handleDelete.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <FormEdit @register="registerModal" @success="handleSuccess" />
+  </PageWrapper>
+</template>
+
+<style scoped lang="less"></style>