Files
school-developer/src/views/recruit/recruitImitateAdjustBatch/index.vue
2026-01-15 19:06:50 +08:00

268 lines
8.0 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
- Copyright (c) 2018-2025, cyweb All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- Neither the name of the pig4cloud.com developer nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-->
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<!-- 搜索表单 -->
<el-form :model="queryForm" inline ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="批次名称" prop="batchName">
<el-input v-model="queryForm.batchName" clearable placeholder="批次名称" />
</el-form-item>
<el-form-item label="批次代码" prop="batchCode">
<el-input v-model="queryForm.batchCode" clearable placeholder="批次代码" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
<el-button plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作按钮 -->
<div class="mb15">
<el-button
v-if="permissions.recruit_recruitImitateAdjustBatch_add"
type="primary"
icon="FolderAdd"
@click="addOrUpdateHandle"
>
</el-button>
</div>
<!-- 表格 -->
<el-table
ref="tableRef"
:data="state.dataList"
v-loading="state.loading"
border
stripe
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
>
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="batchName" label="批次名称" align="center" show-overflow-tooltip />
<el-table-column prop="batchCode" label="批次代码" align="center" show-overflow-tooltip />
<el-table-column prop="peopleNumber" label="人数" align="center" show-overflow-tooltip />
<el-table-column label="操作" width="300" align="center" fixed="right">
<template #default="scope">
<el-button
v-if="permissions.recruit_recruitImitateAdjustBatch_show"
type="primary"
link
icon="Document"
@click="showTable(scope.row.batchCode, scope.row.groupId)"
>
模拟列表
</el-button>
<el-button
v-if="permissions.recruit_recruitImitateAdjustBatch_show"
type="warning"
link
icon="Download"
@click="handleExport(scope.row.batchCode, scope.row.groupId)"
>
导出模拟结果
</el-button>
<el-button
v-if="permissions.recruit_recruitImitateAdjustBatch_edit"
type="primary"
link
icon="EditPen"
@click="addOrUpdateHandle(scope.row.id)"
>
修改
</el-button>
<el-button
v-if="permissions.recruit_recruitImitateAdjustBatch_del"
type="danger"
link
icon="Delete"
@click="deleteHandle(scope.row.id)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-bind="state.pagination"
@current-change="currentChangeHandle"
@size-change="sizeChangeHandle"
/>
<!-- 弹窗, 新增 / 修改 -->
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" />
<mn-table ref="mnTableRef" @refreshDataList="getDataList" />
</div>
</div>
</template>
<script setup lang="ts" name="recruitImitateAdjustBatch">
import { ref, reactive, computed, onMounted, nextTick, defineAsyncComponent } from 'vue'
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { BasicTableProps, useTable } from '/@/hooks/table'
import { useMessage, useMessageBox } from '/@/hooks/message'
import { getList } from '/@/api/recruit/recruitstudentplangroup'
import { delObj, fetchList } from '/@/api/recruit/recruitImitateAdjustBatch'
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'))
const MnTable = defineAsyncComponent(() => import('./mnTable.vue'))
// 使用 Pinia store
const userInfoStore = useUserInfo()
const { userInfos } = storeToRefs(userInfoStore)
// 创建权限对象
const permissions = computed(() => {
const perms: Record<string, boolean> = {}
userInfos.value.authBtnList.forEach((perm: string) => {
perms[perm] = true
})
return perms
})
// 消息提示 hooks
const message = useMessage()
const messageBox = useMessageBox()
// 表格引用
const tableRef = ref()
const searchFormRef = ref()
const addOrUpdateRef = ref()
const mnTableRef = ref()
// 弹窗状态
const addOrUpdateVisible = ref(false)
const mnTableVisible = ref(false)
// 数据
const planList = ref<any[]>([])
// 查询表单
const queryForm = reactive({
groupId: '',
batchName: '',
batchCode: ''
})
// 表格状态
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: queryForm,
pageList: async (params: any) => {
const response = await fetchList(params)
return {
data: {
records: response.data.records,
total: response.data.total
}
}
},
createdIsNeed: false
})
// 使用 table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle, downBlobFile } = useTable(state)
// 初始化
const init = async () => {
try {
const data = await getList()
planList.value = data.data || []
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
}
getDataList()
} catch (error) {
// 初始化失败
}
}
// 新增 / 修改
const addOrUpdateHandle = (payload?: string | MouseEvent) => {
// 新增按钮未传参时会传入 MouseEvent这里统一转换为 id 或 null
const id = typeof payload === 'string' ? payload : null
nextTick(() => {
addOrUpdateRef.value?.init(id)
})
}
// 显示模拟列表
const showTable = (batchNo: string, groupId: string) => {
nextTick(() => {
mnTableRef.value?.init(batchNo, groupId)
})
}
// 导出模拟结果
const handleExport = async (code: string, gid: string) => {
try {
await downBlobFile(
'/recruit/recruitImitateAdjustBatch/exportExcel',
{ batchNo: code, groupId: gid },
'招生模拟统计.xls'
)
} catch (error: any) {
message.error(error.msg || '导出失败')
}
}
// 删除
const deleteHandle = async (id: string) => {
try {
await messageBox.confirm('是否确认删除本条数据?请谨慎操作')
await delObj(id)
message.success('删除成功')
getDataList()
} catch {
// 用户取消
}
}
// 重置查询
const resetQuery = () => {
searchFormRef.value?.resetFields()
queryForm.groupId = ''
queryForm.batchName = ''
queryForm.batchCode = ''
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
}
getDataList()
}
onMounted(() => {
init()
})
</script>
<style lang="scss" scoped>
</style>