From 78c565e37520fad100693c4e298e30e7c916d1bb Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 28 十月 2025 16:21:40 +0800
Subject: [PATCH] fix: 领用二维码异常提示,原材料自检重构

---
 src/pages/production/twist/receive/monofil.vue |  438 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 405 insertions(+), 33 deletions(-)

diff --git a/src/pages/production/twist/receive/monofil.vue b/src/pages/production/twist/receive/monofil.vue
index cc82aab..1c7a03e 100644
--- a/src/pages/production/twist/receive/monofil.vue
+++ b/src/pages/production/twist/receive/monofil.vue
@@ -2,91 +2,463 @@
   <view class="list_box">
     <z-paging
       ref="pagingRef"
-      v-model="cardList"
       :fixed="false"
       :auto-show-back-to-top="true"
+      :loading-more-enabled="false"
       @query="getList"
     >
       <template #top>
         <CardTitle title="鍗曚笣棰嗙敤" :hideAction="false">
           <template #action>
             <wd-button type="icon" icon="scan" color="#0D867F" @click="openScan"></wd-button>
+            <wd-button
+              type="icon"
+              icon="add-circle"
+              color="#0D867F"
+              @click="openManualInput"
+            ></wd-button>
           </template>
         </CardTitle>
       </template>
-      <MonofilCard v-for="(item, index) in cardList" :key="index" />
+      <!-- <MonofilCard v-for="(item, index) in cardList" :key="index" :data="item" /> -->
+      <wd-tabs v-model="tab" slidable="always" class="tabs-container">
+        <block v-for="item in nodeList" :key="item">
+          <wd-tab :title="item.twistedLayer" :name="item.twistedLayer">
+            <scroll-view class="content" scroll-y>
+              <MonofilCard v-for="(m, i) in item.strandedWireDish" :key="i" :data="m" />
+            </scroll-view>
+          </wd-tab>
+        </block>
+      </wd-tabs>
+      <template #bottom>
+        <view class="flex justify-center items-center">
+          <wd-button block @click="save">
+            <text class="text-[#fff]">淇濆瓨</text>
+          </wd-button>
+        </view>
+      </template>
     </z-paging>
+    <Scan ref="scanRef" emitName="scanMono" />
+    <StatisticsModal
+      v-model:visible="showStatisticsModal"
+      :nodeList="nodeList"
+      @confirm="handleConfirmSave"
+    />
+
+    <!-- 鎵嬪姩杈撳叆璐ㄩ噺杩芥函鍙峰脊妗� -->
+    <wd-popup v-model="showManualInput" position="center" :close-on-click-modal="false">
+      <view class="manual-input-modal">
+        <view class="modal-header">
+          <text class="title">鎵嬪姩棰嗙敤鍗曚笣</text>
+          <wd-icon name="close" @click="closeManualInput" />
+        </view>
+        <view class="modal-content">
+          <view class="input-label">鍗曚笣缂栧彿</view>
+          <wd-input
+            v-model="manualOutPutId"
+            placeholder="璇疯緭鍏ュ崟涓濈紪鍙�"
+            clearable
+            @clear="manualOutPutId = ''"
+          />
+        </view>
+        <view class="modal-footer">
+          <wd-button @click="closeManualInput" type="default">鍙栨秷</wd-button>
+          <wd-button type="primary" @click="handleManualConfirm" custom-class="confirm-btn">
+            纭畾
+          </wd-button>
+        </view>
+      </view>
+    </wd-popup>
+
+    <wd-toast />
   </view>
-  <Scan ref="scanRef" />
 </template>
 
 <script setup lang="ts">
 import CardTitle from "@/components/card-title/index.vue";
 import MonofilCard from "../components/MonofilCard.vue";
-import { onLoad, onUnload, onShow, onHide } from "@dcloudio/uni-app";
+import StatisticsModal from "../components/StatisticsModal.vue";
+import { useToast } from "wot-design-uni";
+import { onLoad, onUnload } from "@dcloudio/uni-app";
 import Scan from "@/components/scan/index.vue";
 import ManageApi from "@/api/product/manage";
 import TwistApi from "@/api/product/twist";
 import zPaging from "@/components/z-paging/z-paging.vue";
-import { useMessage } from "@/uni_modules/wot-design-uni";
 // import { useZebraScan } from "@/hooks/useZebraScan";
 // const { init, start, stop, triggerScan } = useZebraScan();
 
 const paramsId = ref();
 const pagingRef = ref();
 const scanRef = ref();
-const cardList = ref<any[]>([]);
-const message = useMessage();
+const toast = useToast();
+const tab = ref("");
+const showStatisticsModal = ref(false);
+const showManualInput = ref(false);
+const manualOutPutId = ref("");
+
+// 鐩戝惉鏍囩鍒囨崲
+watch(tab, () => {
+  if (tab.value) {
+    console.log("tab.value:===========1", tab.value);
+    getList();
+  }
+});
 
 const getScanCode = async (code: any) => {
-  let parseData = code.trim();
-  console.log("鑷畾涔夋壂鎻忕殑缁撴灉鍥炶皟鍑芥暟:", parseData);
-  let codeArr = parseData.split(",");
-  const { data } = await TwistApi.getScarn({
-    outPutId: codeArr[1],
-  });
-  console.log("鍗曚笣缂栧彿", data);
-  message.alert({
-    title: "鍗曚笣缂栧彿",
-    msg: JSON.stringify(data),
-  });
+  console.log("鑷畾涔夋壂鎻忕殑缁撴灉鍥炶皟鍑芥暟:", code);
+  // let parseData = code.trim();
+  console.log("code:===========", JSON.parse(code.code));
+  console.log("id:=============", JSON.parse(code.code).id);
+  try {
+    const { data } = await TwistApi.getScarn({
+      outPutId: JSON.parse(code.code).id,
+    });
+
+    // 妫�鏌ユ槸鍚﹀凡閫夋嫨鏍囩
+    if (!tab.value) {
+      toast.error("璇峰厛閫夋嫨涓�涓眰");
+      return;
+    }
+
+    // 鎵惧埌褰撳墠閫変腑鐨勫眰
+    console.log("tab.value:===========2", tab.value);
+    const currentLayer = nodeList.value.find((node) => node.twistedLayer === tab.value);
+    if (!currentLayer) {
+      toast.error("鏈壘鍒板綋鍓嶉�変腑鐨勫眰");
+      return;
+    }
+
+    // 妫�鏌ュ綋鍓嶅眰鏄惁宸插瓨鍦ㄨ鍗曚笣
+    const exists = currentLayer.strandedWireDish?.some(
+      (item: any) => item.monofilamentNumber === data.monofilamentNumber
+    );
+    if (!exists) {
+      const { id, outPutId, wireId, oneLength, ...rest } = data;
+      const newItem = {
+        wireId: paramsId.value,
+        outputId: id,
+        amount: oneLength,
+        ongLength: oneLength,
+        ...rest,
+      };
+
+      // 娣诲姞鍒板綋鍓嶅眰鐨� strandedWireDish 涓�
+      if (!currentLayer.strandedWireDish) {
+        currentLayer.strandedWireDish = [];
+      }
+      currentLayer.strandedWireDish.push(newItem);
+
+      // 鍒锋柊褰撳墠灞傜殑鏁版嵁鏄剧ず
+      getList();
+    } else {
+      toast.error("璇ュ崟涓濆凡棰嗙敤锛岃鍕块噸澶嶆壂鐮�");
+    }
+  } catch (error) {
+    toast.error("浜岀淮鐮佸紓甯革紝璇锋洿鎹簩缁寸爜锛�");
+  }
 };
 
 const openScan = () => {
   scanRef.value.triggerScan();
 };
 
-const getList = async () => {
-  const { code, data } = await ManageApi.getStrandedWireDish({
-    wireId: paramsId.value,
-    type: "鍗曚笣",
-  });
-  if (code == 200) {
-    pagingRef.value.complete(data);
+// 鎵撳紑鎵嬪姩杈撳叆寮规
+const openManualInput = () => {
+  // 妫�鏌ユ槸鍚﹀凡閫夋嫨鏍囩
+  if (!tab.value) {
+    toast.error("璇峰厛閫夋嫨涓�涓眰");
+    return;
+  }
+  showManualInput.value = true;
+};
+
+// 鍏抽棴鎵嬪姩杈撳叆寮规
+const closeManualInput = () => {
+  showManualInput.value = false;
+  manualOutPutId.value = "";
+};
+
+// 鎵嬪姩杈撳叆纭
+const handleManualConfirm = async () => {
+  if (!manualOutPutId.value.trim()) {
+    toast.error("璇疯緭鍏ヨ川閲忚拷婧彿");
+    return;
+  }
+
+  try {
+    const { data } = await TwistApi.selectByMonofilamentNumber({
+      monofilamentNumber: manualOutPutId.value.trim(),
+    });
+
+    // 鎵惧埌褰撳墠閫変腑鐨勫眰
+    const currentLayer = nodeList.value.find((node) => node.twistedLayer === tab.value);
+    if (!currentLayer) {
+      toast.error("鏈壘鍒板綋鍓嶉�変腑鐨勫眰");
+      return;
+    }
+
+    // 妫�鏌ュ綋鍓嶅眰鏄惁宸插瓨鍦ㄨ鍗曚笣
+    const exists = currentLayer.strandedWireDish?.some(
+      (item: any) => item.monofilamentNumber === data.monofilamentNumber
+    );
+
+    if (!exists) {
+      const { id, outPutId, wireId, oneLength, ...rest } = data;
+      const newItem = {
+        wireId: paramsId.value,
+        outputId: id,
+        amount: oneLength,
+        ongLength: oneLength,
+        ...rest,
+      };
+
+      // 娣诲姞鍒板綋鍓嶅眰鐨� strandedWireDish 涓�
+      if (!currentLayer.strandedWireDish) {
+        currentLayer.strandedWireDish = [];
+      }
+      currentLayer.strandedWireDish.push(newItem);
+
+      // 鍒锋柊褰撳墠灞傜殑鏁版嵁鏄剧ず
+      getList();
+
+      // 鍏抽棴寮规骞舵竻绌鸿緭鍏�
+      closeManualInput();
+      toast.success("娣诲姞鎴愬姛");
+    } else {
+      toast.error("璇ュ崟涓濆凡棰嗙敤锛岃鍕块噸澶嶆坊鍔�");
+    }
+  } catch (error: any) {
+    toast.error(error.msg || "鏌ヨ澶辫触");
   }
 };
 
-onLoad((options: any) => {
+const getList = async () => {
+  // 浠庡綋鍓嶉�変腑灞傜殑 strandedWireDish 涓幏鍙栨暟鎹�
+  const currentLayer = nodeList.value.find((node) => node.twistedLayer === tab.value);
+  if (currentLayer && currentLayer.strandedWireDish) {
+    pagingRef.value.complete(currentLayer.strandedWireDish);
+  } else {
+    pagingRef.value.complete([]);
+  }
+};
+
+let nodeList = ref<any[]>([]);
+// 鑾峰彇鏍瑰彿
+const getRootNumber = async (wireId: number) => {
+  const { code, data, msg } = await TwistApi.getRootNumber({ wireId });
+  if (code === 200) {
+    nodeList.value = data.nodeList;
+    if (data.otherStrandedWireDish && data.otherStrandedWireDish.length > 0) {
+      nodeList.value.push({
+        strandedWireDish: data.otherStrandedWireDish,
+        twistedLayer: "鍏朵粬",
+        twistId: null,
+      });
+    }
+    // 璁剧疆榛樿绗竴灞�
+    if (nodeList.value && nodeList.value.length > 0 && !tab.value) {
+      tab.value = nodeList.value[0].twistedLayer;
+      console.log("璁剧疆榛樿绗竴灞�:", tab.value);
+      // 璁剧疆榛樿鏍囩鍚庯紝鍔犺浇绗竴灞傜殑鏁版嵁
+      getList();
+    }
+  } else {
+    toast.error(msg || "鑾峰彇鏍瑰彿澶辫触");
+  }
+};
+
+const save = () => {
+  // 妫�鏌� nodeList 涓槸鍚︽湁鏂扮殑鍗曚笣鏁版嵁闇�瑕佷繚瀛�
+  let hasNewData = false;
+
+  nodeList.value.forEach((node) => {
+    if (node.strandedWireDish && Array.isArray(node.strandedWireDish)) {
+      const hasNewInLayer = node.strandedWireDish.some(
+        (item: { id?: number }) => item.id === undefined || item.id === null
+      );
+      if (hasNewInLayer) {
+        hasNewData = true;
+      }
+    }
+  });
+
+  if (!hasNewData) {
+    toast.error("娌℃湁鏂扮殑鍗曚笣鏁版嵁闇�瑕佷繚瀛�");
+    return;
+  }
+
+  // 鏄剧ず缁熻寮规
+  showStatisticsModal.value = true;
+};
+
+const handleConfirmSave = async () => {
+  // 浠� nodeList 涓敹闆嗘墍鏈夐渶瑕佷繚瀛樼殑鏂板崟涓濇暟鎹�
+  const newData: any[] = [];
+
+  nodeList.value.forEach((node) => {
+    node.strandedWireDish.forEach((item: any) => {
+      item.saleTwistId = node.twistId;
+    });
+    if (node.strandedWireDish && Array.isArray(node.strandedWireDish)) {
+      const layerNewData = node.strandedWireDish.filter(
+        (item: { id?: number }) => item.id === undefined || item.id === null
+      );
+      newData.push(...layerNewData);
+    }
+  });
+
+  if (newData.length === 0) {
+    toast.error("娌℃湁鏂扮殑鍗曚笣鏁版嵁闇�瑕佷繚瀛�");
+    return;
+  }
+
+  const { code, msg } = await TwistApi.addStrandedWireDish(newData);
+  if (code == 200) {
+    toast.success(msg);
+
+    // 娓呯┖鎵�鏈夊眰涓凡淇濆瓨鐨勬暟鎹紙缁欏凡淇濆瓨鐨勬暟鎹坊鍔� id锛�
+    nodeList.value.forEach((node) => {
+      if (node.strandedWireDish && Array.isArray(node.strandedWireDish)) {
+        node.strandedWireDish.forEach((item: any) => {
+          if (item.id === undefined || item.id === null) {
+            item.id = Date.now(); // 涓存椂鏍囪涓哄凡淇濆瓨
+          }
+        });
+      }
+    });
+
+    pagingRef.value.refresh();
+    getList();
+  } else {
+    toast.error("淇濆瓨澶辫触");
+  }
+};
+
+onLoad(async (options: any) => {
   // 寮�鍚箍鎾洃鍚簨浠�
-  uni.$on("scan", getScanCode);
+  uni.$on("scanMono", getScanCode);
   paramsId.value = options.id;
+
+  // 璋冪敤鑾峰彇鏍瑰彿鎺ュ彛
+  getRootNumber(options.id);
+  // getRootNumber(118);
 });
 onUnload(() => {
   // 寮�鍚箍鎾洃鍚簨浠�
-  uni.$off("scan", getScanCode);
+  uni.$off("scanMono", getScanCode);
 });
-
-onShow(() => {});
-
-onHide(() => {});
 </script>
 
 <style lang="scss" scoped>
 .list_box {
-  height: calc(100vh - 100px);
+  height: calc(100vh - 50px);
   background: #f3f9f8;
+  display: flex;
+  flex-direction: column;
 }
+
+// 鎵嬪姩杈撳叆寮规鏍峰紡
+.manual-input-modal {
+  width: 320px;
+  background: #fff;
+  border-radius: 12px;
+  overflow: hidden;
+
+  .modal-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 16px 20px;
+    border-bottom: 1px solid #f0f0f0;
+
+    .title {
+      font-size: 18px;
+      font-weight: 600;
+      color: #333;
+    }
+  }
+
+  .modal-content {
+    padding: 20px;
+
+    .input-label {
+      font-size: 14px;
+      color: #333;
+      margin-bottom: 8px;
+      font-weight: 500;
+    }
+  }
+
+  .modal-footer {
+    display: flex;
+    gap: 12px;
+    padding: 16px 20px;
+    border-top: 1px solid #f0f0f0;
+  }
+}
+
+:deep(.manual-input-modal .confirm-btn) {
+  background-color: #0d867f !important;
+  border-color: #0d867f !important;
+
+  .wd-button__content {
+    color: #fff !important;
+  }
+}
+
+// tab瀹瑰櫒鏍峰紡
+.tabs-container {
+  height: calc(100vh - 200px);
+  display: flex;
+  flex-direction: column;
+}
+
+.content {
+  height: calc(100vh - 200px);
+  width: 100%;
+}
+
 :deep(.wd-button__content) {
   color: #0d867f;
 }
+:deep(.zp-paging-container) {
+  background: transparent !important;
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+}
+:deep(.zp-paging-container-content) {
+  background: transparent !important;
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+}
+:deep(.wd-tabs) {
+  background: transparent !important;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+}
+:deep(.wd-tabs__nav) {
+  margin-bottom: 10px;
+  flex-shrink: 0;
+  position: sticky;
+  top: 0;
+  z-index: 10;
+  background: #f3f9f8;
+}
+:deep(.wd-tabs__content) {
+  flex: 1;
+  overflow: visible;
+}
+:deep(.wd-tab__pane) {
+  height: 100%;
+}
+:deep(.zp-paging-container-top) {
+  flex-shrink: 0;
+}
+:deep(.zp-paging-container-bottom) {
+  flex-shrink: 0;
+}
 </style>

--
Gitblit v1.9.3