|
@@ -623,74 +623,75 @@ const handleLeaveTypeChange = (value: string) => {
|
|
|
form.leaveTypeCode = leaveType.leaveTypeCode;
|
|
form.leaveTypeCode = leaveType.leaveTypeCode;
|
|
|
|
|
|
|
|
// 1. 处理销假状态逻辑
|
|
// 1. 处理销假状态逻辑
|
|
|
- if (leaveType.needCancelForNonLeave === '0') {
|
|
|
|
|
- // 当 need_cancel_for_non_leave 为 0-否 时
|
|
|
|
|
- if (form.isLeaveSchool === '0') {
|
|
|
|
|
- // 当 isLeaveSchool = 0 时,cancelStatus = 3 (无需销假)
|
|
|
|
|
- form.cancelStatus = '3';
|
|
|
|
|
- form.needCancel = '0';
|
|
|
|
|
- } else {
|
|
|
|
|
- // 其他时候,cancelStatus = 0 (未销假)
|
|
|
|
|
- form.cancelStatus = '0';
|
|
|
|
|
- form.needCancel = '1';
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- // 当 need_cancel_for_non_leave 为 1-是 时,保持原有逻辑
|
|
|
|
|
- form.cancelStatus = '0';
|
|
|
|
|
- form.needCancel = '1';
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // if (leaveType.needCancelForNonLeave === '0') {
|
|
|
|
|
+ // // 当 need_cancel_for_non_leave 为 0-否 时
|
|
|
|
|
+ // if (form.isLeaveSchool === '0') {
|
|
|
|
|
+ // // 当 isLeaveSchool = 0 时,cancelStatus = 3 (无需销假)
|
|
|
|
|
+ // form.cancelStatus = '3';
|
|
|
|
|
+ // form.needCancel = '0';
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // // 其他时候,cancelStatus = 0 (未销假)
|
|
|
|
|
+ // form.cancelStatus = '0';
|
|
|
|
|
+ // form.needCancel = '1';
|
|
|
|
|
+ // }
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // // 当 need_cancel_for_non_leave 为 1-是 时,保持原有逻辑
|
|
|
|
|
+ // form.cancelStatus = '0';
|
|
|
|
|
+ // form.needCancel = '1';
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
// 2. 处理是否可以提前请假的逻辑
|
|
// 2. 处理是否可以提前请假的逻辑
|
|
|
- if (leaveType.canApplyInAdvance === '0') {
|
|
|
|
|
- // 不可以提前请假,开始时间不能选择今天之后的日期(只能选择今天之前的日期)
|
|
|
|
|
- // 这里我们通过日期选择器的 disabledDate 来控制
|
|
|
|
|
- // 在模板中已经设置了相应的限制
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // if (leaveType.canApplyInAdvance === '0') {
|
|
|
|
|
+ // // 不可以提前请假,开始时间不能选择今天之后的日期(只能选择今天之前的日期)
|
|
|
|
|
+ // // 这里我们通过日期选择器的 disabledDate 来控制
|
|
|
|
|
+ // // 在模板中已经设置了相应的限制
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
// 3. 处理最大申请时长的逻辑
|
|
// 3. 处理最大申请时长的逻辑
|
|
|
- if (leaveType.maxApplyDuration && leaveType.maxApplyDuration > 0) {
|
|
|
|
|
- // 有最大申请时长限制,通过日期选择器的 disabledDate 来控制
|
|
|
|
|
- // 在模板中已经设置了相应的限制
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // if (leaveType.maxApplyDuration && leaveType.maxApplyDuration > 0) {
|
|
|
|
|
+ // // 有最大申请时长限制,通过日期选择器的 disabledDate 来控制
|
|
|
|
|
+ // // 在模板中已经设置了相应的限制
|
|
|
|
|
+ // }
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
// 清空选择时,同时清空类型编码和相关状态
|
|
// 清空选择时,同时清空类型编码和相关状态
|
|
|
form.leaveTypeCode = '';
|
|
form.leaveTypeCode = '';
|
|
|
form.cancelStatus = '0';
|
|
form.cancelStatus = '0';
|
|
|
|
|
+ form.needCancel = '1';
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 开始时间禁用逻辑
|
|
// 开始时间禁用逻辑
|
|
|
const disabledStartDate = (time: Date) => {
|
|
const disabledStartDate = (time: Date) => {
|
|
|
- if (!currentLeaveType.value) return false;
|
|
|
|
|
|
|
+ // if (!currentLeaveType.value) return false;
|
|
|
|
|
|
|
|
- const today = new Date();
|
|
|
|
|
- today.setHours(0, 0, 0, 0);
|
|
|
|
|
|
|
+ // const today = new Date();
|
|
|
|
|
+ // today.setHours(0, 0, 0, 0);
|
|
|
|
|
|
|
|
- // 处理是否可以提前请假的逻辑
|
|
|
|
|
- if (currentLeaveType.value.canApplyInAdvance === '0') {
|
|
|
|
|
- // 不可以提前请假,开始时间不能选择今天之后的日期(只能选择今天之前的日期)
|
|
|
|
|
- if (time.getTime() > today.getTime()) {
|
|
|
|
|
- return true; // 禁用今天之后的日期
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // // 处理是否可以提前请假的逻辑
|
|
|
|
|
+ // if (currentLeaveType.value.canApplyInAdvance === '0') {
|
|
|
|
|
+ // // 不可以提前请假,开始时间不能选择今天之后的日期(只能选择今天之前的日期)
|
|
|
|
|
+ // if (time.getTime() > today.getTime()) {
|
|
|
|
|
+ // return true; // 禁用今天之后的日期
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
return false;
|
|
return false;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 结束时间禁用逻辑
|
|
// 结束时间禁用逻辑
|
|
|
const disabledEndDate = (time: Date) => {
|
|
const disabledEndDate = (time: Date) => {
|
|
|
- if (!currentLeaveType.value) return false;
|
|
|
|
|
-
|
|
|
|
|
- // 结束时间不受 can_apply_in_advance 限制,可以选择任何日期
|
|
|
|
|
- // 但需要确保结束时间不能早于开始时间
|
|
|
|
|
- if (form.startTime) {
|
|
|
|
|
- const startDate = new Date(form.startTime);
|
|
|
|
|
- // 修改逻辑:允许选择与开始时间同一天及之后的日期
|
|
|
|
|
- if (time.getTime() < startDate.getTime()) {
|
|
|
|
|
- return true; // 只禁用早于开始时间的日期,允许同一天
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // if (!currentLeaveType.value) return false;
|
|
|
|
|
+
|
|
|
|
|
+ // // 结束时间不受 can_apply_in_advance 限制,可以选择任何日期
|
|
|
|
|
+ // // 但需要确保结束时间不能早于开始时间
|
|
|
|
|
+ // if (form.startTime) {
|
|
|
|
|
+ // const startDate = new Date(form.startTime);
|
|
|
|
|
+ // // 修改逻辑:允许选择与开始时间同一天及之后的日期
|
|
|
|
|
+ // if (time.getTime() < startDate.getTime()) {
|
|
|
|
|
+ // return true; // 只禁用早于开始时间的日期,允许同一天
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
return false;
|
|
return false;
|
|
|
};
|
|
};
|
|
@@ -706,17 +707,17 @@ const calculateLeaveDuration = () => {
|
|
|
const totalDays = diffInMilliseconds / (1000 * 60 * 60 * 24);
|
|
const totalDays = diffInMilliseconds / (1000 * 60 * 60 * 24);
|
|
|
|
|
|
|
|
// 处理最大申请时长的逻辑
|
|
// 处理最大申请时长的逻辑
|
|
|
- if (currentLeaveType.value && currentLeaveType.value.maxApplyDuration && currentLeaveType.value.maxApplyDuration > 0) {
|
|
|
|
|
- console.log('totalDays', totalDays);
|
|
|
|
|
- console.log('currentLeaveType.value.maxApplyDuration', currentLeaveType.value.maxApplyDuration);
|
|
|
|
|
- if (totalDays > currentLeaveType.value.maxApplyDuration) {
|
|
|
|
|
- ElMessage.warning(`请假时长不能超过${currentLeaveType.value.maxApplyDuration}天`);
|
|
|
|
|
- // 清空结束时间
|
|
|
|
|
- form.endTime = '';
|
|
|
|
|
- form.leaveDuration = '';
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // if (currentLeaveType.value && currentLeaveType.value.maxApplyDuration && currentLeaveType.value.maxApplyDuration > 0) {
|
|
|
|
|
+ // console.log('totalDays', totalDays);
|
|
|
|
|
+ // console.log('currentLeaveType.value.maxApplyDuration', currentLeaveType.value.maxApplyDuration);
|
|
|
|
|
+ // if (totalDays > currentLeaveType.value.maxApplyDuration) {
|
|
|
|
|
+ // ElMessage.warning(`请假时长不能超过${currentLeaveType.value.maxApplyDuration}天`);
|
|
|
|
|
+ // // 清空结束时间
|
|
|
|
|
+ // form.endTime = '';
|
|
|
|
|
+ // form.leaveDuration = '';
|
|
|
|
|
+ // return;
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
// 格式化请假时长显示,保留2位小数
|
|
// 格式化请假时长显示,保留2位小数
|
|
|
form.leaveDuration = `${totalDays.toFixed(2)}`;
|
|
form.leaveDuration = `${totalDays.toFixed(2)}`;
|
|
@@ -851,6 +852,51 @@ const submitForm = (status: string) => {
|
|
|
ElMessage.error('请假时间不能为空');
|
|
ElMessage.error('请假时间不能为空');
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // ====== 新增:请假类型相关校验逻辑 ======
|
|
|
|
|
+ // 1. 默认需要销假
|
|
|
|
|
+ form.needCancel = '1';
|
|
|
|
|
+ form.cancelStatus = '0';
|
|
|
|
|
+
|
|
|
|
|
+ // 获取当前选中的请假类型配置
|
|
|
|
|
+ const leaveType = currentLeaveType.value;
|
|
|
|
|
+ if (!leaveType) {
|
|
|
|
|
+ ElMessage.error('请先选择请假类型');
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 校验 needCancelForNonLeave(非离校请假是否需要销假)
|
|
|
|
|
+ // needCancelForNonLeave = '0' 且 isLeaveSchool = '0' 时,不需要销假
|
|
|
|
|
+ if (leaveType.needCancelForNonLeave === '0' && form.isLeaveSchool === '0') {
|
|
|
|
|
+ form.needCancel = '0';
|
|
|
|
|
+ form.cancelStatus = '3';
|
|
|
|
|
+ // 业务上如有特殊cancelStatus要求可补充
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 校验 canApplyInAdvance(是否可以提前请假)
|
|
|
|
|
+ if (leaveType.canApplyInAdvance === '0') {
|
|
|
|
|
+ // 只能选择今天及以前的日期
|
|
|
|
|
+ const now = new Date();
|
|
|
|
|
+ now.setHours(23, 59, 59, 999);
|
|
|
|
|
+ const start = new Date(form.startTime);
|
|
|
|
|
+ if (start.getTime() > now.getTime()) {
|
|
|
|
|
+ ElMessage.error('该请假类型不允许提前请假,开始时间不能大于今天!');
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 校验 maxApplyDuration(最大申请时长,天)
|
|
|
|
|
+ if (leaveType.maxApplyDuration && leaveType.maxApplyDuration > 0) {
|
|
|
|
|
+ const start = new Date(form.startTime);
|
|
|
|
|
+ const end = new Date(form.endTime);
|
|
|
|
|
+ const diffDays = (end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24);
|
|
|
|
|
+ if (diffDays > leaveType.maxApplyDuration) {
|
|
|
|
|
+ ElMessage.error(`请假时长不能超过${leaveType.maxApplyDuration}天!`);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // ====== end ======
|
|
|
|
|
+
|
|
|
console.log('status111:', status);
|
|
console.log('status111:', status);
|
|
|
studentLeaveFormRef.value?.validate(async (valid: boolean) => {
|
|
studentLeaveFormRef.value?.validate(async (valid: boolean) => {
|
|
|
if (valid) {
|
|
if (valid) {
|
|
@@ -930,20 +976,21 @@ const cancel = () => {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 监听 isLeaveSchool 字段变化,更新销假状态
|
|
// 监听 isLeaveSchool 字段变化,更新销假状态
|
|
|
-watch(
|
|
|
|
|
- () => form.isLeaveSchool,
|
|
|
|
|
- (newValue) => {
|
|
|
|
|
- if (currentLeaveType.value && currentLeaveType.value.needCancelForNonLeave === '0') {
|
|
|
|
|
- if (newValue === '0') {
|
|
|
|
|
- // 当 isLeaveSchool = 0 时,cancelStatus = 3 (无需销假)
|
|
|
|
|
- form.cancelStatus = '3';
|
|
|
|
|
- } else {
|
|
|
|
|
- // 其他时候,cancelStatus = 0 (未销假)
|
|
|
|
|
- form.cancelStatus = '0';
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-);
|
|
|
|
|
|
|
+// watch(
|
|
|
|
|
+// () => form.isLeaveSchool,
|
|
|
|
|
+// (newValue) => {
|
|
|
|
|
+// console.log('newValue:', newValue);
|
|
|
|
|
+// // if (currentLeaveType.value && currentLeaveType.value.needCancelForNonLeave === '0') {
|
|
|
|
|
+// // if (newValue === '0') {
|
|
|
|
|
+// // // 当 isLeaveSchool = 0 时,cancelStatus = 3 (无需销假)
|
|
|
|
|
+// // form.cancelStatus = '3';
|
|
|
|
|
+// // } else {
|
|
|
|
|
+// // // 其他时候,cancelStatus = 0 (未销假)
|
|
|
|
|
+// // form.cancelStatus = '0';
|
|
|
|
|
+// // }
|
|
|
|
|
+// // }
|
|
|
|
|
+// }
|
|
|
|
|
+// );
|
|
|
|
|
|
|
|
// 根据id获取学生请假信息
|
|
// 根据id获取学生请假信息
|
|
|
const getStudentLeaveInfo = async (id: string | number) => {
|
|
const getStudentLeaveInfo = async (id: string | number) => {
|