zhangwencui
2026-07-09 9f1324fb9e73e5b53ac67542227e63cdc0b505ba
src/pages/works.vue
@@ -299,6 +299,8 @@
        </up-grid>
      </view>
    </view>
    <PdaScan :active="pdaScanActive"
             eventName="scan_work_report" />
    <DownloadProgressMask />
  </view>
</template>
@@ -308,6 +310,7 @@
  import { userLoginFacotryList } from "@/api/login";
  import { getProductWorkOrderById } from "@/api/productionManagement/productionReporting";
  import DownloadProgressMask from "@/components/DownloadProgressMask.vue";
  import PdaScan from "@/components/pda-scan/pda-scan.vue";
  import modal from "@/plugins/modal";
  import useUserStore from "@/store/modules/user";
@@ -315,6 +318,8 @@
  const show = ref(false);
  const factoryList = ref([]);
  const factoryListTem = ref([]);
  const pdaScanActive = ref(false);
  let scanWorkReportTimer = null;
  const iconStyle = {
    fontSize: "1.125rem",
    color: "#2979ff",
@@ -1072,78 +1077,121 @@
      });
  }
  const getcode = async () => {
    uni.scanCode({
      success: async res => {
        // 解析二维码内容
        const scanResult = res.result;
        let orderRow = "";
    const canUsePdaBroadcast = () => {
      try {
        if (typeof plus === "undefined") return false;
        if (plus?.os?.name !== "Android") return false;
        if (!plus?.android) return false;
        // 判断扫描结果是否为纯数字(id)
        const isNumericId = /^\d+$/.test(scanResult.trim());
        const sys = uni.getSystemInfoSync?.() || {};
        const brand = String(sys?.brand || "").toUpperCase();
        const model = String(sys?.model || "").toUpperCase();
        if (isNumericId) {
          // 如果是纯数字,根据 id 获取工单数据
          const workOrderId = scanResult.trim();
          modal.loading("正在获取工单信息...");
          try {
            const workRes = await getProductWorkOrderById({ id: workOrderId });
            modal.closeLoading();
        return (
          brand.includes("DROI") ||
          model.includes("MV-IDP5204") ||
          model.includes("IDP")
        );
      } catch (e) {
        return false;
      }
    };
            console.log("工单查询结果:", workRes);
    const handleWorkReportScan = async scanResultRaw => {
      const scanResult = scanResultRaw == null ? "" : String(scanResultRaw);
      let orderRow = "";
            if (workRes.code === 200 && workRes.data) {
              // 新接口返回的是单个对象,不是数组
              const workData = workRes.data;
              console.log("工单数据:", workData);
      const isNumericId = /^\d+$/.test(scanResult.trim());
              if (workData.endOrder === true) {
                modal.msgError("该订单已结束,无法报工");
                return;
              }
      if (isNumericId) {
        const workOrderId = scanResult.trim();
        modal.loading("正在获取工单信息...");
        try {
          const workRes = await getProductWorkOrderById({ id: workOrderId });
          modal.closeLoading();
              orderRow = JSON.stringify(workData);
          console.log("工单查询结果:", workRes);
              console.log("构造的orderRow:", orderRow);
            } else {
              modal.msgError("未找到对应的工单信息");
          if (workRes.code === 200 && workRes.data) {
            const workData = workRes.data;
            console.log("工单数据:", workData);
            if (workData.endOrder === true) {
              modal.msgError("该订单已结束,无法报工");
              return;
            }
          } catch (error) {
            modal.closeLoading();
            console.error("获取工单信息失败:", error);
            modal.msgError("获取工单信息失败: " + (error.message || "未知错误"));
            return;
          }
        } else {
          // 如果不是纯数字,尝试从扫码结果中提取orderRow参数
          try {
            // 处理混合格式: http://...?orderRow={...}
            const orderRowStart = scanResult.indexOf("orderRow={");
            if (orderRowStart !== -1) {
              // 提取从orderRow={开始的JSON内容
              const jsonPart = scanResult.substring(orderRowStart + 9); // 9是"orderRow=".length
              orderRow = jsonPart;
            } else {
              // 如果直接是JSON字符串,尝试解析
              orderRow = scanResult;
            }
          } catch (e) {
            console.error(e, "解析失败====????=====");
            orderRow = "";
          }
          // 验证是否为有效的JSON
          try {
            JSON.parse(orderRow);
          } catch (error) {
            modal.msgError("订单解析失败,请检查二维码格式");
            orderRow = JSON.stringify(workData);
            console.log("构造的orderRow:", orderRow);
          } else {
            modal.msgError("未找到对应的工单信息");
            return;
          }
        } catch (error) {
          modal.closeLoading();
          console.error("获取工单信息失败:", error);
          modal.msgError("获取工单信息失败: " + (error.message || "未知错误"));
          return;
        }
        // 扫码成功后跳转到生产报工页面,并传递orderRow参数
        uni.navigateTo({
          url: `/pages/productionManagement/productionReport/index?orderRow=${orderRow}`,
        });
      } else {
        try {
          const orderRowStart = scanResult.indexOf("orderRow={");
          if (orderRowStart !== -1) {
            const jsonPart = scanResult.substring(orderRowStart + 9);
            orderRow = jsonPart;
          } else {
            orderRow = scanResult;
          }
        } catch (e) {
          console.error(e, "解析失败====????=====");
          orderRow = "";
        }
        try {
          JSON.parse(orderRow);
        } catch (error) {
          modal.msgError("订单解析失败,请检查二维码格式");
          return;
        }
      }
      uni.navigateTo({
        url: `/pages/productionManagement/productionReport/index?orderRow=${orderRow}`,
      });
    };
    if (canUsePdaBroadcast()) {
      if (scanWorkReportTimer) {
        clearTimeout(scanWorkReportTimer);
        scanWorkReportTimer = null;
      }
      uni.$off("scan_work_report");
      uni.$on("scan_work_report", async data => {
        pdaScanActive.value = false;
        uni.$off("scan_work_report");
        if (scanWorkReportTimer) {
          clearTimeout(scanWorkReportTimer);
          scanWorkReportTimer = null;
        }
        await handleWorkReportScan(data?.code);
      });
      pdaScanActive.value = true;
      uni.showToast({
        title: "请使用PDA扫码",
        icon: "none",
      });
      scanWorkReportTimer = setTimeout(() => {
        pdaScanActive.value = false;
        uni.$off("scan_work_report");
        scanWorkReportTimer = null;
      }, 20000);
      return;
    }
    uni.scanCode({
      success: async res => {
        await handleWorkReportScan(res.result);
      },
      fail: err => {
        uni.showToast({