diff --git a/src/api/recruit/recruitstudentplan.ts b/src/api/recruit/recruitstudentplan.ts index 57591b2..9b247b5 100644 --- a/src/api/recruit/recruitstudentplan.ts +++ b/src/api/recruit/recruitstudentplan.ts @@ -42,7 +42,7 @@ export const getObj = (id: string | number) => { */ export const delObj = (id: string | number) => { return request({ - url: `/recruit/recruitstudentplan/deletById`, + url: `/recruit/recruitstudentplan/deleteById`, method: 'post', data: { id :id}, }); diff --git a/src/api/stuwork/classassets.ts b/src/api/stuwork/classassets.ts new file mode 100644 index 0000000..eb7fdc8 --- /dev/null +++ b/src/api/stuwork/classassets.ts @@ -0,0 +1,14 @@ +import request from '/@/utils/request'; + +/** + * 教室公物编辑及门锁密码 + * 接口文档:POST /api/stuwork/classassets/edit + * @param data 教室公物数据(包含 buildingNo, deptName, classCode, position, platformType, tyType, tvType, chairCnt, tableCnt, remarks, password 等) + */ +export const editAssets = (data: any) => { + return request({ + url: '/stuwork/classassets/edit', + method: 'post', + data, + }); +}; diff --git a/src/api/stuwork/dormsignrecord.ts b/src/api/stuwork/dormsignrecord.ts new file mode 100644 index 0000000..ac5bf95 --- /dev/null +++ b/src/api/stuwork/dormsignrecord.ts @@ -0,0 +1,35 @@ +import request from '/@/utils/request'; + +/** + * 分页查询宿舍点名列表 + * @param query + */ +export const fetchList = (query?: any) => { + return request({ + url: '/stuwork/dormsignrecord/page', + method: 'get', + params: query + }); +}; + +/** + * 新增宿舍点名 + * @param data + */ +export const addObj = (data: any) => { + return request({ + url: '/stuwork/dormsignrecord', + method: 'post', + data + }); +}; + +/** + * 初始化宿舍学生信息用于考勤 + */ +export const initDormStuInfoForAttendance = () => { + return request({ + url: '/stuwork/dormsignrecord/task/initDormStuInfoForAttendance', + method: 'get' + }); +}; diff --git a/src/api/stuwork/filemanager.ts b/src/api/stuwork/filemanager.ts new file mode 100644 index 0000000..1b5321e --- /dev/null +++ b/src/api/stuwork/filemanager.ts @@ -0,0 +1,85 @@ +import request from '/@/utils/request'; + +/** + * 文件列表(分页) + * @param query + */ +export const fetchList = (query?: any) => { + return request({ + url: '/stuwork/filemanager/page', + method: 'get', + params: query + }); +}; + +/** + * 文件列表(不分页,按层级) + * @param query + */ +export const getList = (query?: any) => { + return request({ + url: '/stuwork/filemanager/list', + method: 'get', + params: query + }); +}; + +/** + * 文件详情 + * @param id + */ +export const getDetail = (id: string) => { + return request({ + url: '/stuwork/filemanager/detail', + method: 'get', + params: { id } + }); +}; + +/** + * 新增文件 + * @param data + */ +export const addObj = (data: any) => { + return request({ + url: '/stuwork/filemanager', + method: 'post', + data + }); +}; + +/** + * 编辑文件 + * @param data + */ +export const editObj = (data: any) => { + return request({ + url: '/stuwork/filemanager/edit', + method: 'post', + data + }); +}; + +/** + * 编辑文件夹 + * @param data + */ +export const editFile = (data: any) => { + return request({ + url: '/stuwork/filemanager/editFile', + method: 'post', + data + }); +}; + +/** + * 删除文件 + * @param ids + */ +export const delObj = (ids: string[]) => { + return request({ + url: '/stuwork/filemanager/delete', + method: 'post', + data: ids + }); +}; diff --git a/src/api/stuwork/moralplan.ts b/src/api/stuwork/moralplan.ts new file mode 100644 index 0000000..bf135b2 --- /dev/null +++ b/src/api/stuwork/moralplan.ts @@ -0,0 +1,61 @@ +import request from '/@/utils/request'; + +/** + * 分页查询德育计划列表 + * @param query + */ +export const fetchList = (query?: any) => { + return request({ + url: '/stuwork/moralplan/page', + method: 'get', + params: query + }); +}; + +/** + * 新增德育计划 + * @param data + */ +export const addObj = (data: any) => { + return request({ + url: '/stuwork/moralplan', + method: 'post', + data + }); +}; + +/** + * 获取详情 + * @param id + */ +export const getDetail = (id: string) => { + return request({ + url: '/stuwork/moralplan/detail', + method: 'get', + params: { id } + }); +}; + +/** + * 编辑德育计划 + * @param data + */ +export const editObj = (data: any) => { + return request({ + url: '/stuwork/moralplan/edit', + method: 'post', + data + }); +}; + +/** + * 删除德育计划 + * @param ids + */ +export const delObj = (ids: string[]) => { + return request({ + url: '/stuwork/moralplan/delete', + method: 'post', + data: ids + }); +}; diff --git a/src/api/stuwork/teachclassroomassign.ts b/src/api/stuwork/teachclassroomassign.ts index 75275ad..23e9319 100644 --- a/src/api/stuwork/teachclassroomassign.ts +++ b/src/api/stuwork/teachclassroomassign.ts @@ -25,3 +25,16 @@ export const addClassRoomAssign = (data: { buildingNo?: string | number; positio }); }; +/** + * 取消教室安排 + * 接口文档:POST /api/stuwork/teachclassroomassign/delClassRoomAssign + * @param data 教室基础数据(包含 id, classCode, position 等) + */ +export const delClassRoomAssign = (data: any) => { + return request({ + url: '/stuwork/teachclassroomassign/delClassRoomAssign', + method: 'post', + data, + }); +}; + diff --git a/src/api/stuwork/termactivity.ts b/src/api/stuwork/termactivity.ts new file mode 100644 index 0000000..e7d0bf6 --- /dev/null +++ b/src/api/stuwork/termactivity.ts @@ -0,0 +1,61 @@ +import request from '/@/utils/request'; + +/** + * 分页查询学期活动列表 + * @param query + */ +export const fetchList = (query?: any) => { + return request({ + url: '/stuwork/termactivity/page', + method: 'get', + params: query + }); +}; + +/** + * 获取学期活动详情 + * @param id + */ +export const getDetail = (id: string) => { + return request({ + url: '/stuwork/termactivity/detail', + method: 'get', + params: { id } + }); +}; + +/** + * 新增学期活动 + * @param data + */ +export const addObj = (data: any) => { + return request({ + url: '/stuwork/termactivity', + method: 'post', + data + }); +}; + +/** + * 编辑学期活动 + * @param data + */ +export const editObj = (data: any) => { + return request({ + url: '/stuwork/termactivity/edit', + method: 'post', + data + }); +}; + +/** + * 删除学期活动 + * @param ids + */ +export const delObj = (ids: string[]) => { + return request({ + url: '/stuwork/termactivity/delete', + method: 'post', + data: ids + }); +}; diff --git a/src/hooks/tableColumn.ts b/src/hooks/tableColumn.ts index 324ec98..23664a0 100644 --- a/src/hooks/tableColumn.ts +++ b/src/hooks/tableColumn.ts @@ -155,6 +155,10 @@ export function useTableColumnControl( * 根据 visibleColumns 和 columnOrder 计算最终显示的列 */ const visibleColumnsSorted = computed(() => { + // 如果 visibleColumns 为空,显示所有列(初始化时) + if (visibleColumns.value.length === 0) { + return tableColumns.filter(col => !col.alwaysShow && !col.fixed) + } // 过滤出可见的列 const columns = tableColumns.filter(col => { const key = col.prop || col.label || '' diff --git a/src/views/professional/common/import-teacher-other-info.vue b/src/views/professional/common/import-teacher-other-info.vue index 550a8b5..ef7514a 100644 --- a/src/views/professional/common/import-teacher-other-info.vue +++ b/src/views/professional/common/import-teacher-other-info.vue @@ -15,6 +15,7 @@ + + diff --git a/src/views/stuwork/classroombase/index.vue b/src/views/stuwork/classroombase/index.vue index 08d1237..4f3de52 100644 --- a/src/views/stuwork/classroombase/index.vue +++ b/src/views/stuwork/classroombase/index.vue @@ -181,19 +181,43 @@ - + @@ -226,7 +254,10 @@ import { getDicts } from "/@/api/admin/dict"; import { useMessage, useMessageBox } from "/@/hooks/message"; import TableColumnControl from '/@/components/TableColumnControl/index.vue' import ArrangeDialog from './arrange.vue' -import { List, OfficeBuilding, CircleCheck, Location, UserFilled, Collection, Setting, Menu, Calendar, Search, Document } from '@element-plus/icons-vue' +import AssetsDialog from './assets.vue' +import PasswordDialog from './password.vue' +import { delClassRoomAssign } from '/@/api/stuwork/teachclassroomassign' +import { List, OfficeBuilding, CircleCheck, Location, UserFilled, Collection, Setting, Menu, Calendar, Search, Document, Close, Lock } from '@element-plus/icons-vue' import { useTableColumnControl } from '/@/hooks/tableColumn' // 定义变量内容 @@ -240,6 +271,8 @@ const platformTypeList = ref([]) const tyTypeList = ref([]) const tvTypeList = ref([]) const arrangeDialogRef = ref() +const assetsDialogRef = ref() +const passwordDialogRef = ref() // 表格列配置 const tableColumns = [ @@ -416,6 +449,33 @@ const handleArrange = (row: any) => { arrangeDialogRef.value?.openDialog(row) } +// 取消教室安排 +const handleCancelArrange = async (row: any) => { + const { confirm } = useMessageBox() + try { + await confirm('确定要取消教室安排吗?') + await delClassRoomAssign(row) + useMessage().success('取消成功') + getDataList() + } catch (err: any) { + if (err !== 'cancel') { + if (!err?._messageShown) { + useMessage().error(err?.msg || '取消失败') + } + } + } +} + +// 教室公物 +const handleAssets = (row: any) => { + assetsDialogRef.value?.openDialog(row) +} + +// 门锁密码 +const handlePassword = (row: any) => { + passwordDialogRef.value?.openDialog(row) +} + // 获取系部列表 const getDeptListData = async () => { try { diff --git a/src/views/stuwork/classroombase/password.vue b/src/views/stuwork/classroombase/password.vue new file mode 100644 index 0000000..1492f15 --- /dev/null +++ b/src/views/stuwork/classroombase/password.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/src/views/stuwork/classroomhygienemonthly/index.vue b/src/views/stuwork/classroomhygienemonthly/index.vue index bb4f487..ceb349e 100644 --- a/src/views/stuwork/classroomhygienemonthly/index.vue +++ b/src/views/stuwork/classroomhygienemonthly/index.vue @@ -495,7 +495,9 @@ const confirmCheck = async () => { checkDialogVisible.value = false getDataList() } catch (err: any) { - useMessage().error(err.msg || '考核失败') + if (!err?._messageShown) { + useMessage().error(err?.msg || '考核失败') + } } } @@ -512,7 +514,9 @@ const handleDelete = async (ids: string[]) => { getDataList() useMessage().success('删除成功') } catch (err: any) { - useMessage().error(err.msg || '删除失败') + if (!err?._messageShown) { + useMessage().error(err?.msg || '删除失败') + } } } diff --git a/src/views/stuwork/dormsignrecord/form.vue b/src/views/stuwork/dormsignrecord/form.vue new file mode 100644 index 0000000..0f0c04b --- /dev/null +++ b/src/views/stuwork/dormsignrecord/form.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/src/views/stuwork/dormsignrecord/index.vue b/src/views/stuwork/dormsignrecord/index.vue new file mode 100644 index 0000000..0ae4a72 --- /dev/null +++ b/src/views/stuwork/dormsignrecord/index.vue @@ -0,0 +1,367 @@ + + + + + diff --git a/src/views/stuwork/entrancerule/form.vue b/src/views/stuwork/entrancerule/form.vue index 86b4038..9e15a34 100644 --- a/src/views/stuwork/entrancerule/form.vue +++ b/src/views/stuwork/entrancerule/form.vue @@ -184,11 +184,24 @@ const TimeRuleTableComponent = defineComponent({ default: ({ row }: any) => { const timeList = getTimeList(row) return h('div', { class: 'time-slots-container' }, - timeList.map((timeSlot: any, index: number) => - h('div', { key: index, class: 'time-slot-item' }, [ + timeList.map((timeSlot: any, index: number) => { + // 通过数组索引更新,确保响应式 + const updateStartTime = (val: string) => { + const list = getTimeList(row) + if (list[index]) { + list[index].startTime = val || '' + } + } + const updateEndTime = (val: string) => { + const list = getTimeList(row) + if (list[index]) { + list[index].endTime = val || '' + } + } + return h('div', { key: index, class: 'time-slot-item' }, [ h(ElTimePicker, { - modelValue: timeSlot.startTime, - 'onUpdate:modelValue': (val: string) => { timeSlot.startTime = val }, + modelValue: timeSlot.startTime || '', + 'onUpdate:modelValue': updateStartTime, format: 'HH:mm', valueFormat: 'HH:mm', placeholder: '开始时间', @@ -196,8 +209,8 @@ const TimeRuleTableComponent = defineComponent({ }), h('span', { style: { margin: '0 10px' } }, '至'), h(ElTimePicker, { - modelValue: timeSlot.endTime, - 'onUpdate:modelValue': (val: string) => { timeSlot.endTime = val }, + modelValue: timeSlot.endTime || '', + 'onUpdate:modelValue': updateEndTime, format: 'HH:mm', valueFormat: 'HH:mm', placeholder: '结束时间', @@ -213,7 +226,7 @@ const TimeRuleTableComponent = defineComponent({ style: { marginLeft: '10px' } }) ]) - ) + }) ) } }), diff --git a/src/views/stuwork/filemanager/folder.vue b/src/views/stuwork/filemanager/folder.vue new file mode 100644 index 0000000..5f61677 --- /dev/null +++ b/src/views/stuwork/filemanager/folder.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/views/stuwork/filemanager/form.vue b/src/views/stuwork/filemanager/form.vue new file mode 100644 index 0000000..098bcee --- /dev/null +++ b/src/views/stuwork/filemanager/form.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/src/views/stuwork/filemanager/index.vue b/src/views/stuwork/filemanager/index.vue new file mode 100644 index 0000000..484de8c --- /dev/null +++ b/src/views/stuwork/filemanager/index.vue @@ -0,0 +1,345 @@ + + + + + diff --git a/src/views/stuwork/moralplan/form.vue b/src/views/stuwork/moralplan/form.vue new file mode 100644 index 0000000..b40aea3 --- /dev/null +++ b/src/views/stuwork/moralplan/form.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/src/views/stuwork/moralplan/index.vue b/src/views/stuwork/moralplan/index.vue new file mode 100644 index 0000000..307952e --- /dev/null +++ b/src/views/stuwork/moralplan/index.vue @@ -0,0 +1,356 @@ + + + + + diff --git a/src/views/stuwork/stuturnover/form.vue b/src/views/stuwork/stuturnover/form.vue index 32bb345..fc07615 100644 --- a/src/views/stuwork/stuturnover/form.vue +++ b/src/views/stuwork/stuturnover/form.vue @@ -10,7 +10,8 @@ :model="form" :rules="dataRules" label-width="120px" - v-loading="loading"> + v-loading="loading" + :key="form.turnoverType"> @@ -47,7 +48,7 @@ - + - + + style="width: 100%" + @change="handleTurnoverTypeChange"> { return `已选择 ${form.selectedStudents.length} 名学生` }) -// 定义校验规则 -const dataRules = { - schoolYear: [ - { required: true, message: '请选择学年', trigger: 'change' } - ], - schoolTerm: [ - { required: true, message: '请选择学期', trigger: 'change' } - ], - oldClassCode: [ - { required: true, message: '请选择原班级', trigger: 'change' } - ], - newClassCode: [ - { required: true, message: '请选择现班级', trigger: 'change' } - ], - turnoverType: [ - { required: true, message: '请选择异动类型', trigger: 'change' } - ], - turnoverDate: [ - { required: true, message: '请选择异动时间', trigger: 'change' } - ], - selectedStudents: [ - { required: true, message: '请至少选择一个学生', trigger: 'change', type: 'array', min: 1 } - ] -} +// 判断是否为退学类型 +const isDropoutType = computed(() => { + if (!form.turnoverType) return false + // 查找异动类型字典中 label 包含"退学"的项 + const dropoutItem = turnoverTypeList.value.find((item: any) => { + const label = item.label || item.dictLabel || item.name || '' + return label.includes('退学') + }) + if (dropoutItem) { + return dropoutItem.value === form.turnoverType || dropoutItem.dictValue === form.turnoverType || dropoutItem.code === form.turnoverType + } + return false +}) + +// 定义校验规则(动态) +const dataRules = computed(() => { + const rules: any = { + schoolYear: [ + { required: true, message: '请选择学年', trigger: 'change' } + ], + schoolTerm: [ + { required: true, message: '请选择学期', trigger: 'change' } + ], + turnoverType: [ + { required: true, message: '请选择异动类型', trigger: 'change' } + ], + turnoverDate: [ + { required: true, message: '请选择异动时间', trigger: 'change' } + ], + selectedStudents: [ + { required: true, message: '请至少选择一个学生', trigger: 'change', type: 'array', min: 1 } + ] + } + + // 如果不是退学类型,原班级和现班级为必填 + if (!isDropoutType.value) { + rules.oldClassCode = [ + { required: true, message: '请选择原班级', trigger: 'change' } + ] + rules.newClassCode = [ + { required: true, message: '请选择现班级', trigger: 'change' } + ] + } + + return rules +}) // 原班级变化时,更新学生搜索条件 const handleOldClassChange = () => { @@ -331,14 +355,30 @@ const handleOldClassChange = () => { form.selectedStudents = [] } +// 异动类型变化时处理 +const handleTurnoverTypeChange = () => { + // 如果切换为退学类型,清空原班级和现班级 + if (isDropoutType.value) { + form.oldClassCode = '' + form.newClassCode = '' + // 清空已选学生(因为退学不需要原班级,学生选择逻辑会受影响) + form.selectedStudents = [] + } + // 重新验证表单 + nextTick(() => { + dataFormRef.value?.clearValidate(['oldClassCode', 'newClassCode']) + }) +} + // 打开学生选择弹窗 const openStudentDialog = () => { - if (!form.oldClassCode) { + // 如果是退学类型,不需要原班级 + if (!isDropoutType.value && !form.oldClassCode) { useMessage().warning('请先选择原班级') return } studentDialogVisible.value = true - studentSearchForm.classCode = form.oldClassCode + studentSearchForm.classCode = form.oldClassCode || '' studentSearchForm.classNo = '' studentSearchForm.stuNo = '' studentSearchForm.realName = '' @@ -354,10 +394,13 @@ const handleStudentSearch = async () => { const params: any = { current: studentPagination.currentPage, size: studentPagination.pageSize, - classCode: studentSearchForm.classCode || undefined, stuNo: studentSearchForm.stuNo || undefined, realName: studentSearchForm.realName || undefined } + // 如果不是退学类型且有原班级,才添加 classCode 条件 + if (!isDropoutType.value && studentSearchForm.classCode) { + params.classCode = studentSearchForm.classCode + } const res = await getStudentList(params) if (res.data && res.data.records) { studentTableData.value = res.data.records @@ -494,8 +537,6 @@ const onSubmit = async () => { const submitData: any = { schoolYear: form.schoolYear, schoolTerm: form.schoolTerm, - oldClassCode: form.oldClassCode, - newClassCode: form.newClassCode, turnoverType: form.turnoverType, turnYear: form.turnYear || '', turnoverDate: form.turnoverDate, @@ -506,6 +547,12 @@ const onSubmit = async () => { })) } + // 如果不是退学类型,才添加原班级和现班级 + if (!isDropoutType.value) { + submitData.oldClassCode = form.oldClassCode + submitData.newClassCode = form.newClassCode + } + // 编辑时需要包含id和单个学生信息 if (operType.value === 'edit') { submitData.id = form.id diff --git a/src/views/stuwork/termactivity/form.vue b/src/views/stuwork/termactivity/form.vue new file mode 100644 index 0000000..fff476a --- /dev/null +++ b/src/views/stuwork/termactivity/form.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/src/views/stuwork/termactivity/index.vue b/src/views/stuwork/termactivity/index.vue new file mode 100644 index 0000000..e3e21c2 --- /dev/null +++ b/src/views/stuwork/termactivity/index.vue @@ -0,0 +1,366 @@ + + + + +