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" }
];
// 发送短信状态
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 = [
{ 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));
};
/**
* 获取报到状态配置(用于 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"
icon="delete"
link
type="primary"
type="danger"
style="margin-left: 12px"
@click="handleDel(scope.row)">删除
</el-button>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,28 +1,23 @@
<template>
<div>
<el-dialog v-model="newStuCheckInDialog" width="40%">
<el-form :model="form" :rules="rules" ref="formRef" label-width="120px" class="demo-ruleForm">
<el-dialog v-model="newStuCheckInDialog" width="600">
<el-form :model="form" :rules="rules" ref="formRef" label-width="100px" class="demo-ruleForm">
<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 label="性别" prop="gender">
<el-select v-model="form.gender" placeholder="请选择性别" disabled style="width: 80%">
<el-option
v-for="item in genderData"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-radio-group v-model="form.gender">
<el-radio v-for="item in genderData" :key="item.value" :label="item.value" :disabled="true">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<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 label="报到状态" prop="backSchoolState">
<el-select v-model="form.backSchoolState" filterable placeholder="请选择报到状态" style="width: 80%">
<el-select v-model="form.backSchoolState" filterable placeholder="请选择报到状态">
<el-option
v-for="item in checkInStatusData"
:key="item.value"
@@ -33,13 +28,14 @@
</el-form-item>
<el-form-item label="回校备注" prop="backSchoolRemark">
<el-input v-model="form.backSchoolRemark" :rows="2" style="width: 80%" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="checkIn" :loading="submitLoading">确定</el-button>
<el-button @click="newStuCheckInDialog = false">取消</el-button>
<el-input v-model="form.backSchoolRemark" :rows="2" type="textarea"/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="newStuCheckInDialog = false">取消</el-button>
<el-button type="primary" @click="checkIn" :loading="submitLoading">确定</el-button>
</template>
</el-dialog>
</div>
</template>
@@ -51,12 +47,12 @@ import { useDict } from '/@/hooks/dict'
import { putBackObj } from '/@/api/recruit/recruitstudentsignup'
import { getDicts } from '/@/api/admin/dict'
// 性别字典
const { sexy:genderData } = useDict('sexy')
// 消息提示 hooks
const message = useMessage()
// 字典
const { getTypeValue } = useDict()
// 定义 emits
const emit = defineEmits(['reload'])
@@ -69,12 +65,6 @@ const checkInStatusData = ref<any[]>([])
const submitLoading = ref(false)
const page = ref<any>({})
// 固定数据
const genderData = [
{ label: '女', value: '2' },
{ label: '男', value: '1' }
]
// 表单数据
const form = reactive({
id: '',
@@ -140,10 +130,6 @@ const checkIn = async () => {
message.success('报到成功')
emit('reload')
newStuCheckInDialog.value = false
} catch (error: any) {
if (error !== false) {
message.error(error.msg || '报到失败')
}
} finally {
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>
<div class="tab-index-container">
<!-- 搜索表单 -->
<div class="search-form-wrapper">
<el-form :model="queryForm" inline ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="chanMajor">
<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="deptCode">
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
<el-option
v-for="item in deptList"
:key="item.deptCode"
:label="item.deptName"
:value="item.deptCode"
/>
</el-select>
</el-form-item>
<el-form-item label="录取专业" prop="confirmedMajor">
<el-select v-model="queryForm.confirmedMajor" filterable clearable placeholder="请选择录取专业">
<el-option
v-for="item in planMajorList"
:key="item.majorCode"
:label="item.majorName + '(' + item.learnYear + '年制)'"
:value="item.majorCode"
/>
</el-select>
</el-form-item>
<el-form-item label="唯一号/姓名/身份证号/学校名称" prop="search">
<el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号/学校名称" />
</el-form-item>
<el-form-item label="缴费状态" prop="paystatus">
<el-select v-model="queryForm.paystatus" filterable clearable placeholder="请选择缴费状态">
<el-option
v-for="item in paystatusList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="推送状态" prop="pushed">
<el-select v-model="queryForm.pushed" filterable clearable placeholder="请选择推送状态">
<el-option
v-for="item in pushedList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="报到状态" prop="backSchoolState">
<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>
<search-form
v-show="showSearch"
:model="queryForm"
ref="searchFormRef"
@keyup-enter="getDataList"
>
<template #default="{ visible }">
<template v-if="visible">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="chanMajor">
<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="deptCode">
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
<el-option
v-for="item in deptList"
:key="item.deptCode"
:label="item.deptName"
:value="item.deptCode"
/>
</el-select>
</el-form-item>
<el-form-item label="录取专业" prop="confirmedMajor">
<el-select v-model="queryForm.confirmedMajor" filterable clearable placeholder="请选择录取专业">
<el-option
v-for="item in planMajorList"
:key="item.majorCode"
:label="item.majorName + '(' + item.learnYear + '年制)'"
:value="item.majorCode"
/>
</el-select>
</el-form-item>
<el-form-item label="唯一号/姓名/身份证号/学校名称" prop="search">
<el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号/学校名称" />
</el-form-item>
</template>
<template v-else>
<el-form-item label="缴费状态" prop="paystatus">
<el-select v-model="queryForm.paystatus" filterable clearable placeholder="请选择缴费状态">
<el-option
v-for="item in paystatusList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="推送状态" prop="pushed">
<el-select v-model="queryForm.pushed" filterable clearable placeholder="请选择推送状态">
<el-option
v-for="item in pushedList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="报到状态" prop="backSchoolState">
<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-button type="primary" icon="Search" @click="getDataList">查询</el-button>
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</div>
</template>
</search-form>
<!-- 操作按钮 -->
<div class="action-buttons-wrapper mb15">
@@ -101,7 +95,7 @@
名单导出
</el-button>
<el-button
v-if="permissions.recruit_recruitstudentsignup_allCX"
v-auth="'recruit_recruitstudentsignup_allCX'"
type="primary"
plain
icon="Search"
@@ -110,6 +104,12 @@
>
批量查询
</el-button>
<right-toolbar
@queryTable="getDataList"
class="ml10"
style="float: right; "
v-model:showSearch="showSearch"
></right-toolbar>
</div>
<!-- 表格 -->
@@ -125,28 +125,6 @@
:header-cell-style="tableStyle.headerCellStyle"
>
<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="deptCode" label="学院" align="center" show-overflow-tooltip>
<template #default="scope">
@@ -163,29 +141,113 @@
</template>
</el-table-column>
<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">
<GenderTag :sex="scope.row.gender" />
</template>
</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="parentTelTwo" label="家长电话2" align="center" show-overflow-tooltip />
<el-table-column prop="backSchoolState" label="报到状态" align="center" show-overflow-tooltip>
<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>
</el-table-column>
<el-table-column prop="backSchoolRemark" label="报到备注" align="center" show-overflow-tooltip />
<el-table-column prop="paiedOffline" label="缴费状态" align="center" show-overflow-tooltip>
<el-table-column prop="paiedOffline" label="缴费状态" width="110" align="center" show-overflow-tooltip>
<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>
</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">
<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>
</el-table-column>
</el-table>
@@ -207,7 +269,7 @@
<el-table-column label="姓名" prop="name" align="center" />
<el-table-column label="家长手机号" prop="parentTelOne" align="center" />
<el-table-column label="操作" align="center">
<template #default="scope">
<template #default>
<el-button type="danger" icon="Search" @click="updateFS">立即查询</el-button>
</template>
</el-table-column>
@@ -236,33 +298,23 @@
</template>
<script setup lang="ts" name="backSchoolCheckinTabIndex">
import { ref, reactive, computed, onMounted, nextTick, defineAsyncComponent, defineExpose } from 'vue'
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { ref, reactive, onMounted, nextTick, defineAsyncComponent, defineExpose } from 'vue'
import { BasicTableProps, useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message'
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 { listPlanByCondition as planMajor } from '/@/api/recruit/recruitstudentplan'
import { updateFs, updateAllFS as updateAllFSApi } from '/@/api/finance/financenormalstu'
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 GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.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
})
const SearchForm = defineAsyncComponent(() => import('/@/components/SearchForm/index.vue'))
const ClickableTag = defineAsyncComponent(() => import('/@/components/ClickableTag/index.vue'))
const DetailPopover = defineAsyncComponent(() => import('/@/components/DetailPopover/index.vue'))
// 消息提示 hooks
const message = useMessage()
@@ -272,13 +324,16 @@ const tableRef = ref()
const searchFormRef = ref()
const stuCheckInRef = ref()
// 搜索表单显示状态
const showSearch = ref(true)
// 数据
const planList = ref<any[]>([])
const planMajorList = ref<any[]>([])
const deptList = ref<any[]>([])
const backSchoolStateList = ref<any[]>([])
const paystatusList = ref([{ label: '已缴费', value: '10' }, { label: '未缴费', value: '0' }, { label: '部分缴费', value: '5' }])
const pushedList = ref([{ label: '未推送', value: '0' }, { label: '已推送', value: '1' }])
const paystatusList = PAY_STATUS_LIST
const pushedList = PUSHED_STATUS_LIST
// 查询表单
const queryForm = reactive({
@@ -318,43 +373,15 @@ const getMajorName = (majorCode: string) => {
return item ? item.majorName : ''
}
// 获取性别
const getGender = (gender: string) => {
if (gender == '2') {
return '女'
}
if (gender == '1') {
return '男'
}
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 ''
// 获取报到状态配置(用于 ClickableTag
const getBackSchoolStateConfig = (value: string) => {
return getCheckInStatusConfig(backSchoolStateList.value, value, {
CircleCheck,
CircleClose,
DocumentChecked,
Warning,
Clock
})
}
// 表格状态
@@ -388,6 +415,7 @@ const getMajorList = async (groupId: string) => {
const data = await planMajor({ groupId })
planMajorList.value = data.data || []
} catch (error) {
// eslint-disable-next-line no-console
console.error('获取专业列表失败', error)
}
}
@@ -413,6 +441,7 @@ const init = async () => {
getDataList()
} catch (error) {
// eslint-disable-next-line no-console
console.error('初始化失败', error)
}
}
@@ -420,7 +449,7 @@ const init = async () => {
// 打开报到窗口
const handleCheckIn = (row: any) => {
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('正在更新所有缴费单状态,请稍后查看更新结果')
}
} catch (error: any) {
message.error(error.msg || '操作失败')
// console.log(error)
}
}
@@ -559,9 +588,6 @@ onMounted(() => {
overflow: hidden;
}
.search-form-wrapper {
flex-shrink: 0;
}
.action-buttons-wrapper {
flex-shrink: 0;
@@ -583,4 +609,33 @@ onMounted(() => {
flex-shrink: 0;
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>

View File

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

View File

@@ -14,7 +14,7 @@
</el-form-item>
<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 label="报到状态" prop="checkInStatus">
@@ -71,7 +71,7 @@
</el-form-item>
<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>
<template #footer>

View File

@@ -3,7 +3,7 @@
:title="!dataForm.id ? '新增' : '修改'"
:close-on-click-modal="false"
v-model="visible"
width="600px"
width="800px"
>
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit"
label-width="100px">
@@ -54,21 +54,31 @@
</el-option>
</el-select>
</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 v-for="item in yes_no_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</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 v-for="item in yes_no_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</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 v-for="item in yes_no_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="正式专业代码" prop="stuworkMajorCode">
<el-select v-model="dataForm.stuworkMajorCode" filterable placeholder="请选择正式专业代码">
<el-option
@@ -79,19 +89,47 @@
</el-option>
</el-select>
</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-input-number :min="0" :max="999" v-model="dataForm.sort" placeholder="排序"></el-input-number>
</el-form-item>
@@ -139,6 +177,7 @@ const planList = ref<any[]>([])
const deptList = ref<any[]>([])
const ccList = ref<any[]>([])
const majorYears = ref<any[]>([])
const tuitionFeeList = ref<any[]>([])
const dataForm = reactive({
id: "",
@@ -154,6 +193,9 @@ const dataForm = reactive({
stuworkMajorCode: "",
isUnion: "0",
tuitionFee: 0,
czFee: 0,
gzFee: 0,
jzxFee: 0,
sort: 0
})
@@ -190,6 +232,18 @@ const dataRule = {
isUnion: [
{ 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: [
{ min: 1, max: 100, message: '备注长度不大于100个字符', trigger: 'blur' }
],
@@ -205,6 +259,27 @@ const isCityDisable = (id: string) => {
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 = () => {
// 查询二级学院信息
@@ -218,9 +293,10 @@ const initData = () => {
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 || []
ccList.value = res.data?.basic_major_level || []
tuitionFeeList.value = res.data?.tuition_fee || []
})
}
@@ -292,12 +368,17 @@ const init = (id: string | null) => {
// 错误处理
})
} else {
// 新增模式:设置默认招生计划
// 新增模式:设置默认招生计划和费用默认值
getList().then((data: any) => {
if (data.data && data.data.length > 0) {
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>
<style scoped>
<style lang="scss" scoped>
.dialog-footer {
text-align: right;
}
.el-row {
margin-bottom: 18px !important;
}
</style>

View File

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

View File

@@ -5,7 +5,7 @@
v-model="visible"
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-col :span="24">
<el-form-item label="招生计划" prop="groupId">

View File

@@ -4,7 +4,7 @@
:close-on-click-modal="false"
width="600px"
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-select v-model="dataForm.groupId" filterable :disabled="!dataForm.id ? false : true" placeholder="请选择招生计划">
<el-option

View File

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

View File

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

View File

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

View File

@@ -5,7 +5,7 @@
v-model="visible"
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-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id" placeholder="请选择招生计划">
<el-option

View File

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

View File

@@ -306,23 +306,7 @@
:cell-style="tableStyle.cellStyle"
: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
prop="serialNumber"
@@ -343,7 +327,7 @@
prop="name"
header-align="center"
align="center"
width="120"
width="130"
label="资料检测">
<template #default="scope">
<div v-if="scope.row.isOut=='0'" class="material-check-compact">
@@ -610,6 +594,23 @@
</el-tag>
</template>
</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>

View File

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

View File

@@ -6,7 +6,7 @@
v-model="visible"
width="90%">
<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>
<div id="container2"></div>
@@ -179,4 +179,10 @@ defineExpose({
ul li {
list-style: none;
}
:deep(.address-descriptions .el-descriptions__label) {
width: 100px !important;
min-width: 100px !important;
text-align: center !important;
}
</style>

View File

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

View File

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