| | |
| | | </template> |
| | | </u-form-item> |
| | | |
| | | <u-form-item v-if="isReturnMode" label="已使用数量" border-bottom> |
| | | <u-input |
| | | :value="formData.usageQuantity" |
| | | disabled |
| | | placeholder="已使用数量" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <u-form-item v-if="isReturnMode" label="已归还数量" border-bottom> |
| | | <u-input |
| | | :value="formData.totalReturnNo || 0" |
| | | disabled |
| | | placeholder="已归还数量" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <u-form-item v-if="!isReturnMode && formData.status !== 2" label="领用数量" prop="usageQuantity" border-bottom required> |
| | | <view class="number-box-wrapper"> |
| | | <u-number-box |
| | |
| | | /> |
| | | <text class="info-text" v-if="remainingReturnQuantity > 0">(最多{{ remainingReturnQuantity }}台)</text> |
| | | <text class="info-text" v-else>(已全部归还)</text> |
| | | </view> |
| | | <view |
| | | v-if="remainingReturnQuantity > 0 && form.returnQuantity === remainingReturnQuantity" |
| | | class="tip-text" |
| | | > |
| | | 💡 提示:本次归还后将完成全部归还 |
| | | </view> |
| | | </u-form-item> |
| | | |
| | |
| | | </scroll-view> |
| | | |
| | | <view class="popup-footer"> |
| | | <u-button @click="handleClose" :customStyle="{ marginRight: '10px', flex: 1 }">取消</u-button> |
| | | <u-button type="primary" @click="debouncedSubmit" v-if="!isViewMode" :customStyle="{ flex: 1 }">确定</u-button> |
| | | <u-button @click="handleClose" :customStyle="{ marginRight: '10px', flex: 1 }" :disabled="isSubmitting">取消</u-button> |
| | | <u-button type="primary" @click="debouncedSubmit" v-if="!isViewMode" :customStyle="{ flex: 1 }" :loading="isSubmitting">确定</u-button> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | // 领用数量变化 |
| | | const onUsageQuantityChange = (value) => { |
| | | // 确保值是数字类型 |
| | | form.value.usageQuantity = Number(value) || 1; |
| | | // 触发验证 |
| | | const numValue = Number(value) || 1; |
| | | form.value.usageQuantity = numValue; |
| | | // 只有在值有效时才触发验证,避免默认值1触发错误提示 |
| | | if (numValue >= 1) { |
| | | nextTick(() => { |
| | | if (formRef.value) { |
| | | // 清除之前的错误,然后重新验证 |
| | | formRef.value.clearValidate('usageQuantity'); |
| | | formRef.value.validateField('usageQuantity'); |
| | | } |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | // 获取设备列表 |
| | |
| | | |
| | | const isEdit = computed(() => !!props.formData?.id); |
| | | const formRef = ref(); |
| | | const isSubmitting = ref(false); |
| | | |
| | | // 日期选择器 |
| | | const showDatePickerVisible = ref(false); |
| | |
| | | { |
| | | required: true, |
| | | message: "请输入领用数量", |
| | | trigger: "change", |
| | | trigger: "blur", |
| | | validator: (rule, value, callback) => { |
| | | const numValue = Number(value) || 0; |
| | | if (!value && value !== 0) { |
| | | // 如果值为空或未定义,才报错 |
| | | if (value === null || value === undefined || value === '') { |
| | | callback(new Error("请输入领用数量")); |
| | | } else if (numValue < 1) { |
| | | callback(new Error("至少领用1台")); |
| | | } else if (maxQuantity.value !== null && numValue > maxQuantity.value) { |
| | | } else if (maxQuantity.value !== null && maxQuantity.value > 0 && numValue > maxQuantity.value) { |
| | | callback(new Error("领用数量不能大于设备数量")); |
| | | } else { |
| | | callback(); |
| | |
| | | |
| | | function handleClose() { |
| | | emit("update:modelValue", false); |
| | | isSubmitting.value = false; |
| | | } |
| | | |
| | | // 通用防抖函数 |
| | |
| | | // 防抖后的提交方法 |
| | | const debouncedSubmit = debounce(handleSubmit, 800); |
| | | |
| | | function handleSubmit() { |
| | | formRef.value.validate(async (valid) => { |
| | | if (!valid) return; |
| | | async function handleSubmit() { |
| | | console.log('handleSubmit 被调用'); |
| | | console.log('formRef.value:', formRef.value); |
| | | console.log('当前表单数据:', JSON.stringify(form.value)); |
| | | |
| | | if (isSubmitting.value) { |
| | | console.log('正在提交中,忽略重复点击'); |
| | | return; |
| | | } |
| | | |
| | | if (!formRef.value) { |
| | | console.error('formRef 不存在'); |
| | | showToast('表单引用不存在,请刷新页面重试', 'error'); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | console.log('开始验证表单...'); |
| | | const valid = await formRef.value.validate().catch((errors) => { |
| | | console.log('表单验证失败,错误信息:', errors); |
| | | // 如果验证失败,errors 可能是错误数组或 false |
| | | if (errors && Array.isArray(errors) && errors.length > 0) { |
| | | const firstError = errors[0]; |
| | | showToast(firstError.message || '请完善表单信息', 'error'); |
| | | } else { |
| | | showToast('请完善表单信息', 'error'); |
| | | } |
| | | return false; |
| | | }); |
| | | console.log('表单验证结果:', valid); |
| | | |
| | | if (!valid) { |
| | | console.log('表单验证失败,停止提交'); |
| | | return; |
| | | } |
| | | |
| | | console.log('表单验证通过,开始提交'); |
| | | isSubmitting.value = true; |
| | | |
| | | let submitData = { ...form.value }; |
| | | |
| | |
| | | |
| | | if (!result) { |
| | | showToast('已取消归还操作', 'info'); |
| | | isSubmitting.value = false; |
| | | return; |
| | | } |
| | | } catch (error) { |
| | | showToast('已取消归还操作', 'info'); |
| | | isSubmitting.value = false; |
| | | return; |
| | | } |
| | | |
| | |
| | | }; |
| | | } |
| | | |
| | | try { |
| | | let { code, data } = await addOrEditUsageRecord(submitData); |
| | | if (code !== 200) { |
| | | showToast(data.msg || "操作失败", 'error'); |
| | | isSubmitting.value = false; |
| | | return; |
| | | } |
| | | if (code == 200 && data == 1) { |
| | | showToast('操作成功', 'success'); |
| | | emit("submit", submitData); |
| | | } |
| | | handleClose(); |
| | | } else { |
| | | showToast(data.msg || "操作失败", 'error'); |
| | | isSubmitting.value = false; |
| | | } |
| | | } catch (error) { |
| | | console.error("提交失败:", error); |
| | | showToast("操作失败,请稍后再试", 'error'); |
| | | isSubmitting.value = false; |
| | | } |
| | | }); |
| | | } |
| | | </script> |
| | | |