gaoluyang
2025-12-29 bbdd646b82cb8c84079598b7200b1102fd247b28
src/pages/management/mould/equipmentRequisitionDialog.vue
@@ -54,22 +54,6 @@
            </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
@@ -95,12 +79,6 @@
              />
              <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>
          
@@ -141,8 +119,8 @@
      </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>
    
@@ -348,13 +326,18 @@
// 领用数量变化
const onUsageQuantityChange = (value) => {
  // 确保值是数字类型
  form.value.usageQuantity = Number(value) || 1;
  // 触发验证
  nextTick(() => {
    if (formRef.value) {
      formRef.value.validateField('usageQuantity');
    }
  });
  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');
      }
    });
  }
};
// 获取设备列表
@@ -458,6 +441,7 @@
const isEdit = computed(() => !!props.formData?.id);
const formRef = ref();
const isSubmitting = ref(false);
// 日期选择器
const showDatePickerVisible = ref(false);
@@ -633,14 +617,15 @@
        { 
          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();
@@ -657,6 +642,7 @@
function handleClose() {
  emit("update:modelValue", false);
  isSubmitting.value = false;
}
// 通用防抖函数
@@ -674,10 +660,45 @@
// 防抖后的提交方法
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 };
    // 归还模式处理
@@ -707,10 +728,12 @@
          
          if (!result) {
            showToast('已取消归还操作', 'info');
            isSubmitting.value = false;
            return;
          }
        } catch (error) {
          showToast('已取消归还操作', 'info');
          isSubmitting.value = false;
          return;
        }
@@ -741,21 +764,25 @@
      };
    }
    try {
      let { code, data } = await addOrEditUsageRecord(submitData);
      if (code !== 200) {
        showToast(data.msg || "操作失败", 'error');
        return;
      }
      if (code == 200 && data == 1) {
        emit("submit", submitData);
      }
      handleClose();
    } catch (error) {
      console.error("提交失败:", error);
      showToast("操作失败,请稍后再试", 'error');
    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>