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 @@
活动说明
-
+
操作
-
+ 报名
+
+
删除
@@ -162,7 +169,7 @@
diff --git a/src/views/stuwork/classsafeedu/index.vue b/src/views/stuwork/classsafeedu/index.vue
index 20f94fd..64b901f 100644
--- a/src/views/stuwork/classsafeedu/index.vue
+++ b/src/views/stuwork/classsafeedu/index.vue
@@ -81,16 +81,22 @@
安全教育列表
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 @@
学生社团列表
@@ -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 @@