From a87c52ba861983052139295de5f78e00ae174051 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期一, 12 一月 2026 16:51:22 +0800
Subject: [PATCH] 拉丝出库调整

---
 src/pages/outbound/material.vue |  367 +++++-----------------------------------------------
 1 files changed, 37 insertions(+), 330 deletions(-)

diff --git a/src/pages/outbound/material.vue b/src/pages/outbound/material.vue
index 01ac482..4487533 100644
--- a/src/pages/outbound/material.vue
+++ b/src/pages/outbound/material.vue
@@ -1,24 +1,15 @@
 <template>
   <view class="material-page">
     <view class="material-header">
-      <CardTitle title="鐗╂枡璇︽儏" :hideAction="false">
-        <template #action>
-          <wd-button
-            type="icon"
-            icon="scan"
-            color="#0d867f"
-            @click="openScan"
-            style="color: #0d867f"
-          ></wd-button>
-        </template>
-      </CardTitle>
+      <CardTitle title="鐗╂枡璇︽儏" :hideAction="false" />
 
-      <!-- 鐗╂枡淇℃伅 -->
+      <!-- 鐗╂枡淇℃伅鍒楄〃锛岀偣鍑昏繘鍏ュ搴旂墿鏂欑殑鍑哄簱椤甸潰 -->
       <view class="material-info">
         <wd-card
           v-for="(item, index) in materialList"
           :key="item.materialcode || index"
           custom-class="info-card"
+          @click="toMaterialOutbound(item)"
         >
           <wd-row class="info-row">
             <wd-col :span="24">
@@ -53,7 +44,7 @@
                   <wd-icon name="folder" color="#0D867F"></wd-icon>
                 </view>
                 <text class="text-[#646874] mx-2">
-                  宸插彂璐ф暟閲�:
+                  寰呭彂璐ф暟閲�:
                   <text class="text-[#252525]">{{ item.shippedQuantity || 0 }}</text>
                 </text>
               </view>
@@ -62,94 +53,49 @@
         </wd-card>
       </view>
     </view>
-
-    <!-- 璐х墿鍒楄〃 -->
-    <view class="list_content">
-      <view v-if="goodsList.length === 0" class="empty_tip">
-        <view class="empty_text">鏆傛棤璐х墿鏁版嵁</view>
-      </view>
-      <view v-for="(item, index) in goodsList" :key="index" class="outbound_item">
-        <view class="outbound_item_left">
-          <view class="outbound_item_content">
-            <view class="outbound_item_row">
-              <text class="outbound_item_label">鍚堝悓鍙凤細</text>
-              <text class="outbound_item_value">{{ item.contractNo || "-" }}</text>
-            </view>
-            <view class="outbound_item_row">
-              <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>
-          </view>
-        </view>
-        <view class="outbound_item_action">
-          <wd-button
-            type="icon"
-            icon="delete"
-            size="small"
-            custom-class="delete-btn"
-            @click.stop="removeGoodsItem(index)"
-          ></wd-button>
-        </view>
-      </view>
-    </view>
-
-    <!-- 搴曢儴鎸夐挳 -->
-    <view v-if="goodsList.length > 0" class="outbound_footer">
-      <wd-button block @click="handleOutbound" style="background: #0d867f">
-        <text class="text-[#fff]">鍑哄簱</text>
-      </wd-button>
-    </view>
-
-    <Scan ref="scanRef" emitName="scanMaterial" />
-    <wd-toast />
   </view>
 </template>
 
 <script setup lang="ts">
-import { ref, onMounted, onUnmounted } from "vue";
+import { ref } from "vue";
 import { onLoad } from "@dcloudio/uni-app";
 // @ts-ignore
 import CardTitle from "@/components/card-title/index.vue";
-// @ts-ignore
-import Scan from "@/components/scan/index.vue";
-import { useToast, dayjs } from "wot-design-uni";
+import { useToast } from "wot-design-uni";
 import OutboundApi from "@/api/product/outbound";
 
 const toast = useToast();
-const scanRef = ref();
 const materialId = ref<string>("");
 const vbillcode = ref<string>("");
-const vsrccode = ref<string>("");
 
 // 鐗╂枡淇℃伅鍒楄〃
 const materialList = ref<any[]>([]);
 
-// 璐х墿鍒楄〃
-const goodsList = ref<any[]>([]);
+// 瀹夊叏瑙g爜锛堝吋瀹瑰悗绔凡缂栫爜鎴栨湭缂栫爜鐨勬儏鍐碉級
+const safeDecode = (val: any) => {
+  if (typeof val !== "string") return val || "";
+  try {
+    return val.includes("%") ? decodeURIComponent(val) : val;
+  } catch (e) {
+    return val;
+  }
+};
 
-// 鏍煎紡鍖栨椂闂�
-const formatTime = (date: Date) => {
-  return dayjs(date).format("YYYY-MM-DD HH:mm:ss");
+// 鐐瑰嚮鏌愪釜鐗╂枡锛岃烦杞埌鍗曠嫭鐨勫嚭搴撻〉闈�
+const toMaterialOutbound = (item: any) => {
+  const query = [
+    `materialname=${encodeURIComponent(item.materialname || "")}`,
+    `materialspec=${encodeURIComponent(item.materialspec || "")}`,
+    `shippedQuantity=${item.shippedQuantity || 0}`,
+    `vsrccode=${item.vsrccode || ""}`,
+    `cdeliveryid=${encodeURIComponent(item.cdeliveryid || "")}`,
+    `cdeliverybid=${encodeURIComponent(item.cdeliverybid || "")}`,
+    `materialcode=${encodeURIComponent(item.materialcode || "")}`,
+  ].join("&");
+
+  uni.navigateTo({
+    url: `/pages/outbound/materialOutbound?${query}`,
+  });
 };
 
 // 鑾峰彇鐗╂枡璇︽儏
@@ -172,15 +118,15 @@
     uni.hideLoading();
 
     if (code === 200 && data) {
-      // 灏嗘帴鍙h繑鍥炵殑鏁版嵁鏄犲皠鍒� materialList
+      // 灏嗘帴鍙h繑鍥炵殑鏁版嵁鏄犲皠鍒� materialList锛屽苟瀵瑰彲鑳借 URL 缂栫爜鐨勫瓧娈靛仛涓�娆″畨鍏ㄨВ鐮�
       materialList.value = data.map((item: any) => ({
-        materialcode: item.materialcode,
-        materialname: item.materialname || "-",
-        materialspec: item.materialspec || "-",
+        materialcode: safeDecode(item.materialcode),
+        materialname: safeDecode(item.materialname || "-"),
+        materialspec: safeDecode(item.materialspec || "-"),
         shippedQuantity: item.nnum || 0,
-        cdeliveryid: item.cdeliveryid,
-        cdeliverybid: item.cdeliverybid,
-        vsrccode: item.vsrccode,
+        cdeliveryid: safeDecode(item.cdeliveryid),
+        cdeliverybid: safeDecode(item.cdeliverybid),
+        vsrccode: safeDecode(item.vsrccode),
       }));
     } else {
       toast.error(msg || "鑾峰彇鐗╂枡璇︽儏澶辫触");
@@ -194,249 +140,10 @@
   }
 };
 
-// 鐩存帴鎵爜
-const openScan = () => {
-  scanRef.value?.triggerScan();
-};
-
-// 鎵爜鍥炶皟
-const getScanCode = async (code: any) => {
-  try {
-    // 濡傛灉 code 鏄璞′笖鏈� code 瀛楁锛屼娇鐢� code.code锛涘惁鍒欑洿鎺ヤ娇鐢� code
-    let scanCode = code.code || code;
-
-    // 濡傛灉 scanCode 鏄璞★紝灏濊瘯鑾峰彇鍏� code 瀛楁
-    if (typeof scanCode === "object" && scanCode.code) {
-      scanCode = scanCode.code;
-    }
-
-    // 濡傛灉 scanCode 鏄瓧绗︿覆锛岀洿鎺ヤ娇鐢紱濡傛灉鏄璞★紝杞负瀛楃涓�
-    if (typeof scanCode !== "string") {
-      scanCode = JSON.stringify(scanCode);
-    }
-
-    if (!scanCode) {
-      toast.error("鎵爜鍐呭涓虹┖");
-      return;
-    }
-
-    // 瑙f瀽鎵爜鏁版嵁锛岀幇鍦ㄤ簩缁寸爜鍙寘鍚玦d
-    let scanData;
-    try {
-      scanData = JSON.parse(scanCode);
-    } catch (e) {
-      toast.error("浜岀淮鐮佹牸寮忛敊璇�");
-      return;
-    }
-
-    const outPutId = scanData.id;
-
-    if (!outPutId) {
-      toast.error("浜岀淮鐮佹牸寮忛敊璇紝缂哄皯id淇℃伅");
-      return;
-    }
-
-    // 妫�鏌ユ槸鍚﹀凡瀛樺湪锛堟牴鎹甶d鍒ゆ柇锛�
-    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;
-    }
-
-    const tagData = list[0];
-
-    // 宸插嚭搴撴牎楠�
-    if (tagData?.state === "宸插嚭搴�") {
-      toast.error("璇ユ潯鐮佸凡鍑哄簱锛屾棤娉曢噸澶嶅嚭搴�");
-      return;
-    }
-
-    // 鍚堝悓鍙锋牎楠岋細妫�鏌ユ壂鐮佺殑鍚堝悓鍙锋槸鍚︾瓑浜庡彂璐у崟鐨剉srccode
-    const scannedContractNo = tagData?.contractno || "";
-    if (scannedContractNo && vsrccode.value && scannedContractNo !== vsrccode.value) {
-      toast.error(`鍚堝悓鍙�"${scannedContractNo}"涓庡綋鍓嶅彂璐у崟涓嶅尮閰峘);
-      return;
-    }
-
-    // 鎻愬彇鏁版嵁瀛楁锛堟牴鎹帴鍙h繑鍥炵殑鏁版嵁缁撴瀯锛�
-    const parsedData = {
-      id: tagData?.id || outPutId,
-      contractNo: tagData?.contractno || tagData?.contractNo || "-",
-      monofilamentNumber:
-        tagData?.monofilamentnumber ||
-        tagData?.monofilamentNumber ||
-        tagData?.systemno ||
-        tagData?.systemNo ||
-        "-",
-      model: tagData?.model || "-",
-      weight: tagData?.actuallylength || tagData?.actuallyLength || tagData?.weight || "-",
-      clienteleName: tagData?.clientelename || tagData?.clienteleName || "-",
-      actuallyLength: tagData?.actuallylength || tagData?.actuallyLength || "-",
-      productionDate: tagData?.producttime || tagData?.productionDate || "-",
-      type: tagData?.type || "",
-      devicemodel: tagData?.devicemodel || "",
-      state: tagData?.state || "",
-      projectId: tagData?.projectid || tagData?.projectId || "",
-      productuser: tagData?.productuser || "",
-      // 淇濈暀鍘熷鏁版嵁
-      rawData: tagData,
-      scanCode: scanCode,
-    };
-
-    // 娣诲姞鍒板垪琛�
-    const newItem = {
-      ...parsedData,
-      scanTime: formatTime(new Date()),
-    };
-
-    goodsList.value.push(newItem);
-    toast.success("鎵爜鎴愬姛");
-  } catch (error: any) {
-    console.error("鎵爜澶勭悊澶辫触:", error);
-    toast.error(error.msg || "浜岀淮鐮佸紓甯革紝璇锋洿鎹簩缁寸爜锛�");
-  }
-};
-
-// 鍒犻櫎璐х墿椤�
-const removeGoodsItem = (index: number) => {
-  const item = goodsList.value[index];
-  const itemName = item.contractNo || item.monofilamentNumber || `绗�${index + 1}椤筦;
-
-  uni.showModal({
-    title: "纭鍒犻櫎",
-    content: `纭畾瑕佸垹闄�"${itemName}"鍚楋紵`,
-    confirmText: "鍒犻櫎",
-    cancelText: "鍙栨秷",
-    confirmColor: "#ff4444",
-    success: (res) => {
-      if (res.confirm) {
-        goodsList.value.splice(index, 1);
-        toast.success("鍒犻櫎鎴愬姛");
-      }
-    },
-  });
-};
-
-// 缁熻鐗╂枡鏁伴噺鍜岀被鍨嬭鏍�
-const getMaterialStatistics = () => {
-  const statistics: Record<string, { type: string; model: string; count: number }> = {};
-
-  goodsList.value.forEach((item) => {
-    const type = item.type || "鏈煡绫诲瀷";
-    const model = item.model || "鏈煡瑙勬牸";
-    const key = `${type}_${model}`;
-
-    if (!statistics[key]) {
-      statistics[key] = {
-        type,
-        model,
-        count: 0,
-      };
-    }
-    statistics[key].count++;
-  });
-
-  return Object.values(statistics);
-};
-
-// 澶勭悊鍑哄簱
-const handleOutbound = async () => {
-  if (goodsList.value.length === 0) {
-    toast.error("鏆傛棤璐х墿鏁版嵁");
-    return;
-  }
-
-  // 缁熻鐗╂枡鏁伴噺鍜岀被鍨嬭鏍�
-  const statistics = getMaterialStatistics();
-
-  // 鏋勫缓缁熻淇℃伅鏂囨湰
-  let statisticsText = "鍑哄簱鐗╂枡缁熻锛歕n\n";
-  statistics.forEach((item, index) => {
-    statisticsText += `${index + 1}. ${item.type} - ${item.model}锛�${item.count}浠禱n`;
-  });
-  statisticsText += `\n鎬昏锛�${goodsList.value.length}浠禱n\n纭鍑哄簱鍚楋紵`;
-
-  // 鏄剧ず纭寮规
-  uni.showModal({
-    title: "纭鍑哄簱",
-    content: statisticsText,
-    confirmText: "纭",
-    cancelText: "鍙栨秷",
-    confirmColor: "#0d867f",
-    success: async (res) => {
-      if (res.confirm) {
-        // 鏋勫缓璇锋眰鏁版嵁
-        const requestData = goodsList.value.map((item) => ({
-          outPutId: item.id,
-          projectId: item.projectId || "",
-        }));
-
-        try {
-          uni.showLoading({
-            title: "鍑哄簱涓�...",
-            mask: true,
-          });
-
-          console.log("requestData", requestData);
-          const { code, msg } = await OutboundApi.finishedOutbound(requestData);
-
-          uni.hideLoading();
-
-          if (code === 200) {
-            toast.success("鍑哄簱鎴愬姛");
-            // 娓呯┖鍒楄〃
-            goodsList.value = [];
-            // 杩斿洖涓婁竴椤垫垨鍒锋柊鐗╂枡璇︽儏
-            setTimeout(() => {
-              uni.navigateBack();
-            }, 1500);
-          } else {
-            toast.error(msg || "鍑哄簱澶辫触");
-          }
-        } catch (error: any) {
-          uni.hideLoading();
-          console.error("鍑哄簱澶辫触:", error);
-          toast.error(error.msg || "鍑哄簱澶辫触");
-        }
-      }
-    },
-  });
-};
-
-// 璁剧疆鎵爜鐩戝惉
-const setupScanListener = () => {
-  uni.$off("scanMaterial", getScanCode);
-  uni.$on("scanMaterial", getScanCode);
-};
-
 onLoad((options: any) => {
   materialId.value = options.id || "";
   vbillcode.value = options.vbillcode || "";
-  vsrccode.value = options.vsrccode || "";
   getMaterialDetail();
-});
-
-onMounted(() => {
-  setupScanListener();
-});
-
-onUnmounted(() => {
-  uni.$off("scanMaterial", getScanCode);
 });
 </script>
 

--
Gitblit v1.9.3