| 
					
				 | 
			
			
				@@ -8,7 +8,7 @@ import Drawer from '@/components/Drawer/index.vue' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import {InStoreageFormType} from '@/hooks/useDepot' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import InStorageProduct from './InStorageProduct.vue' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import {CirclePlus, Delete} from '@element-plus/icons-vue' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import {Storehouse_StockIn_Add} from '@/api/storehouse/index' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import {Storehouse_StockIn_Add,Storehouse_StockIn_Generate_Number} from '@/api/storehouse/index' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import ImageCom from '@/components/Image/index.vue' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import ReceiveUser from "@/views/storehouse/outStock/receiveUser.vue"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -20,6 +20,11 @@ const drawerRef = ref<InstanceType<typeof Drawer> | null>(null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const drawerSnRef = ref<InstanceType<typeof InStorageSn> | null>(null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const drawerProductRef = ref<InstanceType<typeof InStorageProduct> | null>(null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 防抖相关 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const isSubmitting = ref(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const isGeneratingNumber = ref(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+let generateNumberTimer: NodeJS.Timeout | null = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const data: any = reactive({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	optionsType: [{id: 1, T_name: '入库'}, {id: 2, T_name: '退库'}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -34,6 +39,7 @@ const form = reactive<InStoreageFormType>({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_project: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_return_user: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	T_return_user_name: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	T_batch_number: '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const validate_T_product = (rule: any, value: any, callback: any) => { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -108,24 +114,77 @@ const determineSNorCount = (DeviceSnData: any) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 生成入库单号(防抖) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const generateStockInNumber = async () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (isGeneratingNumber.value) return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 清除之前的定时器 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (generateNumberTimer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    clearTimeout(generateNumberTimer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  generateNumberTimer = setTimeout(async () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      isGeneratingNumber.value = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const res: any = await Storehouse_StockIn_Generate_Number({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        User_tokey: globalStore.GET_User_tokey 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (res.Code === 200) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        form.T_number = res.Data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ElMessage.error('生成入库单号失败:' + (res.Msg || '系统错误')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      console.error('生成入库单号失败:', error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ElMessage.error('生成入库单号失败,请重试') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } finally { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      isGeneratingNumber.value = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }, 500) // 500ms 防抖延迟 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 页面加载时生成入库单号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if (!form.T_number) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  generateStockInNumber() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const AddInStorage = (formEl: FormInstance | undefined) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if (!formEl) return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 防止重复提交 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (isSubmitting.value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ElMessage.warning('正在提交中,请勿重复操作') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	form.T_product = getDeviceSnToProduct() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	formEl.validate(async valid => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (valid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			const res: any = await Storehouse_StockIn_Add({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				User_tokey: globalStore.GET_User_tokey, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				...form, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				T_product: form.T_product.join('') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if (res.Code === 200) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				ElMessage.success('入库成功!') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				drawerProductRef.value?.clearSelection() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				nextTick(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					emit('onUpdateList') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					resetForm(ruleFormRef.value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					drawerRef.value?.closeDrawer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				isSubmitting.value = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				const res: any = await Storehouse_StockIn_Add({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					User_tokey: globalStore.GET_User_tokey, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					...form, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					T_product: form.T_product.join('') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (res.Code === 200) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					ElMessage.success('入库成功!') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					drawerProductRef.value?.clearSelection() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					nextTick(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						emit('onUpdateList') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						resetForm(ruleFormRef.value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						drawerRef.value?.closeDrawer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					ElMessage.error('入库失败:' + (res.Msg || '系统错误')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				console.error('入库失败:', error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ElMessage.error('入库失败,请重试') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} finally { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				isSubmitting.value = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -153,6 +212,18 @@ const resetForm = (formEl: FormInstance | undefined) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	drawerSnRef.value?.clearDeviceSn() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	tableData.value = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	formEl.resetFields() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 清理防抖定时器 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (generateNumberTimer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		clearTimeout(generateNumberTimer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		generateNumberTimer = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	isSubmitting.value = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	isGeneratingNumber.value = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 重置后重新生成单号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	form.T_number = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	generateStockInNumber() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -230,7 +301,13 @@ const getReturnUserInfo = ({T_uuid, T_name}: { T_uuid: string; T_name: string }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 入库调用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const openDrawer = () => drawerRef.value?.openDrawer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const openDrawer = () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	drawerRef.value?.openDrawer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// 打开抽屉时生成单号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!form.T_number) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		generateStockInNumber() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 defineExpose({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	openDrawer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -244,8 +321,24 @@ defineExpose({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			</template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			<el-form ref="ruleFormRef" :model="form" :rules="rules"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				<el-form-item label="入库单号:" :label-width="formLabelWidth" prop="T_number"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					<el-input v-model="form.T_number" type="text" :disabled="true" placeholder="系统自动生成" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							  class="w-50"/> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					<div class="w-50" style="display: flex; align-items: center; gap: 8px;"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						<el-input  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							v-model="form.T_number"  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							type="text"  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							:disabled="true"  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							placeholder="系统自动生成" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							style="flex: 1;" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						/> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						<el-button  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							type="primary"  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							size="small"  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							:loading="isGeneratingNumber" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							:disabled="isGeneratingNumber" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							@click="generateStockInNumber" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							{{ isGeneratingNumber ? '生成中...' : '重新生成' }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				</el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				<el-form-item label="入库仓库:" :label-width="formLabelWidth" prop="T_depot_id"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					<el-select v-model="form.T_depot_id" class="w-50" clearable placeholder="请选择入库仓库~"> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -271,6 +364,14 @@ defineExpose({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						value-format="YYYY-MM-DD" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					/> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				</el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				<el-form-item label="入库批次:" :label-width="formLabelWidth" prop="T_batch_number"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					<el-input  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						v-model="form.T_batch_number"  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						type="text"  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						placeholder="请输入入库批次号"  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						class="w-50" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					/> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				</el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				<el-form-item label="入库明细:" :label-width="formLabelWidth" prop="T_product"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					<el-table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						:data="tableData" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -365,7 +466,14 @@ defineExpose({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				<div class="btn"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					<el-divider> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						<el-button @click="closeInStorage">取消</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						<el-button color="#626aef" @click="AddInStorage(ruleFormRef)">提交</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						<el-button  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							color="#626aef"  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							:loading="isSubmitting" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							:disabled="isSubmitting || isGeneratingNumber" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							@click="AddInStorage(ruleFormRef)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							{{ isSubmitting ? '提交中...' : '提交' }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					</el-divider> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				<ReceiveUser ref="receiveUserdialog" :dept_leader="0" @onUserInfo="getReturnUserInfo" title="选择退库人"/> 
			 |