zlwu hai 1 ano
pai
achega
062b545bd4

+ 18 - 9
mobile/src/pages/xg/xsjcxx/xsqj/leave/index.vue

@@ -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;

+ 74 - 43
mobile/src/pages/xg/xsjcxx/xsqj/leaveEdit/index.vue

@@ -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);
         },
     },