buhuazhen
5 天以前 f2e14fbd69737ca7717835fcc4e02c0f01de10d4
src/pages/outbound/materialOutbound.vue
@@ -7,14 +7,14 @@
            type="icon"
            icon="scan"
            color="#0d867f"
            @click="openScan"
            style="color: #0d867f"
            @click="openScan"
          ></wd-button>
        </template>
      </CardTitle>
      <!-- 当前物料信息 -->
      <view class="material-info" v-if="currentMaterial">
      <view v-if="currentMaterial" class="material-info">
        <wd-card custom-class="info-card">
          <view class="info-compact">
            <view class="icon_box">
@@ -55,26 +55,28 @@
              <text class="outbound_item_label">生产批次号:</text>
              <text class="outbound_item_value">{{ item.monofilamentNumber || "-" }}</text>
            </view>
            <view class="outbound_item_row">
              <text class="outbound_item_label">规格型号:</text>
              <text class="outbound_item_value">{{ item.model || "-" }}</text>
            </view>
            <view class="outbound_item_row">
              <text class="outbound_item_label">重量:</text>
              <text class="outbound_item_value">{{ item.weight || "-" }} kg</text>
            </view>
            <view class="outbound_item_row">
              <text class="outbound_item_label">厂家:</text>
              <text class="outbound_item_value">{{ item.clienteleName || "-" }}</text>
            </view>
            <view class="outbound_item_row">
              <text class="outbound_item_label">段长:</text>
              <text class="outbound_item_value">{{ item.actuallyLength || "-" }} M</text>
            </view>
            <view class="outbound_item_row">
              <text class="outbound_item_label">生产日期:</text>
              <text class="outbound_item_value">{{ item.productionDate || "-" }}</text>
            </view>
            <template v-if="!item.isMesMissing">
              <view class="outbound_item_row">
                <text class="outbound_item_label">规格型号:</text>
                <text class="outbound_item_value">{{ item.model || "-" }}</text>
              </view>
              <view class="outbound_item_row">
                <text class="outbound_item_label">重量:</text>
                <text class="outbound_item_value">{{ item.weight || "-" }} kg</text>
              </view>
              <view class="outbound_item_row">
                <text class="outbound_item_label">厂家:</text>
                <text class="outbound_item_value">{{ item.clienteleName || "-" }}</text>
              </view>
              <view class="outbound_item_row">
                <text class="outbound_item_label">段长:</text>
                <text class="outbound_item_value">{{ item.actuallyLength || "-" }} M</text>
              </view>
              <view class="outbound_item_row">
                <text class="outbound_item_label">生产日期:</text>
                <text class="outbound_item_value">{{ item.productionDate || "-" }}</text>
              </view>
            </template>
          </view>
        </view>
        <view class="outbound_item_action">
@@ -91,7 +93,7 @@
    <!-- 底部按钮 -->
    <view v-if="goodsList.length > 0" class="outbound_footer">
      <wd-button block @click="handleOutbound" style="background: #0d867f">
      <wd-button block style="background: #0d867f" @click="handleOutbound">
        <text class="text-[#fff]">出库</text>
      </wd-button>
    </view>
@@ -124,6 +126,19 @@
// 格式化时间
const formatTime = (date: Date) => {
  return dayjs(date).format("YYYY-MM-DD HH:mm:ss");
};
const handleMonofilamentNumber = (value?: string) => {
  if (!value) return "";
  if (!value.includes("-")) {
    if (value.length < 3) {
      toast.error("单丝编号长度不足,无法添加 '-'");
      return "";
    }
    const insertIndex = value.length - 3;
    return `${value.slice(0, insertIndex)}-${value.slice(insertIndex)}`;
  }
  return value;
};
// 直接扫码
@@ -161,49 +176,62 @@
    let tagData: any = null;
    let outPutId: string | number | undefined;
    let monofilamentNumber: string | undefined;
    let needContractCheck = false; // 是否需要进行合同号校验(只对绞线)
    if (isJsonCode) {
      // ===== 绞线等原有二维码逻辑(JSON) =====
      let scanData;
      try {
        scanData = JSON.parse(scanText);
      } catch (e) {
      } catch {
        toast.error("二维码格式错误");
        return;
      }
      outPutId = scanData.id;
      monofilamentNumber = scanData.monofilamentNumber;
      if (!outPutId) {
        toast.error("二维码格式错误,缺少id信息");
      if (outPutId) {
        //TODO兼容目前已打印的二维码
        // 有 id:按 id 查重并调 getTagByIdAll(返回数组)
        const exists = goodsList.value.some((item) => {
          const itemId = item.id;
          return itemId && itemId === outPutId && itemId !== "-";
        });
        if (exists) {
          toast.error("该条码已存在,请勿重复扫码");
          return;
        }
        const { data } = await OutboundApi.getTagByIdAll({
          outPutId: outPutId,
        });
        tagData = data;
        if (!tagData) {
          toast.error("未查询到条码信息");
          return;
        }
      } else if (monofilamentNumber) {
        // 有 monofilamentNumber:按单丝号查重并调 getTagByMonofilamentNumber(返回对象)
        const exists = goodsList.value.some((item) => {
          const itemMono = item.monofilamentNumber;
          return itemMono && itemMono === monofilamentNumber && itemMono !== "-";
        });
        if (exists) {
          toast.error("该条码已存在,请勿重复扫码");
          return;
        }
        const { data } = await OutboundApi.getTagByMonofilamentNumber({
          monofilamentNumber,
        });
        if (!data || (Array.isArray(data) && !data.length)) {
          toast.error("未查询到条码信息");
          return;
        }
        tagData = Array.isArray(data) ? data[0] : data;
        outPutId = tagData?.id || monofilamentNumber;
      } else {
        toast.error("二维码格式错误,缺少id或单丝编号信息");
        return;
      }
      // 检查是否已存在(根据 id 判断)
      const exists = goodsList.value.some((item) => {
        const itemId = item.id;
        return itemId && itemId === outPutId && itemId !== "-";
      });
      if (exists) {
        toast.error("该条码已存在,请勿重复扫码");
        return;
      }
      // 调用接口获取绞线/拉丝详细信息(含出库状态)
      const { data } = await OutboundApi.getTagByIdAll({
        outPutId: outPutId,
      });
      const list = data || [];
      if (!list.length) {
        toast.error("未查询到条码信息");
        return;
      }
      tagData = list[0];
      needContractCheck = true; // 只有绞线需要做合同号校验
    } else {
      // ===== 单丝拉丝二维码逻辑(纯字符串) =====
      // 示例:ZD7z30202616101201#[@]01,Φ5.6,-,750826011001001,600.6
@@ -227,14 +255,56 @@
        return;
      }
      // 调用拉丝接口:GET /mes/app/getTagByLsMonofilamentNumber?monofilamentNumber=xxxx
      const { data } = await OutboundApi.getTagByLsMonofilamentNumber({
        monofilamentNumber,
      });
      // 调用拉丝接口:GET /mes/app/getTagByMonofilamentNumber?monofilamentNumber=xxxx
      let data;
      try {
        const response = await OutboundApi.getTagByMonofilamentNumber({
          monofilamentNumber,
        });
        data = response.data;
      } catch {
        data = null;
      }
      const list = Array.isArray(data) ? data : data ? [data] : [];
      if (!list.length) {
        toast.error("未查询到条码信息");
        const formattedMonofilamentNumber = handleMonofilamentNumber(monofilamentNumber);
        if (!formattedMonofilamentNumber) {
          return;
        }
        // 检查是否已存在(针对手动处理后的单丝号进行去重)
        const isDuplicate = goodsList.value.some((item) => {
          const itemMono = item.monofilamentNumber;
          return itemMono && itemMono === formattedMonofilamentNumber;
        });
        if (isDuplicate) {
          toast.error(`条码"${formattedMonofilamentNumber}"已存在,请勿重复扫码`);
          return;
        }
        const newItem = {
          id: monofilamentNumber || "-",
          contractNo: "未在mes中生产",
          monofilamentNumber: formattedMonofilamentNumber,
          model: "-",
          weight: "-",
          clienteleName: "-",
          actuallyLength: "-",
          productionDate: "-",
          type: "拉丝",
          devicemodel: "",
          state: "",
          projectId: "",
          productuser: "",
          rawData: null,
          scanCode: scanText,
          scanTime: formatTime(new Date()),
          isMesMissing: true,
        };
        goodsList.value.push(newItem);
        toast.success("扫码成功");
        return;
      }
@@ -248,15 +318,15 @@
      toast.error("该条码已出库,无法重复出库");
      return;
    }
    // 合同号校验:只对绞线(JSON 场景)进行校验
    if (needContractCheck) {
      const scannedContractNo = tagData?.contractno || "";
      if (scannedContractNo && vsrccode.value && scannedContractNo !== vsrccode.value) {
        toast.error(`合同号"${scannedContractNo}"与当前发货单为"${vsrccode.value}"不匹配`);
        return;
      }
    }
    //
    // // 合同号校验:只对绞线(JSON 场景)进行校验
    // if (needContractCheck) {
    //   const scannedContractNo = tagData?.contractno || "";
    //   if (scannedContractNo && vsrccode.value && scannedContractNo !== vsrccode.value) {
    //     toast.error(`合同号"${scannedContractNo}"与当前发货单为"${vsrccode.value}"不匹配`);
    //     return;
    //   }
    // }
    // 提取数据字段(根据接口返回的数据结构)
    const parsedData = {
@@ -283,6 +353,29 @@
      rawData: tagData,
      scanCode: scanText,
    };
    // 再次检查是否已存在(针对手动处理后的单丝号进行去重)
    const isDuplicate = goodsList.value.some((item) => {
      const itemMono = item.monofilamentNumber;
      const currentMono = parsedData.monofilamentNumber;
      return itemMono && itemMono === currentMono && itemMono !== "-";
    });
    if (isDuplicate) {
      toast.error(`条码"${parsedData.monofilamentNumber}"已存在,请勿重复扫码`);
      return;
    }
    // 检查类型是否一致
    if (goodsList.value.length > 0) {
      const firstItemType = goodsList.value[0].type;
      const currentType = parsedData.type;
      // 如果类型不一致,提示错误
      if (firstItemType && currentType && firstItemType !== currentType) {
        toast.error(`目前只能进行${firstItemType}出库`);
        return;
      }
    }
    // 添加到列表
    const newItem = {
@@ -370,6 +463,7 @@
        const requestData = goodsList.value.map((item) => ({
          outPutId: item.id,
          projectId: item.projectId || "",
          monofilamentNumber: item.monofilamentNumber || "",
        }));
        // 按出库单明细构建请求体
@@ -378,6 +472,7 @@
          cdeliveryid: currentMaterial.value?.cdeliveryid || "",
          cdeliverybid: currentMaterial.value?.cdeliverybid || "",
          materialcode: currentMaterial.value?.materialcode || "",
          vfree4: currentMaterial.value?.vfree4 || "",
        };
        try {
@@ -424,7 +519,7 @@
  try {
    // 如果是编码过的(包含 %),decode 一次;否则直接返回
    return val.includes("%") ? decodeURIComponent(val) : val;
  } catch (e) {
  } catch {
    return val;
  }
};
@@ -438,6 +533,7 @@
    cdeliveryid: safeDecode(options.cdeliveryid || ""),
    cdeliverybid: safeDecode(options.cdeliverybid || ""),
    materialcode: safeDecode(options.materialcode || ""),
    vfree4: safeDecode(options.vfree4 || ""),
  };
  vsrccode.value = options.vsrccode || "";
});