提交代码

This commit is contained in:
zlwu committed 2025-08-11 05:56:28 +08:00
1 parent d4eb09c5a9
commit 062b545bd4
2 files changed
+92 -52

No files matched your search

@@ -212,11 +212,19 @@
<!-- 操作按钮 -->
<view class="card-actions">
<!-- 修改按钮 -->
<view class="action-btn info-btn" @click="handleUpdate(item)">
<!-- 修改/查看按钮:根据审批状态动态显示 -->
<view
v-if="isEditableStatus(item.approvalStatus)"
class="action-btn info-btn"
@click="handleUpdate(item)"
>
<u-icon name="edit-pen" size="16" color="#3c9cff"></u-icon>
<text class="btn-text">修改</text>
</view>
<view v-else class="action-btn warning-btn" @click="handleUpdate(item)">
<u-icon name="eye" size="16" color="#ff9900"></u-icon>
<text class="btn-text">查看</text>
</view>
<!-- 删除按钮:仅草稿状态可见 -->
<view
@@ -237,12 +245,6 @@
<u-icon name="checkmark-circle" size="16" color="#5ac725"></u-icon>
<text class="btn-text">销假</text>
</view>
<!-- 查看详情按钮 -->
<!-- <view class="action-btn warning-btn" @click="handleViewDetail(item)">
<u-icon name="eye" size="16" color="#ff9900"></u-icon>
<text class="btn-text">详情</text>
</view> -->
</view>
</view>
</view>
@@ -596,6 +598,13 @@ export default {
return getDictTagType(this.sys_yesno, value, fallbackMap);
},
// 判断审批状态是否可编辑(显示修改按钮)
isEditableStatus(status) {
// draft(草稿)、cancel(已取消)、back(退回)状态可编辑
const editableStatuses = ['draft', 'cancel', 'back'];
return editableStatuses.includes(status);
},
// 格式化请假时间
formatLeaveTime(startTime, endTime) {
if (!startTime || !endTime) return '时间待定';
@@ -939,7 +948,7 @@ export default {
// 操作按钮
.card-actions {
display: flex;
justify-content: space-around;
justify-content: flex-end;
padding: 20rpx;
border-top: 1px solid #f0f0f0;
gap: 16rpx;
@@ -42,7 +42,7 @@
<view class="form-section">
<view class="section-title">基本信息</view>
<u-form-item label="请假类型" prop="leaveTypeName">
<u-form-item label="请假类型" prop="leaveTypeName" required>
<view @click="handleLeaveTypeClick" style="width: 100%">
<u-input
v-model="form.leaveTypeName"
@@ -64,13 +64,13 @@
@cancel="showLeaveTypePicker = false"
></u-picker>
<u-form-item label="类型编码" prop="leaveTypeCode">
<u-form-item label="类型编码" prop="leaveTypeCode" v-if="false">
<view class="readonly-input">
<text>{{ form.leaveTypeCode || '-' }}</text>
</view>
</u-form-item>
<u-form-item label="开始时间" prop="startTime">
<u-form-item label="开始时间" prop="startTime" required>
<view @click="handleStartTimeClick" style="width: 100%">
<u-input
v-model="form.startTime"
@@ -94,7 +94,7 @@
@cancel="showStartTimePicker = false"
></u-datetime-picker>
<u-form-item label="结束时间" prop="endTime">
<u-form-item label="结束时间" prop="endTime" required>
<view @click="handleEndTimeClick" style="width: 100%">
<u-input
v-model="form.endTime"
@@ -124,19 +124,18 @@
</view>
</u-form-item>
<u-form-item label="是否离校">
<u-form-item label="是否离校" prop="isLeaveSchool" required>
<u-radio-group v-model="form.isLeaveSchool" class="radio-group">
<u-radio label="0" name="0" class="radio-item">不离校</u-radio>
<u-radio label="1" name="1" class="radio-item">离校</u-radio>
</u-radio-group>
</u-form-item>
<u-form-item label="是否需要销假">
<view class="readonly-input">
<text class="duration-text">
{{ form.needCancel === '1' ? '需要' : '不需要' }}
</text>
</view>
<u-form-item label="是否需要销假" prop="needCancel" required v-if="false">
<u-radio-group v-model="form.needCancel" class="radio-group">
<u-radio label="1" name="1" class="radio-item">需要</u-radio>
<u-radio label="0" name="0" class="radio-item">不需要</u-radio>
</u-radio-group>
</u-form-item>
</view>
@@ -144,7 +143,7 @@
<view class="form-section">
<view class="section-title">联系信息</view>
<u-form-item label="紧急联系人">
<u-form-item label="紧急联系人" prop="emergencyContact" required>
<u-input
v-model="form.emergencyContact"
placeholder="请输入紧急联系人"
@@ -152,7 +151,7 @@
/>
</u-form-item>
<u-form-item label="紧急联系电话">
<u-form-item label="紧急联系电话" prop="emergencyPhone" required>
<u-input
v-model="form.emergencyPhone"
placeholder="请输入紧急联系电话"
@@ -166,7 +165,7 @@
<view class="form-section">
<view class="section-title">请假详情</view>
<u-form-item label="请假原因" prop="leaveReason">
<u-form-item label="请假原因" prop="leaveReason" required>
<u-textarea
v-model="form.leaveReason"
placeholder="请输入请假原因"
@@ -196,9 +195,9 @@
</text>
</view>
<view class="location-action-container">
<u-button size="mini" type="success" plain @click="openLocationInMap">
<u-icon name="eye" size="16" />
<text style="margin-left: 20rpx">查看位置</text>
<u-button size="mini" type="primary" plain @click="openLocationInMap">
<!-- <u-icon name="eye" size="16" color="#0051d9" /> -->
<text>查看位置</text>
</u-button>
</view>
</view>
@@ -594,6 +593,14 @@ export default {
leaveTypeName: [{ required: true, message: '请选择请假类型', trigger: 'change' }],
startTime: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
endTime: [{ required: true, message: '请选择结束时间', trigger: 'change' }],
isLeaveSchool: [{ required: true, message: '请选择是否离校', trigger: 'change' }],
needCancel: [{ required: true, message: '请选择是否需要销假', trigger: 'change' }],
emergencyContact: [
{ required: true, message: '请输入紧急联系人', trigger: 'blur' },
],
emergencyPhone: [
{ required: true, message: '请输入紧急联系电话', trigger: 'blur' },
],
leaveReason: [{ required: true, message: '请输入请假原因', trigger: 'blur' }],
},
@@ -844,20 +851,20 @@ export default {
)}&referer=智慧校园`;
// #ifdef H5
window.open(url, '_blank');
// window.open(url, '_blank');
// #endif
// #ifndef H5
uni.showModal({
title: '查看地图',
content: '是否打开外部地图应用查看位置?',
success: (res) => {
if (res.confirm) {
// 在非H5环境中,可以尝试使用系统的地图应用
plus.runtime.openURL(url);
}
},
});
// uni.showModal({
// title: '查看地图',
// content: '是否打开外部地图应用查看位置?',
// success: (res) => {
// if (res.confirm) {
// // 在非H5环境中,可以尝试使用系统的地图应用
// plus.runtime.openURL(url);
// }
// },
// });
// #endif
},
@@ -2890,9 +2897,15 @@ export default {
try {
this.buttonLoading = true;
// 表单验证
const valid = await this.validateForm();
if (!valid) return;
// 使用 uview2 官方表单验证
try {
await this.$refs.formRef.validate();
uni.$u.toast('表单校验通过');
} catch (errors) {
uni.$u.toast('请检查表单填写是否正确');
console.log('表单校验失败:', errors);
return;
}
// 业务校验
if (!this.validateLeaveRequest()) return;
@@ -2935,11 +2948,14 @@ export default {
icon: 'success',
duration: 1500,
});
// 延迟跳转,确保 Toast 能够显示,并通知上一页刷新
// 延迟跳转,确保 Toast 能够显示,并通知目标页面刷新
setTimeout(() => {
// 发送事件通知上一页刷新数据
// 发送事件通知目标页面刷新数据
uni.$emit('refreshLeaveList');
uni.navigateBack();
// 跳转到请假列表页面
uni.navigateTo({
url: '/pages/xg/xsjcxx/xsqj/leave/index',
});
}, 1600);
} else {
console.log('response', response);
@@ -3034,7 +3050,24 @@ export default {
return false;
}
// 校验是否可以提前请假
// 1. 校验是否需要上传地理位置
if (leaveType.needLocationOnApply === '1') {
if (!this.form.leaveLocation) {
uni.showToast({ title: '该请假类型需要上传地理位置', icon: 'none' });
return false;
}
}
// 2. 校验和设置销假状态
if (leaveType.needCancelForNonLeave === '0' && this.form.isLeaveSchool === '0') {
// 非离校请假且该类型不需要销假时,自动设置为不需要销假
this.form.needCancel = '0';
} else {
// 其他情况都需要销假
this.form.needCancel = '1';
}
// 3. 校验是否可以提前请假
if (leaveType.canApplyInAdvance === '0') {
const now = new Date();
now.setHours(23, 59, 59, 999);
@@ -3045,7 +3078,7 @@ export default {
}
}
// 校验最大申请时长
// 4. 校验最大申请时长
if (leaveType.maxApplyDuration && leaveType.maxApplyDuration > 0) {
const start = new Date(this.form.startTime);
const end = new Date(this.form.endTime);
@@ -3193,15 +3226,13 @@ export default {
// 延迟执行后续操作,确保用户看到成功提示
setTimeout(() => {
// 发送事件通知上一页刷新数据
// 发送事件通知请假列表页面刷新数据
uni.$emit('refreshLeaveList');
// 如果是编辑模式,刷新当前页面数据;否则返回上一页
if (this.routeParams.id) {
this.getLeaveDetail(this.routeParams.id);
} else {
uni.navigateBack();
}
// 无论是编辑模式还是新增模式,都跳转到请假列表页面
uni.navigateTo({
url: '/pages/xg/xsjcxx/xsqj/leave/index',
});
}, 1600);
},
},