diff --git a/public/img/bg/003.PNG b/public/img/bg/003.PNG new file mode 100644 index 0000000..5f55b78 Binary files /dev/null and b/public/img/bg/003.PNG differ diff --git a/public/img/bg/12345.jpg b/public/img/bg/12345.jpg new file mode 100644 index 0000000..90598ac Binary files /dev/null and b/public/img/bg/12345.jpg differ diff --git a/public/img/bg/bf.jpg b/public/img/bg/bf.jpg new file mode 100644 index 0000000..e13ff12 Binary files /dev/null and b/public/img/bg/bf.jpg differ diff --git a/public/img/bg/bfnew.jpg b/public/img/bg/bfnew.jpg new file mode 100644 index 0000000..4dad858 Binary files /dev/null and b/public/img/bg/bfnew.jpg differ diff --git a/public/img/bg/cglz.jpg b/public/img/bg/cglz.jpg new file mode 100644 index 0000000..13d775c Binary files /dev/null and b/public/img/bg/cglz.jpg differ diff --git a/public/img/bg/cgsq.jpg b/public/img/bg/cgsq.jpg new file mode 100644 index 0000000..95c355c Binary files /dev/null and b/public/img/bg/cgsq.jpg differ diff --git a/public/img/bg/city.png b/public/img/bg/city.png new file mode 100644 index 0000000..5cc24f2 Binary files /dev/null and b/public/img/bg/city.png differ diff --git a/public/img/bg/cloud.jpg b/public/img/bg/cloud.jpg new file mode 100644 index 0000000..151a000 Binary files /dev/null and b/public/img/bg/cloud.jpg differ diff --git a/public/img/bg/czLogin.png b/public/img/bg/czLogin.png new file mode 100644 index 0000000..89b6367 Binary files /dev/null and b/public/img/bg/czLogin.png differ diff --git a/public/img/bg/db.jpg b/public/img/bg/db.jpg new file mode 100644 index 0000000..87b40bd Binary files /dev/null and b/public/img/bg/db.jpg differ diff --git a/public/img/bg/inExam.jpg b/public/img/bg/inExam.jpg new file mode 100644 index 0000000..6faadf5 Binary files /dev/null and b/public/img/bg/inExam.jpg differ diff --git a/public/img/bg/lyys.jpg b/public/img/bg/lyys.jpg new file mode 100644 index 0000000..0d89d28 Binary files /dev/null and b/public/img/bg/lyys.jpg differ diff --git a/public/img/bg/outExam.jpg b/public/img/bg/outExam.jpg new file mode 100644 index 0000000..1381df7 Binary files /dev/null and b/public/img/bg/outExam.jpg differ diff --git a/public/img/bg/star-squashed.jpg b/public/img/bg/star-squashed.jpg new file mode 100644 index 0000000..2176e39 Binary files /dev/null and b/public/img/bg/star-squashed.jpg differ diff --git a/public/img/bg/ten_logo.jpg b/public/img/bg/ten_logo.jpg new file mode 100644 index 0000000..92fffe0 Binary files /dev/null and b/public/img/bg/ten_logo.jpg differ diff --git a/public/img/bg/ten_logo.png b/public/img/bg/ten_logo.png new file mode 100644 index 0000000..87cd35e Binary files /dev/null and b/public/img/bg/ten_logo.png differ diff --git a/public/img/bg/userphotobg.jpg b/public/img/bg/userphotobg.jpg new file mode 100644 index 0000000..c7a18eb Binary files /dev/null and b/public/img/bg/userphotobg.jpg differ diff --git a/public/img/bg/ybf.jpg b/public/img/bg/ybf.jpg new file mode 100644 index 0000000..77c2d95 Binary files /dev/null and b/public/img/bg/ybf.jpg differ diff --git a/public/img/bg/zss.jpeg b/public/img/bg/zss.jpeg new file mode 100644 index 0000000..5f11431 Binary files /dev/null and b/public/img/bg/zss.jpeg differ diff --git a/public/img/chartImg/1.jpeg b/public/img/chartImg/1.jpeg new file mode 100644 index 0000000..2928053 Binary files /dev/null and b/public/img/chartImg/1.jpeg differ diff --git a/public/img/chartImg/2.jpeg b/public/img/chartImg/2.jpeg new file mode 100644 index 0000000..a31cb96 Binary files /dev/null and b/public/img/chartImg/2.jpeg differ diff --git a/public/img/chartImg/3.jpeg b/public/img/chartImg/3.jpeg new file mode 100644 index 0000000..8afb66b Binary files /dev/null and b/public/img/chartImg/3.jpeg differ diff --git a/public/img/chartImg/4.jpeg b/public/img/chartImg/4.jpeg new file mode 100644 index 0000000..4eafdc8 Binary files /dev/null and b/public/img/chartImg/4.jpeg differ diff --git a/public/img/chartImg/5.jpeg b/public/img/chartImg/5.jpeg new file mode 100644 index 0000000..b6de0f2 Binary files /dev/null and b/public/img/chartImg/5.jpeg differ diff --git a/public/img/chartImg/6.jpeg b/public/img/chartImg/6.jpeg new file mode 100644 index 0000000..3a43115 Binary files /dev/null and b/public/img/chartImg/6.jpeg differ diff --git a/public/img/chartImg/7.jpeg b/public/img/chartImg/7.jpeg new file mode 100644 index 0000000..4cfba24 Binary files /dev/null and b/public/img/chartImg/7.jpeg differ diff --git a/public/img/chartImg/8.jpeg b/public/img/chartImg/8.jpeg new file mode 100644 index 0000000..e8f6d8f Binary files /dev/null and b/public/img/chartImg/8.jpeg differ diff --git a/public/img/chartImg/9.jpeg b/public/img/chartImg/9.jpeg new file mode 100644 index 0000000..188ee3c Binary files /dev/null and b/public/img/chartImg/9.jpeg differ diff --git a/public/img/default/no_pic.png b/public/img/default/no_pic.png new file mode 100644 index 0000000..b8e8b80 Binary files /dev/null and b/public/img/default/no_pic.png differ diff --git a/public/img/dormRoom/6.png b/public/img/dormRoom/6.png new file mode 100644 index 0000000..20ef28f Binary files /dev/null and b/public/img/dormRoom/6.png differ diff --git a/public/img/enroll/app-upload.jpg b/public/img/enroll/app-upload.jpg new file mode 100644 index 0000000..4a9040f Binary files /dev/null and b/public/img/enroll/app-upload.jpg differ diff --git a/public/img/enroll/certificate.png b/public/img/enroll/certificate.png new file mode 100644 index 0000000..5beb7d7 Binary files /dev/null and b/public/img/enroll/certificate.png differ diff --git a/public/img/enroll/courseimg/anjian-head-bg.jpg b/public/img/enroll/courseimg/anjian-head-bg.jpg new file mode 100644 index 0000000..c352763 Binary files /dev/null and b/public/img/enroll/courseimg/anjian-head-bg.jpg differ diff --git a/public/img/enroll/courseimg/anjian-list-submenu-bg.jpg b/public/img/enroll/courseimg/anjian-list-submenu-bg.jpg new file mode 100644 index 0000000..18d7549 Binary files /dev/null and b/public/img/enroll/courseimg/anjian-list-submenu-bg.jpg differ diff --git a/public/img/enroll/courseimg/list-ico-1.png b/public/img/enroll/courseimg/list-ico-1.png new file mode 100644 index 0000000..2df12fa Binary files /dev/null and b/public/img/enroll/courseimg/list-ico-1.png differ diff --git a/public/img/enroll/courseimg/list-ico-2.png b/public/img/enroll/courseimg/list-ico-2.png new file mode 100644 index 0000000..a8278ee Binary files /dev/null and b/public/img/enroll/courseimg/list-ico-2.png differ diff --git a/public/img/enroll/courseimg/list-logo.png b/public/img/enroll/courseimg/list-logo.png new file mode 100644 index 0000000..e4d728d Binary files /dev/null and b/public/img/enroll/courseimg/list-logo.png differ diff --git a/public/img/enroll/courseimg/page-ico-a.jpg b/public/img/enroll/courseimg/page-ico-a.jpg new file mode 100644 index 0000000..aa6e99c Binary files /dev/null and b/public/img/enroll/courseimg/page-ico-a.jpg differ diff --git a/public/img/enroll/courseimg/page-ico-b.jpg b/public/img/enroll/courseimg/page-ico-b.jpg new file mode 100644 index 0000000..0fcd173 Binary files /dev/null and b/public/img/enroll/courseimg/page-ico-b.jpg differ diff --git a/public/img/enroll/courseimg/radia-2.png b/public/img/enroll/courseimg/radia-2.png new file mode 100644 index 0000000..3dbf03c Binary files /dev/null and b/public/img/enroll/courseimg/radia-2.png differ diff --git a/public/img/enroll/login-bg.jpg b/public/img/enroll/login-bg.jpg new file mode 100644 index 0000000..5bd1360 Binary files /dev/null and b/public/img/enroll/login-bg.jpg differ diff --git a/public/img/enroll/login-title.png b/public/img/enroll/login-title.png new file mode 100644 index 0000000..20eb663 Binary files /dev/null and b/public/img/enroll/login-title.png differ diff --git a/public/img/enroll/logo.png b/public/img/enroll/logo.png new file mode 100644 index 0000000..978ac2d Binary files /dev/null and b/public/img/enroll/logo.png differ diff --git a/public/img/enroll/radia-1.png b/public/img/enroll/radia-1.png new file mode 100644 index 0000000..80f17d3 Binary files /dev/null and b/public/img/enroll/radia-1.png differ diff --git a/public/img/enroll/radia-2.png b/public/img/enroll/radia-2.png new file mode 100644 index 0000000..3dbf03c Binary files /dev/null and b/public/img/enroll/radia-2.png differ diff --git a/public/img/enroll/register-title.png b/public/img/enroll/register-title.png new file mode 100644 index 0000000..e050324 Binary files /dev/null and b/public/img/enroll/register-title.png differ diff --git a/public/img/homePage/building.png b/public/img/homePage/building.png new file mode 100644 index 0000000..6ed132c Binary files /dev/null and b/public/img/homePage/building.png differ diff --git a/public/img/homePage/class_leave.png b/public/img/homePage/class_leave.png new file mode 100644 index 0000000..bc815d1 Binary files /dev/null and b/public/img/homePage/class_leave.png differ diff --git a/public/img/homePage/company_change.png b/public/img/homePage/company_change.png new file mode 100644 index 0000000..35f1418 Binary files /dev/null and b/public/img/homePage/company_change.png differ diff --git a/public/img/homePage/dorm_leave.png b/public/img/homePage/dorm_leave.png new file mode 100644 index 0000000..9c5577d Binary files /dev/null and b/public/img/homePage/dorm_leave.png differ diff --git a/public/img/homePage/stu_leave.png b/public/img/homePage/stu_leave.png new file mode 100644 index 0000000..b699875 Binary files /dev/null and b/public/img/homePage/stu_leave.png differ diff --git a/public/img/homePage/trainProjectApply.png b/public/img/homePage/trainProjectApply.png new file mode 100644 index 0000000..d6f144b Binary files /dev/null and b/public/img/homePage/trainProjectApply.png differ diff --git a/public/img/homePage/trainProjectArrived.png b/public/img/homePage/trainProjectArrived.png new file mode 100644 index 0000000..885cd4e Binary files /dev/null and b/public/img/homePage/trainProjectArrived.png differ diff --git a/public/img/login/20150407100539_39849.jpeg b/public/img/login/20150407100539_39849.jpeg new file mode 100644 index 0000000..86b07a2 Binary files /dev/null and b/public/img/login/20150407100539_39849.jpeg differ diff --git a/public/img/login/logo.png b/public/img/login/logo.png new file mode 100644 index 0000000..e1b7e82 Binary files /dev/null and b/public/img/login/logo.png differ diff --git a/public/img/login/pkucloud1h100.png b/public/img/login/pkucloud1h100.png new file mode 100644 index 0000000..c53e9ae Binary files /dev/null and b/public/img/login/pkucloud1h100.png differ diff --git a/public/img/pdf/more_big.png b/public/img/pdf/more_big.png new file mode 100644 index 0000000..28293dd Binary files /dev/null and b/public/img/pdf/more_big.png differ diff --git a/public/img/pdf/more_small.png b/public/img/pdf/more_small.png new file mode 100644 index 0000000..c9356d5 Binary files /dev/null and b/public/img/pdf/more_small.png differ diff --git a/public/img/pdf/next_icon.png b/public/img/pdf/next_icon.png new file mode 100644 index 0000000..7c490d7 Binary files /dev/null and b/public/img/pdf/next_icon.png differ diff --git a/public/img/pdf/pre_icon.png b/public/img/pdf/pre_icon.png new file mode 100644 index 0000000..5b7c415 Binary files /dev/null and b/public/img/pdf/pre_icon.png differ diff --git a/public/img/pdf/roate_icon.png b/public/img/pdf/roate_icon.png new file mode 100644 index 0000000..8df90df Binary files /dev/null and b/public/img/pdf/roate_icon.png differ diff --git a/public/img/support/board/.bg.png.icloud b/public/img/support/board/.bg.png.icloud new file mode 100644 index 0000000..b84090d Binary files /dev/null and b/public/img/support/board/.bg.png.icloud differ diff --git a/public/img/support/board/samiao.png b/public/img/support/board/samiao.png new file mode 100644 index 0000000..7897400 Binary files /dev/null and b/public/img/support/board/samiao.png differ diff --git a/public/img/test/bydkl.jpg b/public/img/test/bydkl.jpg new file mode 100644 index 0000000..927108d Binary files /dev/null and b/public/img/test/bydkl.jpg differ diff --git a/public/img/test/bylcl.jpg b/public/img/test/bylcl.jpg new file mode 100644 index 0000000..7635be0 Binary files /dev/null and b/public/img/test/bylcl.jpg differ diff --git a/public/img/test/gwlx.jpg b/public/img/test/gwlx.jpg new file mode 100644 index 0000000..1483e93 Binary files /dev/null and b/public/img/test/gwlx.jpg differ diff --git a/public/img/test/jyxstj.jpg b/public/img/test/jyxstj.jpg new file mode 100644 index 0000000..138d9aa Binary files /dev/null and b/public/img/test/jyxstj.jpg differ diff --git a/public/img/test/qddk.jpg b/public/img/test/qddk.jpg new file mode 100644 index 0000000..9f6dded Binary files /dev/null and b/public/img/test/qddk.jpg differ diff --git a/public/img/test/shpxrs.jpg b/public/img/test/shpxrs.jpg new file mode 100644 index 0000000..e1e99b8 Binary files /dev/null and b/public/img/test/shpxrs.jpg differ diff --git a/public/img/test/xszcrs.jpg b/public/img/test/xszcrs.jpg new file mode 100644 index 0000000..3489fcc Binary files /dev/null and b/public/img/test/xszcrs.jpg differ diff --git a/public/img/test/xydsjjc.jpg b/public/img/test/xydsjjc.jpg new file mode 100644 index 0000000..d76cc91 Binary files /dev/null and b/public/img/test/xydsjjc.jpg differ diff --git a/public/img/test/zbtj.jpg b/public/img/test/zbtj.jpg new file mode 100644 index 0000000..961f017 Binary files /dev/null and b/public/img/test/zbtj.jpg differ diff --git a/src/api/basic/basicstudent.ts b/src/api/basic/basicstudent.ts index bed758c..dca1daa 100644 --- a/src/api/basic/basicstudent.ts +++ b/src/api/basic/basicstudent.ts @@ -52,6 +52,18 @@ export const getObj = (id: string | number) => { }); }; +/** + * 根据学号获取学生详细信息(用于详情页面) + * @param query + */ +export const getStudentInfoDetail = (query: any) => { + return request({ + url: '/basic/basicstudentinfo/page', + method: 'get', + params: query, + }); +}; + /** * 根据学号获取信息 * @param stuNo @@ -492,11 +504,10 @@ export const exportStudentData = (data: any) => { /** * 申请顶岗 * @param data - * TODO: 接口文档中未找到此接口,请提供正确的接口地址 */ export const applyInternship = (data: any) => { return request({ - url: '/basic/basicstudent/applyInternship', // TODO: 接口文档中未找到此接口 + url: '/work/jobfairstu/batchSaveJobFairStu', method: 'post', data: data, }); @@ -519,15 +530,13 @@ export const importCertificate = (formData: FormData) => { }; /** - * 证书导出 - * @param data - * TODO: 接口文档中未找到此接口,请提供正确的接口地址 + * 创建证书导出异步任务 + * @param data 查询参数 */ -export const exportCertificate = (data: any) => { +export const makeExportSkillLevelTask = (data?: any) => { return request({ - url: '/basic/basicstudent/exportCertificate', // TODO: 接口文档中未找到此接口 + url: '/ems/file/makeExportSkillLevelTask', method: 'post', data: data, - responseType: 'blob', }); }; diff --git a/src/api/purchase/purchasingrequisition.ts b/src/api/purchase/purchasingrequisition.ts index 53a6d8c..5e654cf 100644 --- a/src/api/purchase/purchasingrequisition.ts +++ b/src/api/purchase/purchasingrequisition.ts @@ -115,9 +115,9 @@ export function revokeAgent(applyId: number | string) { } /** - * 保存实施采购方式(分步骤实施采购-第一步) + * 保存实施采购途径(分步骤实施采购-第一步) * @param id 采购申请ID - * @param implementType 实施采购方式:1-自行组织采购,2-委托代理采购 + * @param implementType 实施采购途径:1-自行组织采购,2-委托代理采购 */ export function saveImplementType(id: number | string, implementType: string) { return request({ @@ -179,7 +179,7 @@ export function getContracts(params?: any) { * 实施采购:上传招标文件并关联到申请单(可同时保存采购代表人方式与人员) * @param id 采购申请ID * @param fileIds 已上传的招标文件ID列表(fileType=130) - * @param implementType 实施采购方式 1:自行组织采购 2:委托代理采购 + * @param implementType 实施采购途径 1:自行组织采购 2:委托代理采购 * @param representorTeacherNo 需求部门初审-指定采购代表人(单人) * @param representors 需求部门初审-部门多人逗号分隔 */ diff --git a/src/views/basic/basicstudent/components/SimpleEdit.vue b/src/views/basic/basicstudent/components/SimpleEdit.vue index 555e9b9..7e9717e 100644 --- a/src/views/basic/basicstudent/components/SimpleEdit.vue +++ b/src/views/basic/basicstudent/components/SimpleEdit.vue @@ -35,6 +35,7 @@ const loading = ref(false); // 提交表单数据 const form = reactive({ id: '', + stuNo: '', realName: '', oldName: '', idCard: '', @@ -58,6 +59,7 @@ const openDialog = (rowData: any) => { Object.assign(form, { id: rowData.id || '', realName: rowData.realName || '', + stuNo: rowData.stuNo || '', oldName: rowData.oldName || '', idCard: rowData.idCard || '', }); diff --git a/src/views/basic/basicstudent/components/StudentDetail.vue b/src/views/basic/basicstudent/components/StudentDetail.vue new file mode 100644 index 0000000..491582e --- /dev/null +++ b/src/views/basic/basicstudent/components/StudentDetail.vue @@ -0,0 +1,333 @@ + + + + + \ No newline at end of file diff --git a/src/views/basic/basicstudent/components/StudentIdCardPrint.vue b/src/views/basic/basicstudent/components/StudentIdCardPrint.vue new file mode 100644 index 0000000..e7455b5 --- /dev/null +++ b/src/views/basic/basicstudent/components/StudentIdCardPrint.vue @@ -0,0 +1,274 @@ + + + + + \ No newline at end of file diff --git a/src/views/basic/basicstudent/index.vue b/src/views/basic/basicstudent/index.vue index 4d52197..24e1b8b 100644 --- a/src/views/basic/basicstudent/index.vue +++ b/src/views/basic/basicstudent/index.vue @@ -62,8 +62,8 @@ - - + + 查询 @@ -199,7 +199,16 @@ 取消班干部 设为班干部 - 禁止进出 + + 禁止进出 + + 允许进出 @@ -217,6 +226,9 @@ + + + + + + + + + + + + + + + @@ -291,6 +322,7 @@ import { Tickets, Medal, Lock, + Unlock, DataAnalysis, Setting, Menu, @@ -306,7 +338,7 @@ import { preBatchPrint, importCertificate, exportStuInfoCard, - exportCertificate, + makeExportSkillLevelTask, resetPassWord, editIsleader, updateInout, @@ -324,14 +356,16 @@ import { makeExportClassRoomHygieneMonthlyTask } from '/@/api/stuwork/file'; // 引入组件 const FormDialog = defineAsyncComponent(() => import('./form.vue')); -const DetailDialog = defineAsyncComponent(() => import('./detail.vue')); +const DetailDialog = defineAsyncComponent(() => import('./components/StudentDetail.vue')); const SimpleEditDialog = defineAsyncComponent(() => import('./components/SimpleEdit.vue')); +const PrintDialog = defineAsyncComponent(() => import('./components/StudentIdCardPrint.vue')); // 定义变量内容 const route = useRoute(); const formDialogRef = ref(); const detailDialogRef = ref(); const simpleEditDialogRef = ref(); +const printDialogRef = ref(); const searchFormRef = ref(); const uploadRef = ref(); const columnControlRef = ref(); @@ -351,6 +385,13 @@ const exportFieldLoading = ref(false); const selectedExportFields = ref([]); const exportFieldCheckAll = ref(false); const exportFieldIndeterminate = ref(false); +// 申请顶岗相关 +const applyInternshipDialogVisible = ref(false); +const applyInternshipLoading = ref(false); +const workYearList = ref([]); +const applyInternshipForm = reactive({ + year: '', +}); // 表格列配置 const tableColumns = [ @@ -504,7 +545,7 @@ const searchForm = reactive({ parkingCard: '', completion: '', isUnionClass: '', - keyword: '', + total: '', }); // 配置 useTable @@ -546,7 +587,7 @@ const handleReset = () => { parkingCard: '', completion: '', isUnionClass: '', - keyword: '', + total: '', }); getDataList(); }; @@ -622,17 +663,85 @@ const handleExportFieldConfirm = async () => { // 申请顶岗 const handleApplyInternship = async () => { - useMessage().warning('功能开发中'); + if (selectedRows.value.length === 0) { + useMessage().warning('请先选择要申请顶岗的学生'); + return; + } + + // 获取顶岗年份字典 + try { + const yearRes = await getDicts('work_year'); + if (yearRes.data && Array.isArray(yearRes.data)) { + workYearList.value = yearRes.data.map((item: any) => ({ + label: item.label || item.dictLabel || item.name, + value: item.value || item.dictValue || item.code, + })); + } + // 重置表单并打开弹窗 + applyInternshipForm.year = ''; + applyInternshipDialogVisible.value = true; + } catch (err: any) { + useMessage().error(err.msg || '获取顶岗年份失败'); + } +}; + +// 确认申请顶岗 +const handleApplyInternshipConfirm = async () => { + if (!applyInternshipForm.year) { + useMessage().warning('请选择顶岗年份'); + return; + } + + applyInternshipLoading.value = true; + try { + // 构建请求数据 + const stuList = selectedRows.value.map((row) => ({ stuNo: row.stuNo })); + await applyInternship({ stuList, year: applyInternshipForm.year }); + useMessage().success('申请顶岗成功'); + applyInternshipDialogVisible.value = false; + getDataList(); + } catch (err: any) { + useMessage().error(err.msg || '申请顶岗失败'); + } finally { + applyInternshipLoading.value = false; + } }; // 导出头像 const handleExportAvatar = async () => { - useMessage().warning('功能开发中'); + if (!searchForm.classCode) { + useMessage().warning('请先选择班级'); + return; + } + + try { + const res = await getDownPic({ + classCode: searchForm.classCode, + stuStatus: searchForm.stuStatus || '1', + }); + // 处理blob下载 + const blob = new Blob([res], { type: 'application/zip' }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `学生头像_${searchForm.classCode}.zip`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + window.URL.revokeObjectURL(url); + useMessage().success('导出成功'); + } catch (err: any) { + useMessage().error(err.msg || '导出失败'); + } }; // 批量打印 -const handleBatchPrint = async () => { - useMessage().warning('功能开发中'); +const handleBatchPrint = () => { + if (selectedRows.value.length === 0) { + useMessage().warning('请先选择要打印的学生'); + return; + } + printDialogRef.value?.openDialog(selectedRows.value); }; // 段段清证书导入 @@ -682,47 +791,124 @@ const handleUploadError = (err: any) => { // 学籍卡导出 const handleExportStudentCard = async () => { - useMessage().warning('功能开发中'); + if (selectedRows.value.length === 0) { + useMessage().warning('请先选择要导出学籍卡的学生'); + return; + } + + try { + const stuNoList = selectedRows.value.map((row) => row.stuNo); + const res = await exportStuInfoCard({ stuNoList }); + // 处理blob下载 + const blob = new Blob([res], { type: 'application/zip' }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '学籍卡.zip'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + window.URL.revokeObjectURL(url); + useMessage().success('学籍卡导出成功'); + } catch (err: any) { + useMessage().error(err.msg || '学籍卡导出失败'); + } }; // 证书导出 const handleExportCertificate = async () => { - useMessage().warning('功能开发中'); + try { + await makeExportSkillLevelTask({ + deptCode: searchForm.deptCode, + classCode: searchForm.classCode, + }); + useMessage().success('导出任务已创建,请在文件管理中下载'); + } catch (err: any) { + useMessage().error(err.msg || '创建导出任务失败'); + } }; // 简单信息维护 const handleSimpleEdit = (row: any) => { - useMessage().warning('功能开发中'); + simpleEditDialogRef.value?.openDialog(row); }; // 查看详情 const handleViewDetail = (row: any) => { - useMessage().warning('功能开发中'); + detailDialogRef.value?.openDialog(row); }; // 打印证件照 -const handlePrintPhoto = async (row: any) => { - useMessage().warning('功能开发中'); +const handlePrintPhoto = (row: any) => { + printDialogRef.value?.openSingleDialog(row); }; // 重置密码 const handleResetPassword = async (row: any) => { - useMessage().warning('功能开发中'); + try { + await useMessageBox().confirm(`确定要重置学生【${row.realName}】的密码吗?重置后密码将变为默认密码。`); + await resetPassWord(row); + useMessage().success('密码重置成功'); + } catch (err: any) { + if (err !== 'cancel') { + useMessage().error(err.msg || '密码重置失败'); + } + } }; // 设为班干部 const handleSetLeader = async (row: any) => { - useMessage().warning('功能开发中'); + try { + await useMessageBox().confirm(`确定要将学生【${row.realName}】设为班干部吗?`); + await editIsleader({ + id: row.id, + stuNo: row.stuNo, + isClassLeader: 1 + }); + useMessage().success('设置成功'); + getDataList(); + } catch (err: any) { + if (err !== 'cancel') { + useMessage().error(err.msg || '设置失败'); + } + } }; // 取消班干部 const handleCancelLeader = async (row: any) => { - useMessage().warning('功能开发中'); + try { + await useMessageBox().confirm(`确定要取消学生【${row.realName}】的班干部身份吗?`); + await editIsleader({ + id: row.id, + stuNo: row.stuNo, + isClassLeader: 0 + }); + useMessage().success('取消成功'); + getDataList(); + } catch (err: any) { + if (err !== 'cancel') { + useMessage().error(err.msg || '取消失败'); + } + } }; -// 禁止进出 +// 禁止进出/允许进出 const handleForbidInout = async (row: any) => { - useMessage().warning('功能开发中'); + const isForbid = row.isInout === 1 || row.isInout === '1'; + const action = isForbid ? '禁止' : '允许'; + try { + await useMessageBox().confirm(`确定要${action}学生【${row.realName}】进出吗?`); + await updateInout({ + stuNo: row.stuNo, + isInout: isForbid ? 0 : 1 + }); + useMessage().success(`${action}进出设置成功`); + getDataList(); + } catch (err: any) { + if (err !== 'cancel') { + useMessage().error(err.msg || '设置失败'); + } + } }; // 获取学院列表 diff --git a/src/views/purchase/purchasingrequisition/add.vue b/src/views/purchase/purchasingrequisition/add.vue index 63e2edf..9dfc189 100644 --- a/src/views/purchase/purchasingrequisition/add.vue +++ b/src/views/purchase/purchasingrequisition/add.vue @@ -26,116 +26,113 @@ 基础信息 - - 暂存时,基础信息必填 - + 暂存时,基础信息必填 - - - + + + + + + + + + + + + + + + + + + +
+ - - - - - - - - - - - - - - - - -
- - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - 当前选择品目为服务商城品目 - - - - + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + 品目编码层级:{{ categoryCodeHierarchy }} + + + 当前选择品目为服务商城品目 + + + +
@@ -199,7 +196,13 @@ :disabled="isPurchaseTypeDisabled" style="width: 100%" > - + @@ -395,12 +398,17 @@ - - - - {{ item.label }} - - + + + + @@ -810,15 +818,9 @@ 实施采购信息 -
实施采购方式
+
实施采购途径
- {{ - dataForm.implementType === '1' - ? '自行组织采购' - : dataForm.implementType === '2' - ? '委托代理采购' - : dataForm.implementType || '—' - }} +
@@ -978,7 +980,6 @@ const dataForm = reactive({ isSpecial: '', hasAssets: '0', purchaseMode: '', - purchaseSchool: '', purchaseType: '', purchaseTypeUnion: '', purchaseChannel: '', @@ -1049,7 +1050,13 @@ const isSpecialList = ref([]); const purchaseTypeDeptList = ref([]); /** 部门采购方式字典(委托采购中心采购时使用) */ const purchaseTypeDeptDelegationList = ref([]); -const purchaseModeSchoolList = ref([]); +/** 实施采购途径选项:1:自行组织采购 2:委托代理采购 5:框架协议 8:网上商城 */ +const implementTypeList = ref([ + { value: '1', label: '自行组织采购' }, + { value: '2', label: '委托代理采购' }, + { value: '140', label: '框架协议' }, + { value: '170', label: '网上商城' }, +]); const purchaseTypeUnionList = ref([]); const businessDeptList = ref([]); const schoolLeaderList = ref([]); @@ -1215,8 +1222,8 @@ const isPurchaseTypeUnionRequired = computed(() => { return false; }); -// 学校统一采购 - 组织采购形式是否必填 -const isPurchaseSchoolRequired = computed(() => { +// 学校统一采购 - 实施采购途径是否必填 +const isImplementTypeRequired = computed(() => { // 审核阶段:采购中心必填 if (isFlowEmbed.value && isPurchaseCenter.value) { return true; @@ -1361,6 +1368,14 @@ const isSpecialServiceCategory = computed(() => { return Number(category.isMallService) === 1 || Number(category.isProjectService) === 1; }); +// 计算品目编码层级路径显示(如:A/A01/A01000000) +const categoryCodeHierarchy = computed(() => { + if (!categoryCodePath.value || categoryCodePath.value.length === 0) { + return ''; + } + return categoryCodePath.value.join('/'); +}); + // 部门自行采购 & 采购途径=自行采购 & 特殊服务类目 → 采购方式固定网上商城 const isDeptSelfMallLocked = computed(() => { return isDeptPurchase.value && !isEntrustCenterChannel.value && isSpecialServiceCategory.value; @@ -1386,6 +1401,26 @@ const calcEntrustCenterType = (): 'service_online' | 'other' | '' => { return 'other'; }; +// 实施采购途径变化时,根据选择自动设置采购方式 +// 140:框架协议 → 采购方式自动选择"框架协议" +// 170:网上商城 → 采购方式自动选择"网上商城" +// 1:自行组织采购、2:委托代理采购 → 清空采购方式,由用户手动选择 +const handleImplementTypeChange = (value: string) => { + if (!value) { + // 清空实施采购途径时,清空采购方式 + dataForm.purchaseType = ''; + return; + } + + // 仅当选择框架协议(140)或网上商城(170)时,自动设置采购方式 + if (value === '140' || value === '170') { + dataForm.purchaseType = value; + } else { + // 其他选项清空采购方式,由用户手动选择 + dataForm.purchaseType = ''; + } +}; + // 监听采购途径变化,清理所有与采购方式相关的材料字段,同时如果已选择品目则重新计算entrustCenterType watch( () => dataForm.purchaseChannel, @@ -1732,13 +1767,13 @@ const dataRules = reactive({ trigger: 'change', }, ], - // 学校统一采购 + 采购中心审核:采购形式必填 - purchaseSchool: [ + // 学校统一采购 + 采购中心审核:实施采购途径必填 + implementType: [ { validator: (_rule: any, value: string, callback: (e?: Error) => void) => { if (!isDeptPurchase.value && isFlowEmbed.value && isPurchaseCenter.value) { if (!value || String(value).trim() === '') { - callback(new Error('请选择组织采购形式')); + callback(new Error('请选择实施采购途径')); return; } } @@ -1865,7 +1900,6 @@ async function loadDetail(applyId: string | number) { isCentralized: detail.isCentralized != null ? String(detail.isCentralized) : '', isSpecial: detail.isSpecial != null ? String(detail.isSpecial) : '', purchaseMode: detail.purchaseMode != null ? String(detail.purchaseMode) : '', - purchaseSchool: detail.purchaseSchool != null ? String(detail.purchaseSchool) : '', purchaseType: detail.purchaseType === DEPT_PURCHASE_TYPE.ENTRUST_CENTER ? '' @@ -2220,23 +2254,6 @@ const purchaseTypeDeptOptions = computed(() => { })); }); -// 获取学校采购形式字典 -const getPurchaseModeSchoolDict = async () => { - try { - const res = await getDicts('PURCHASE_MODE_SCHOOL'); - purchaseModeSchoolList.value = - res.data && Array.isArray(res.data) - ? res.data.map((item: any) => ({ - id: item.id, - label: item.label || item.dictLabel || item.name, - value: item.value || item.dictValue || item.code, - })) - : []; - } catch (err) { - purchaseModeSchoolList.value = []; - } -}; - // 获取学校统一采购方式字典 const getPurchaseTypeUnionDict = async () => { try { @@ -2808,7 +2825,6 @@ onMounted(async () => { getIsSpecialDict(), getPurchaseTypeDeptDict(), getPurchaseTypeDeptDelegationDict(), - getPurchaseModeSchoolDict(), getPurchaseTypeUnionDict(), getBusinessDeptListData(), getSchoolLeaderListData(), diff --git a/src/views/purchase/purchasingrequisition/implement.vue b/src/views/purchase/purchasingrequisition/implement.vue index 0193ae9..700c27b 100644 --- a/src/views/purchase/purchasingrequisition/implement.vue +++ b/src/views/purchase/purchasingrequisition/implement.vue @@ -1,15 +1,15 @@ @@ -211,8 +181,7 @@ import { reactive, ref, onMounted, computed, nextTick } from 'vue'; import { useRoute } from 'vue-router'; import { BasicTableProps, useTable } from '/@/hooks/table'; -import { fetchList, delObj, importExcel } from '/@/api/stuwork/stuconduct'; -import { exportConductAssessmentTemplate, importConductAssessment, downloadBlobFile } from '/@/api/stuwork/file'; +import { fetchList, delObj } from '/@/api/stuwork/stuconduct'; import { getDeptList } from '/@/api/basic/basicclass'; import { queryAllSchoolYear } from '/@/api/basic/basicyear'; import { getClassListByRole } from '/@/api/basic/basicclass'; @@ -220,7 +189,6 @@ import { getDicts } from '/@/api/admin/dict'; import { useMessage, useMessageBox } from '/@/hooks/message'; import TableColumnControl from '/@/components/TableColumnControl/index.vue'; import { - UploadFilled, List, CreditCard, Calendar, @@ -242,7 +210,6 @@ import FormDialog from './form.vue'; const route = useRoute(); const formDialogRef = ref(); const columnControlRef = ref(); -const uploadRef = ref(); const searchFormRef = ref(); const showSearch = ref(true); const schoolYearList = ref([]); @@ -250,12 +217,7 @@ const schoolTermList = ref([]); const deptList = ref([]); const classList = ref([]); const typeList = ref([]); -const importDialogVisible = ref(false); -const importFile = ref(null); -const importLoading = ref(false); -const conductImportDialogVisible = ref(false); -const conductImportFile = ref(null); -const conductImportLoading = ref(false); +const conductUploadExcelRef = ref(); // 表格列配置 const tableColumns = [ @@ -357,81 +319,9 @@ const handleViewAttachment = (row: any) => { } }; -// 导入 -const handleImport = () => { - importDialogVisible.value = true; - importFile.value = null; - uploadRef.value?.clearFiles(); -}; - -// 文件变化 -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; - importFile.value = null; - uploadRef.value?.clearFiles(); - getDataList(); - } catch (err: any) { - useMessage().error(err.msg || '导入失败'); - } finally { - importLoading.value = false; - } -}; - -// 下载操行考核导入模板 -const handleDownloadConductTemplate = async () => { - try { - await downloadBlobFile(exportConductAssessmentTemplate(), `操行考核导入模板_${Date.now()}.xlsx`); - } catch (err: any) { - useMessage().error(err?.msg || '下载模板失败'); - } -}; - -// 打开操行考核导入弹窗 +// 导入操行考核 const handleConductImport = () => { - conductImportDialogVisible.value = true; - conductImportFile.value = null; -}; - -// 操行考核文件变化 -const handleConductFileChange = (file: any) => { - conductImportFile.value = file.raw; -}; - -// 提交操行考核导入 -const handleConductImportSubmit = async () => { - if (!conductImportFile.value) { - useMessage().warning('请先选择要上传的文件'); - return; - } - - conductImportLoading.value = true; - try { - const formData = new FormData(); - formData.append('file', conductImportFile.value); - await importConductAssessment(formData); - useMessage().success('导入成功'); - conductImportDialogVisible.value = false; - conductImportFile.value = null; - getDataList(); - } catch (err: any) { - useMessage().error(err.msg || '导入失败'); - } finally { - conductImportLoading.value = false; - } + conductUploadExcelRef.value?.show(); }; // 编辑 diff --git a/src/views/stuwork/stuunionleague/index.vue b/src/views/stuwork/stuunionleague/index.vue index f731baf..ad8dfa3 100644 --- a/src/views/stuwork/stuunionleague/index.vue +++ b/src/views/stuwork/stuunionleague/index.vue @@ -208,39 +208,15 @@ - + - - - -
- 将文件拖到此处,或点击上传 -
- -
- -
+ () const searchFormRef = ref() -const uploadRef = ref() +const uploadExcelRef = ref() const showSearch = ref(true) const classList = ref([]) const gradeList = ref([]) -const importDialogVisible = ref(false) -const importLoading = ref(false) -const fileList = ref([]) // 统计相关变量 const statisticsDialogVisible = ref(false) @@ -420,47 +392,7 @@ const handleDelete = async (row: any) => { // 导入 const handleImport = () => { - importDialogVisible.value = true - fileList.value = [] -} - -// 文件变化 -const handleFileChange = (file: UploadFile, files: UploadFiles) => { - fileList.value = [file] -} - -// 文件超出限制 -const handleExceed = () => { - useMessage().warning('文件数量超出限制') -} - -// 提交导入 -const handleImportSubmit = async () => { - if (fileList.value.length === 0) { - useMessage().warning('请先选择要上传的文件') - return - } - - const file = fileList.value[0].raw - if (!file) { - useMessage().warning('文件无效') - return - } - - importLoading.value = true - try { - const formData = new FormData() - formData.append('file', file as File) - await importStuUnionLeague(formData) - useMessage().success('导入成功') - importDialogVisible.value = false - fileList.value = [] - getDataList() - } catch (err: any) { - useMessage().error(err.msg || '导入失败') - } finally { - importLoading.value = false - } + uploadExcelRef.value?.show() } // 导出