|
@@ -13,6 +13,12 @@
|
|
|
<el-form-item label="学生姓名" prop="studentName">
|
|
<el-form-item label="学生姓名" prop="studentName">
|
|
|
<el-input v-model="queryParams.studentName" placeholder="请输入学生姓名" clearable @keyup.enter="handleQuery" />
|
|
<el-input v-model="queryParams.studentName" placeholder="请输入学生姓名" clearable @keyup.enter="handleQuery" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
|
|
+ <el-form-item label="状态" prop="status">
|
|
|
|
|
+ <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
|
|
|
|
|
+ <el-option label="有效" value="valid" />
|
|
|
|
|
+ <el-option label="失效" value="invalid" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
<!-- <el-form-item label="学号" prop="studentNo">
|
|
<!-- <el-form-item label="学号" prop="studentNo">
|
|
|
<el-input v-model="queryParams.studentNo" placeholder="请输入学号" clearable @keyup.enter="handleQuery" />
|
|
<el-input v-model="queryParams.studentNo" placeholder="请输入学号" clearable @keyup.enter="handleQuery" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -215,7 +221,14 @@
|
|
|
<el-table-column label="扩展字段2" align="center" prop="extField2" v-if="false" />
|
|
<el-table-column label="扩展字段2" align="center" prop="extField2" v-if="false" />
|
|
|
<el-table-column label="扩展字段3" align="center" prop="extField3" v-if="false" />
|
|
<el-table-column label="扩展字段3" align="center" prop="extField3" v-if="false" />
|
|
|
<el-table-column label="备注信息" align="center" prop="remark" />
|
|
<el-table-column label="备注信息" align="center" prop="remark" />
|
|
|
- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
|
|
|
|
|
|
+ <el-table-column label="状态" align="center" prop="status" width="90">
|
|
|
|
|
+ <template #default="scope">
|
|
|
|
|
+ <el-tag :type="getStatusType(scope.row)" size="small">
|
|
|
|
|
+ {{ getStatusText(scope.row) }}
|
|
|
|
|
+ </el-tag>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="100">
|
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
|
<el-tooltip content="修改" placement="top">
|
|
<el-tooltip content="修改" placement="top">
|
|
|
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['holidayStay:holidayStay:edit']"></el-button>
|
|
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['holidayStay:holidayStay:edit']"></el-button>
|
|
@@ -223,7 +236,7 @@
|
|
|
<el-tooltip content="删除" placement="top">
|
|
<el-tooltip content="删除" placement="top">
|
|
|
<el-button
|
|
<el-button
|
|
|
link
|
|
link
|
|
|
- type="primary"
|
|
|
|
|
|
|
+ type="danger"
|
|
|
icon="Delete"
|
|
icon="Delete"
|
|
|
@click="handleDelete(scope.row)"
|
|
@click="handleDelete(scope.row)"
|
|
|
v-hasPermi="['holidayStay:holidayStay:remove']"
|
|
v-hasPermi="['holidayStay:holidayStay:remove']"
|
|
@@ -706,21 +719,16 @@ const data = reactive<PageData<HolidayStayForm, HolidayStayQuery>>({
|
|
|
extField1: undefined,
|
|
extField1: undefined,
|
|
|
extField2: undefined,
|
|
extField2: undefined,
|
|
|
extField3: undefined,
|
|
extField3: undefined,
|
|
|
|
|
+ status: undefined,
|
|
|
params: {}
|
|
params: {}
|
|
|
},
|
|
},
|
|
|
rules: {
|
|
rules: {
|
|
|
id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
|
|
id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
|
|
|
- studentId: [{ required: true, message: '学生ID,关联xg_student_msg.id不能为空', trigger: 'blur' }],
|
|
|
|
|
|
|
+ studentId: [{ required: true, message: '学生ID', trigger: 'blur' }],
|
|
|
studentName: [{ required: true, message: '学生姓名不能为空', trigger: 'blur' }],
|
|
studentName: [{ required: true, message: '学生姓名不能为空', trigger: 'blur' }],
|
|
|
studentNo: [{ required: true, message: '学号不能为空', trigger: 'blur' }],
|
|
studentNo: [{ required: true, message: '学号不能为空', trigger: 'blur' }],
|
|
|
- holidayType: [{ required: true, message: '假期类型不能为空', trigger: 'change' }],
|
|
|
|
|
- applyStartDate: [{ required: true, message: '申请留宿开始日期不能为空', trigger: 'blur' }],
|
|
|
|
|
- applyEndDate: [{ required: true, message: '申请留宿结束日期不能为空', trigger: 'blur' }],
|
|
|
|
|
- stayReason: [{ required: true, message: '留宿原因不能为空', trigger: 'blur' }],
|
|
|
|
|
- studentPhone: [{ required: true, message: '学生联系电话不能为空', trigger: 'blur' }],
|
|
|
|
|
- emergencyContact: [{ required: true, message: '紧急联系人姓名不能为空', trigger: 'blur' }],
|
|
|
|
|
- emergencyPhone: [{ required: true, message: '紧急联系人电话不能为空', trigger: 'blur' }],
|
|
|
|
|
- parentConsent: [{ required: true, message: '家长同意不能为空', trigger: 'change' }]
|
|
|
|
|
|
|
+ applyStartDate: [{ required: true, message: '留宿开始日期不能为空', trigger: 'blur' }],
|
|
|
|
|
+ applyEndDate: [{ required: true, message: '留宿结束日期不能为空', trigger: 'blur' }]
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -747,7 +755,35 @@ const uploadData = computed(() => {
|
|
|
/** 查询假期留宿管理列表 */
|
|
/** 查询假期留宿管理列表 */
|
|
|
const getList = async () => {
|
|
const getList = async () => {
|
|
|
loading.value = true;
|
|
loading.value = true;
|
|
|
- const res = await listHolidayStay(queryParams.value);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 处理状态过滤逻辑
|
|
|
|
|
+ const requestParams = { ...queryParams.value };
|
|
|
|
|
+
|
|
|
|
|
+ // 根据状态设置时间过滤条件
|
|
|
|
|
+ if (requestParams.status) {
|
|
|
|
|
+ const currentTime = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
|
|
|
+
|
|
|
|
|
+ if (requestParams.status === 'valid') {
|
|
|
|
|
+ // 查询有效状态:结束时间大于等于当前时间
|
|
|
|
|
+ requestParams.params = {
|
|
|
|
|
+ ...requestParams.params,
|
|
|
|
|
+ statusType: 'valid',
|
|
|
|
|
+ currentTime: currentTime
|
|
|
|
|
+ };
|
|
|
|
|
+ } else if (requestParams.status === 'invalid') {
|
|
|
|
|
+ // 查询失效状态:结束时间小于当前时间
|
|
|
|
|
+ requestParams.params = {
|
|
|
|
|
+ ...requestParams.params,
|
|
|
|
|
+ statusType: 'invalid',
|
|
|
|
|
+ currentTime: currentTime
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 移除status参数,因为后端不需要这个字段
|
|
|
|
|
+ delete requestParams.status;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const res = await listHolidayStay(requestParams);
|
|
|
holidayStayList.value = res.rows;
|
|
holidayStayList.value = res.rows;
|
|
|
total.value = res.total;
|
|
total.value = res.total;
|
|
|
loading.value = false;
|
|
loading.value = false;
|
|
@@ -1265,6 +1301,30 @@ const loadCascadeOptionsForUpdate = async (formData: HolidayStayForm) => {
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+/** 获取状态文本 */
|
|
|
|
|
+const getStatusText = (row: HolidayStayVO) => {
|
|
|
|
|
+ if (!row.applyEndDate) {
|
|
|
|
|
+ return '未知';
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const currentTime = new Date();
|
|
|
|
|
+ const endTime = new Date(row.applyEndDate);
|
|
|
|
|
+
|
|
|
|
|
+ return currentTime > endTime ? '失效' : '有效';
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+/** 获取状态标签类型 */
|
|
|
|
|
+const getStatusType = (row: HolidayStayVO) => {
|
|
|
|
|
+ if (!row.applyEndDate) {
|
|
|
|
|
+ return 'info';
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const currentTime = new Date();
|
|
|
|
|
+ const endTime = new Date(row.applyEndDate);
|
|
|
|
|
+
|
|
|
|
|
+ return currentTime > endTime ? 'danger' : 'success';
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
// 文件类型判断
|
|
// 文件类型判断
|
|
|
const isImageFile = (file: any) => {
|
|
const isImageFile = (file: any) => {
|
|
|
const imageTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/bmp', 'image/webp'];
|
|
const imageTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/bmp', 'image/webp'];
|