This commit is contained in:
guochunsi
2026-01-20 17:33:36 +08:00
parent 39c07a03ee
commit 48f65a6d1b
26 changed files with 946 additions and 590 deletions

View File

@@ -392,6 +392,14 @@ export const setFw = (obj: any) => {
}); });
}; };
export const updateInfo = (obj: any) => {
return request({
url: '/recruit/recruitstudentsignup/updateInfo',
method: 'post',
data: obj
})
}
/** /**
* 更新信息 * 更新信息
* @param obj * @param obj

View File

@@ -0,0 +1,225 @@
# ClickableTag 可点击标签组件
一个可点击、带图标的标签组件,支持悬停动画效果。
## 功能特性
- ✅ 支持所有 Element Plus Tag 类型
- ✅ 可自定义左侧图标
- ✅ 可选显示右侧箭头(默认不显示)
- ✅ 可选显示警告图标(默认不显示)
- ✅ 悬停动画效果
- ✅ 点击事件支持
## Props
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
|-----|------|------|-------|--------|
| type | 标签类型 | string | success/info/warning/danger/primary | primary |
| size | 标签大小 | string | large/default/small | default |
| leftIcon | 左侧图标组件 | Component | - | undefined |
| middleIcon | 中间图标组件(如警告图标) | Component | - | undefined |
| rightIcon | 右侧图标组件 | Component | - | DArrowRight默认双箭头传 null 不显示) |
## Events
| 事件名 | 说明 | 回调参数 |
|--------|------|---------|
| click | 点击标签时触发 | - |
## 使用示例
### 基础用法(默认带右侧双箭头)
```vue
<template>
<ClickableTag type="success">
成功状态
</ClickableTag>
</template>
<script setup>
import ClickableTag from '/@/components/ClickableTag/index.vue'
</script>
```
### 不显示右侧箭头
```vue
<template>
<ClickableTag type="success" :right-icon="null">
成功状态
</ClickableTag>
</template>
<script setup>
import ClickableTag from '/@/components/ClickableTag/index.vue'
</script>
```
### 带左侧图标
```vue
<template>
<ClickableTag
type="warning"
:left-icon="Clock">
待审核
</ClickableTag>
</template>
<script setup>
import ClickableTag from '/@/components/ClickableTag/index.vue'
import { Clock } from '@element-plus/icons-vue'
</script>
```
### 自定义右侧图标
```vue
<template>
<!-- 使用默认双箭头 -->
<ClickableTag
type="info"
:left-icon="Document">
未填写
</ClickableTag>
<!-- 自定义右侧图标 -->
<ClickableTag
type="info"
:left-icon="Document"
:right-icon="More">
查看更多
</ClickableTag>
</template>
<script setup>
import ClickableTag from '/@/components/ClickableTag/index.vue'
import { Document, More } from '@element-plus/icons-vue'
</script>
```
### 带中间警告图标
```vue
<template>
<ClickableTag
type="warning"
:left-icon="Clock"
:middle-icon="hasProblem ? WarningFilled : undefined"
:right-icon="ArrowRight">
待审核
</ClickableTag>
</template>
<script setup>
import { ref } from 'vue'
import ClickableTag from '/@/components/ClickableTag/index.vue'
import { Clock, WarningFilled, ArrowRight } from '@element-plus/icons-vue'
const hasProblem = ref(true)
</script>
```
### 自定义所有图标
```vue
<template>
<ClickableTag
type="primary"
:left-icon="User"
:middle-icon="Star"
:right-icon="More">
自定义内容
</ClickableTag>
</template>
<script setup>
import ClickableTag from '/@/components/ClickableTag/index.vue'
import { User, Star, More } from '@element-plus/icons-vue'
</script>
```
### 监听点击事件
```vue
<template>
<ClickableTag
type="success"
:left-icon="CircleCheck"
@click="handleClick">
审核通过
</ClickableTag>
</template>
<script setup>
import ClickableTag from '/@/components/ClickableTag/index.vue'
import { CircleCheck } from '@element-plus/icons-vue'
const handleClick = () => {
console.log('标签被点击了')
}
</script>
```
### 配合 Popover 使用
```vue
<template>
<el-popover placement="right" :width="320" trigger="click">
<template #reference>
<ClickableTag
type="warning"
:left-icon="Clock">
待审核
</ClickableTag>
</template>
<div>这里是弹出的详细信息</div>
</el-popover>
</template>
<script setup>
import ClickableTag from '/@/components/ClickableTag/index.vue'
import { Clock } from '@element-plus/icons-vue'
</script>
```
## 样式说明
组件自带以下交互效果:
- **悬停效果**:添加阴影
- **右图标动画**:悬停时向右移动 2px透明度 70%
- **中间图标动画**:带有脉冲动画效果
- **图标大小**:自动跟随 size 属性small/default/large
- **响应式**:所有图标垂直居中对齐
- **默认箭头**:右侧默认显示双箭头图标 `DArrowRight`
## 实际应用
`src/views/recruit/recruitstudentsignup/index.vue` 中的使用:
```vue
<!-- 自动显示默认的右侧双箭头 -->
<ClickableTag
v-if="scope.row.zlsh=='1'"
type="warning"
:left-icon="Clock"
:middle-icon="!scope.row.graPic || hasMaterialProblem ? WarningFilled : undefined">
待审核
</ClickableTag>
```
## 图标位置说明
```
[ 左图标 文本内容 中间图标 ⇉ ]
↑ ↑ ↑
leftIcon middleIcon rightIcon(默认双箭头)
```
- **leftIcon**: 主要图标,表示状态类型
- **middleIcon**: 辅助图标,如警告提示(带脉冲动画)
- **rightIcon**: 交互提示图标,默认为双箭头 `DArrowRight`悬停时右移透明度70%),传 `null` 则不显示

View File

@@ -0,0 +1,119 @@
<template>
<el-tag
:type="type"
:size="size"
:class="['clickable-tag', { 'has-action': actualRightIcon !== null }]"
@click="handleClick">
<!-- 左侧图标 -->
<el-icon
v-if="leftIcon"
:size="size"
class="left-icon">
<component :is="leftIcon" />
</el-icon>
<!-- 主要内容 -->
<slot></slot>
<!-- 中间图标如警告图标 -->
<el-icon
v-if="middleIcon"
:size="size"
class="middle-icon">
<component :is="middleIcon" />
</el-icon>
<!-- 右侧图标 -->
<el-icon
v-if="actualRightIcon !== null"
:size="size"
class="right-icon">
<component :is="actualRightIcon" />
</el-icon>
</el-tag>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { Right } from '@element-plus/icons-vue'
interface Props {
type?: 'success' | 'info' | 'warning' | 'danger' | 'primary'
size?: 'large' | 'default' | 'small'
leftIcon?: any // 左侧图标组件
middleIcon?: any // 中间图标组件(如警告图标)
rightIcon?: any // 右侧图标组件(默认为 Right null 则不显示)
}
const props = withDefaults(defineProps<Props>(), {
type: 'primary',
size: 'default',
leftIcon: undefined,
middleIcon: undefined,
rightIcon: undefined
})
// 获取实际的右侧图标:未传值时使用默认图标,传 null 则不显示
const actualRightIcon = computed(() => {
if (props.rightIcon === null) return null
return props.rightIcon || Right
})
const emit = defineEmits<{
click: []
}>()
const handleClick = () => {
emit('click')
}
</script>
<script lang="ts">
export default {
name: 'ClickableTag'
}
</script>
<style scoped lang="scss">
.clickable-tag {
transition: all 0.2s;
// 覆盖 el-tag 的内部结构
:deep(.el-tag__content) {
display: flex !important;
align-items: center !important;
gap: 4px;
}
// 有交互功能时才显示手型光标和悬停效果
&.has-action {
cursor: pointer;
&:hover {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
.right-icon {
transform: translateX(2px);
}
}
}
.middle-icon {
animation: pulse 1.5s ease-in-out infinite;
}
.right-icon {
opacity: 0.7;
transition: all 0.2s;
}
}
@keyframes pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.6;
}
}
</style>

View File

@@ -51,3 +51,36 @@ export const BXSTATUS = {
* 前端URL * 前端URL
*/ */
export const FRONT_URL = "https://zhxy.czjsy.com"; export const FRONT_URL = "https://zhxy.czjsy.com";
/**
* 招生相关常量
*/
// 缴费状态 使用字典recruit_pay_status
// 推送状态
export const PUSHED_STATUS_LIST = [
{ label: "未推送", value: "0" },
{ label: "已推送", value: "1" }
];
// 数据来源
export const DATA_SOURCE_LIST = [
{ label: "学校", value: "0" },
{ label: "市平台", value: "1" }
];
// 录取通知书发放状态
export const NOTICE_SEND_STATUS_LIST = [
{ label: "未发放", value: "0" },
{ label: "已发放", value: "1" }
];
// 审核状态 使用字典recruit_audit_status
// 市平台考试类型审核状态 使用字典recruit_city_exzm_type
// 宿舍范围状态 使用字典recruit_dorm_range_status

View File

@@ -1,5 +1,54 @@
import type { App } from 'vue'; import type { App } from 'vue';
/**
* 输入过滤指令
* @directive v-input-filter如 `<el-input v-model="phone" v-input-filter="'number'" />`
* @param number - 纯数字
* @param alphanumeric - 数字+字母
* @param idcard - 数字+字母+括号(支持大陆、港澳台身份证)
* @param tel - 固话格式(数字+横杠+括号+空格)
*/
export function inputFilterDirective(app: App) {
app.directive('input-filter', {
mounted(el, binding) {
const input = el.querySelector('input') || el;
const filterType = binding.value || 'number';
const filters: { [key: string]: RegExp } = {
number: /[^\d]/g, // 纯数字
alphanumeric: /[^0-9A-Za-z]/g, // 数字+字母
idcard: /[^0-9A-Za-z()]/g, // 数字+字母+括号(支持港澳台)
tel: /[^\d\-() ]/g, // 固话:数字+横杠+括号+空格
};
const handleInput = (e: Event) => {
const target = e.target as HTMLInputElement;
const regex = filters[filterType];
if (regex && target.value) {
const newValue = target.value.replace(regex, '');
if (newValue !== target.value) {
target.value = newValue;
// 触发 input 事件,确保 v-model 更新
target.dispatchEvent(new Event('input'));
}
}
};
input.addEventListener('input', handleInput);
// 保存 handler用于 unmounted 时清理
(el as any)._inputFilterHandler = handleInput;
(el as any)._inputFilterElement = input;
},
unmounted(el) {
const handler = (el as any)._inputFilterHandler;
const input = (el as any)._inputFilterElement;
if (handler && input) {
input.removeEventListener('input', handler);
}
},
});
}
/** /**
* 按钮波浪指令 * 按钮波浪指令
* @directive 默认方式v-waves如 `<div v-waves></div>` * @directive 默认方式v-waves如 `<div v-waves></div>`

View File

@@ -1,17 +1,20 @@
import type { App } from 'vue'; import type { App } from 'vue';
import { authDirective } from '/@/directive/authDirective'; import { authDirective } from '/@/directive/authDirective';
import { wavesDirective } from '/@/directive/customDirective'; import { wavesDirective, inputFilterDirective } from '/@/directive/customDirective';
/** /**
* 导出指令方法v-xxx * 导出指令方法v-xxx
* @methods authDirective 用户权限指令用法v-auth * @methods authDirective 用户权限指令用法v-auth
* @methods wavesDirective 按钮波浪指令用法v-waves * @methods wavesDirective 按钮波浪指令用法v-waves
* @methods inputFilterDirective 输入过滤指令用法v-input-filter
*/ */
export function directive(app: App) { export function directive(app: App) {
// 用户权限指令 // 用户权限指令
authDirective(app); authDirective(app);
// 按钮波浪指令 // 按钮波浪指令
wavesDirective(app); wavesDirective(app);
// 输入过滤指令
inputFilterDirective(app);
// focus // focus
app.directive('focus', { app.directive('focus', {
mounted(el) { mounted(el) {

View File

@@ -545,14 +545,8 @@ svg {
border-color: #d3d4d6 !important; border-color: #d3d4d6 !important;
} }
// 主要类型 - 浅蓝背景 + 深蓝文字 // 主要类型 - 保持 Element Plus 默认样式,不覆盖
&.el-tag--primary { // primary 类型使用默认的主题色系统,无需手动覆盖
--el-tag-bg-color: #ecf5ff !important;
--el-tag-text-color: #409eff !important;
background-color: #ecf5ff !important;
color: #409eff !important;
border-color: #b3d8ff !important;
}
// 确保文字颜色应用到所有子元素 // 确保文字颜色应用到所有子元素
.el-tag__content, .el-tag__content,

View File

@@ -300,7 +300,7 @@ export function verifyEmail(val: string) {
} }
/** /**
* 身份证 * 身份证大陆18位
* @param val 当前值字符串 * @param val 当前值字符串
* @returns 返回 true: 身份证正确 * @returns 返回 true: 身份证正确
*/ */
@@ -311,6 +311,28 @@ export function verifyIdCard(val: string) {
else return true; else return true;
} }
/**
* 身份证/港澳台证件(支持大陆、香港、澳门、台湾)
* @param val 当前值字符串
* @returns 返回 true: 证件号正确
*/
export function verifyIdCardAll(val: string) {
// 大陆身份证18位
const mainlandIdCard = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
// 香港身份证:字母+6位数字+(校验码),如 A123456(7)
const hkIdCard = /^[A-Z]{1,2}\d{6}\([0-9A]\)$/;
// 澳门身份证1位或7位数字
const macaoIdCard = /^[1-9]\d{0,6}$/;
// 台湾身份证1个字母+9位数字
const taiwanIdCard = /^[A-Z]\d{9}$/;
// 只要匹配其中一种即可
if (mainlandIdCard.test(val) || hkIdCard.test(val) || macaoIdCard.test(val) || taiwanIdCard.test(val)) {
return true;
}
return false;
}
/** /**
* 姓名 * 姓名
* @param val 当前值字符串 * @param val 当前值字符串
@@ -368,3 +390,15 @@ export function verifyCarNum(val: string) {
// true车牌号正确 // true车牌号正确
else return true; else return true;
} }
/**
* 准考证号
* @param val 当前值字符串
* @returns 返回 true准考证号正确
*/
export function verifyAdmissionNumber(val: string) {
// false: 准考证号不正确6-20位数字或字母
if (!/^[0-9A-Za-z]{6,20}$/.test(val)) return false;
// true准考证号正确
else return true;
}

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

View File

@@ -99,7 +99,7 @@
</el-button> </el-button>
<el-button <el-button
v-auth="'recruit_recruitImitateAdjustBatch_del'" v-auth="'recruit_recruitImitateAdjustBatch_del'"
type="primary" type="danger"
link link
icon="Delete" icon="Delete"
@click="deleteHandle(scope.row.id)" @click="deleteHandle(scope.row.id)"

View File

@@ -112,12 +112,12 @@
label="操作"> label="操作">
<template #default="scope"> <template #default="scope">
<el-button v-auth="'recruit_recruitImitateAdjustBatch_edit'" type="text" size="small" :icon="Edit" @click="addOrUpdateHandle(scope.row.id)">修改</el-button> <el-button v-auth="'recruit_recruitImitateAdjustBatch_edit'" type="text" size="small" :icon="Edit" @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
<el-button v-auth="'recruit_recruitImitateAdjustBatch_del'" type="text" size="small" :icon="Delete" @click="deleteHandle(scope.row.id)">删除</el-button> <el-button v-auth="'recruit_recruitImitateAdjustBatch_del'" type="danger" link size="small" :icon="Delete" @click="deleteHandle(scope.row.id)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<add-m-n-stu v-if="addMnStuVisible" ref="addMnStuRef" @refreshDataList="getDataList"></add-m-n-stu> <add-m-n-stu ref="addMnStuRef" @refreshDataList="getDataList"></add-m-n-stu>
</el-dialog> </el-dialog>
</template> </template>
@@ -127,7 +127,7 @@ import { useMessage, useMessageBox } from '/@/hooks/message'
import { Edit, Delete } from '@element-plus/icons-vue' import { Edit, Delete } from '@element-plus/icons-vue'
import { getMNStuList, delMNObj } from '/@/api/recruit/recruitImitateAdjustBatch' import { getMNStuList, delMNObj } from '/@/api/recruit/recruitImitateAdjustBatch'
import { listPlanByCondition as planMajor } from '/@/api/recruit/recruitstudentplan' import { listPlanByCondition as planMajor } from '/@/api/recruit/recruitstudentplan'
import { getTypeValue } from '/@/api/admin/dict' import { getDicts } from '/@/api/admin/dict'
import { getLabelValueByProps } from '/@/utils/dictLabel' import { getLabelValueByProps } from '/@/utils/dictLabel'
const AddMNStu = defineAsyncComponent(() => import('./addMNStu.vue')) const AddMNStu = defineAsyncComponent(() => import('./addMNStu.vue'))
@@ -149,7 +149,6 @@ const addMnStuRef = ref()
const visible = ref(false) const visible = ref(false)
const canSubmit = ref(false) const canSubmit = ref(false)
const dataListLoading = ref(false) const dataListLoading = ref(false)
const addMnStuVisible = ref(false)
const dataForm = reactive({ const dataForm = reactive({
batchNo: "", batchNo: "",
@@ -171,7 +170,6 @@ const init = (batchNo: string, groupId: string) => {
// 新增 / 修改 // 新增 / 修改
const addOrUpdateHandle = (id?: string) => { const addOrUpdateHandle = (id?: string) => {
addMnStuVisible.value = true
nextTick(() => { nextTick(() => {
addMnStuRef.value?.init(id || null, dataForm.groupId, dataForm.batchNo) addMnStuRef.value?.init(id || null, dataForm.groupId, dataForm.batchNo)
}) })
@@ -205,7 +203,7 @@ const getDataList = () => {
// 初始化数据 // 初始化数据
const initData = () => { const initData = () => {
eduList.value = [] eduList.value = []
getTypeValue('finance_student_source').then((res: any) => { getDicts('finance_student_source').then((res: any) => {
eduList.value = res.data eduList.value = res.data
}) })
planMajorList.value = [] planMajorList.value = []

View File

@@ -71,11 +71,11 @@
</el-table-column> </el-table-column>
<el-table-column label="姓名" align="center" prop="teacherName" show-overflow-tooltip> <el-table-column label="姓名" align="center" prop="teacherName" show-overflow-tooltip>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" fixed="right"> <el-table-column label="操作" align="center" width="150px" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-if="permissions.recruit_recruitexampeople_del" v-if="permissions.recruit_recruitexampeople_del"
type="primary" type="danger"
link link
icon="Delete" icon="Delete"
@click="handleDel(scope.row)" @click="handleDel(scope.row)"

View File

@@ -6,7 +6,7 @@
width="600px" width="600px"
> >
<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="请选择招生计划"> <el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划">

View File

@@ -134,7 +134,7 @@
</el-button> </el-button>
<el-button <el-button
v-auth="'recruit_recruitplanmajor_del'" v-auth="'recruit_recruitplanmajor_del'"
type="primary" type="danger"
link link
icon="Delete" icon="Delete"
@click="deleteHandle(scope.row.id)" @click="deleteHandle(scope.row.id)"

View File

@@ -44,7 +44,6 @@
v-model="scope.row.degreeOfEducation" v-model="scope.row.degreeOfEducation"
placeholder="请选择生源" placeholder="请选择生源"
multiple multiple
style="display: flex;justify-content: center;align-items: center;"
@change="updateMajor(scope.row,'degreeOfEducation')" @change="updateMajor(scope.row,'degreeOfEducation')"
> >
<el-option v-for="item in degreeOfEducationList" :key="item.value" :label="item.label" :value="item.value"> </el-option> <el-option v-for="item in degreeOfEducationList" :key="item.value" :label="item.label" :value="item.value"> </el-option>

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="900px" 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="120px">
<el-row :gutter="20"> <el-row :gutter="20">
@@ -28,7 +28,13 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="电话" prop="phone"> <el-form-item label="电话" prop="phone">
<el-input v-model="dataForm.phone" placeholder="电话"></el-input> <el-input
v-model="dataForm.phone"
placeholder="电话"
type="tel"
maxlength="11"
v-input-filter="'number'">
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@@ -42,14 +48,24 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="身份证" prop="idCard"> <el-form-item label="身份证" prop="idCard">
<el-input v-model="dataForm.idCard" placeholder="身份证"></el-input> <el-input
v-model="dataForm.idCard"
placeholder="身份证号"
maxlength="20"
v-input-filter="'idcard'">
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="准考证" prop="admission"> <el-form-item label="准考证" prop="admission">
<el-input v-model="dataForm.admission" placeholder="准考证"></el-input> <el-input
v-model="dataForm.admission"
placeholder="准考证"
maxlength="20"
v-input-filter="'alphanumeric'">
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@@ -88,7 +104,7 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="拟报专业1" prop="planMajorOne"> <el-form-item label="拟报专业1" prop="planMajorOne">
<el-select v-model="dataForm.planMajorOne" filterable placeholder="请选择拟报专业1" > <el-select v-model="dataForm.planMajorOne" filterable placeholder="请选择拟报专业1" >
<el-option <el-option
v-for="item in planMajorList" v-for="item in planMajorList"
:key="item.id" :key="item.id"
@@ -283,6 +299,7 @@ import { getObj, addObjStu, putObj } from '/@/api/recruit/recruitprestudent'
import { getList } from '/@/api/recruit/recruitstudentplangroup' import { getList } from '/@/api/recruit/recruitstudentplangroup'
import { getDicts } from '/@/api/admin/dict' import { getDicts } from '/@/api/admin/dict'
import { queryAllTeacherByRecruit } from '/@/api/professional/professionaluser/teacherbase' import { queryAllTeacherByRecruit } from '/@/api/professional/professionaluser/teacherbase'
import { verifyIdCardAll, verifyPhone, verifyAdmissionNumber } from '/@/utils/toolsValidate'
// Props // Props
const props = defineProps<{ const props = defineProps<{
@@ -350,7 +367,42 @@ const dataRule = {
], ],
phone: [ phone: [
{ required: true, message: '电话不能为空', trigger: 'blur' }, { required: true, message: '电话不能为空', trigger: 'blur' },
{ min: 11, max: 11, message: "电话号码长度为11位", trigger: "blur" } {
validator: (rule: any, value: any, callback: any) => {
if (value && !verifyPhone(value)) {
callback(new Error('请输入正确的手机号码'))
} else {
callback()
}
},
trigger: 'blur'
}
],
idCard: [
{ required: true, message: '身份证不能为空', trigger: 'blur' },
{
validator: (rule: any, value: any, callback: any) => {
if (value && !verifyIdCardAll(value)) {
callback(new Error('请输入正确的身份证号码'))
} else {
callback()
}
},
trigger: 'blur'
}
],
admission: [
{ required: true, message: '准考证不能为空', trigger: 'blur' },
{
validator: (rule: any, value: any, callback: any) => {
if (value && !verifyAdmissionNumber(value)) {
callback(new Error('请输入正确的准考证号'))
} else {
callback()
}
},
trigger: 'blur'
}
], ],
gender: [ gender: [
{ required: true, message: '性别不能为空', trigger: 'blur' } { required: true, message: '性别不能为空', trigger: 'blur' }

View File

@@ -131,7 +131,7 @@
<el-table-column prop="name" label="学生姓名" width="120" align="center" show-overflow-tooltip /> <el-table-column prop="name" label="学生姓名" width="120" align="center" show-overflow-tooltip />
<el-table-column prop="phone" label="电话" width="120" align="center" show-overflow-tooltip /> <el-table-column prop="phone" label="电话" width="120" align="center" show-overflow-tooltip />
<el-table-column prop="achievement" label="中考分数" width="90" align="center" show-overflow-tooltip /> <el-table-column prop="achievement" label="中考分数" width="90" align="center" show-overflow-tooltip />
<el-table-column prop="admission" label="准考证号" width="120" align="left" show-overflow-tooltip /> <el-table-column prop="admission" label="准考证号" width="130" align="left" show-overflow-tooltip />
<el-table-column prop="planMajorOne" label="拟报专业1" align="left" show-overflow-tooltip> <el-table-column prop="planMajorOne" label="拟报专业1" align="left" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ getMajorName(scope.row.planMajorOne) }} {{ getMajorName(scope.row.planMajorOne) }}
@@ -165,7 +165,7 @@
</el-button> </el-button>
<el-button <el-button
v-auth="'recruit_recruitprestudent_del'" v-auth="'recruit_recruitprestudent_del'"
type="primary" type="danger"
link link
icon="Delete" icon="Delete"
@click="deleteHandle(scope.row.id)" @click="deleteHandle(scope.row.id)"

View File

@@ -95,7 +95,7 @@
</el-button> </el-button>
<el-button <el-button
v-auth="'recruit_recruitschoolcode_del'" v-auth="'recruit_recruitschoolcode_del'"
type="primary" type="danger"
link link
icon="Delete" icon="Delete"
@click="deleteHandle(scope.row.id)" @click="deleteHandle(scope.row.id)"

View File

@@ -62,7 +62,7 @@
</el-button> </el-button>
<el-button <el-button
v-auth="'recruit_recruitstudentplancorrectscoreconfig_del'" v-auth="'recruit_recruitstudentplancorrectscoreconfig_del'"
type="primary" type="danger"
link link
icon="Delete" icon="Delete"
@click="deleteHandle(scope.row.id)" @click="deleteHandle(scope.row.id)"

View File

@@ -117,7 +117,7 @@
<el-button v-auth="'recruit_recruitstudentplangroup_edit'" type="primary" link icon="Switch" @click="majorHandle(scope.row)"> <el-button v-auth="'recruit_recruitstudentplangroup_edit'" type="primary" link icon="Switch" @click="majorHandle(scope.row)">
专业调整 专业调整
</el-button> </el-button>
<el-button v-auth="'recruit_recruitstudentplangroup_del'" type="primary" link icon="Delete" @click="deleteHandle(scope.row.id)"> <el-button v-auth="'recruit_recruitstudentplangroup_del'" type="danger" link icon="Delete" @click="deleteHandle(scope.row.id)">
删除 删除
</el-button> </el-button>
</template> </template>

View File

@@ -86,7 +86,7 @@
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruit_recruitstudentschool_del" v-if="permissions.recruit_recruitstudentschool_del"
type="primary" type="danger"
link link
icon="Delete" icon="Delete"
@click="deleteHandle(scope.row.id)" @click="deleteHandle(scope.row.id)"

View File

@@ -116,29 +116,58 @@
<el-row :gutter="20" class="form-row"> <el-row :gutter="20" class="form-row">
<el-col :span="8"> <el-col :span="8">
<el-form-item label="身份证号" prop="idNumber"> <el-form-item label="身份证号" prop="idNumber">
<el-input type="text" v-model="dataForm.idNumber"></el-input> <el-input
v-model="dataForm.idNumber"
placeholder="身份证号"
maxlength="20"
v-input-filter="'idcard'">
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="准考证号" prop="examRegistrationNumbers"> <el-form-item label="准考证号" prop="examRegistrationNumbers">
<el-input type="text" v-model="dataForm.examRegistrationNumbers" :disabled="type==1 ? false : true"></el-input> <el-input
v-model="dataForm.examRegistrationNumbers"
placeholder="准考证号"
maxlength="20"
:disabled="type==1 ? false : true"
v-input-filter="'alphanumeric'">
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="成绩" prop="score"> <el-form-item label="成绩" prop="score">
<el-input type="text" v-model="dataForm.score" :disabled="type==1 ? false : true" @change="jsZSF"></el-input> <el-input-number
v-model="dataForm.score"
placeholder="成绩"
:min="0"
:max="1000"
:disabled="type==1 ? false : true"
@change="jsZSF">
</el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row v-if="dataForm.degreeOfEducation=='1'" :gutter="20" class="form-row"> <el-row v-if="dataForm.degreeOfEducation=='1'" :gutter="20" class="form-row">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="成绩折算分" prop="correctedScore"> <el-form-item label="成绩折算分" prop="correctedScore">
<el-input type="text" v-model="dataForm.correctedScore" :disabled="type==2 ? false : true"></el-input> <el-input-number
v-model="dataForm.correctedScore"
:min="0"
:max="1000"
:disabled="type==2 ? false : true">
</el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="当地总分" prop="fullScore"> <el-form-item label="当地总分" prop="fullScore">
<el-input type="text" v-model="dataForm.fullScore" :disabled="isShow" @change="changePlaceScore"></el-input> <el-input-number
v-model="dataForm.fullScore"
:min="0"
:max="1000"
:disabled="isShow"
@change="changePlaceScore">
</el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@@ -272,17 +301,37 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="家长手机" prop="parentTelOne"> <el-form-item label="家长手机" prop="parentTelOne">
<el-input type="text" v-model="dataForm.parentTelOne" :disabled="type==1 ? false : true"></el-input> <el-input
v-model="dataForm.parentTelOne"
type="tel"
placeholder="家长手机"
maxlength="11"
:disabled="type==1 ? false : true"
v-input-filter="'number'">
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="家长固话" prop="parentTelTwo"> <el-form-item label="家长固话" prop="parentTelTwo">
<el-input type="text" v-model="dataForm.parentTelTwo" :disabled="type==1 ? false : true"></el-input> <el-input
v-model="dataForm.parentTelTwo"
placeholder="家长固话"
maxlength="20"
:disabled="type==1 ? false : true"
v-input-filter="'tel'">
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="本人联系电话" prop="selfTel"> <el-form-item label="本人联系电话" prop="selfTel">
<el-input type="text" v-model="dataForm.selfTel" :disabled="type==1 ? false : true"></el-input> <el-input
v-model="dataForm.selfTel"
type="tel"
placeholder="本人联系电话"
maxlength="11"
:disabled="type==1 ? false : true"
v-input-filter="'number'">
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@@ -546,12 +595,12 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="8">
<el-form-item label="原序号" prop="oldSerialNumber"> <el-form-item label="原序号" prop="oldSerialNumber">
<el-input type="text" v-model="dataForm.oldSerialNumber" :disabled="type==1?false:true"></el-input> <el-input type="text" v-model="dataForm.oldSerialNumber" :disabled="type==1?false:true"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="8">
<el-form-item label="辨色力" prop="colorDiscrimination"> <el-form-item label="辨色力" prop="colorDiscrimination">
<el-select v-model="dataForm.colorDiscrimination" filterable clearable placeholder="请选择辨色力" class="w-full" :disabled="type==1?false:true"> <el-select v-model="dataForm.colorDiscrimination" filterable clearable placeholder="请选择辨色力" class="w-full" :disabled="type==1?false:true">
<el-option <el-option
@@ -617,6 +666,7 @@ import { useDict } from '/@/hooks/dict'
import { areaList, areaSonList } from "/@/api/recruit/recruitstudentschool" import { areaList, areaSonList } from "/@/api/recruit/recruitstudentschool"
import { list as scoreList } from "/@/api/recruit/recruitstudentplancorrectscoreconfig" import { list as scoreList } from "/@/api/recruit/recruitstudentplancorrectscoreconfig"
import { queryAllTeacher } from "/@/api/professional/professionaluser/teacherbase" import { queryAllTeacher } from "/@/api/professional/professionaluser/teacherbase"
import { verifyIdCardAll, verifyAdmissionNumber } from '/@/utils/toolsValidate'
const messageBox = useMessageBox() const messageBox = useMessageBox()
@@ -770,7 +820,30 @@ const dataRule = {
{required: true, message: '户口性质不能为空', trigger: 'change'} {required: true, message: '户口性质不能为空', trigger: 'change'}
], ],
idNumber: [ idNumber: [
{required: true, message: '身份证不能为空', trigger: 'change'} {required: true, message: '身份证不能为空', trigger: 'change'},
{
validator: (rule: any, value: any, callback: any) => {
if (value && !verifyIdCardAll(value)) {
callback(new Error('请输入正确的身份证号码'))
} else {
callback()
}
},
trigger: 'blur'
}
],
examRegistrationNumbers: [
{required: true, message: '准考证号不能为空', trigger: 'change'},
{
validator: (rule: any, value: any, callback: any) => {
if (value && !verifyAdmissionNumber(value)) {
callback(new Error('请输入正确的准考证号'))
} else {
callback()
}
},
trigger: 'blur'
}
], ],
otherProvince: [ otherProvince: [
{required: true, message: '外省不能为空', trigger: 'change'} {required: true, message: '外省不能为空', trigger: 'change'}

View File

@@ -346,52 +346,105 @@
<el-table-column <el-table-column
prop="name" prop="name"
header-align="center" header-align="center"
align="left" align="center"
width="290" width="140"
label="资料检测"> label="资料检测">
<template #default="scope"> <template #default="scope">
<div v-if="scope.row.isOut=='0'" class="material-check-cell"> <div v-if="scope.row.isOut=='0'" class="material-check-compact">
<!-- 资料审核状态 --> <!-- 审核通过不需要弹窗直接显示 -->
<div class="check-item"> <ClickableTag
<span class="check-label">审核状态</span> v-if="scope.row.zlsh=='2'"
<el-tag v-if="scope.row.zlsh=='0'" type="info" size="small">未填写</el-tag> type="success"
<el-tag v-else-if="scope.row.zlsh=='2'" type="success" size="small"> :left-icon="CircleCheck"
<el-icon class="tag-icon"><CircleCheck /></el-icon> :right-icon="null">
审核通过 审核通过
</el-tag> </ClickableTag>
<el-tag v-else-if="scope.row.zlsh=='1'" type="warning" size="small">待审核</el-tag>
<el-tag v-else-if="scope.row.zlsh=='3'" type="danger" size="small">
<el-icon class="tag-icon"><CircleClose /></el-icon>
审核驳回
</el-tag>
</div>
<!-- 材料状态 --> <!-- 其他状态需要弹窗查看详情 -->
<div v-if="scope.row.zlsh !='2'" class="check-item"> <el-popover
<span class="check-label">材料状态</span> v-else
<div class="material-status"> placement="right"
<el-tag v-if="!scope.row.graPic" type="warning" size="small" class="material-tag"> :width="320"
<el-icon class="tag-icon"><Warning /></el-icon> trigger="click">
缺少毕业证 <template #reference>
</el-tag> <div class="status-wrapper">
<el-tag v-if="scope.row.degreeOfEducation == '1' && scope.row.zlsh !='2' && !scope.row.yyPic && !scope.row.housePic && !scope.row.sbPic" type="warning" size="small" class="material-tag"> <!-- 审核状态标签 -->
<el-icon class="tag-icon"><Warning /></el-icon> <ClickableTag
缺新市民材料 v-if="scope.row.zlsh=='0'"
</el-tag> type="info"
<span v-if="scope.row.degreeOfEducation == '1' && scope.row.isOut == '1'" class="no-upload-text">无需上传</span> :left-icon="Document">
</div> 未填写
</div> </ClickableTag>
<ClickableTag
v-else-if="scope.row.zlsh=='1'"
type="warning"
:left-icon="Clock"
:middle-icon="!scope.row.graPic || (scope.row.degreeOfEducation == '1' && !scope.row.yyPic && !scope.row.housePic && !scope.row.sbPic) ? WarningFilled : undefined">
待审核
</ClickableTag>
<ClickableTag
v-else-if="scope.row.zlsh=='3'"
type="danger"
:left-icon="CircleClose">
审核驳回
</ClickableTag>
</div>
</template>
<!-- 审核意见 --> <!-- 弹出内容 -->
<div v-if="scope.row.zlsh=='3' && scope.row.zlshRemark" class="check-item check-remark"> <div class="material-detail-popover">
<span class="check-label">审核意见</span> <div class="detail-title">资料检测详情</div>
<div class="remark-content">
<el-icon class="remark-icon"><Warning /></el-icon> <!-- 审核状态 -->
<el-tooltip :content="scope.row.zlshRemark" placement="top" :show-after="300"> <div class="detail-section horizontal">
<span class="remark-text">{{ scope.row.zlshRemark }}</span> <div class="section-label">审核状态</div>
</el-tooltip> <div class="section-content">
<el-tag v-if="scope.row.zlsh=='0'" type="info" size="small">未填写</el-tag>
<el-tag v-else-if="scope.row.zlsh=='2'" type="success" size="small">
<el-icon class="tag-icon"><CircleCheck /></el-icon>
审核通过
</el-tag>
<el-tag v-else-if="scope.row.zlsh=='1'" type="warning" size="small">待审核</el-tag>
<el-tag v-else-if="scope.row.zlsh=='3'" type="danger" size="small">
<el-icon class="tag-icon"><CircleClose /></el-icon>
审核驳回
</el-tag>
</div>
</div>
<!-- 材料状态 -->
<div v-if="scope.row.zlsh !='2'" class="detail-section">
<div class="section-label">材料状态</div>
<div class="material-list">
<div v-if="!scope.row.graPic" class="material-item warning">
<el-icon><Warning /></el-icon>
<span>缺少毕业证</span>
</div>
<div v-if="scope.row.degreeOfEducation == '1' && scope.row.zlsh !='2' && !scope.row.yyPic && !scope.row.housePic && !scope.row.sbPic" class="material-item warning">
<el-icon><Warning /></el-icon>
<span>缺新市民材料</span>
</div>
<div v-if="scope.row.degreeOfEducation == '1' && scope.row.isOut == '1'" class="material-item success">
<el-icon><CircleCheck /></el-icon>
<span>无需上传</span>
</div>
<div v-if="scope.row.graPic && (scope.row.degreeOfEducation != '1' || scope.row.yyPic || scope.row.housePic || scope.row.sbPic)" class="material-item success">
<el-icon><CircleCheck /></el-icon>
<span>材料齐全</span>
</div>
</div>
</div>
<!-- 审核意见 -->
<div v-if="scope.row.zlsh=='3' && scope.row.zlshRemark" class="detail-section">
<div class="section-label">审核意见</div>
<div class="remark-box">
<el-icon class="remark-icon"><Warning /></el-icon>
<div class="remark-text">{{ scope.row.zlshRemark }}</div>
</div>
</div>
</div> </div>
</div> </el-popover>
</div> </div>
<span v-else class="empty-text">-</span> <span v-else class="empty-text">-</span>
</template> </template>
@@ -434,7 +487,7 @@
prop="auditTime" prop="auditTime"
header-align="center" header-align="center"
align="center" align="center"
width="110" width="160"
label="录取时间"> label="录取时间">
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.auditStatus==20" class="time-text">{{ dateFormat(scope.row.auditTime) }}</span> <span v-if="scope.row.auditStatus==20" class="time-text">{{ dateFormat(scope.row.auditTime) }}</span>
@@ -526,18 +579,15 @@
prop="deptCode" prop="deptCode"
header-align="center" header-align="center"
align="center" align="center"
width="120" width="180"
label="学院(经办人)"> label="学院(经办人)"
show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.auditStatus==20"> <span v-if="scope.row.auditStatus==20">
{{ getLabelValueByProps(deptList, scope.row.deptCode, { key: 'deptCode', value: 'deptName' }) }} {{ getLabelValueByProps(deptList, scope.row.deptCode, { key: 'deptCode', value: 'deptName' }) }}
</span> <br/> <span v-if="scope.row.auditorName">({{ scope.row.auditorName }})</span>
<span v-if="scope.row.auditStatus==20">
<span v-if="scope.row.auditorName">({{scope.row.auditorName}})</span>
<span v-else>-</span>
</span> </span>
<span v-else class="empty-text">-</span>
</template> </template>
</el-table-column> </el-table-column>
@@ -606,7 +656,8 @@
<script setup lang="ts" name="recruitstudentsignup"> <script setup lang="ts" name="recruitstudentsignup">
import { ref, reactive, onMounted, nextTick, defineAsyncComponent, watch } from 'vue' import { ref, reactive, onMounted, nextTick, defineAsyncComponent, watch } from 'vue'
import { Edit, Check, DocumentChecked, Close, Switch, Tickets, Document, Upload, Warning, User, CircleCheck, CircleClose } from '@element-plus/icons-vue' import { Edit, Check, DocumentChecked, Close, Switch, Tickets, Document, Upload, Warning, User, CircleCheck, CircleClose, Clock, WarningFilled } from '@element-plus/icons-vue'
import ClickableTag from '/@/components/ClickableTag/index.vue'
import { useMessage, useMessageBox } from '/@/hooks/message' import { useMessage, useMessageBox } from '/@/hooks/message'
import { BasicTableProps, useTable } from '/@/hooks/table' import { BasicTableProps, useTable } from '/@/hooks/table'
import { auth } from '/@/utils/authFunction' import { auth } from '/@/utils/authFunction'
@@ -632,7 +683,12 @@ import { getDictsByTypes } from "/@/api/admin/dict";
import { getUserListByRole } from "/@/api/admin/user"; import { getUserListByRole } from "/@/api/admin/user";
import { queryTeacherBaseByNo } from "/@/api/professional/professionaluser/teacherbase"; import { queryTeacherBaseByNo } from "/@/api/professional/professionaluser/teacherbase";
import { useDict } from '/@/hooks/dict' import { useDict } from '/@/hooks/dict'
import { ROLE_CODE } from '/@/config/global' import {
ROLE_CODE,
PUSHED_STATUS_LIST,
DATA_SOURCE_LIST,
NOTICE_SEND_STATUS_LIST
} from '/@/config/global'
import { showLoading, hideLoading } from '/@/api/asset/loading' import { showLoading, hideLoading } from '/@/api/asset/loading'
// 定义组件 // 定义组件
@@ -725,18 +781,18 @@ const deptList = ref<any[]>([])
const teacherList = ref<any[]>([]) const teacherList = ref<any[]>([])
const interviewDicList = ref<any[]>([]) const interviewDicList = ref<any[]>([])
const zlshList = ref<any[]>([]) const zlshList = ref<any[]>([])
const paystatusList = ref<any[]>([]) const paystatusList = ref<any[]>([]) // 缴费状态
const auditStatusList = ref<any[]>([]) // 审核状态
const cityExamTypeList = ref<any[]>([]) // 市平台考试类型
const isOutFwList = ref<any[]>([]) // 宿舍范围状态
// 字典数据 // 字典数据
const { yes_no_type } = useDict('yes_no_type') const { yes_no_type } = useDict('yes_no_type')
// 静态数据 // 静态数据
const isBackTzList = [{ label: '未发放', value: '0' }, { label: '已发放', value: '1' }] const isBackTzList = NOTICE_SEND_STATUS_LIST
const auditStatusList = [{ label: '未录取', value: '-20' }, { label: '待审核', value: '0' }, { label: '已录取', value: '20' }] const pushedList = PUSHED_STATUS_LIST
const cityExamTypeList = [{ label: '待审核', value: '0' }, { label: '通过', value: '1' }, { label: '驳回', value: '2' }] const isOutList = DATA_SOURCE_LIST
const pushedList = [{ label: '未推送', value: '0' }, { label: '已推送', value: '1' }]
const isOutFwList = [{ label: '待确认', value: '0' }, { label: '范围内', value: '1' }, { label: '范围外', value: '2' }]
const isOutList = [{ label: '学校', value: '0' }, { label: '市平台', value: '1' }]
// 日期格式化 // 日期格式化
const dateFormat = (date: string | null | undefined) => { const dateFormat = (date: string | null | undefined) => {
@@ -1024,7 +1080,7 @@ const getPaymentStatusTagType = (status: string | number) => {
return statusMap[String(status)] || '' return statusMap[String(status)] || ''
} }
// 缴费状态 // 缴费状态(使用字典)
const getStatus = (type: string) => { const getStatus = (type: string) => {
return getLabelValue(paystatusList.value, type) return getLabelValue(paystatusList.value, type)
} }
@@ -1226,12 +1282,23 @@ const init = async () => {
}) })
// 批量获取字典数据:文化程度、面试结果、资料审核状态、缴费状态 // 批量获取字典数据
getDictsByTypes(['finance_student_source','interview_dic', 'recruit_zlsh', 'recruit_pay_status']).then((res) => { getDictsByTypes([
'finance_student_source', // 文化程度
'interview_dic', // 面试结果
'recruit_zlsh', // 资料审核状态
'recruit_pay_status', // 缴费状态
'recruit_audit_status', // 审核状态
'recruit_city_exam_type', // 市平台考试类型
'recruit_dorm_range_status' // 宿舍范围状态
]).then((res) => {
eduList.value = res.data.finance_student_source || [] eduList.value = res.data.finance_student_source || []
interviewDicList.value = res.data.interview_dic || [] interviewDicList.value = res.data.interview_dic || []
zlshList.value = res.data.recruit_zlsh || [] zlshList.value = res.data.recruit_zlsh || []
paystatusList.value = res.data.recruit_pay_status || [] paystatusList.value = res.data.recruit_pay_status || []
auditStatusList.value = res.data.recruit_audit_status || []
cityExamTypeList.value = res.data.recruit_city_exam_type || []
isOutFwList.value = res.data.recruit_dorm_range_status || []
}) })
// 所有经办人 // 所有经办人
@@ -1361,7 +1428,126 @@ onMounted(() => {
} }
} }
// 资料检测样式 // 资料检测样式(紧凑版)
.material-check-compact {
.status-wrapper {
display: inline-flex;
align-items: center;
}
}
// Popover详情样式
.material-detail-popover {
.detail-title {
font-size: 14px;
font-weight: 600;
color: #303133;
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 1px solid #EBEEF5;
}
.detail-section {
margin-bottom: 16px;
&:last-child {
margin-bottom: 0;
}
// 横向布局
&.horizontal {
display: flex;
align-items: center;
gap: 12px;
.section-label {
margin-bottom: 0;
white-space: nowrap;
}
.section-content {
flex: 1;
}
}
.section-label {
font-size: 12px;
color: #909399;
margin-bottom: 8px;
font-weight: 500;
}
:deep(.el-tag) {
.tag-icon {
font-size: 12px;
}
}
}
.material-list {
display: flex;
flex-direction: column;
gap: 8px;
.material-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 13px;
padding: 6px 10px;
border-radius: 4px;
&.warning {
background-color: #fef0f0;
color: #f56c6c;
.el-icon {
color: #f56c6c;
}
}
&.success {
background-color: #f0f9ff;
color: #67c23a;
.el-icon {
color: #67c23a;
}
}
.el-icon {
font-size: 14px;
}
}
}
.remark-box {
display: flex;
align-items: flex-start;
gap: 8px;
padding: 12px;
background-color: #fef0f0;
border-radius: 4px;
border-left: 3px solid #f56c6c;
.remark-icon {
color: #f56c6c;
font-size: 16px;
flex-shrink: 0;
margin-top: 1px;
}
.remark-text {
color: #f56c6c;
font-size: 13px;
line-height: 1.6;
word-break: break-all;
flex: 1;
}
}
}
// 旧样式保留(如果其他地方还在使用)
.material-check-cell { .material-check-cell {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@@ -177,17 +177,6 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="是否打印" prop="isBackTz">
<el-select v-model="dataForm.isBackTz" filterable clearable placeholder="请选择是否打印">
<el-option
v-for="item in isBackTzList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否同步学工" prop="isTb"> <el-form-item label="是否同步学工" prop="isTb">
<el-select v-model="dataForm.isTb" filterable clearable placeholder="请选择是否同步学工"> <el-select v-model="dataForm.isTb" filterable clearable placeholder="请选择是否同步学工">
<el-option <el-option
@@ -220,7 +209,7 @@
@click="handleExport()">分班导出 @click="handleExport()">分班导出
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruit_banding" v-auth="'recruit_banding'"
class="ml10" class="ml10"
type="danger" type="danger"
plain plain
@@ -228,7 +217,7 @@
@click="oneClassHandle()">一键分班 @click="oneClassHandle()">一键分班
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruit_banding" v-auth="'recruit_banding'"
class="ml10" class="ml10"
type="danger" type="danger"
plain plain
@@ -236,7 +225,7 @@
@click="oneStuNoHandle()">一键分学号 @click="oneStuNoHandle()">一键分学号
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruit_synchronous_stuwork" v-auth="'recruit_synchronous_stuwork'"
class="ml10" class="ml10"
type="primary" type="primary"
plain plain
@@ -332,18 +321,19 @@
<el-table-column <el-table-column
header-align="center" header-align="center"
align="center" align="center"
width="180"
label="操作"> label="操作">
<template #default="scope"> <template #default="scope">
<el-button type="primary" link icon="Document" size="small" @click="addOrUpdateHandle(scope.row.id,0)"> <el-button type="primary" link icon="Document" @click="addOrUpdateHandle(scope.row.id,0)">
查看 查看
</el-button> </el-button>
<el-button <el-button
v-if="permissions.recruit_banding && scope.row.isTb=='0' && scope.row.classNo !=null" v-if="scope.row.isTb=='0' && scope.row.classNo !=null"
v-auth="'recruit_banding'"
type="primary" type="primary"
link link
size="small" icon="Switch"
@click="changeclass(scope.row)"> @click="changeclass(scope.row)">
<el-icon><Edit /></el-icon>
调整班级 调整班级
</el-button> </el-button>
</template> </template>
@@ -357,106 +347,31 @@
@size-change="sizeChangeHandle" @size-change="sizeChangeHandle"
/> />
<!-- 弹窗, 新增 / 修改 --> <!-- 弹窗, 新增 / 修改 -->
<TableForm v-if="addOrUpdateVisible" ref="addOrUpdateRef" @refreshDataList="getDataList" ></TableForm> <TableForm ref="addOrUpdateRef" @refreshDataList="getDataList" ></TableForm>
<MajorChange v-if="majorChangeVisible" ref="majorChangeRef" @refreshDataList="getDataList"></MajorChange> <el-dialog title="班级调整" v-model="changeClassVisible" width="600px"
<Update v-if="updateVisible" ref="updateRef" @refreshDataList="getDataList"></Update>
<el-dialog title="支付二维码" v-model="dialogFormVisible" width="800px"
@close="dialogFormVisible=false">
<el-table :data="tableData" border>
<el-table-column label="唯一号" prop="serialNumber" align="center"></el-table-column>
<el-table-column label="姓名" prop="name" align="center"></el-table-column>
<el-table-column label="家长手机号" prop="parentTelOne" align="center"></el-table-column>
<el-table-column label="操作" prop="" align="center">
<template #default>
<el-button @click="updateFS()" type="danger" size="small">
<el-icon><Search /></el-icon>
立即查询
</el-button>
</template>
</el-table-column>
</el-table>
<div style="padding-top: 20px;">
<div id="payQrcode1" style="display: inline-block;" >
{{payQrcode1Msg}}
</div>
<vue-qr :text="payQrcode1" :size="200" v-if="showPrise1" style="display: inline-block"></vue-qr>
<div id="payQrcode2" style="display: inline-block">
{{payQrcode2Msg}}
</div>
<vue-qr :text="payQrcode2" :size="200" v-if="showPrise2" style="display: inline-block"></vue-qr>
<div id="payQrcode3" style="display: inline-block">
{{payQrcode3Msg}}
</div>
<vue-qr :text="payQrcode3" :size="200" v-if="showPrise3" style="display: inline-block"></vue-qr>
</div>
<span style="color: red;padding-top: 20px;">** 此界面为查询学生缴款二维码如有收不到微信推送或手机号填错的可直接在此扫码支付支付成功后请手动点击"立即查询"按钮查询该生的缴费情况;因财政收费系统有一定的滞后性如点击"立即查询"后任显示未交费请稍后再继续查询或重新点击"立即查询"按钮 **</span>
</el-dialog>
<el-dialog title="延迟缴费" v-model="delayPayTimeVisible" width="300px"
@close="delayPayTimeVisible=false">
<el-date-picker v-model="delayPayTime" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" clearable type="datetime" ></el-date-picker>
<template #footer>
<div class="dialog-footer">
<el-button @click="delayPayTimeVisible=false"> </el-button>
<el-button @click="updateInfoHandle" type="primary">保存</el-button>
</div>
</template>
</el-dialog>
<el-dialog title="录取通知书" v-model="lqtzsVisible" width="80%"
@close="lqtzsVisible=false">
<div style="height: 60vh">
<iframe id="iframeid" :src="pdfPath" ref="iframeRef" frameborder="0" style="width:100%;height:100%;"></iframe>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="lqtzsVisible=false"> </el-button>
<el-button @click="suerLQTZ" v-if="permissions.sureLQTZ && lqtzsShow" type="primary">确认已打印</el-button>
</div>
</template>
</el-dialog>
<el-dialog title="班级调整" v-model="changeClassVisible" width="500px"
@close="changeClassVisible=false"> @close="changeClassVisible=false">
<el-form ref="formRef" :model="changeForm" label-width="80px"> <el-form ref="formRef" :model="changeForm" label-width="80px">
<el-row :gutter="24"> <el-form-item label="原班级">
<el-col :span="24"> <el-select v-model="changeForm.oldClass" placeholder="请选择班级" disabled >
<el-form-item label="原班级"> <el-option
<el-select v-model="changeForm.oldClass" size="small" placeholder="请选择班级" disabled > v-for="item in classList"
<el-option :key="item.classCode"
v-for="item in classList" :label="item.classNo"
:key="item.classCode" :value="item.classCode">
:label="item.classNo" </el-option>
:value="item.classCode"> </el-select>
</el-option> </el-form-item>
</el-select> <el-form-item label="新班级">
</el-form-item> <el-select v-model="changeForm.classNo" filterable placeholder="请选择新班级" >
</el-col> <el-option
</el-row> v-for="item in changeClassList"
<el-row :gutter="24"> :key="item.classNo"
<el-col :span="24"> :label="item.classNo"
<el-form-item label="新班级"> :value="item.classNo">
<el-select v-model="changeForm.classNo" filterable size="small" placeholder="请选择新班级" > </el-option>
<el-option </el-select>
v-for="item in changeClassList" </el-form-item>
:key="item.classNo"
:label="item.classNo"
:value="item.classNo">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
@@ -465,35 +380,22 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<DormFW v-if="dormFWRefVisible" ref="dormFWRef"></DormFW>
<ShowMap v-if="baiduMapVisible" ref="baiduMapRef"></ShowMap>
</div> </div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, computed, nextTick, onMounted, defineAsyncComponent } from 'vue' import { ref, reactive, nextTick, onMounted, defineAsyncComponent } from 'vue'
import { Search, ZoomIn, Edit } from '@element-plus/icons-vue' import { Search, ZoomIn, Edit } from '@element-plus/icons-vue'
import { ElNotification } from 'element-plus' import { ElNotification } from 'element-plus'
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { useMessage } from '/@/hooks/message' import { useMessage } from '/@/hooks/message'
import { useMessageBox } from '/@/hooks/message' import { useMessageBox } from '/@/hooks/message'
import { BasicTableProps, useTable } from '/@/hooks/table' import { BasicTableProps, useTable } from '/@/hooks/table'
import axios from 'axios' import axios from 'axios'
import { getList } from '/@/api/recruit/recruitstudentplangroup' import { getList } from '/@/api/recruit/recruitstudentplangroup'
import { import {
delObj,
exportZip,
classPage, classPage,
leaveSchool,
rePush,
updateInfo,
yjOut,
toWord,
sureLQTZ,
tbStuWork, tbStuWork,
sendImg,
oneClass, oneClass,
oneStuNo, oneStuNo,
changeClassInfo, getMajorClass changeClassInfo, getMajorClass
@@ -503,31 +405,13 @@ import { getClassListByRole, getDeptList } from "/@/api/basic/basicclass"
import {listPlanByCondition as planMajor} from "/@/api/recruit/recruitstudentplan" import {listPlanByCondition as planMajor} from "/@/api/recruit/recruitstudentplan"
import { getTypeValue } from "/@/api/admin/dict" import { getTypeValue } from "/@/api/admin/dict"
import { getUserListByRole } from "/@/api/admin/user" import { getUserListByRole } from "/@/api/admin/user"
import { ROLE_CODE } from "/@/config/global" import { ROLE_CODE, PAY_STATUS_LIST, PUSHED_STATUS_LIST, DATA_SOURCE_LIST } from "/@/config/global"
import { updateFs } from "/@/api/finance/financenormalstu"
import { showLoading, hideLoading } from '/@/api/asset/loading' import { showLoading, hideLoading } from '/@/api/asset/loading'
import { useDict } from '/@/hooks/dict' import { useDict } from '/@/hooks/dict'
const TableForm = defineAsyncComponent(() => import('./detaiform.vue')) const TableForm = defineAsyncComponent(() => import('./detaiform.vue'))
const MajorChange = defineAsyncComponent(() => import('./majorChange.vue'))
const Update = defineAsyncComponent(() => import('./update.vue'))
const DormFW = defineAsyncComponent(() => import('./dormFW.vue'))
const ShowMap = defineAsyncComponent(() => import('./showMap.vue'))
const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.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
})
// 使用 hooks // 使用 hooks
const message = useMessage() const message = useMessage()
@@ -550,11 +434,6 @@ const searchFormRef = ref()
const formRef = ref() const formRef = ref()
const tableRef = ref() const tableRef = ref()
const addOrUpdateRef = ref() const addOrUpdateRef = ref()
const majorChangeRef = ref()
const updateRef = ref()
const dormFWRef = ref()
const baiduMapRef = ref()
const iframeRef = ref()
// 响应式数据 // 响应式数据
const changeForm = reactive({ const changeForm = reactive({
@@ -588,12 +467,8 @@ const dataForm = reactive({
isBackTz: "" isBackTz: ""
}) })
const id = ref("")
const pdfPath = ref("")
const delayPayTime = ref("")
const auditorList = ref<any[]>([]) const auditorList = ref<any[]>([])
const isBackTzList = [{ label: "未打印", value: "0" }, { label: "已打印", value: "1" }] const paystatusList = PAY_STATUS_LIST
const paystatusList = [{ label: "已缴费", value: "10" }, { label: "未缴费", value: "0" }, { label: "部分缴费", value: "5" }]
// 搜索表单显示状态 // 搜索表单显示状态
const showSearch = ref(true) const showSearch = ref(true)
@@ -601,10 +476,9 @@ const showSearch = ref(true)
const planList = ref<any[]>([]) const planList = ref<any[]>([])
const eduList = ref<any[]>([]) const eduList = ref<any[]>([])
const planMajorList = ref<any[]>([]) const planMajorList = ref<any[]>([])
const pushedList = [{ label: "未推送", value: "0" }, { label: "已推送", value: "1" }] const pushedList = PUSHED_STATUS_LIST
const isOutList = [{ label: "学校", value: "0" }, { label: "市平台", value: "1" }] const isOutList = DATA_SOURCE_LIST
const deptList = ref<any[]>([]) const deptList = ref<any[]>([])
const lqtzsShow = ref(false)
// 字典数据 // 字典数据
const { yes_no_type } = useDict('yes_no_type') const { yes_no_type } = useDict('yes_no_type')
@@ -627,26 +501,7 @@ const state: BasicTableProps = reactive<BasicTableProps>({
// 使用 table hook // 使用 table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state) const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
const addOrUpdateVisible = ref(false)
const changeClassVisible = ref(false) const changeClassVisible = ref(false)
const majorChangeVisible = ref(false)
const lqtzsVisible = ref(false)
const updateVisible = ref(false)
const payQrcode1 = ref("")
const showPrise1 = ref(false)
const payQrcode1Msg = ref("")
const payQrcode2 = ref("")
const payQrcode2Msg = ref("")
const showPrise2 = ref(false)
const payQrcode3 = ref("")
const payQrcode3Msg = ref("")
const showPrise3 = ref(false)
const dialogFormVisible = ref(false)
const delayPayTimeVisible = ref(false)
const dormFWRefVisible = ref(false)
const baiduMapVisible = ref(false)
const tableData = ref<any[]>([])
const classList = ref<any[]>([]) const classList = ref<any[]>([])
const changeClassList = ref<any[]>([]) const changeClassList = ref<any[]>([])
@@ -671,15 +526,7 @@ const getClassData = () => {
classList.value = data.data classList.value = data.data
}) })
} }
const sendImgHandle = () => {
useMessageBox().confirm('是否确认同步招生图片到市平台?请谨慎操作').then(() => {
return sendImg()
}).then(() => {
message.success('同步图片请求已发起,请耐心等待')
}).catch(() => {
hideLoading()
})
}
const tbStuWorkHandle = () => { const tbStuWorkHandle = () => {
if (dataForm.groupId == '') { if (dataForm.groupId == '') {
message.warning('招生计划不能为空') message.warning('招生计划不能为空')
@@ -728,62 +575,6 @@ const oneStuNoHandle = () => {
hideLoading() hideLoading()
}) })
} }
const downZip = () => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
showLoading()
exportZip(dataForm).then((res: any) => {
hideLoading()
const blob = new Blob([res.data])
const elink = document.createElement('a')
elink.download = "招生名单.zip"
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}).catch(() => {
hideLoading()
})
}
const baiduMap = (row: any) => {
baiduMapVisible.value = true
nextTick(() => {
baiduMapRef.value?.init(row)
})
}
const setDormFW = () => {
dormFWRefVisible.value = true
nextTick(() => {
dormFWRef.value?.init()
})
}
const yjOutHandle = () => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
useMessageBox().confirm('是否确认一键判断是否超出住宿范围?请谨慎操作').then(() => {
return yjOut({ groupId: dataForm.groupId })
}).then(() => {
message.success('操作成功')
getDataList()
})
}
const handleExportAudit = (type: number) => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
downFile(type)
}
const handleExport = () => { const handleExport = () => {
if (dataForm.groupId == '') { if (dataForm.groupId == '') {
@@ -816,27 +607,6 @@ const exportExcel = (form: any, url: string) => {
}) })
} }
const downFile = (type: number) => {
dataForm.type = String(type)
exportExcel(dataForm, '/recruit/recruitstudentsignup/exportExcel').then((res: any) => {
const blob = new Blob([res.data])
let fileName = ""
if (type == 1) {
fileName = '延迟缴费名单导出.xlsx'
} else {
fileName = '超时缴费名单导出.xlsx'
}
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}).catch(() => {
})
}
const init = () => { const init = () => {
// 查询二级学院信息 // 查询二级学院信息
getDeptList().then((data: any) => { getDeptList().then((data: any) => {
@@ -871,17 +641,6 @@ const unique = (arr: any[]) => {
return arr.filter((item) => !rese.has(item.username) && rese.set(item.username, 1)) return arr.filter((item) => !rese.has(item.username) && rese.set(item.username, 1))
} }
// 性别
const getGender = (gender: string) => {
if (gender == '2') {
return '女'
}
if (gender == '1') {
return '男'
}
return ''
}
const chanMajor = () => { const chanMajor = () => {
planMajorList.value = [] planMajorList.value = []
planMajor({ groupId: dataForm.groupId }).then((data: any) => { planMajor({ groupId: dataForm.groupId }).then((data: any) => {
@@ -906,27 +665,11 @@ const changeclass = (row: any) => {
// 新增 / 修改 // 新增 / 修改
const addOrUpdateHandle = (id: string, type: number) => { const addOrUpdateHandle = (id: string, type: number) => {
addOrUpdateVisible.value = true
nextTick(() => { nextTick(() => {
addOrUpdateRef.value?.init(id, type) addOrUpdateRef.value?.init(id, type)
}) })
} }
// 新增 / 修改
const edit = (id: string) => {
updateVisible.value = true
nextTick(() => {
updateRef.value?.init(id)
})
}
const majorChangeHandle = (id: string) => {
majorChangeVisible.value = true
nextTick(() => {
majorChangeRef.value?.init(id)
})
}
const changeClassInfoHandle = () => { const changeClassInfoHandle = () => {
if (changeForm.classNo == '') { if (changeForm.classNo == '') {
message.error('调整班级不能空') message.error('调整班级不能空')
@@ -951,25 +694,6 @@ const changeClassInfoHandle = () => {
}) })
} }
const updateHandle = (id: string, groupId: string, feeAgency: string) => {
useMessageBox().confirm('是否确认办理退学操作?请谨慎操作').then(() => {
return leaveSchool({ id: id, groupId: groupId, feeAgency: feeAgency })
}).then(() => {
message.success('操作成功')
getDataList()
})
}
// 删除
const deleteHandle = (id: string) => {
useMessageBox().confirm('是否确认删除本条数据?请谨慎操作').then(() => {
return delObj(id)
}).then(() => {
message.success('删除成功')
getDataList()
})
}
const resetForm = (formName: string) => { const resetForm = (formName: string) => {
if (formName === 'searchForm') { if (formName === 'searchForm') {
searchFormRef.value?.formRef?.resetFields() searchFormRef.value?.formRef?.resetFields()
@@ -977,148 +701,6 @@ const resetForm = (formName: string) => {
formRef.value?.resetFields() formRef.value?.resetFields()
} }
} }
// 使用插槽 缴费状态
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 ''
}
const getMajor = (type: string) => {
if (type == '0') {
return '未申请'
} else if (type == '1') {
return '待审核'
} else if (type == '2') {
return '驳回'
} else if (type == '3') {
return '已通过'
}
return ''
}
const lqtz = (row: any) => {
id.value = row.id
pdfPath.value = ""
if (row.isBackTz == '0') {
lqtzsShow.value = true
} else {
lqtzsShow.value = false
}
toWord(row).then((res: any) => {
pdfPath.value = "/recruit/file/previewPdf?filePath=" + encodeURIComponent(res.data)
lqtzsVisible.value = true
})
}
const infoTable = (row: any) => {
window.open("printRecruitedStu.html?appId=" + row.id)
}
const suerLQTZ = () => {
useMessageBox().confirm('是否确认已打印本通知书?请谨慎操作').then(() => {
return sureLQTZ({ id: id.value })
}).then(() => {
message.success('保存成功')
lqtzsVisible.value = false
getDataList()
})
}
const rePushHandle = (row: any) => {
useMessageBox().confirm('是否确认重新推送本条数据?请谨慎操作').then(() => {
return rePush({ id: row.id })
}).then(() => {
message.success('推送成功')
getDataList()
})
}
const delayPayTimeSet = (row: any) => {
delayPayTime.value = ''
id.value = row.id
if (row.delayPaymentTime) {
delayPayTime.value = row.delayPaymentTime
}
delayPayTimeVisible.value = true
}
const updateInfoHandle = () => {
useMessageBox().confirm('是否确认进度延迟收费操作?请谨慎操作').then(() => {
return updateInfo({ delayPaymentTime: delayPayTime.value, id: id.value })
}).then(() => {
delayPayTimeVisible.value = false
message.success('延迟收费修改成功')
getDataList()
})
}
const updateFS = () => {
updateFs({ "serialNumber": tableData.value[0].serialNumber.substring(1, tableData.value[0].serialNumber.length) }).then(() => {
ElNotification.success({
title: '成功',
message: '已提交查询请求请等待1分钟后重新查询'
})
dialogFormVisible.value = false
getDataList()
})
}
const showPayCode = (row: any) => {
showPrise1.value = false
showPrise2.value = false
showPrise3.value = false
// 置空
payQrcode1.value = ""
payQrcode2.value = ""
payQrcode3.value = ""
if (row.clfPayCode == "" || row.clfPayCode == undefined) {
payQrcode1Msg.value = ""
showPrise1.value = false
} else {
payQrcode1Msg.value = "材料费、代办费"
showPrise1.value = true
payQrcode1.value = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.clfPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400'
}
if (row.xfPayCode == "" || row.xfPayCode == undefined) {
payQrcode2Msg.value = ""
showPrise2.value = false
} else {
payQrcode2Msg.value = "学费"
showPrise2.value = true
payQrcode2.value = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.xfPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400'
}
if (row.zdbPayCode == "" || row.zdbPayCode == undefined) {
payQrcode3Msg.value = ""
showPrise3.value = false
} else {
payQrcode3Msg.value = "中德班学费"
showPrise3.value = true
payQrcode3.value = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.zdbPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400'
}
tableData.value = []
tableData.value.push(row)
dialogFormVisible.value = true
}
// 初始化 // 初始化
onMounted(() => { onMounted(() => {

View File

@@ -6,7 +6,7 @@
append-to-body append-to-body
width="600"> width="600">
<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-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="招生计划" prop="groupId"> <el-form-item label="招生计划" prop="groupId">
@@ -115,7 +115,7 @@ import { useMessageBox } from '/@/hooks/message'
import { getObj, changeMajor } from '/@/api/recruit/recruitstudentsignup' import { getObj, changeMajor } from '/@/api/recruit/recruitstudentsignup'
import { getList } from "/@/api/recruit/recruitstudentplangroup" import { getList } from "/@/api/recruit/recruitstudentplangroup"
import { listByEdu } from "/@/api/recruit/recruitstudentplan" import { listByEdu } from "/@/api/recruit/recruitstudentplan"
import { getDictsByTypes } from "/@/api/admin/dict" import { getDicts } from "/@/api/admin/dict"
import { list as scoreList } from "/@/api/recruit/recruitstudentplancorrectscoreconfig" import { list as scoreList } from "/@/api/recruit/recruitstudentplancorrectscoreconfig"
// 消息提示 hooks // 消息提示 hooks
@@ -324,10 +324,10 @@ const init = (id: string | null) => {
dataFormRef.value?.resetFields() dataFormRef.value?.resetFields()
if (dataForm.id) { if (dataForm.id) {
// 获取数据字典代办费 // 获取数据字典代办费
getDictsByTypes(["agency_fee"]).then((res: any) => { getDicts('agency_fee').then((res: any) => {
agencyFeeList.value = res.data agencyFeeList.value = res.data
// 获取数据字典学费 // 获取数据字典学费
getDictsByTypes(["tuition_fee"]).then((res: any) => { getDicts('tuition_fee').then((res: any) => {
tuitionFeeList.value = res.data tuitionFeeList.value = res.data
getObj(dataForm.id).then((response: any) => { getObj(dataForm.id).then((response: any) => {
Object.assign(dataForm, response.data) Object.assign(dataForm, response.data)

View File

@@ -4,9 +4,9 @@
:close-on-click-modal="false" :close-on-click-modal="false"
v-model="visible" v-model="visible"
append-to-body append-to-body
width="1000px"> width="900px">
<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-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="招生计划" prop="groupId"> <el-form-item label="招生计划" prop="groupId">
@@ -102,25 +102,6 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8">
<el-form-item label="在常租赁合同/房产证明" prop="housePic">
<el-upload
action="/recruit/file/uploadAttachment"
list-type="picture-card"
name="file"
:headers="headers"
:limit="5"
:data="uploadData"
:file-list="houseList"
:before-upload="beforeUpload"
:on-preview="handlePictureCardPreview"
:on-remove="remove4Handler"
:http-request="httpRequest"
:on-success="upload4Success">
<el-icon class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="在常就业社保证明" prop="sbPic"> <el-form-item label="在常就业社保证明" prop="sbPic">
<el-upload <el-upload
@@ -140,6 +121,26 @@
</el-upload> </el-upload>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item label="在常租赁合同/房产证明" prop="housePic">
<el-upload
action="/recruit/file/uploadAttachment"
list-type="picture-card"
name="file"
:headers="headers"
:limit="5"
:data="uploadData"
:file-list="houseList"
:before-upload="beforeUpload"
:on-preview="handlePictureCardPreview"
:on-remove="remove4Handler"
:http-request="httpRequest"
:on-success="upload4Success">
<el-icon class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="户口本" prop="householdPic"> <el-form-item label="户口本" prop="householdPic">
<el-upload <el-upload