diff --git a/src/api/stuwork/activityinfosub.ts b/src/api/stuwork/activityinfosub.ts index c7a8e8b..97d0745 100644 --- a/src/api/stuwork/activityinfosub.ts +++ b/src/api/stuwork/activityinfosub.ts @@ -47,3 +47,15 @@ export const delObj = (ids: string[]) => { }); }; +/** + * 活动报名 + * @param data 报名信息 { activityInfoId, id (子项目ID), remarks } + */ +export const signUp = (data: any) => { + return request({ + url: '/stuwork/activityinfosub/signUp', + method: 'post', + data + }); +}; + diff --git a/src/api/stuwork/classactivity.ts b/src/api/stuwork/classactivity.ts index af08694..aefae20 100644 --- a/src/api/stuwork/classactivity.ts +++ b/src/api/stuwork/classactivity.ts @@ -60,3 +60,16 @@ export const delObj = (ids: string[]) => { }); }; +/** + * 按学年学期统计各班级举办活动次数 + * @param schoolYear 学年 + * @param schoolTerm 学期 + */ +export const statisticsByYearTerm = (schoolYear?: string, schoolTerm?: string) => { + return request({ + url: '/stuwork/classactivity/statistics', + method: 'get', + params: { schoolYear, schoolTerm } + }); +}; + diff --git a/src/api/stuwork/classfeelog.ts b/src/api/stuwork/classfeelog.ts index 9984064..07aafd0 100644 --- a/src/api/stuwork/classfeelog.ts +++ b/src/api/stuwork/classfeelog.ts @@ -73,3 +73,16 @@ export const exportExcel = (query?: any) => { }); }; +/** + * 班费使用汇总 + * @param schoolYear 学年 + * @param schoolTerm 学期 + */ +export const getSummary = (schoolYear: string, schoolTerm: string) => { + return request({ + url: '/stuwork/classfeelog/summary', + method: 'get', + params: { schoolYear, schoolTerm } + }); +}; + diff --git a/src/api/stuwork/classpaper.ts b/src/api/stuwork/classpaper.ts index f259462..a88bef5 100644 --- a/src/api/stuwork/classpaper.ts +++ b/src/api/stuwork/classpaper.ts @@ -72,3 +72,38 @@ export const addScore = (data: any) => { }); }; +/** + * 生成班级论文上传统计 + * @param data + */ +export const generateSummary = (data: any) => { + return request({ + url: '/stuwork/classpaper/generateSummary', + method: 'get', + params: data + }); +}; + +/** + * 初始化班级论文数据 + * @param data + */ +export const initClassPaper = (data: any) => { + return request({ + url: '/stuwork/classpaper/init', + method: 'post', + data + }); +}; + +/** + * 查询班级论文统计列表 + * @param data + */ +export const getSummaryList = (data: any) => { + return request({ + url: '/stuwork/classpaper/summaryList', + method: 'get', + params: data + }); +}; diff --git a/src/api/stuwork/classsafeedu.ts b/src/api/stuwork/classsafeedu.ts index ba18d11..bec7c73 100644 --- a/src/api/stuwork/classsafeedu.ts +++ b/src/api/stuwork/classsafeedu.ts @@ -73,3 +73,16 @@ export const exportExcel = (query?: any) => { }); }; +/** + * 按学年学期统计各班级安全教育次数 + * @param schoolYear 学年 + * @param schoolTerm 学期 + */ +export const statisticsByYearTerm = (schoolYear?: string, schoolTerm?: string) => { + return request({ + url: '/stuwork/classsafeedu/statistics', + method: 'get', + params: { schoolYear, schoolTerm } + }); +}; + diff --git a/src/api/stuwork/classsummary.ts b/src/api/stuwork/classsummary.ts index a7e0e35..7c77bdb 100644 --- a/src/api/stuwork/classsummary.ts +++ b/src/api/stuwork/classsummary.ts @@ -60,3 +60,26 @@ export const delObj = (ids: string[]) => { }); }; +/** + * 初始化班级总结数据 + * @param data + */ +export const initClassSummary = (data: any) => { + return request({ + url: '/stuwork/classsummary/init', + method: 'post', + data + }); +}; + +/** + * 查询班级总结统计列表 + * @param data + */ +export const getStatisticsList = (data: any) => { + return request({ + url: '/stuwork/classsummary/statisticsList', + method: 'get', + params: data + }); +}; diff --git a/src/api/stuwork/rewardstudent.ts b/src/api/stuwork/rewardstudent.ts index 5ce6aa8..b455089 100644 --- a/src/api/stuwork/rewardstudent.ts +++ b/src/api/stuwork/rewardstudent.ts @@ -25,3 +25,39 @@ export const exportExcel = (query?: any) => { }); }; +/** + * 更新学生评优奖项 + * @param data + */ +export const updateStuAward = (data: any) => { + return request({ + url: '/stuwork/rewardstudent/updateStuAward', + method: 'post', + data + }); +}; + +/** + * 查询学生评优记录 + * @param stuNo 学号 + * @param schoolYear 学年 + * @param schoolTerm 学期 + */ +export const getStuRewardList = (stuNo: string, schoolYear: string, schoolTerm: string) => { + return request({ + url: '/stuwork/rewardstudent/getStuRewardList', + method: 'get', + params: { stuNo, schoolYear, schoolTerm } + }); +}; + +/** + * 获取奖项规则列表 + */ +export const getRewardRuleList = () => { + return request({ + url: '/stuwork/rewardrule/getRewardRule', + method: 'get' + }); +}; + diff --git a/src/api/stuwork/stuassociation.ts b/src/api/stuwork/stuassociation.ts index 8b35261..ea4bc80 100644 --- a/src/api/stuwork/stuassociation.ts +++ b/src/api/stuwork/stuassociation.ts @@ -59,3 +59,13 @@ export const delObj = (ids: string[]) => { }); }; +/** + * 社团统计 - 根据学院统计社团数量 + */ +export const getAssociationStats = () => { + return request({ + url: '/stuwork/stuassociation/stats', + method: 'get' + }); +}; + diff --git a/src/api/stuwork/stucare.ts b/src/api/stuwork/stucare.ts index 4a800a4..f4f747e 100644 --- a/src/api/stuwork/stucare.ts +++ b/src/api/stuwork/stucare.ts @@ -72,3 +72,31 @@ export const updateResult = (data: any) => { }); }; +/** + * 导入心理健康数据 + * @param file + */ +export const importExcel = (file: File) => { + const formData = new FormData(); + formData.append('file', file); + return request({ + url: '/stuwork/stucare/import', + method: 'post', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }); +}; + +/** + * 下载导入模板 + */ +export const downloadTemplate = () => { + return request({ + url: '/stuwork/stucare/importTemplate', + method: 'get', + responseType: 'blob' + }); +}; + diff --git a/src/api/stuwork/stuconduct.ts b/src/api/stuwork/stuconduct.ts index 67293a9..0269a64 100644 --- a/src/api/stuwork/stuconduct.ts +++ b/src/api/stuwork/stuconduct.ts @@ -113,3 +113,16 @@ export const getStuConductYear = (query?: any) => { }); }; +/** + * 发送学期操行考核预警 + * @param schoolYear 学年 + * @param schoolTerm 学期 + */ +export const sendConductWarning = (schoolYear: string, schoolTerm: string) => { + return request({ + url: '/stuwork/stuconduct/sendWarning', + method: 'post', + params: { schoolYear, schoolTerm } + }); +}; + diff --git a/src/api/stuwork/stugraducheck.ts b/src/api/stuwork/stugraducheck.ts index b877870..eb0d20e 100644 --- a/src/api/stuwork/stugraducheck.ts +++ b/src/api/stuwork/stugraducheck.ts @@ -23,3 +23,51 @@ export const fetchList = (query?: any) => { } }) } + +/** + * 学分确认 + * @param graduYear 毕业年份 + */ +export const confirmScore = (graduYear: string) => { + return request({ + url: '/stuwork/stugraducheck/confirmScore', + method: 'get', + params: { graduYear } + }) +} + +/** + * 操行考核确认 + * @param graduYear 毕业年份 + */ +export const confirmConduct = (graduYear: string) => { + return request({ + url: '/stuwork/stugraducheck/confirmConduct', + method: 'get', + params: { graduYear } + }) +} + +/** + * 违纪确认 + * @param graduYear 毕业年份 + */ +export const confirmPunish = (graduYear: string) => { + return request({ + url: '/stuwork/stugraducheck/confirmPunish', + method: 'get', + params: { graduYear } + }) +} + +/** + * 等级工确认 + * @param graduYear 毕业年份 + */ +export const confirmSkill = (graduYear: string) => { + return request({ + url: '/stuwork/stugraducheck/confirmSkill', + method: 'get', + params: { graduYear } + }) +} diff --git a/src/api/stuwork/stuunionleague.ts b/src/api/stuwork/stuunionleague.ts index 5d7ae57..f718f35 100644 --- a/src/api/stuwork/stuunionleague.ts +++ b/src/api/stuwork/stuunionleague.ts @@ -89,3 +89,13 @@ export const exportExcel = (query?: any) => { }); }; +/** + * 获取团员统计信息(全校总数+各学院统计) + */ +export const getStatistics = () => { + return request({ + url: '/stuwork/stuunionleague/statistics', + method: 'get' + }); +}; + diff --git a/src/views/stuwork/activityinfosub/index.vue b/src/views/stuwork/activityinfosub/index.vue index 98cc2fc..0ea70d1 100644 --- a/src/views/stuwork/activityinfosub/index.vue +++ b/src/views/stuwork/activityinfosub/index.vue @@ -126,16 +126,23 @@ 活动说明 - + diff --git a/src/views/stuwork/stuassociation/index.vue b/src/views/stuwork/stuassociation/index.vue index 9ff5aaa..cfd7fc5 100644 --- a/src/views/stuwork/stuassociation/index.vue +++ b/src/views/stuwork/stuassociation/index.vue @@ -64,12 +64,19 @@ 学生社团列表
- 新增 + + 社团统计 + - + + + + + + + + + + + + +
+ + +
+ 学院总数: + {{ statsData.length }} +
+
+ +
+ 社团总数: + {{ totalAssociationCount }} +
+
+
+
+ +
@@ -197,7 +249,7 @@ import { reactive, ref, onMounted, computed, nextTick } from 'vue' import { useRoute } from 'vue-router' import { BasicTableProps, useTable } from "/@/hooks/table"; -import { fetchList, delObj } from "/@/api/stuwork/stuassociation"; +import { fetchList, delObj, getAssociationStats } from "/@/api/stuwork/stuassociation"; import { getDeptList } from "/@/api/basic/basicclass"; import { getDicts } from "/@/api/admin/dict"; import { useMessage, useMessageBox } from "/@/hooks/message"; @@ -205,9 +257,9 @@ import { parseTime } from "/@/utils/formatTime"; import TableColumnControl from '/@/components/TableColumnControl/index.vue' import FormDialog from './form.vue' import MemberDialog from './member.vue' -import { - List, Trophy, OfficeBuilding, User, UserFilled, Calendar, - Phone, Collection, Document, Files, Setting, Menu, Search +import { + List, Trophy, OfficeBuilding, User, UserFilled, Calendar, + Phone, Collection, Document, Files, Setting, Menu, Search, DataAnalysis } from '@element-plus/icons-vue' import { useTableColumnControl } from '/@/hooks/tableColumn' @@ -222,6 +274,11 @@ const showSearch = ref(true) const deptList = ref([]) const typeList = ref([]) +// 社团统计相关 +const statsDialogVisible = ref(false) +const statsLoading = ref(false) +const statsData = ref([]) + // 表格列配置 const tableColumns = [ { prop: 'associationName', label: '社团名称', minWidth: 200 }, @@ -362,6 +419,31 @@ const getTypeDict = async () => { } } +// 社团统计 +const handleStats = async () => { + statsDialogVisible.value = true + statsLoading.value = true + statsData.value = [] + try { + const res = await getAssociationStats() + if (res.data && Array.isArray(res.data)) { + statsData.value = res.data + } else { + statsData.value = [] + } + } catch (err: any) { + useMessage().error(err.msg || '获取统计数据失败') + statsData.value = [] + } finally { + statsLoading.value = false + } +} + +// 社团总数计算 +const totalAssociationCount = computed(() => { + return statsData.value.reduce((sum, item) => sum + (item.associationCount || 0), 0) +}) + // 初始化 onMounted(() => { getDeptListData() @@ -375,5 +457,32 @@ onMounted(() => { diff --git a/src/views/stuwork/stucare/index.vue b/src/views/stuwork/stucare/index.vue index 58d0b8e..34692d5 100644 --- a/src/views/stuwork/stucare/index.vue +++ b/src/views/stuwork/stucare/index.vue @@ -101,12 +101,19 @@ 学生关怀记录列表
- 新增 + + 导入 + - + + + + +
+ + 下载模板 + +
+ + +
+ 将文件拖到此处,或点击上传 +
+ +
+ +
@@ -237,7 +284,7 @@ import { reactive, ref, onMounted, computed, nextTick } from 'vue' import { useRoute } from 'vue-router' import { BasicTableProps, useTable } from "/@/hooks/table"; -import { fetchList, delObj } from "/@/api/stuwork/stucare"; +import { fetchList, delObj, importExcel, downloadTemplate } from "/@/api/stuwork/stucare"; import { getDeptList } from "/@/api/basic/basicclass"; import { queryAllSchoolYear } from "/@/api/basic/basicyear"; import { getClassListByRole } from "/@/api/basic/basicclass"; @@ -246,7 +293,7 @@ import { useMessage, useMessageBox } from "/@/hooks/message"; import TableColumnControl from '/@/components/TableColumnControl/index.vue' import FormDialog from './form.vue' import ResultDialog from './result.vue' -import { List, Calendar, Clock, OfficeBuilding, Grid, Avatar, UserFilled, Phone, Star, Warning, CircleCheck, Setting, Menu, Search, Document } from '@element-plus/icons-vue' +import { List, Calendar, Clock, OfficeBuilding, Grid, Avatar, UserFilled, Phone, Star, Warning, CircleCheck, Setting, Menu, Search, Document, UploadFilled } from '@element-plus/icons-vue' import { useTableColumnControl } from '/@/hooks/tableColumn' @@ -256,12 +303,16 @@ const formDialogRef = ref() const resultDialogRef = ref() const searchFormRef = ref() const columnControlRef = ref() +const uploadRef = ref() const showSearch = ref(true) const schoolYearList = ref([]) const schoolTermList = ref([]) const deptList = ref([]) const classList = ref([]) const careTypeList = ref([]) +const importDialogVisible = ref(false) +const importFile = ref(null) +const importLoading = ref(false) // 表格列配置 const tableColumns = [ @@ -457,6 +508,57 @@ const getCareTypeDict = async () => { } } +// 导入 +const handleImport = () => { + importDialogVisible.value = true + importFile.value = null + uploadRef.value?.clearFiles() +} + +// 下载模板 +const handleDownloadTemplate = async () => { + try { + const res = await downloadTemplate() + const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }) + const url = window.URL.createObjectURL(blob) + const link = document.createElement('a') + link.href = url + link.download = '心理健康导入模板.xlsx' + document.body.appendChild(link) + link.click() + window.URL.revokeObjectURL(url) + document.body.removeChild(link) + useMessage().success('模板下载成功') + } catch (error) { + useMessage().error('模板下载失败') + } +} + +// 文件变化 +const handleFileChange = (file: any) => { + importFile.value = file.raw +} + +// 提交导入 +const handleImportSubmit = async () => { + if (!importFile.value) { + useMessage().warning('请选择要导入的文件') + return + } + + importLoading.value = true + try { + await importExcel(importFile.value) + useMessage().success('导入成功') + importDialogVisible.value = false + getDataList() + } catch (err: any) { + useMessage().error(err.msg || '导入失败') + } finally { + importLoading.value = false + } +} + // 初始化 onMounted(() => { getSchoolYearList() diff --git a/src/views/stuwork/stuconduct/indexTerm.vue b/src/views/stuwork/stuconduct/indexTerm.vue index f06e93f..737a62a 100644 --- a/src/views/stuwork/stuconduct/indexTerm.vue +++ b/src/views/stuwork/stuconduct/indexTerm.vue @@ -51,6 +51,7 @@ 查询 重置 + 发送预警 @@ -159,11 +160,11 @@