From 2685b65eb81a6cb9ff5a450c8894ddbeaea1ca03 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期四, 08 一月 2026 17:30:53 +0800
Subject: [PATCH] fix: 出库添加型号唯一性验证
---
src/pages/outbound/index0.vue | 350 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 350 insertions(+), 0 deletions(-)
diff --git a/src/pages/outbound/index0.vue b/src/pages/outbound/index0.vue
new file mode 100644
index 0000000..88beb06
--- /dev/null
+++ b/src/pages/outbound/index0.vue
@@ -0,0 +1,350 @@
+<template>
+ <view class="list_box">
+ <CardTitle title="鍑哄簱" :hideAction="false">
+ <template #action>
+ <wd-button type="icon" icon="scan" color="#0D867F" @click="openScan"></wd-button>
+ </template>
+ </CardTitle>
+ <view class="list_content">
+ <view v-if="outboundList.length === 0" class="empty_tip">
+ <view class="empty_text">鏆傛棤鍑哄簱鏁版嵁</view>
+ </view>
+ <view v-for="(item, index) in outboundList" :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.batchNo || "-" }}</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="removeOutboundItem(index)"
+ ></wd-button>
+ </view>
+ </view>
+ </view>
+ <view v-if="outboundList.length > 0" class="outbound_footer">
+ <wd-button block @click="handleOutbound">
+ <text class="text-[#fff]">鍑哄簱</text>
+ </wd-button>
+ </view>
+ <Scan ref="scanRef" emitName="scanOutbound" />
+ <wd-toast />
+ </view>
+</template>
+
+<script setup lang="ts">
+import CardTitle from "@/components/card-title/index.vue";
+import Scan from "@/components/scan/index.vue";
+import { useToast } from "wot-design-uni";
+import { dayjs } from "wot-design-uni";
+import OutboundApi from "@/api/product/outbound";
+
+const scanRef = ref();
+const toast = useToast();
+const outboundList = ref<any[]>([]);
+const projectId = ref<string | number>("");
+
+// 鏍煎紡鍖栨椂闂�
+const formatTime = (date: Date) => {
+ return dayjs(date).format("YYYY-MM-DD HH:mm:ss");
+};
+
+// 鎵爜鍥炶皟
+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 = outboundList.value.some((item) => {
+ const itemId = item.id;
+ return itemId && itemId === outPutId && itemId !== "-";
+ });
+
+ if (exists) {
+ toast.error("璇ユ潯鐮佸凡瀛樺湪锛岃鍕块噸澶嶆壂鐮�");
+ return;
+ }
+
+ // 璋冪敤鎺ュ彛鑾峰彇缁炵嚎璇︾粏淇℃伅
+ const { data: tagData } = await OutboundApi.getTagByIdJx({
+ outPutId: outPutId,
+ });
+
+ // 鎻愬彇鏁版嵁瀛楁锛堟牴鎹帴鍙h繑鍥炵殑鏁版嵁缁撴瀯锛�
+ const parsedData = {
+ id: tagData?.id || outPutId,
+ contractNo: tagData?.contractno || tagData?.contractNo || "-",
+ batchNo: tagData?.systemno || tagData?.systemNo || tagData?.batchNo || "-",
+ model: tagData?.model || "-",
+ weight: tagData?.actuallyweight || tagData?.actuallyWeight || tagData?.weight || "-",
+ clienteleName: tagData?.clientelename || tagData?.clienteleName || "-",
+ actuallyLength: tagData?.actuallylength || tagData?.actuallyLength || "-",
+ productionDate: tagData?.producttime || tagData?.productionDate || "-",
+ projectId: tagData?.projectid || tagData?.projectId || projectId.value || "",
+ // 淇濈暀鍘熷鏁版嵁
+ rawData: tagData,
+ scanCode: scanCode,
+ };
+
+ // 濡傛灉鎺ュ彛杩斿洖鐨勬暟鎹腑鏈� projectId锛屼繚瀛樺畠
+ if (parsedData.projectId && !projectId.value) {
+ projectId.value = parsedData.projectId;
+ }
+
+ // 娣诲姞鍒板垪琛�
+ const newItem = {
+ ...parsedData,
+ scanTime: formatTime(new Date()),
+ };
+
+ outboundList.value.push(newItem);
+ toast.success("鎵爜鎴愬姛");
+ } catch (error: any) {
+ console.error("鎵爜澶勭悊澶辫触:", error);
+ toast.error(error.msg || "浜岀淮鐮佸紓甯革紝璇锋洿鎹簩缁寸爜锛�");
+ }
+};
+
+// 瑙﹀彂鎵爜
+const openScan = () => {
+ scanRef.value.triggerScan();
+};
+
+// 鍒犻櫎椤�
+const removeOutboundItem = (index: number) => {
+ const item = outboundList.value[index];
+ const itemName = item.contractNo || item.batchNo || `绗�${index + 1}椤筦;
+
+ uni.showModal({
+ title: "纭鍒犻櫎",
+ content: `纭畾瑕佸垹闄�"${itemName}"鍚楋紵`,
+ confirmText: "鍒犻櫎",
+ cancelText: "鍙栨秷",
+ confirmColor: "#ff4444",
+ success: (res) => {
+ if (res.confirm) {
+ outboundList.value.splice(index, 1);
+ toast.success("鍒犻櫎鎴愬姛");
+ }
+ },
+ });
+};
+
+// 澶勭悊鍑哄簱
+const handleOutbound = async () => {
+ if (outboundList.value.length === 0) {
+ toast.error("鏆傛棤鍑哄簱鏁版嵁");
+ return;
+ }
+
+ // 鏋勫缓璇锋眰鏁版嵁
+ const requestData = outboundList.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("鍑哄簱鎴愬姛");
+ // 娓呯┖鍒楄〃
+ outboundList.value = [];
+ } else {
+ toast.error(msg || "鍑哄簱澶辫触");
+ }
+ } catch (error: any) {
+ uni.hideLoading();
+ console.error("鍑哄簱澶辫触:", error);
+ }
+};
+
+// 纭繚鍏堢Щ闄ゅ啀娣诲姞鐩戝惉
+const setupScanListener = () => {
+ uni.$off("scanOutbound", getScanCode); // 鍏堢Щ闄ゆ棫鐨�
+ uni.$on("scanOutbound", getScanCode); // 鍐嶆坊鍔犳柊鐨�
+};
+
+onMounted(() => {
+ setupScanListener();
+});
+
+onUnmounted(() => {
+ uni.$off("scanOutbound", getScanCode);
+});
+</script>
+
+<style lang="scss" scoped>
+.list_box {
+ height: calc(100vh - 100px);
+ background: #f3f9f8;
+ display: flex;
+ flex-direction: column;
+}
+
+.list_content {
+ flex: 1;
+ overflow-y: auto;
+ padding-bottom: 120rpx;
+}
+
+.empty_tip {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 100rpx 0;
+ color: #999;
+
+ .empty_text {
+ font-size: 32rpx;
+ margin-bottom: 20rpx;
+ }
+}
+
+.outbound_item {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 30rpx;
+ margin: 5rpx;
+ background: #fff;
+ border-radius: 16rpx;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
+
+ .outbound_item_left {
+ display: flex;
+ align-items: center;
+ flex: 1;
+ }
+
+ .outbound_item_content {
+ flex: 1;
+ }
+
+ .outbound_item_row {
+ display: flex;
+ align-items: center;
+ margin-bottom: 12rpx;
+ font-size: 28rpx;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ .outbound_item_label {
+ color: #666;
+ min-width: 140rpx;
+ flex-shrink: 0;
+ }
+
+ .outbound_item_value {
+ color: #333;
+ flex: 1;
+ word-break: break-all;
+ }
+
+ .outbound_item_action {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-left: 20rpx;
+ flex-shrink: 0;
+ }
+}
+
+:deep(.delete-btn) {
+ .wd-button__content {
+ color: #ff4444 !important;
+ }
+
+ &:active {
+ opacity: 0.7;
+ }
+}
+
+:deep(.wd-button__content) {
+ color: #0d867f;
+}
+
+.outbound_footer {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ padding: 20rpx 30rpx;
+ padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
+ z-index: 100;
+}
+</style>
--
Gitblit v1.9.3