From 7a93a85f75bcfc8001ea1d3b921860806a8209ac Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 29 十月 2026 12:28:48 +0800
Subject: [PATCH] feat(mobile): 新增多个移动端功能模块并优化扫码流程

---
 src/views/wls/productsales/modules/form.vue |   28 +++++++++++++---------------
 1 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/src/views/wls/productsales/modules/form.vue b/src/views/wls/productsales/modules/form.vue
index 27ee471..c05ba79 100644
--- a/src/views/wls/productsales/modules/form.vue
+++ b/src/views/wls/productsales/modules/form.vue
@@ -23,6 +23,7 @@
   submitProductSales,
   updateProductSales,
 } from '#/api/mes/wm/productsales';
+import TraceScanInput from '#/components/TraceScanInput.vue';
 import { $t } from '#/locales';
 
 import { useFormSchema } from '../data';
@@ -33,7 +34,7 @@
 const formType = ref<FormType>('create');
 const formData = ref<MesWmProductSalesApi.ProductSales>();
 const scanContent = ref('');
-const scanType = ref<'BAG' | 'PALLET' | 'BATCH'>('BAG');
+const scanType = ref<'' | 'BAG' | 'BATCH' | 'PALLET'>('');
 const scanPreview = ref<MesWmProductSalesApi.ProductSalesScanResponse>();
 const selectedBagIds = ref<number[]>([]);
 const scanLoading = ref(false);
@@ -108,16 +109,18 @@
   }
 }
 
-/** 鍏堣瘑鍒璞″苟閫夋嫨琚嬬爜锛屽洖杞︿笉浼氱洿鎺ュ啓鍏ユ嫞璐с�� */
-async function handleScan() {
-  if (!formData.value?.id || !scanContent.value.trim() || scanLoading.value) {
+/** 鍏堣瘑鍒璞″苟閫夋嫨琚嬬爜锛岀‘璁ゅ悗鎵嶅啓鍏ユ嫞璐с�� */
+async function handleScan(raw?: string) {
+  const content = (raw ?? scanContent.value).trim();
+  if (!formData.value?.id || !content || scanLoading.value) {
     return;
   }
+  scanContent.value = content;
   scanLoading.value = true;
   try {
     scanPreview.value = undefined;
     selectedBagIds.value = [];
-    const result = await previewProductSalesScan(scanContent.value.trim(), scanType.value, formData.value.id);
+    const result = await previewProductSalesScan(content, scanType.value || undefined, formData.value.id);
     scanPreview.value = result;
     if (result.scanType === 'BAG') selectedBagIds.value = result.bags?.filter(b => b.selectable).map(b => b.id) || [];
     if (!result.scanQuantity) message.warning('褰撳墠瀵硅薄娌℃湁鍙嫞琚嬬爜锛岃鏍稿璐ㄦ鍜屽簱瀛樼姸鎬�');
@@ -291,19 +294,14 @@
         <div v-if="isStock" class="mb-3 flex items-center gap-2 px-4">
           <label for="sales-picking-type" class="sr-only">鎷h揣鎵爜绫诲瀷</label>
           <a-select id="sales-picking-type" v-model:value="scanType" :disabled="scanLoading" style="width:140px" @change="scanPreview = undefined; selectedBagIds = []">
-            <a-select-option value="BAG">琚嬬爜</a-select-option><a-select-option value="PALLET">鎵樼洏鐮�</a-select-option><a-select-option value="BATCH">鐢熶骇鎵规鐮�</a-select-option>
+            <a-select-option value="">鑷姩璇嗗埆</a-select-option><a-select-option value="BAG">琚嬬爜</a-select-option><a-select-option value="PALLET">鎵樼洏鐮�</a-select-option><a-select-option value="BATCH">鐢熶骇鎵规鐮�</a-select-option>
           </a-select>
-          <a-input
-            v-model:value="scanContent"
-            :disabled="scanLoading"
-            autofocus
+          <TraceScanInput
             class="flex-1"
-            placeholder="鎵弿鎵�閫夌被鍨嬬爜锛屽洖杞﹁瘑鍒�"
-            @press-enter="handleScan"
+            :disabled="scanLoading"
+            placeholder="鎵弿杩芥函浜岀淮鐮佹垨杈撳叆杩芥函鐮侊紝鍥炶溅璇嗗埆"
+            @code="handleScan"
           />
-          <Button :loading="scanLoading" type="default" @click="handleScan">
-            璇嗗埆鐮佸��
-          </Button>
         </div>
         <section v-if="isStock && scanPreview" class="mb-4 rounded-lg border border-border p-4">
           <h3 class="font-semibold">鏍稿鎷h揣瀵硅薄</h3><p>鎵规 {{scanPreview.batchCode}} 路 鍙嫞 {{scanPreview.scanQuantity}} 琚�</p>

--
Gitblit v1.9.3