1
heshaofeng
2026-01-13 1866b69e8f67e382a0a75268d63e6418c8ae02e7
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/OrderStockTake.vue
@@ -61,6 +61,35 @@
            </el-input>
          </el-form-item>
          <!-- æ–°å¢žï¼šç«™å°é€‰æ‹©ä¸‹æ‹‰æ¡† -->
          <el-form-item
            label="回库站台:"
            name="station"
            :rules="[
              {
                required: true,
                message: '请选择回库站台',
                trigger: 'blur',
              },
            ]"
            class="form-item"
          >
            <el-select
              v-model="selectedStation"
              placeholder="请选择回库站台"
              :disabled="!formData.boxNo.trim() || loading"
              class="custom-input"
              :class="{ 'has-value': selectedStation }"
            >
              <el-option
                v-for="item in stations"
                :key="item.key || item.value"
                :label="item.label"
                :value="item.value"
              ></el-option>
            </el-select>
          </el-form-item>
          <!-- æ¡ç è¾“入框 -->
          <el-form-item
            label="盘点条码:"
@@ -130,13 +159,13 @@
          >
            <el-input
              v-model.number="formData.actualQuantity"
              placeholder="请输入实际盘点数量(大于0)"
              placeholder="请输入实际盘点数量"
              type="number"
              clearable
              @keydown.enter="handleStockTakeComplete"
              :disabled="!formData.stockQuantity || loading"
              class="custom-input"
              :class="{ 'has-value': formData.actualQuantity }"
              :class="{ 'has-value': formData.actualQuantity !== '' }"
            ></el-input>
          </el-form-item>
        </el-form>
@@ -147,7 +176,7 @@
            type="info"
            size="small"
            @click="handleBoxReturn"
            :disabled="!formData.boxNo.trim() || loading"
            :disabled="!formData.boxNo.trim() || !selectedStation || loading"
            class="return-btn"
          >
            <Return /> æ–™ç®±å›žåº“
@@ -156,13 +185,7 @@
            type="primary"
            size="small"
            @click="handleStockTakeComplete"
            :disabled="
              loading ||
              !formData.boxNo.trim() ||
              !formData.barcode.trim() ||
              !formData.stockQuantity ||
              !formData.actualQuantity
            "
            :disabled="isFormCompleteDisabled"
            class="complete-btn"
          >
            <Check /> ç›˜ç‚¹å®Œæˆ
@@ -188,6 +211,8 @@
import VolBox from "@/components/basic/VolBox.vue";
import http from "@/api/http";
// æ–°å¢žï¼šå¼•入站台管理工具(和示例代码保持一致)
import { stationManager, STATION_STORAGE_KEY } from "@/../src/uitils/stationManager";
// å“åº”式变量 - å•据号
const orderNo = ref("");
@@ -206,6 +231,13 @@
const loading = ref(false);
const formRef = ref(null);
// æ–°å¢žï¼šç«™å°ç›¸å…³å“åº”式数据(仿照示例代码)
const stations = ref([
  { label: "站台2", value: "2-1" },
  { label: "站台3", value: "3-1" },
]);
const selectedStation = ref(stationManager.getStation() || ""); // é»˜è®¤é€‰ä¸­ç¼“存的站台
// æ¨¡æ¿å¼•用
const boxNoInputRef = ref(null);
const barcodeInputRef = ref(null);
@@ -213,6 +245,20 @@
// æ£€æµ‹æ˜¯å¦ä¸ºç§»åŠ¨ç«¯
const isMobile = computed(() => {
  return window.innerWidth < 768;
});
// è®¡ç®—属性:盘点完成按钮是否禁用
const isFormCompleteDisabled = computed(() => {
  return (
    loading.value ||
    !formData.boxNo.trim() ||
    !formData.barcode.trim() ||
    !formData.stockQuantity ||
    formData.actualQuantity === "" ||
    formData.actualQuantity === null ||
    formData.actualQuantity === undefined ||
    Number(formData.actualQuantity) < 0 // å°äºŽ0时禁用,0是允许的
  );
});
// ç»„件挂载时聚焦到料箱号输入框
@@ -232,6 +278,8 @@
      formData.barcode = "";
      formData.stockQuantity = "";
      formData.actualQuantity = "";
      // æ–°å¢žï¼šæ–™ç®±å·æ¸…空时,重置站台选择
      selectedStation.value = stationManager.getStation() || "";
    }
  },
  { immediate: true }
@@ -257,6 +305,8 @@
  formData.barcode = "";
  formData.stockQuantity = "";
  formData.actualQuantity = "";
  // æ–°å¢žï¼šæ‰“开弹窗时重置站台选择(默认取缓存的站台)
  selectedStation.value = stationManager.getStation() || "";
  nextTick(() => {
    boxNoInputRef.value?.focus();
  });
@@ -292,15 +342,18 @@
  }
};
// å®žé™…盘点数量验证(优化:有值时验证合法性)
// å®žé™…盘点数量验证:允许0,但不允许小于0
const validateActualQuantity = (rule, value, callback) => {
  if (value === null || value === undefined) {
    callback(new Error("请输入实际盘点数量"));
  } else if (value <= 0) {
    callback(new Error("实际盘点数量必须大于0"));
  } else if (!Number.isInteger(value)) {
    callback(new Error("实际盘点数量必须是整数"));
  } else {
  // ç©ºå€¼ç”±required规则处理,这里只验证数值合法性
  if (value === null || value === undefined || value === "") {
    callback(); // ç©ºå€¼ä¸åœ¨è¿™é‡Œæç¤ºï¼Œäº¤ç»™required规则
  }
  // éªŒè¯æ•°å€¼æ˜¯å¦å°äºŽ0
  else if (value < 0) {
    callback(new Error("实际盘点数量不能小于0"));
  }
  // éªŒè¯é€šè¿‡ï¼ˆå…è®¸0)
  else {
    callback();
  }
};
@@ -429,6 +482,12 @@
  const valid = await formRef.value.validate();
  if (!valid) return;
  // é¢å¤–检查实际盘点数量是否小于0
  if (formData.actualQuantity < 0) {
    ElMessage.error("实际盘点数量不能小于0");
    return;
  }
  const { boxNo, barcode, actualQuantity, stockQuantity } = formData;
  const receiptNo = orderNo.value;
@@ -468,16 +527,21 @@
  }
};
// æ–™ç®±å›žåº“功能
// æ–™ç®±å›žåº“功能(核心修改:增加站台验证 + ä¼ å…¥sourceAddress参数)
const handleBoxReturn = async () => {
  const boxNo = formData.boxNo.trim();
  // æ–°å¢žï¼šéªŒè¯ç«™å°æ˜¯å¦é€‰æ‹©
  if (!boxNo) {
    ElMessage.warning("请先输入或扫描料箱号");
    return;
  }
  if (!selectedStation.value) {
    ElMessage.warning("请选择回库站台");
    return;
  }
  try {
    await ElMessageBox.confirm(`确定将料箱【${boxNo}】回库吗?`, "回库确认", {
    await ElMessageBox.confirm(`确定将料箱【${boxNo}】回库至【${selectedStation.value}】站台吗?`, "回库确认", {
      confirmButtonText: "确定",
      cancelButtonText: "取消",
      type: "info",
@@ -488,19 +552,21 @@
    loading.value = true;
    // æ–°å¢žï¼šæ‹¼æŽ¥sourceAddress参数(站台数据)到接口请求中
    const res = await http.post(
      `/api/TakeStockOrder/ReturnBox?boxNo=${encodeURIComponent(boxNo)}&orderNo=${encodeURIComponent(
        orderNo.value
      )}`,
      )}&sourceAddress=${encodeURIComponent(selectedStation.value)}`, // æ–°å¢žsourceAddress参数
      "料箱回库中..."
    );
    if (res.status) {
      ElMessage.success(`料箱【${boxNo}】回库成功!`);
      ElMessage.success(`料箱【${boxNo}】回库至【${selectedStation.value}】站台成功!`);
      formData.boxNo = "";
      formData.barcode = "";
      formData.stockQuantity = "";
      formData.actualQuantity = "";
      selectedStation.value = stationManager.getStation() || ""; // é‡ç½®ç«™å°é€‰æ‹©
      nextTick(() => {
        boxNoInputRef.value?.focus();
      });
@@ -588,13 +654,15 @@
}
/* æœ‰å€¼æ—¶éšè—å ä½ç¬¦ + ä¼˜åŒ–边框 */
.custom-input.has-value :deep(.el-input__inner) {
.custom-input.has-value :deep(.el-input__inner),
.custom-input.has-value :deep(.el-select__wrapper) {
  --el-input-placeholder-color: transparent; /* éšè—å ä½ç¬¦ */
  border-color: #8cc5ff; /* æµ…蓝边框,区分无值状态 */
  background-color: #ffffff;
}
.custom-input :deep(.el-input__inner) {
.custom-input :deep(.el-input__inner),
.custom-input :deep(.el-select__wrapper) {
  border-radius: 8px;
  border-color: #e5f0fa;
  transition: all 0.2s ease;
@@ -606,7 +674,8 @@
}
/* èšç„¦æ ·å¼ä¼˜åŒ– */
.custom-input :deep(.el-input__inner:focus) {
.custom-input :deep(.el-input__inner:focus),
.custom-input :deep(.el-select__wrapper:focus) {
  border-color: #409eff;
  box-shadow: 0 0 0 3px rgba(64, 158, 255, 0.1);
  background-color: #ffffff;
@@ -666,7 +735,8 @@
}
/* æœ‰å€¼æ—¶å³ä½¿éªŒè¯å¤±è´¥ï¼Œä¹Ÿä¸æ˜¾ç¤ºé”™è¯¯è¾¹æ¡† */
.custom-input.has-value :deep(.el-input__inner.el-input__inner--error) {
.custom-input.has-value :deep(.el-input__inner.el-input__inner--error),
.custom-input.has-value :deep(.el-select__wrapper.el-select__wrapper--error) {
  border-color: #8cc5ff;
  box-shadow: none;
}
@@ -807,22 +877,26 @@
}
/* å ä½ç¬¦æ ·å¼ - ç»Ÿä¸€é¢œè‰² */
.el-input__inner::-webkit-input-placeholder {
.el-input__inner::-webkit-input-placeholder,
.el-select__placeholder {
  color: #b3d8ff;
  font-size: 13px;
}
.el-input__inner::-moz-placeholder {
.el-input__inner::-moz-placeholder,
.el-select__placeholder {
  color: #b3d8ff;
  font-size: 13px;
}
.el-input__inner:-ms-input-placeholder {
.el-input__inner:-ms-input-placeholder,
.el-select__placeholder {
  color: #b3d8ff;
  font-size: 13px;
}
.el-input__inner::placeholder {
.el-input__inner::placeholder,
.el-select__placeholder {
  color: #b3d8ff;
  font-size: 13px;
}