zhaosheng

This commit is contained in:
guochunsi
2026-01-26 18:19:57 +08:00
parent 741af78a0e
commit c5eea52c46
48 changed files with 656 additions and 488 deletions

View File

@@ -96,6 +96,24 @@ export const DORM_RANGE_STATUS_LIST = [
{ label: "范围外", value: "2" } { label: "范围外", value: "2" }
]; ];
// 发送短信状态
export const SEND_STATUS_LIST = [
{ label: "未发送", value: "0" },
{ label: "已发送", value: "1" }
];
// 手动设置状态
export const MANUAL_SET_STATUS_LIST = [
{ label: "未设置", value: "0" },
{ label: "已设置", value: "1" }
];
// 住宿申请状态
export const DORM_APPLY_STATUS_LIST = [
{ label: "未通过", value: "0" },
{ label: "申请通过", value: "1" }
];
// 面试结果 // 面试结果
export const INTERVIEW_DIC_LIST = [ export const INTERVIEW_DIC_LIST = [
{ label: "未面试", value: "0" ,type: "info",icon: "Document"}, { label: "未面试", value: "0" ,type: "info",icon: "Document"},
@@ -134,3 +152,60 @@ export const getStatusConfig = (statusList: any[], value: string | number) => {
return statusList.find(item => item.value === String(value)); return statusList.find(item => item.value === String(value));
}; };
/**
* 获取报到状态配置(用于 ClickableTag
* 根据字典数据0=未联系, 1=已经报到, 2=推迟报到, 3=放弃报到, 4=无法联系
* @param statusList 报到状态字典列表
* @param value 状态值
* @param iconMap 图标映射对象,包含 CircleCheck, CircleClose, DocumentChecked, Warning, Clock
* @returns 包含 label、type、icon 的配置对象
*/
export const getCheckInStatusConfig = (
statusList: any[],
value: string,
iconMap: {
CircleCheck: any
CircleClose: any
DocumentChecked: any
Warning: any
Clock: any
}
) => {
const item = statusList.find((item: any) => item.value === value)
if (!item) return null
let type: 'success' | 'info' | 'warning' | 'danger' = 'info'
let icon: any = null
// 根据状态值设置类型和图标
switch (value) {
case '1': // 已经报到
type = 'success'
icon = iconMap.CircleCheck
break
case '2': // 推迟报到
type = 'warning'
icon = iconMap.Clock
break
case '3': // 放弃报到
type = 'danger'
icon = iconMap.CircleClose
break
case '4': // 无法联系
type = 'danger'
icon = iconMap.Warning
break
case '0': // 未联系
default:
type = 'info'
icon = iconMap.DocumentChecked
break
}
return {
label: item.label,
type,
icon
}
}

View File

@@ -44,7 +44,7 @@
v-if="permissions.professional_professionalacademicqualificationsconfig_del" v-if="permissions.professional_professionalacademicqualificationsconfig_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -69,7 +69,7 @@
v-if="permissions.professional_outercompany_del" v-if="permissions.professional_outercompany_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>
</template> </template>

View File

@@ -75,7 +75,7 @@
v-if="permissions.professional_outercompany_del" v-if="permissions.professional_outercompany_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>
</template> </template>

View File

@@ -58,7 +58,7 @@
v-if="permissions.professional_outercompany_del" v-if="permissions.professional_outercompany_del"
icon="delete" icon="delete"
text text
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalacademicdegreeconfig_del" v-if="permissions.professional_professionalacademicdegreeconfig_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalacademiceducationtypeconfig_del" v-if="permissions.professional_professionalacademiceducationtypeconfig_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalatstation_del" v-if="permissions.professional_professionalatstation_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalemploymentnature_del" v-if="permissions.professional_professionalemploymentnature_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalmajorstation_del" v-if="permissions.professional_professionalmajorstation_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalpaperconfig_del" v-if="permissions.professional_professionalpaperconfig_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -42,7 +42,7 @@
@click="handleEdit(scope.row)">编辑 @click="handleEdit(scope.row)">编辑
</el-button> </el-button>
<el-button <el-button
type="primary" type="danger"
link link
icon="Delete" icon="Delete"
v-if="permissions.professional_professionalpartybranch_del" v-if="permissions.professional_professionalpartybranch_del"

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalqualificationconfig_del" v-if="permissions.professional_professionalqualificationconfig_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -148,7 +148,7 @@
@click="changeState(scope.row, -2)">驳回 @click="changeState(scope.row, -2)">驳回
</el-button> </el-button>
<el-button <el-button
type="primary" type="danger"
link link
icon="delete" icon="delete"
v-if="permissions.professional_professionalqualificationrelation_del" v-if="permissions.professional_professionalqualificationrelation_del"

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalstationdutylevel_del" v-if="permissions.professional_professionalstationdutylevel_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalstationtype_del" v-if="permissions.professional_professionalstationtype_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -174,7 +174,7 @@
@click="changeState(scope.row, -2)">驳回 @click="changeState(scope.row, -2)">驳回
</el-button> </el-button>
<el-button <el-button
type="primary" type="danger"
link link
icon="delete" icon="delete"
v-if="permissions.professional_professionalteacheracademicrelation_del" v-if="permissions.professional_professionalteacheracademicrelation_del"

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalteachercertificateconf_del" v-if="permissions.professional_professionalteachercertificateconf_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -144,7 +144,7 @@
@click="changeState(scope.row, -2)">驳回 @click="changeState(scope.row, -2)">驳回
</el-button> </el-button>
<el-button <el-button
type="primary" type="danger"
link link
icon="delete" icon="delete"
v-if="permissions.professional_professionalteachercertificaterelation_del" v-if="permissions.professional_professionalteachercertificaterelation_del"

View File

@@ -139,7 +139,7 @@
@click="changeState(scope.row, -2)">驳回 @click="changeState(scope.row, -2)">驳回
</el-button> </el-button>
<el-button <el-button
type="primary" type="danger"
link link
icon="delete" icon="delete"
v-if="permissions.professional_professionalteacherhonor_del" v-if="permissions.professional_professionalteacherhonor_del"

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalteachertype_del" v-if="permissions.professional_professionalteachertype_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionalteachingmaterialconfig_del" v-if="permissions.professional_professionalteachingmaterialconfig_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionaltitlelevelconfig_del" v-if="permissions.professional_professionaltitlelevelconfig_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -183,7 +183,7 @@
@click="changeState(scope.row, -2)">驳回 @click="changeState(scope.row, -2)">驳回
</el-button> </el-button>
<el-button <el-button
type="primary" type="danger"
link link
icon="delete" icon="delete"
v-if="permissions.professional_professionaltitlerelation_del" v-if="permissions.professional_professionaltitlerelation_del"

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionaltopiclevelconfig_del" v-if="permissions.professional_professionaltopiclevelconfig_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_professionaltopicsourceconfig_del" v-if="permissions.professional_professionaltopicsourceconfig_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -41,7 +41,7 @@
v-if="permissions.professional_worktype_del" v-if="permissions.professional_worktype_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -56,7 +56,7 @@
v-if="permissions.professional_professionalyearbounds_del" v-if="permissions.professional_professionalyearbounds_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -925,14 +925,8 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" width="150" align="center" v-if="permissions.politics_edit"> <el-table-column label="操作" width="150" align="center" v-if="permissions.politics_edit">
<template #default="scope"> <template #default="scope">
<el-button type="primary" link @click="handleEditPolitics(scope.row, scope.$index)"> <el-button type="primary" link icon="EditPen" @click="handleEditPolitics(scope.row, scope.$index)">编辑</el-button>
<el-icon><EditPen /></el-icon> <el-button type="danger" link icon="Delete" style="margin-left: 12px" @click="handleDeletePolitics(scope.row, scope.$index)">删除</el-button>
<span>编辑</span>
</el-button>
<el-button type="primary" link @click="handleDeletePolitics(scope.row, scope.$index)">
<el-icon><Delete /></el-icon>
<span>删除</span>
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -972,7 +966,7 @@
<el-icon><EditPen /></el-icon> <el-icon><EditPen /></el-icon>
<span>编辑</span> <span>编辑</span>
</el-button> </el-button>
<el-button type="primary" link @click="handleDeleteRelation(scope.row, scope.$index)"> <el-button type="danger" link @click="handleDeleteRelation(scope.row, scope.$index)">
<el-icon><Delete /></el-icon> <el-icon><Delete /></el-icon>
<span>删除</span> <span>删除</span>
</el-button> </el-button>

View File

@@ -45,7 +45,7 @@
v-if="permissions.professional_typeofworkconfig_del" v-if="permissions.professional_typeofworkconfig_del"
icon="delete" icon="delete"
link link
type="primary" type="danger"
style="margin-left: 12px" style="margin-left: 12px"
@click="handleDel(scope.row)">删除 @click="handleDel(scope.row)">删除
</el-button> </el-button>

View File

@@ -1,28 +1,23 @@
<template> <template>
<div> <div>
<el-dialog v-model="newStuCheckInDialog" width="40%"> <el-dialog v-model="newStuCheckInDialog" width="600">
<el-form :model="form" :rules="rules" ref="formRef" label-width="120px" class="demo-ruleForm"> <el-form :model="form" :rules="rules" ref="formRef" label-width="100px" class="demo-ruleForm">
<el-form-item label="姓名" prop="name"> <el-form-item label="姓名" prop="name">
<el-input v-model="form.name" disabled style="width: 80%" /> <el-input v-model="form.name" disabled/>
</el-form-item> </el-form-item>
<el-form-item label="性别" prop="gender"> <el-form-item label="性别" prop="gender">
<el-select v-model="form.gender" placeholder="请选择性别" disabled style="width: 80%"> <el-radio-group v-model="form.gender">
<el-option <el-radio v-for="item in genderData" :key="item.value" :label="item.value" :disabled="true">{{ item.label }}</el-radio>
v-for="item in genderData" </el-radio-group>
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="身份证号" prop="idNumber"> <el-form-item label="身份证号" prop="idNumber">
<el-input v-model="form.idNumber" disabled style="width: 80%" /> <el-input v-model="form.idNumber" disabled/>
</el-form-item> </el-form-item>
<el-form-item label="报到状态" prop="backSchoolState"> <el-form-item label="报到状态" prop="backSchoolState">
<el-select v-model="form.backSchoolState" filterable placeholder="请选择报到状态" style="width: 80%"> <el-select v-model="form.backSchoolState" filterable placeholder="请选择报到状态">
<el-option <el-option
v-for="item in checkInStatusData" v-for="item in checkInStatusData"
:key="item.value" :key="item.value"
@@ -33,13 +28,14 @@
</el-form-item> </el-form-item>
<el-form-item label="回校备注" prop="backSchoolRemark"> <el-form-item label="回校备注" prop="backSchoolRemark">
<el-input v-model="form.backSchoolRemark" :rows="2" style="width: 80%" /> <el-input v-model="form.backSchoolRemark" :rows="2" type="textarea"/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="checkIn" :loading="submitLoading">确定</el-button>
<el-button @click="newStuCheckInDialog = false">取消</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer>
<el-button @click="newStuCheckInDialog = false">取消</el-button>
<el-button type="primary" @click="checkIn" :loading="submitLoading">确定</el-button>
</template>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
@@ -51,12 +47,12 @@ import { useDict } from '/@/hooks/dict'
import { putBackObj } from '/@/api/recruit/recruitstudentsignup' import { putBackObj } from '/@/api/recruit/recruitstudentsignup'
import { getDicts } from '/@/api/admin/dict' import { getDicts } from '/@/api/admin/dict'
// 性别字典
const { sexy:genderData } = useDict('sexy')
// 消息提示 hooks // 消息提示 hooks
const message = useMessage() const message = useMessage()
// 字典
const { getTypeValue } = useDict()
// 定义 emits // 定义 emits
const emit = defineEmits(['reload']) const emit = defineEmits(['reload'])
@@ -69,12 +65,6 @@ const checkInStatusData = ref<any[]>([])
const submitLoading = ref(false) const submitLoading = ref(false)
const page = ref<any>({}) const page = ref<any>({})
// 固定数据
const genderData = [
{ label: '女', value: '2' },
{ label: '男', value: '1' }
]
// 表单数据 // 表单数据
const form = reactive({ const form = reactive({
id: '', id: '',
@@ -140,10 +130,6 @@ const checkIn = async () => {
message.success('报到成功') message.success('报到成功')
emit('reload') emit('reload')
newStuCheckInDialog.value = false newStuCheckInDialog.value = false
} catch (error: any) {
if (error !== false) {
message.error(error.msg || '报到失败')
}
} finally { } finally {
submitLoading.value = false submitLoading.value = false
} }

View File

@@ -1,94 +1,88 @@
<!--
- 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> <template>
<div class="tab-index-container"> <div class="tab-index-container">
<!-- 搜索表单 --> <!-- 搜索表单 -->
<div class="search-form-wrapper"> <search-form
<el-form :model="queryForm" inline ref="searchFormRef"> v-show="showSearch"
<el-form-item label="招生计划" prop="groupId"> :model="queryForm"
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="chanMajor"> ref="searchFormRef"
<el-option @keyup-enter="getDataList"
v-for="item in planList" >
:key="item.id" <template #default="{ visible }">
:label="item.groupName" <template v-if="visible">
:value="item.id" <el-form-item label="招生计划" prop="groupId">
/> <el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="chanMajor">
</el-select> <el-option
</el-form-item> v-for="item in planList"
<el-form-item label="学院" prop="deptCode"> :key="item.id"
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院"> :label="item.groupName"
<el-option :value="item.id"
v-for="item in deptList" />
:key="item.deptCode" </el-select>
:label="item.deptName" </el-form-item>
:value="item.deptCode" <el-form-item label="学院" prop="deptCode">
/> <el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
</el-select> <el-option
</el-form-item> v-for="item in deptList"
<el-form-item label="录取专业" prop="confirmedMajor"> :key="item.deptCode"
<el-select v-model="queryForm.confirmedMajor" filterable clearable placeholder="请选择录取专业"> :label="item.deptName"
<el-option :value="item.deptCode"
v-for="item in planMajorList" />
:key="item.majorCode" </el-select>
:label="item.majorName + '(' + item.learnYear + '年制)'" </el-form-item>
:value="item.majorCode" <el-form-item label="录取专业" prop="confirmedMajor">
/> <el-select v-model="queryForm.confirmedMajor" filterable clearable placeholder="请选择录取专业">
</el-select> <el-option
</el-form-item> v-for="item in planMajorList"
<el-form-item label="唯一号/姓名/身份证号/学校名称" prop="search"> :key="item.majorCode"
<el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号/学校名称" /> :label="item.majorName + '(' + item.learnYear + '年制)'"
</el-form-item> :value="item.majorCode"
<el-form-item label="缴费状态" prop="paystatus"> />
<el-select v-model="queryForm.paystatus" filterable clearable placeholder="请选择缴费状态"> </el-select>
<el-option </el-form-item>
v-for="item in paystatusList" <el-form-item label="唯一号/姓名/身份证号/学校名称" prop="search">
:key="item.value" <el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号/学校名称" />
:label="item.label" </el-form-item>
:value="item.value" </template>
/> <template v-else>
</el-select> <el-form-item label="缴费状态" prop="paystatus">
</el-form-item> <el-select v-model="queryForm.paystatus" filterable clearable placeholder="请选择缴费状态">
<el-form-item label="推送状态" prop="pushed"> <el-option
<el-select v-model="queryForm.pushed" filterable clearable placeholder="请选择推送状态"> v-for="item in paystatusList"
<el-option :key="item.value"
v-for="item in pushedList" :label="item.label"
:key="item.value" :value="item.value"
:label="item.label" />
:value="item.value" </el-select>
/> </el-form-item>
</el-select> <el-form-item label="推送状态" prop="pushed">
</el-form-item> <el-select v-model="queryForm.pushed" filterable clearable placeholder="请选择推送状态">
<el-form-item label="报到状态" prop="backSchoolState"> <el-option
<el-select v-model="queryForm.backSchoolState" filterable clearable placeholder="请选择报到状态"> v-for="item in pushedList"
<el-option :key="item.value"
v-for="item in backSchoolStateList" :label="item.label"
:key="item.value" :value="item.value"
:label="item.label" />
:value="item.value" </el-select>
/> </el-form-item>
</el-select> <el-form-item label="报到状态" prop="backSchoolState">
</el-form-item> <el-select v-model="queryForm.backSchoolState" filterable clearable placeholder="请选择报到状态">
<el-option
v-for="item in backSchoolStateList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</template>
</template>
<template #actions>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button> <el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button> <el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </template>
</div> </search-form>
<!-- 操作按钮 --> <!-- 操作按钮 -->
<div class="action-buttons-wrapper mb15"> <div class="action-buttons-wrapper mb15">
@@ -101,7 +95,7 @@
名单导出 名单导出
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruit_recruitstudentsignup_allCX" v-auth="'recruit_recruitstudentsignup_allCX'"
type="primary" type="primary"
plain plain
icon="Search" icon="Search"
@@ -110,6 +104,12 @@
> >
批量查询 批量查询
</el-button> </el-button>
<right-toolbar
@queryTable="getDataList"
class="ml10"
style="float: right; "
v-model:showSearch="showSearch"
></right-toolbar>
</div> </div>
<!-- 表格 --> <!-- 表格 -->
@@ -125,28 +125,6 @@
:header-cell-style="tableStyle.headerCellStyle" :header-cell-style="tableStyle.headerCellStyle"
> >
<el-table-column type="index" label="序号" width="60" align="center" /> <el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column label="操作" width="200" align="center" fixed="left">
<template #default="scope">
<el-button
v-if="permissions.recruit_recruitstudentsignup_show && scope.row.pushed == '1' && scope.row.paiedOffline != '10' && (scope.row.clfPayCode != undefined && scope.row.clfPayCode != '')"
type="primary"
link
icon="QrCode"
@click="showPayCode(scope.row)"
>
支付二维码
</el-button>
<el-button
v-if="permissions.recruit_recruitstudentsignup_back"
type="success"
link
icon="CircleCheck"
@click="handleCheckIn(scope.row)"
>
报到
</el-button>
</template>
</el-table-column>
<el-table-column prop="serialNumber" label="唯一号" align="center" show-overflow-tooltip /> <el-table-column prop="serialNumber" label="唯一号" align="center" show-overflow-tooltip />
<el-table-column prop="deptCode" label="学院" align="center" show-overflow-tooltip> <el-table-column prop="deptCode" label="学院" align="center" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
@@ -163,29 +141,113 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="name" label="姓名" align="center" show-overflow-tooltip /> <el-table-column prop="name" label="姓名" align="center" show-overflow-tooltip />
<el-table-column prop="gender" label="性别" align="center" show-overflow-tooltip> <el-table-column prop="gender" label="性别" width="80" align="center" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<GenderTag :sex="scope.row.gender" /> <GenderTag :sex="scope.row.gender" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="idNumber" label="身份证号" align="center" show-overflow-tooltip /> <el-table-column prop="idNumber" label="身份证号" width="190" align="center" show-overflow-tooltip />
<el-table-column prop="parentTelOne" label="家长电话1" align="center" show-overflow-tooltip /> <el-table-column prop="parentTelOne" label="家长电话1" align="center" show-overflow-tooltip />
<el-table-column prop="parentTelTwo" label="家长电话2" align="center" show-overflow-tooltip /> <el-table-column prop="parentTelTwo" label="家长电话2" align="center" show-overflow-tooltip />
<el-table-column prop="backSchoolState" label="报到状态" align="center" show-overflow-tooltip> <el-table-column prop="backSchoolState" label="报到状态" align="center" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ getBackSchoolStateLabel(scope.row.backSchoolState) }} <template v-if="getBackSchoolStateConfig(scope.row.backSchoolState)">
<!-- 有备注信息时使用 popover 包裹 ClickableTag -->
<DetailPopover
v-if="scope.row.backSchoolRemark"
title="报到详情"
:width="300"
:items="[
{
label: '报到状态',
layout: 'horizontal',
content: getBackSchoolStateConfig(scope.row.backSchoolState)?.label
},
{
label: '备注信息',
content: scope.row.backSchoolRemark,
contentClass: 'reason-content'
}
]">
<template #reference>
<ClickableTag
:type="getBackSchoolStateConfig(scope.row.backSchoolState)?.type || 'info'"
:left-icon="getBackSchoolStateConfig(scope.row.backSchoolState)?.icon"
>
{{ getBackSchoolStateConfig(scope.row.backSchoolState)?.label }}
</ClickableTag>
</template>
<template #content-0>
<ClickableTag
:type="getBackSchoolStateConfig(scope.row.backSchoolState)?.type || 'info'"
:left-icon="getBackSchoolStateConfig(scope.row.backSchoolState)?.icon"
:right-icon="null"
>
{{ getBackSchoolStateConfig(scope.row.backSchoolState)?.label }}
</ClickableTag>
</template>
<template #content-1>
<div class="reason-content">
<el-icon class="reason-icon"><Warning /></el-icon>
<span>{{ scope.row.backSchoolRemark }}</span>
</div>
</template>
</DetailPopover>
<!-- 无备注时直接显示 ClickableTag -->
<ClickableTag
v-else
:type="getBackSchoolStateConfig(scope.row.backSchoolState)?.type || 'info'"
:left-icon="getBackSchoolStateConfig(scope.row.backSchoolState)?.icon"
:right-icon="null"
>
{{ getBackSchoolStateConfig(scope.row.backSchoolState)?.label }}
</ClickableTag>
</template>
<span v-else class="empty-text">-</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="backSchoolRemark" label="报到备注" align="center" show-overflow-tooltip /> <el-table-column prop="paiedOffline" label="缴费状态" width="110" align="center" show-overflow-tooltip>
<el-table-column prop="paiedOffline" label="缴费状态" align="center" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ getStatus(scope.row.paiedOffline) }} <el-tag
v-if="getStatusConfig(paystatusList, scope.row.paiedOffline)"
:type="getStatusConfig(paystatusList, scope.row.paiedOffline)?.type"
>
{{ getStatusConfig(paystatusList, scope.row.paiedOffline)?.label }}
</el-tag>
<span v-else class="empty-text">{{ getStatusConfig(paystatusList, scope.row.paiedOffline)?.label || '-' }}</span>
</template>
</el-table-column>
<el-table-column prop="pushed" label="推送状态" width="110" align="center" show-overflow-tooltip>
<template #default="scope">
<el-tag
:type="getStatusConfig(pushedList, scope.row.pushed)?.type"
>
{{ getStatusConfig(pushedList, scope.row.pushed)?.label }}
</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="pushed" label="推送状态" align="center" show-overflow-tooltip> <el-table-column label="操作" width="200" align="center" fixed="right">
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.pushed == 0" style="color: red">{{ getPushed(scope.row.pushed) }}</span>
<span v-if="scope.row.pushed == 1" style="color: green">{{ getPushed(scope.row.pushed) }}</span> <el-button
v-auth="'recruit_recruitstudentsignup_show'"
v-if="scope.row.pushed == '1' && scope.row.paiedOffline != '10' && (scope.row.clfPayCode != undefined && scope.row.clfPayCode != '')"
type="primary"
link
:icon="Tickets"
@click="showPayCode(scope.row)"
>
支付二维码
</el-button>
<el-button
v-auth="'recruit_recruitstudentsignup_back'"
type="primary"
link
icon="EditPen"
@click="handleCheckIn(scope.row)"
>
报到
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -207,7 +269,7 @@
<el-table-column label="姓名" prop="name" align="center" /> <el-table-column label="姓名" prop="name" align="center" />
<el-table-column label="家长手机号" prop="parentTelOne" align="center" /> <el-table-column label="家长手机号" prop="parentTelOne" align="center" />
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="center">
<template #default="scope"> <template #default>
<el-button type="danger" icon="Search" @click="updateFS">立即查询</el-button> <el-button type="danger" icon="Search" @click="updateFS">立即查询</el-button>
</template> </template>
</el-table-column> </el-table-column>
@@ -236,33 +298,23 @@
</template> </template>
<script setup lang="ts" name="backSchoolCheckinTabIndex"> <script setup lang="ts" name="backSchoolCheckinTabIndex">
import { ref, reactive, computed, onMounted, nextTick, defineAsyncComponent, defineExpose } from 'vue' import { ref, reactive, onMounted, nextTick, defineAsyncComponent, defineExpose } from 'vue'
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { BasicTableProps, useTable } from '/@/hooks/table' import { BasicTableProps, useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message' import { useMessage } from '/@/hooks/message'
import { getList } from '/@/api/recruit/recruitstudentplangroup' import { getList } from '/@/api/recruit/recruitstudentplangroup'
import { backPush, backSchoolStuPage, batchPushAll } from '/@/api/recruit/recruitstudentsignup' import { backSchoolStuPage } from '/@/api/recruit/recruitstudentsignup'
import { getDeptList } from '/@/api/basic/basicclass' import { getDeptList } from '/@/api/basic/basicclass'
import { listPlanByCondition as planMajor } from '/@/api/recruit/recruitstudentplan' import { listPlanByCondition as planMajor } from '/@/api/recruit/recruitstudentplan'
import { updateFs, updateAllFS as updateAllFSApi } from '/@/api/finance/financenormalstu' import { updateFs, updateAllFS as updateAllFSApi } from '/@/api/finance/financenormalstu'
import { getDicts } from '/@/api/admin/dict' import { getDicts } from '/@/api/admin/dict'
import { PAY_STATUS_LIST,PUSHED_STATUS_LIST,getStatusConfig, getCheckInStatusConfig } from '/@/config/global'
import { CircleCheck, CircleClose, DocumentChecked, Warning, Clock, Tickets } from '@element-plus/icons-vue'
const StuCheckIn = defineAsyncComponent(() => import('./stu-check-in.vue')) const StuCheckIn = defineAsyncComponent(() => import('./stu-check-in.vue'))
const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.vue')) const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.vue'))
const SearchForm = defineAsyncComponent(() => import('/@/components/SearchForm/index.vue'))
// 使用 Pinia store const ClickableTag = defineAsyncComponent(() => import('/@/components/ClickableTag/index.vue'))
const userInfoStore = useUserInfo() const DetailPopover = defineAsyncComponent(() => import('/@/components/DetailPopover/index.vue'))
const { userInfos } = storeToRefs(userInfoStore)
// 创建权限对象
const permissions = computed(() => {
const perms: Record<string, boolean> = {}
userInfos.value.authBtnList.forEach((perm: string) => {
perms[perm] = true
})
return perms
})
// 消息提示 hooks // 消息提示 hooks
const message = useMessage() const message = useMessage()
@@ -272,13 +324,16 @@ const tableRef = ref()
const searchFormRef = ref() const searchFormRef = ref()
const stuCheckInRef = ref() const stuCheckInRef = ref()
// 搜索表单显示状态
const showSearch = ref(true)
// 数据 // 数据
const planList = ref<any[]>([]) const planList = ref<any[]>([])
const planMajorList = ref<any[]>([]) const planMajorList = ref<any[]>([])
const deptList = ref<any[]>([]) const deptList = ref<any[]>([])
const backSchoolStateList = ref<any[]>([]) const backSchoolStateList = ref<any[]>([])
const paystatusList = ref([{ label: '已缴费', value: '10' }, { label: '未缴费', value: '0' }, { label: '部分缴费', value: '5' }]) const paystatusList = PAY_STATUS_LIST
const pushedList = ref([{ label: '未推送', value: '0' }, { label: '已推送', value: '1' }]) const pushedList = PUSHED_STATUS_LIST
// 查询表单 // 查询表单
const queryForm = reactive({ const queryForm = reactive({
@@ -318,43 +373,15 @@ const getMajorName = (majorCode: string) => {
return item ? item.majorName : '' return item ? item.majorName : ''
} }
// 获取性别 // 获取报到状态配置(用于 ClickableTag
const getGender = (gender: string) => { const getBackSchoolStateConfig = (value: string) => {
if (gender == '2') { return getCheckInStatusConfig(backSchoolStateList.value, value, {
return '女' CircleCheck,
} CircleClose,
if (gender == '1') { DocumentChecked,
return '男' Warning,
} Clock
return '' })
}
// 获取报到状态标签
const getBackSchoolStateLabel = (value: string) => {
const item = backSchoolStateList.value.find(item => item.value === value)
return item ? item.label : ''
}
// 获取缴费状态
const getStatus = (type: string) => {
if (type == '0') {
return '未缴费'
} else if (type == '5') {
return '部分缴费'
} else if (type == '10') {
return '已缴费'
}
return ''
}
// 获取推送状态
const getPushed = (type: string) => {
if (type == '0') {
return '未推送'
} else if (type == '1') {
return '已推送'
}
return ''
} }
// 表格状态 // 表格状态
@@ -388,6 +415,7 @@ const getMajorList = async (groupId: string) => {
const data = await planMajor({ groupId }) const data = await planMajor({ groupId })
planMajorList.value = data.data || [] planMajorList.value = data.data || []
} catch (error) { } catch (error) {
// eslint-disable-next-line no-console
console.error('获取专业列表失败', error) console.error('获取专业列表失败', error)
} }
} }
@@ -413,6 +441,7 @@ const init = async () => {
getDataList() getDataList()
} catch (error) { } catch (error) {
// eslint-disable-next-line no-console
console.error('初始化失败', error) console.error('初始化失败', error)
} }
} }
@@ -420,7 +449,7 @@ const init = async () => {
// 打开报到窗口 // 打开报到窗口
const handleCheckIn = (row: any) => { const handleCheckIn = (row: any) => {
nextTick(() => { nextTick(() => {
stuCheckInRef.value?.init(row, state.pagination.current) stuCheckInRef.value?.init(row, state.pagination?.current || 1)
}) })
} }
@@ -445,7 +474,7 @@ const updateAllFS = async () => {
message.success('正在更新所有缴费单状态,请稍后查看更新结果') message.success('正在更新所有缴费单状态,请稍后查看更新结果')
} }
} catch (error: any) { } catch (error: any) {
message.error(error.msg || '操作失败') // console.log(error)
} }
} }
@@ -559,9 +588,6 @@ onMounted(() => {
overflow: hidden; overflow: hidden;
} }
.search-form-wrapper {
flex-shrink: 0;
}
.action-buttons-wrapper { .action-buttons-wrapper {
flex-shrink: 0; flex-shrink: 0;
@@ -583,4 +609,33 @@ onMounted(() => {
flex-shrink: 0; flex-shrink: 0;
padding-top: 15px; padding-top: 15px;
} }
.empty-text {
color: #909399;
}
.reason-content {
display: flex;
align-items: flex-start;
gap: 8px;
padding: 8px 12px;
background-color: #fef0f0;
border-radius: 4px;
border-left: 3px solid #f56c6c;
.reason-icon {
color: #f56c6c;
font-size: 16px;
flex-shrink: 0;
margin-top: 2px;
}
span {
color: #f56c6c;
font-size: 13px;
line-height: 1.6;
word-break: break-all;
flex: 1;
}
}
</style> </style>

View File

@@ -15,8 +15,7 @@
v-model="queryForm.deptCode" v-model="queryForm.deptCode"
filterable filterable
clearable clearable
placeholder="请选择学院" placeholder="请选择学院">
style="width: 200px">
<el-option <el-option
v-for="item in deptList" v-for="item in deptList"
:key="item.deptCode" :key="item.deptCode"
@@ -30,8 +29,7 @@
v-model="queryForm.grade" v-model="queryForm.grade"
filterable filterable
clearable clearable
placeholder="请选择入学年份" placeholder="请选择入学年份">
style="width: 150px">
<el-option <el-option
v-for="item in planList" v-for="item in planList"
:key="item.id" :key="item.id"
@@ -45,8 +43,7 @@
v-model="queryForm.classCode" v-model="queryForm.classCode"
filterable filterable
clearable clearable
placeholder="请选择班级" placeholder="请选择班级">
style="width: 200px">
<el-option <el-option
v-for="item in classList" v-for="item in classList"
:key="item.classCode" :key="item.classCode"
@@ -60,8 +57,7 @@
v-model="queryForm.checkInStatus" v-model="queryForm.checkInStatus"
filterable filterable
clearable clearable
placeholder="请选择报到状态" placeholder="请选择报到状态">
style="width: 150px">
<el-option <el-option
v-for="item in checkInStatusData" v-for="item in checkInStatusData"
:key="item.value" :key="item.value"
@@ -75,10 +71,13 @@
v-model="queryForm.isDormApply" v-model="queryForm.isDormApply"
filterable filterable
clearable clearable
placeholder="请选择住宿申请" placeholder="请选择住宿申请">
style="width: 150px"> <el-option
<el-option label="未通过" value="0" /> v-for="item in dormApplyStatusList"
<el-option label="申请通过" value="1" /> :key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
@@ -91,7 +90,7 @@
<!-- 操作按钮 --> <!-- 操作按钮 -->
<div class="mb15"> <div class="mb15">
<el-button <el-button
v-if="permissions.recruit_newstucheckin_output" v-auth="'recruit_newstucheckin_output'"
type="warning" type="warning"
plain plain
icon="Download" icon="Download"
@@ -128,9 +127,14 @@
<el-table-column prop="idNumber" label="身份证号" align="center" show-overflow-tooltip /> <el-table-column prop="idNumber" label="身份证号" align="center" show-overflow-tooltip />
<el-table-column prop="checkInStatus" label="报到状态" align="center" show-overflow-tooltip> <el-table-column prop="checkInStatus" label="报到状态" align="center" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.checkInStatus"> <ClickableTag
{{ getCheckInStatusLabel(scope.row.checkInStatus) }} v-if="getCheckInStatusConfigLocal(scope.row.checkInStatus)"
</el-tag> :type="getCheckInStatusConfigLocal(scope.row.checkInStatus)?.type || 'info'"
:left-icon="getCheckInStatusConfigLocal(scope.row.checkInStatus)?.icon"
:right-icon="null">
{{ getCheckInStatusConfigLocal(scope.row.checkInStatus)?.label }}
</ClickableTag>
<span v-else class="empty-text">-</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="isRoom" label="是否住宿" align="center" width="120"> <el-table-column prop="isRoom" label="是否住宿" align="center" width="120">
@@ -155,29 +159,21 @@
} }
]"> ]">
<template #reference> <template #reference>
<el-tag type="success" class="dorm-tag"> <ClickableTag
type="success"
>
{{ getStatusConfig(yes_no_type, scope.row.isRoom)?.label }} {{ getStatusConfig(yes_no_type, scope.row.isRoom)?.label }}
<el-icon class="info-icon"><InfoFilled /></el-icon> </ClickableTag>
</el-tag>
</template> </template>
<!-- 住宿申请状态 --> <!-- 住宿申请状态 -->
<template #content-0> <template #content-0>
<div class="dorm-apply-content"> <div class="dorm-apply-content">
<ClickableTag <ClickableTag
v-if="scope.row.isDormApply == '1'" v-if="getStatusConfig(dormApplyStatusList, scope.row.isDormApply)"
type="success" :type="scope.row.isDormApply == '1'?'success':'danger'"
size="small" :left-icon="scope.row.isDormApply == '1'?'CircleCheck':'CircleClose'"
:left-icon="CircleCheck"
:right-icon="null"> :right-icon="null">
申请通过 {{getStatusConfig(dormApplyStatusList, scope.row.isDormApply)?.label}}
</ClickableTag>
<ClickableTag
v-else-if="scope.row.isDormApply == '0'"
type="danger"
size="small"
:left-icon="CircleClose"
:right-icon="null">
未通过
</ClickableTag> </ClickableTag>
<span v-else class="empty-text">-</span> <span v-else class="empty-text">-</span>
</div> </div>
@@ -208,16 +204,8 @@
</el-table-column> </el-table-column>
<el-table-column prop="residenceDetail" label="居住地址" align="center" show-overflow-tooltip /> <el-table-column prop="residenceDetail" label="居住地址" align="center" show-overflow-tooltip />
<el-table-column prop="parentName" label="家庭联系人" width="100" align="center" show-overflow-tooltip /> <el-table-column prop="parentName" label="家庭联系人" width="100" align="center" show-overflow-tooltip />
<el-table-column label="家长电话" align="center" show-overflow-tooltip> <el-table-column label="家长电话1" align="center" prop="parentTelOne" show-overflow-tooltip></el-table-column>
<template #default="scope"> <el-table-column label="家长电话2" align="center" prop="parentTelTwo" show-overflow-tooltip></el-table-column>
<div v-if="scope.row.parentTelOne || scope.row.parentTelTwo" class="parent-tel">
<span v-if="scope.row.parentTelOne" class="tel-item">{{ scope.row.parentTelOne }}</span>
<span v-if="scope.row.parentTelOne && scope.row.parentTelTwo" class="tel-separator">/</span>
<span v-if="scope.row.parentTelTwo" class="tel-item">{{ scope.row.parentTelTwo }}</span>
</div>
<span v-else class="empty-text">-</span>
</template>
</el-table-column>
<el-table-column prop="remarks" label="备注" align="center" show-overflow-tooltip /> <el-table-column prop="remarks" label="备注" align="center" show-overflow-tooltip />
<el-table-column label="操作" width="100" align="center" fixed="right"> <el-table-column label="操作" width="100" align="center" fixed="right">
<template #default="scope"> <template #default="scope">
@@ -248,21 +236,19 @@
</template> </template>
<script setup lang="ts" name="newstucheckin"> <script setup lang="ts" name="newstucheckin">
import { ref, reactive, computed, onMounted, defineAsyncComponent } from 'vue' import { ref, reactive, onMounted, defineAsyncComponent } from 'vue'
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { BasicTableProps, useTable } from '/@/hooks/table' import { BasicTableProps, useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message' import { useMessage } from '/@/hooks/message'
import { fetchList } from '/@/api/recruit/newstucheckin' import { fetchList } from '/@/api/recruit/newstucheckin'
import { getDictsByTypes } from '/@/api/admin/dict' import { getDictsByTypes } from '/@/api/admin/dict'
import { useDict } from '/@/hooks/dict' import { useDict } from '/@/hooks/dict'
import request from '/@/utils/request' import request from '/@/utils/request'
import { getStatusConfig } from '/@/config/global' import { getStatusConfig, getCheckInStatusConfig, DORM_APPLY_STATUS_LIST } from '/@/config/global'
import { getDeptList, getClassListByRole } from '/@/api/basic/basicclass' import { getDeptList, getClassListByRole } from '/@/api/basic/basicclass'
import { getList } from '/@/api/recruit/recruitstudentplangroup' import { getList } from '/@/api/recruit/recruitstudentplangroup'
import DetailPopover from '/@/components/DetailPopover/index.vue' import DetailPopover from '/@/components/DetailPopover/index.vue'
import ClickableTag from '/@/components/ClickableTag/index.vue' import ClickableTag from '/@/components/ClickableTag/index.vue'
import { InfoFilled, CircleCheck, CircleClose, HomeFilled, Grid } from '@element-plus/icons-vue' import { InfoFilled, CircleCheck, CircleClose, DocumentChecked, Warning, Clock } from '@element-plus/icons-vue'
const StuCheckIn = defineAsyncComponent(() => import('./stu-check-in.vue')) const StuCheckIn = defineAsyncComponent(() => import('./stu-check-in.vue'))
const TeacherNameNo = defineAsyncComponent(() => import('/@/components/TeacherNameNo/index.vue')) const TeacherNameNo = defineAsyncComponent(() => import('/@/components/TeacherNameNo/index.vue'))
@@ -271,18 +257,8 @@ const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/ind
// 是否住宿字典 // 是否住宿字典
const { yes_no_type } = useDict('yes_no_type') const { yes_no_type } = useDict('yes_no_type')
// 使用 Pinia store // 住宿申请状态列表
const userInfoStore = useUserInfo() const dormApplyStatusList = DORM_APPLY_STATUS_LIST
const { userInfos } = storeToRefs(userInfoStore)
// 创建权限对象
const permissions = computed(() => {
const perms: Record<string, boolean> = {}
userInfos.value.authBtnList.forEach((perm: string) => {
perms[perm] = true
})
return perms
})
// 消息提示 hooks // 消息提示 hooks
const message = useMessage() const message = useMessage()
@@ -341,10 +317,15 @@ const state: BasicTableProps = reactive<BasicTableProps>({
// 使用 table hook // 使用 table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state) const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
// 获取报到状态标签 // 获取报到状态配置(用于 ClickableTag
const getCheckInStatusLabel = (value: string) => { const getCheckInStatusConfigLocal = (value: string) => {
const item = checkInStatusData.value.find(item => item.value === value) return getCheckInStatusConfig(checkInStatusData.value, value, {
return item ? item.label : value CircleCheck,
CircleClose,
DocumentChecked,
Warning,
Clock
})
} }
// 重置查询 // 重置查询
@@ -406,7 +387,7 @@ const handleExportOut = async () => {
message.success('导出成功') message.success('导出成功')
} catch (error: any) { } catch (error: any) {
message.error(error.msg || '导出失败') // console.log(error)
} finally { } finally {
exportLoading.value = false exportLoading.value = false
} }
@@ -443,7 +424,7 @@ const init = async () => {
getDataList() getDataList()
} catch (error) { } catch (error) {
message.error('初始化失败') // console.log(error)
} }
} }
@@ -456,7 +437,7 @@ onMounted(() => {
.parent-tel { .parent-tel {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; // justify-content: center;
gap: 4px; gap: 4px;
.tel-item { .tel-item {

View File

@@ -14,7 +14,7 @@
</el-form-item> </el-form-item>
<el-form-item label="身份证号" prop="idCard"> <el-form-item label="身份证号" prop="idCard">
<el-input v-model="form.idNumber"></el-input> <el-input v-model="form.idNumber" v-input-filter="'idcard'"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="报到状态" prop="checkInStatus"> <el-form-item label="报到状态" prop="checkInStatus">
@@ -71,7 +71,7 @@
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remarks"> <el-form-item label="备注" prop="remarks">
<el-input v-model="form.remarks" :rows="2"></el-input> <el-input v-model="form.remarks" type="textarea" :rows="2"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>

View File

@@ -3,7 +3,7 @@
:title="!dataForm.id ? '新增' : '修改'" :title="!dataForm.id ? '新增' : '修改'"
:close-on-click-modal="false" :close-on-click-modal="false"
v-model="visible" v-model="visible"
width="600px" width="800px"
> >
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" <el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit"
label-width="100px"> label-width="100px">
@@ -54,21 +54,31 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="中德班" prop="isZd"> <el-row>
<el-col :span="8">
<el-form-item label="中德班" prop="isZd">
<el-radio-group v-model="dataForm.isZd"> <el-radio-group v-model="dataForm.isZd">
<el-radio v-for="item in yes_no_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio> <el-radio v-for="item in yes_no_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="订单班" prop="isOrder">
</el-col>
<el-col :span="8">
<el-form-item label="订单班" prop="isOrder">
<el-radio-group v-model="dataForm.isOrder"> <el-radio-group v-model="dataForm.isOrder">
<el-radio v-for="item in yes_no_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio> <el-radio v-for="item in yes_no_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="联院班" prop="isUnion">
</el-col>
<el-col :span="8">
<el-form-item label="联院班" prop="isUnion">
<el-radio-group v-model="dataForm.isUnion"> <el-radio-group v-model="dataForm.isUnion">
<el-radio v-for="item in yes_no_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio> <el-radio v-for="item in yes_no_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col>
</el-row>
<el-form-item label="正式专业代码" prop="stuworkMajorCode"> <el-form-item label="正式专业代码" prop="stuworkMajorCode">
<el-select v-model="dataForm.stuworkMajorCode" filterable placeholder="请选择正式专业代码"> <el-select v-model="dataForm.stuworkMajorCode" filterable placeholder="请选择正式专业代码">
<el-option <el-option
@@ -79,19 +89,47 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-row>
<el-col :span="8">
<el-form-item label="初中费用" prop="czFee">
<el-input-number
v-model="dataForm.czFee"
controls-position="right"
:min="0"
:max="999999"
:precision="2"
placeholder="请输入初中费用"
>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="高中费用" prop="gzFee">
<el-input-number
v-model="dataForm.gzFee"
controls-position="right"
:min="0"
:max="999999"
:precision="2"
placeholder="请输入高中费用"
>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="技职校费用" prop="jzxFee">
<el-input-number
v-model="dataForm.jzxFee"
controls-position="right"
:min="0"
:max="999999"
:precision="2"
placeholder="请输入技职校费用" >
</el-input-number>
</el-form-item>
</el-col>
</el-row>
<!-- <el-form-item label="市平台代码" prop="cityPlanId">-->
<!-- <el-select v-model="dataForm.cityPlanId" filterable placeholder="请选择市平台代码">-->
<!-- <el-option-->
<!-- v-for="item in cityPlanIdList"-->
<!-- :key="item.id"-->
<!-- :label="item.schoolMajorName+' | '+item.educational"-->
<!-- :value="item.id"-->
<!-- :disabled="isCityDisable(item.id)"-->
<!-- >-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="排序" prop="sort"> <el-form-item label="排序" prop="sort">
<el-input-number :min="0" :max="999" v-model="dataForm.sort" placeholder="排序"></el-input-number> <el-input-number :min="0" :max="999" v-model="dataForm.sort" placeholder="排序"></el-input-number>
</el-form-item> </el-form-item>
@@ -139,6 +177,7 @@ const planList = ref<any[]>([])
const deptList = ref<any[]>([]) const deptList = ref<any[]>([])
const ccList = ref<any[]>([]) const ccList = ref<any[]>([])
const majorYears = ref<any[]>([]) const majorYears = ref<any[]>([])
const tuitionFeeList = ref<any[]>([])
const dataForm = reactive({ const dataForm = reactive({
id: "", id: "",
@@ -154,6 +193,9 @@ const dataForm = reactive({
stuworkMajorCode: "", stuworkMajorCode: "",
isUnion: "0", isUnion: "0",
tuitionFee: 0, tuitionFee: 0,
czFee: 0,
gzFee: 0,
jzxFee: 0,
sort: 0 sort: 0
}) })
@@ -190,6 +232,18 @@ const dataRule = {
isUnion: [ isUnion: [
{ required: true, message: '联院班不能为空', trigger: 'blur' } { required: true, message: '联院班不能为空', trigger: 'blur' }
], ],
czFee: [
{ required: true, message: '初中费用不能为空', trigger: 'blur' },
{ type: 'number', min: 0, message: '初中费用不能小于0', trigger: 'blur' }
],
gzFee: [
{ required: true, message: '高中费用不能为空', trigger: 'blur' },
{ type: 'number', min: 0, message: '高中费用不能小于0', trigger: 'blur' }
],
jzxFee: [
{ required: true, message: '技职校费用不能为空', trigger: 'blur' },
{ type: 'number', min: 0, message: '技职校费用不能小于0', trigger: 'blur' }
],
remarks: [ remarks: [
{ min: 1, max: 100, message: '备注长度不大于100个字符', trigger: 'blur' } { min: 1, max: 100, message: '备注长度不大于100个字符', trigger: 'blur' }
], ],
@@ -205,6 +259,27 @@ const isCityDisable = (id: string) => {
return dataForm.cityPlanIds.some(e => e == id) return dataForm.cityPlanIds.some(e => e == id)
} }
// 设置费用默认值
const setFeeDefaults = () => {
if (tuitionFeeList.value.length > 0) {
// 初中费用:字典值 1
const czFeeItem = tuitionFeeList.value.find((item: any) => item.value === '1')
if (czFeeItem) {
dataForm.czFee = Number(czFeeItem.label) || 0
}
// 高中费用:字典值 2
const gzFeeItem = tuitionFeeList.value.find((item: any) => item.value === '2')
if (gzFeeItem) {
dataForm.gzFee = Number(gzFeeItem.label) || 0
}
// 技职校费用:字典值 3
const jzxFeeItem = tuitionFeeList.value.find((item: any) => item.value === '3')
if (jzxFeeItem) {
dataForm.jzxFee = Number(jzxFeeItem.label) || 0
}
}
}
// 初始化数据 // 初始化数据
const initData = () => { const initData = () => {
// 查询二级学院信息 // 查询二级学院信息
@@ -218,9 +293,10 @@ const initData = () => {
offcialZydmList.value = data.data offcialZydmList.value = data.data
}) })
// 获取数据字典(一次获取多个) // 获取数据字典(一次获取多个)
getDictsByTypes(['basic_major_years', 'basic_major_level']).then((res: any) => { getDictsByTypes(['basic_major_years', 'basic_major_level', 'tuition_fee']).then((res: any) => {
majorYears.value = res.data?.basic_major_years || [] majorYears.value = res.data?.basic_major_years || []
ccList.value = res.data?.basic_major_level || [] ccList.value = res.data?.basic_major_level || []
tuitionFeeList.value = res.data?.tuition_fee || []
}) })
} }
@@ -292,12 +368,17 @@ const init = (id: string | null) => {
// 错误处理 // 错误处理
}) })
} else { } else {
// 新增模式:设置默认招生计划 // 新增模式:设置默认招生计划和费用默认值
getList().then((data: any) => { getList().then((data: any) => {
if (data.data && data.data.length > 0) { if (data.data && data.data.length > 0) {
dataForm.groupId = data.data[0]?.id || "" dataForm.groupId = data.data[0]?.id || ""
} }
}) })
// 等待字典数据加载完成后设置费用默认值
getDictsByTypes(['tuition_fee']).then((res: any) => {
tuitionFeeList.value = res.data?.tuition_fee || []
setFeeDefaults()
})
} }
} }
@@ -307,8 +388,11 @@ defineExpose({
}) })
</script> </script>
<style scoped> <style lang="scss" scoped>
.dialog-footer { .dialog-footer {
text-align: right; text-align: right;
} }
.el-row {
margin-bottom: 18px !important;
}
</style> </style>

View File

@@ -258,7 +258,8 @@ const init = async () => {
getDataList() getDataList()
} catch (error) { } catch (error) {
message.error('初始化失败') console.log(error)
} }
} }
@@ -269,7 +270,8 @@ const changeSm = async (row: any) => {
await editQuickField(parmas) await editQuickField(parmas)
message.success('修改成功') message.success('修改成功')
} catch (error: any) { } catch (error: any) {
message.error(error.msg || '修改失败') console.log(error)
} }
} }

View File

@@ -5,7 +5,7 @@
v-model="visible" v-model="visible"
width="800px" width="800px"
> >
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="120px"> <el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="招生计划" prop="groupId"> <el-form-item label="招生计划" prop="groupId">

View File

@@ -4,7 +4,7 @@
:close-on-click-modal="false" :close-on-click-modal="false"
width="600px" width="600px"
v-model="visible"> v-model="visible">
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="120px"> <el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
<el-form-item label="招生计划" prop="groupId"> <el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable :disabled="!dataForm.id ? false : true" placeholder="请选择招生计划"> <el-select v-model="dataForm.groupId" filterable :disabled="!dataForm.id ? false : true" placeholder="请选择招生计划">
<el-option <el-option

View File

@@ -238,7 +238,7 @@ const init = async () => {
} }
getDataList() getDataList()
} catch (error) { } catch (error) {
message.error('初始化失败') // console.log(error)
} }
} }

View File

@@ -5,7 +5,7 @@
width="600px" width="600px"
v-model="visible"> v-model="visible">
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" <el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit"
label-width="120px"> label-width="100px">
<el-form-item label="招生计划" prop="groupId"> <el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" :disabled="!!dataForm.id"> <el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" :disabled="!!dataForm.id">

View File

@@ -146,7 +146,7 @@ const init = async () => {
} }
getDataList() getDataList()
} catch (error) { } catch (error) {
message.error('初始化失败') // console.log(error)
} }
} }

View File

@@ -5,7 +5,7 @@
v-model="visible" v-model="visible"
width="600px" width="600px"
> >
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="120px"> <el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
<el-form-item label="招生计划" prop="groupId"> <el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id" placeholder="请选择招生计划"> <el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id" placeholder="请选择招生计划">
<el-option <el-option

View File

@@ -42,7 +42,7 @@
<!-- 操作按钮 --> <!-- 操作按钮 -->
<div class="mb15"> <div class="mb15">
<el-button <el-button
v-if="permissions.recruit_recruitstudentplangroup_add" v-auth="'recruit_recruitstudentplangroup_add'"
type="primary" type="primary"
icon="FolderAdd" icon="FolderAdd"
@click="addOrUpdateHandle" @click="addOrUpdateHandle"
@@ -76,7 +76,7 @@
<el-table-column label="操作" width="150" align="center" fixed="right"> <el-table-column label="操作" width="150" align="center" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-if="permissions.recruit_recruitstudentschool_edit" v-auth="'recruit_recruitstudentschool_edit'"
type="primary" type="primary"
link link
icon="EditPen" icon="EditPen"
@@ -85,7 +85,7 @@
修改 修改
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruit_recruitstudentschool_del" v-auth="'recruit_recruitstudentschool_del'"
type="danger" type="danger"
link link
icon="Delete" icon="Delete"
@@ -112,9 +112,7 @@
</template> </template>
<script setup lang="ts" name="recruitstudentschool"> <script setup lang="ts" name="recruitstudentschool">
import { ref, reactive, computed, onMounted, nextTick, defineAsyncComponent } from 'vue' import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue'
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { BasicTableProps, useTable } from '/@/hooks/table' import { BasicTableProps, useTable } from '/@/hooks/table'
import { useMessage, useMessageBox } from '/@/hooks/message' import { useMessage, useMessageBox } from '/@/hooks/message'
import { getList } from '/@/api/recruit/recruitstudentplangroup' import { getList } from '/@/api/recruit/recruitstudentplangroup'
@@ -124,19 +122,6 @@ import { getDeptList } from '/@/api/basic/basicclass'
const TableForm = defineAsyncComponent(() => import('./detaiform.vue')) const TableForm = defineAsyncComponent(() => import('./detaiform.vue'))
const MajorGroupByDeptForm = defineAsyncComponent(() => import('/@/views/recruit/recruitplanmajor/majorGroupByDept.vue')) const MajorGroupByDeptForm = defineAsyncComponent(() => import('/@/views/recruit/recruitplanmajor/majorGroupByDept.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 // 消息提示 hooks
const message = useMessage() const message = useMessage()
const messageBox = useMessageBox() const messageBox = useMessageBox()

View File

@@ -306,23 +306,7 @@
:cell-style="tableStyle.cellStyle" :cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"> :header-cell-style="tableStyle.headerCellStyle">
<el-table-column
header-align="center"
align="center"
width="140"
label="操作">
<template #default="scope">
<div style="display: flex; align-items: center;">
<el-button type="primary" link icon="Document" @click="addOrUpdateHandle(scope.row.id,0)">
查看
</el-button>
<ActionDropdown
:items="getActionMenuItems(scope.row)"
@command="(command) => handleMoreCommand(command, scope.row)"
/>
</div>
</template>
</el-table-column>
<el-table-column <el-table-column
prop="serialNumber" prop="serialNumber"
@@ -343,7 +327,7 @@
prop="name" prop="name"
header-align="center" header-align="center"
align="center" align="center"
width="120" width="130"
label="资料检测"> label="资料检测">
<template #default="scope"> <template #default="scope">
<div v-if="scope.row.isOut=='0'" class="material-check-compact"> <div v-if="scope.row.isOut=='0'" class="material-check-compact">
@@ -610,6 +594,23 @@
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column
header-align="center"
align="center"
width="140"
label="操作">
<template #default="scope">
<div style="display: flex; align-items: center;">
<el-button type="primary" link icon="Document" @click="addOrUpdateHandle(scope.row.id,0)">
查看
</el-button>
<ActionDropdown
:items="getActionMenuItems(scope.row)"
@command="(command) => handleMoreCommand(command, scope.row)"
/>
</div>
</template>
</el-table-column>
</el-table> </el-table>

View File

@@ -1,87 +1,100 @@
<template> <template>
<div> <div>
<!-- 搜索表单 --> <!-- 搜索表单 -->
<el-form :model="queryForm" inline ref="searchFormRef"> <search-form
<el-form-item label="招生计划" prop="groupId"> v-show="showSearch"
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划"> :model="queryForm"
<el-option ref="searchFormRef"
v-for="item in planList" @keyup-enter="getDataList"
:key="item.id" >
:label="item.groupName" <template #default="{ visible }">
:value="item.id" <template v-if="visible">
/> <el-form-item label="招生计划" prop="groupId">
</el-select> <el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
</el-form-item> <el-option
<el-form-item label="学院" prop="deptCode"> v-for="item in planList"
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院"> :key="item.id"
<el-option :label="item.groupName"
v-for="item in deptList" :value="item.id"
:key="item.deptCode" />
:label="item.deptName" </el-select>
:value="item.deptCode" </el-form-item>
/> <el-form-item label="学院" prop="deptCode">
</el-select> <el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
</el-form-item> <el-option
<el-form-item label="录取专业" prop="confirmedMajor"> v-for="item in deptList"
<el-select v-model="queryForm.confirmedMajor" filterable clearable placeholder="请选择录取专业"> :key="item.deptCode"
<el-option :label="item.deptName"
v-for="item in planMajorList" :value="item.deptCode"
:key="item.majorCode" />
:label="item.majorName + '(' + item.learnYear + '年制)'" </el-select>
:value="item.majorCode" </el-form-item>
/> <el-form-item label="录取专业" prop="confirmedMajor">
</el-select> <el-select v-model="queryForm.confirmedMajor" filterable clearable placeholder="请选择录取专业">
</el-form-item> <el-option
<el-form-item label="唯一号/姓名/身份证号" prop="search"> v-for="item in planMajorList"
<el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号" /> :key="item.majorCode"
</el-form-item> :label="item.majorName + '(' + item.learnYear + '年制)'"
<el-form-item label="住宿范围" prop="isOutFw"> :value="item.majorCode"
<el-select v-model="queryForm.isOutFw" filterable clearable placeholder="请选择住宿范围"> />
<el-option </el-select>
v-for="item in isOutFwList" </el-form-item>
:key="item.value" <el-form-item label="唯一号/姓名/身份证号" prop="search">
:label="item.label" <el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号" />
:value="item.value" </el-form-item>
/> </template>
</el-select> <template v-else>
</el-form-item> <el-form-item label="住宿范围" prop="isOutFw">
<el-form-item label="是否发送短信" prop="isSend"> <el-select v-model="queryForm.isOutFw" filterable clearable placeholder="请选择住宿范围">
<el-select v-model="queryForm.isSend" filterable clearable placeholder="请选择是否发送短信"> <el-option
<el-option v-for="item in isOutFwList"
v-for="item in isSendList" :key="item.value"
:key="item.value" :label="item.label"
:label="item.label" :value="item.value"
:value="item.value" />
/> </el-select>
</el-select> </el-form-item>
</el-form-item> <el-form-item label="是否发送短信" prop="isSend">
<el-form-item label="性别" prop="gender"> <el-select v-model="queryForm.isSend" filterable clearable placeholder="请选择是否发送短信">
<el-select v-model="queryForm.gender" filterable clearable placeholder="请选择性别"> <el-option
<el-option v-for="item in isSendList"
v-for="item in sexy" :key="item.value"
:key="item.value" :label="item.label"
:label="item.label" :value="item.value"
:value="item.value" />
/> </el-select>
</el-select> </el-form-item>
</el-form-item> <el-form-item label="性别" prop="gender">
<el-select v-model="queryForm.gender" filterable clearable placeholder="请选择性别">
<el-option
v-for="item in sexy"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</template>
</template>
<template #actions>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button> <el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button> <el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </template>
</search-form>
<!-- 操作按钮 --> <!-- 操作按钮 -->
<div class="mb15"> <div class="mb15">
<el-button <el-button
v-if="permissions.recruitStuDorm" v-auth="'recruitStuDorm'"
icon="Setting" icon="Setting"
@click="setDormFW" @click="setDormFW"
> >
设置住宿范围 设置住宿范围
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruitStuDorm" v-auth="'recruitStuDorm'"
type="danger" type="danger"
plain plain
icon="Location" icon="Location"
@@ -91,7 +104,7 @@
一键判断住宿范围 一键判断住宿范围
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruitStuDormMess" v-auth="'recruitStuDormMess'"
type="danger" type="danger"
plain plain
icon="Message" icon="Message"
@@ -138,27 +151,24 @@
<el-table-column prop="homeAddressDetail" label="家庭地址" align="center" show-overflow-tooltip /> <el-table-column prop="homeAddressDetail" label="家庭地址" align="center" show-overflow-tooltip />
<el-table-column prop="isOutFw" label="范围" width="100" align="center" show-overflow-tooltip> <el-table-column prop="isOutFw" label="范围" width="100" align="center" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.isOutFw == 0">待确认</span> <span v-if="getStatusConfig(DORM_RANGE_STATUS_LIST, scope.row.isOutFw)">{{ getStatusConfig(DORM_RANGE_STATUS_LIST, scope.row.isOutFw)?.label }}</span>
<span v-if="scope.row.isOutFw == 1">范围内</span>
<span v-if="scope.row.isOutFw == 2">范围外</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="isSd" label="手动设置" width="100" align="center" show-overflow-tooltip> <el-table-column prop="isSd" label="手动设置" width="100" align="center" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.isSd == 0">未设置</span> <span v-if="getStatusConfig(MANUAL_SET_STATUS_LIST, scope.row.isSd)">{{ getStatusConfig(MANUAL_SET_STATUS_LIST, scope.row.isSd)?.label }}</span>
<span v-if="scope.row.isSd == 1">已设置</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="isSend" label="发送短信" width="100" align="center" show-overflow-tooltip> <el-table-column prop="isSend" label="发送短信" width="100" align="center" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.isSend == 0">未发送</span> <span v-if="getStatusConfig(SEND_STATUS_LIST, scope.row.isSend)">{{ getStatusConfig(SEND_STATUS_LIST, scope.row.isSend)?.label }}</span>
<span v-if="scope.row.isSend == 1">已发送</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="300" align="center" fixed="right"> <el-table-column label="操作" width="300" align="center" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-if="permissions.recruitStuDormSd && scope.row.isOutFw != '1'" v-auth="'recruitStuDormSd'"
v-if="scope.row.isOutFw != '1'"
type="primary" type="primary"
link link
icon="CircleCheck" icon="CircleCheck"
@@ -167,7 +177,8 @@
设为范围内 设为范围内
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruitStuDormSd && scope.row.isOutFw != '2'" v-auth="'recruitStuDormSd'"
v-if="scope.row.isOutFw != '2'"
type="primary" type="primary"
link link
icon="Close" icon="Close"
@@ -184,7 +195,7 @@
家庭地址 家庭地址
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruitStuDormDel" v-auth="'recruitStuDormDel'"
type="danger" type="danger"
link link
icon="Delete" icon="Delete"
@@ -209,36 +220,20 @@
</template> </template>
<script setup lang="ts" name="recruitstudentsignupList"> <script setup lang="ts" name="recruitstudentsignupList">
import { ref, reactive, computed, onMounted, nextTick, defineAsyncComponent } from 'vue' import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue'
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { BasicTableProps, useTable } from '/@/hooks/table' import { BasicTableProps, useTable } from '/@/hooks/table'
import { useMessage, useMessageBox } from '/@/hooks/message' import { useMessage, useMessageBox } from '/@/hooks/message'
import { useDict } from '/@/hooks/dict' import { useDict } from '/@/hooks/dict'
import { getLabelValue } from '/@/utils/dictLabel'
import { getList } from '/@/api/recruit/recruitstudentplangroup' import { getList } from '/@/api/recruit/recruitstudentplangroup'
import { fetchListStuDorm, yjOut as yjOutApi, setFw as setFwApi, delFw, yjSend as yjSendApi } from '/@/api/recruit/recruitstudentsignup' import { fetchListStuDorm, yjOut as yjOutApi, setFw as setFwApi, delFw, yjSend as yjSendApi } from '/@/api/recruit/recruitstudentsignup'
import { getDeptList } from '/@/api/basic/basicclass' import { getDeptList } from '/@/api/basic/basicclass'
import { DORM_RANGE_STATUS_LIST, SEND_STATUS_LIST, MANUAL_SET_STATUS_LIST, getStatusConfig } from '/@/config/global'
const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.vue')) const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.vue'))
const SearchForm = defineAsyncComponent(() => import('/@/components/SearchForm/index.vue'))
const DormFW = defineAsyncComponent(() => import('./dormFW.vue')) const DormFW = defineAsyncComponent(() => import('./dormFW.vue'))
const ShowMap = defineAsyncComponent(() => import('./showMap.vue')) const ShowMap = defineAsyncComponent(() => import('./showMap.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 // 消息提示 hooks
const message = useMessage() const message = useMessage()
const messageBox = useMessageBox() const messageBox = useMessageBox()
@@ -246,6 +241,9 @@ const messageBox = useMessageBox()
// 字典数据 // 字典数据
const { sexy } = useDict('sexy') const { sexy } = useDict('sexy')
// 搜索表单显示状态
const showSearch = ref(true)
// 表格引用 // 表格引用
const tableRef = ref() const tableRef = ref()
const searchFormRef = ref() const searchFormRef = ref()
@@ -256,8 +254,9 @@ const baiduMapRef = ref()
const planList = ref<any[]>([]) const planList = ref<any[]>([])
const planMajorList = ref<any[]>([]) const planMajorList = ref<any[]>([])
const deptList = ref<any[]>([]) const deptList = ref<any[]>([])
const isOutFwList = ref([{ label: '待确认', value: '0' }, { label: '范围内', value: '1' }, { label: '范围外', value: '2' }]) const isOutFwList = DORM_RANGE_STATUS_LIST
const isSendList = ref([{ label: '未发送', value: 0 }, { label: '已发送', value: 1 }]) const isSendList = SEND_STATUS_LIST
// 查询表单 // 查询表单
const queryForm = reactive({ const queryForm = reactive({
@@ -321,7 +320,7 @@ const init = async () => {
getDataList() getDataList()
} catch (error) { } catch (error) {
message.error('初始化失败') // console.log(error)
} }
} }

View File

@@ -6,7 +6,7 @@
v-model="visible" v-model="visible"
width="90%"> width="90%">
<div style="height: 100%;width:100%"> <div style="height: 100%;width:100%">
<el-descriptions :column="1" border> <el-descriptions :column="1" border class="address-descriptions">
<el-descriptions-item label="家庭地址">{{ form.homeAddressDetail }}</el-descriptions-item> <el-descriptions-item label="家庭地址">{{ form.homeAddressDetail }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<div id="container2"></div> <div id="container2"></div>
@@ -179,4 +179,10 @@ defineExpose({
ul li { ul li {
list-style: none; list-style: none;
} }
:deep(.address-descriptions .el-descriptions__label) {
width: 100px !important;
min-width: 100px !important;
text-align: center !important;
}
</style> </style>

View File

@@ -58,12 +58,12 @@
:width="320" :width="320"
:items="(() => { :items="(() => {
const items = [] const items = []
if (scope.row.oldMajorInfo) {
items.push({ label: '旧专业', content: scope.row.oldMajorInfo })
}
if (scope.row.newMajorInfo) { if (scope.row.newMajorInfo) {
items.push({ label: '新专业', content: scope.row.newMajorInfo, contentClass: 'new-major' }) items.push({ label: '新专业', content: scope.row.newMajorInfo, contentClass: 'new-major' })
} }
if (scope.row.oldMajorInfo) {
items.push({ label: '旧专业', content: scope.row.oldMajorInfo })
}
return items return items
})()"> })()">
<template #reference> <template #reference>
@@ -201,8 +201,8 @@
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="cancelPlace">取消</el-button>
<el-button type="primary" @click="update">保存</el-button> <el-button type="primary" @click="update">保存</el-button>
<el-button @click="cancelPlace">关闭</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>

View File

@@ -28,7 +28,7 @@
<!-- 操作按钮 --> <!-- 操作按钮 -->
<el-row> <el-row>
<div class="mb15"> <div>
<el-button <el-button
v-if="permissions.recruit_recruitstudentsignupturnovermoneychange_add" v-if="permissions.recruit_recruitstudentsignupturnovermoneychange_add"
type="primary" type="primary"