Browse Source

add:验证工具入库添加历史记录

zoie 4 weeks ago
parent
commit
8b1964dd7c

+ 2 - 0
src/api/storehouse/index.ts

@@ -117,6 +117,8 @@ export const Storehouse_Contract_Percentage_Remit = (params: any) => $http.post(
 // 设备列表
 export const Storehouse_Device_List = (params: any) => $http.post('/storage/Device/List', params)
 export const validation_List = (params: any) => $http.post('/storage/validationTool/list', params)
+export const validation_recordList = (params: any) => $http.post('/storage/validationTool/recordList', params)
+export const validation_operationList = (params: any) => $http.post('/storage/validationTool/operationList', params)
 export const validation_Stat = (params: any) => $http.post('/storage/validationTool/stat', params)
 export const validation_add = (params: any) => $http.post('/storage/validationTool/add', params)  //借出验证工具
 export const validation_del = (params: any) => $http.post('/storage/validationTool/del', params,)

+ 2 - 10
src/components/TableBase/index.vue

@@ -19,7 +19,7 @@ interface ProTableProps extends Partial<Omit<TableProps<any>, 'data'>> {
   displayHeader?: boolean // 是否隐藏头部
   rowClick?: (row: any, column: any, event: any) => void // 点击行
   selectionChange?: (row: any) => void // 选择函数
-	selectable?: (row: any) => void // 选择函数
+  selectable?: (row: any) => void // 选择函数
   getRowKey?: ((row: any) => string) | string // 用于优化select勾选框
   tableRowClassName?: (data: any) => CSSProperties
 }
@@ -56,7 +56,7 @@ defineExpose({
   getTableList,
   searchTable,
   clearSelection,
-	toggleRowSelection,
+  toggleRowSelection,
 })
 </script>
 
@@ -93,14 +93,6 @@ defineExpose({
 			  v-if="item.type == 'index'"
 			  show-overflow-tooltip
 		  ></el-table-column>
-<!--        <el-table-column-->
-<!--          v-bind="item"-->
-<!--          :align="item.align ?? 'center'"-->
-<!--          :reserve-selection="item.type == 'selection'"-->
-<!--		  v-if="item.type == 'selection' || item.type == 'index'"-->
-<!--          show-overflow-tooltip-->
-<!--        ></el-table-column>-->
-
         <!-- expand 支持 tsx 语法 && 作用域插槽 (tsx > slot) -->
         <el-table-column v-bind="item" :align="item.align ?? 'center'" v-if="item.type === 'expand'" v-slot="scope" show-overflow-tooltip>
           <component :is="item.render" :row="scope.row" v-if="item.render"> </component>

+ 5 - 4
src/views/storehouse/ValidationTool/modules/snAdd.vue

@@ -142,10 +142,6 @@ const submitForm = () => {
 			}
 			data.fromData.T_sn = ''
 			data.snItems.unshift({...data.fromData, T_sn: extractedSN})
-			data.snItems.value = data.snItems.value.filter((value:any, index:any, self:any) => {  //去重
-				return self.findIndex((t:any) => (t.T_sn === value.T_sn)) === index;
-			});
-
 			ElMessage.success('已添加到待提交列表')
 			if ('speechSynthesis' in window) {
 				const utterance = new SpeechSynthesisUtterance('添加成功')
@@ -153,6 +149,11 @@ const submitForm = () => {
 			} else {
 				console.warn('Web Speech API 不被支持')
 			}
+			data.snItems.value = data.snItems.value.filter((value:any, index:any, self:any) => {  //去重
+				return self.findIndex((t:any) => (t.T_sn === value.T_sn)) === index;
+			});
+
+
 		}
 	})
 }

+ 261 - 7
src/views/storehouse/ValidationTool/validation.vue

@@ -8,22 +8,27 @@ import {
 	validation_del,
 	validation_List,
 	validation_update,
-	validationTool_class_list
+	validationTool_class_list,
+	validation_recordList, validation_operationList
 } from '@/api/storehouse'
 import TableBase from '@/components/TableBase/index.vue'
 import {computed, nextTick, onMounted, reactive, ref} from 'vue'
 import {GlobalStore} from '@/stores'
 import type {ColumnProps} from '@/components/TableBase/interface'
-import {Delete, Edit} from '@element-plus/icons-vue'
+import {Delete, Edit, View} from '@element-plus/icons-vue'
 import type {FormInstance, UploadInstance} from 'element-plus'
 import {ElLoading, ElMessage, ElMessageBox} from 'element-plus'
 import snAdd from './modules/snAdd.vue'
+import Drawer from "@/components/Drawer/index.vue";
 
 const uploadRef = ref<UploadInstance>()
 const uploadFiles = ref<File[]>([]) // 新增:用于存储上传的文件
 
 const globalStore = GlobalStore()
 const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
+const recordTableRef = ref<InstanceType<typeof TableBase> | null>(null)
+const operationTableRef = ref<InstanceType<typeof TableBase> | null>(null)
+const drawerSnRef = ref<InstanceType<typeof Drawer> | null>(null)
 
 const initParam = reactive({
 	User_tokey: globalStore.GET_User_tokey,
@@ -36,6 +41,25 @@ const initParam = reactive({
 	T_project: '',
 	T_class: ''
 })
+
+const recordInitParam = reactive({
+	User_tokey: globalStore.GET_User_tokey,
+	Validationnumber: '',
+	T_state: '',
+	T_sn: '',
+	T_imei: '',
+	T_iccid: '',
+	LendUser: '',
+	T_project: '',
+	T_class: ''
+})
+const operationInitParam = reactive({
+	User_tokey: globalStore.GET_User_tokey,
+	T_state: '',
+	T_sn: '',
+	LendUser: '',
+	T_project: '',
+})
 const columns: ColumnProps[] = [
 	{type: 'index', label: '序号', width: 80},
 	{prop: 'Validationnumber', label: '设备编号', ellipsis: true},
@@ -49,6 +73,34 @@ const columns: ColumnProps[] = [
 	{prop: 'T_remark', label: '备注',  ellipsis: true},
 	{prop: 'operation', label: '操作', width: 260, fixed: 'right'}
 ]
+
+const recordColumns: ColumnProps[] = [
+	{type: 'index', label: '序号', width: 80},
+	{prop: 'Validationnumber', label: '设备编号', ellipsis: true},
+	{prop: 'T_sn', label: '设备SN', ellipsis: true, width: 180},
+	{prop: 'T_imei', label: '模组imei', ellipsis: true},
+	{prop: 'T_iccid', label: '物联网卡号', ellipsis: true},
+	{prop: 'T_state', label: '状态', name: 'T_state'},
+	{prop: 'T_class', label: '设备类型', name: 'T_class'},
+	{prop: 'LendUser', label: '借出人', ellipsis: true},
+	{prop: 'T_project', label: '借出项目', ellipsis: true},
+	{prop: 'T_remark', label: '备注',  ellipsis: true},
+	{prop: 'CreateTime', label: '操作时间',  ellipsis: true},
+]
+const operationColumns: ColumnProps[] = [
+	{type: 'index', label: '序号', width: 80},
+	{prop: 'BatchNumber', label: '操作时间',  width: 190},
+	{prop: 'T_state', label: '操作', name: 'T_state'},
+	{prop: 'LendUser', label: '借出人', ellipsis: true},
+	{prop: 'T_project', label: '借出项目', ellipsis: true},
+	{prop: 'T_remark', label: '备注',  ellipsis: true},
+	{prop: 'operation', label: 'SN', width: 100, fixed: 'right', align: 'center' }
+
+]
+const snColumns = [
+	{ type: 'index', label: '序号', width: 80, align: 'center ' },
+	{ label: 'SN', prop: 'sn', align: 'center ' }
+]
 // 搜索
 const options = reactive([
 	{name: '已出库', id: 1},
@@ -60,6 +112,13 @@ const options = reactive([
 const searchHandle = () => {
 	TableRef.value?.searchTable()
 }
+
+const recordSearchHandle = () => {
+	recordTableRef.value?.searchTable()
+}
+const operationSearchHandle = () => {
+	operationTableRef.value?.searchTable()
+}
 /**
  * 删除
  */
@@ -112,6 +171,8 @@ const exportExcel = async () => {
 }
 
 const showInStorageForm = ref(false)
+const dialogTableVisible = ref(false)
+const operationVisible = ref(false)
 
 const inStorageFormRef = ref<FormInstance | null>(null)
 const inStorageForm = reactive({
@@ -295,9 +356,7 @@ const submitLendForm = () => {
 				LendUser: lendForm.LendUser,
 				T_project: lendForm.T_project
 			})
-			pendingLendItems.value = pendingLendItems.value.filter((value:any, index:any, self:any) => {  //去重
-				return self.findIndex((t:any) => (t.T_sn === value.T_sn)) === index;
-			});
+
 			lendForm.T_sn = ''
 			lendForm.T_remark = ''
 			ElMessage.success('已添加到待提交列表')
@@ -307,6 +366,9 @@ const submitLendForm = () => {
 			} else {
 				console.warn('Web Speech API 不被支持')
 			}
+			pendingLendItems.value = pendingLendItems.value.filter((value:any, index:any, self:any) => {  //去重
+				return self.findIndex((t:any) => (t.T_sn === value.T_sn)) === index;
+			});
 		} else {
 		}
 	})
@@ -366,6 +428,32 @@ const previewEdit = async (row: any) => {
 		ElMessage.error('获取数据失败')
 	}
 }
+const preview = (T_sn:any) => {
+	recordInitParam.T_sn = T_sn
+	dialogTableVisible.value = true
+	recordTableRef.value?.searchTable()
+}
+const callbackSnDrawer = (done: () => void) => done()
+
+
+const operationPreview = () => {
+	operationVisible.value = true
+	operationTableRef.value?.searchTable()
+}
+const tableSnData = ref<any[]>([])
+const previewSn = (devicelist: string[]) => {
+	drawerSnRef.value?.openDrawer()
+	if (!devicelist) return
+	tableSnData.value = devicelist.map((item: string) => {
+		return {
+			sn: item
+		}
+	})
+
+
+}
+
+
 
 const submitEditForm = () => {
 	editFormRef.value?.validate(async (valid: boolean): Promise<void> => {
@@ -561,7 +649,7 @@ onMounted(() => {
 								@change="searchHandle"
 							/>
 						</el-col>
-						<el-col :xl="10" :lg="10" :md="10" style="margin-top: 10px">
+						<el-col :xl="15" :lg="15" :md="15" style="margin-top: 10px">
 							<el-button type="primary" @click="searchHandle">搜索</el-button>
 							<el-button type="primary" @click="showInStorageForm = true">入库
 							</el-button>
@@ -575,6 +663,7 @@ onMounted(() => {
 							</el-button>
 							<el-button type="success" @click="ImportEdit = true">模板导入</el-button>
 							<el-button type="success" @click="exportExcel">导出</el-button>
+							<el-button type="primary" @click="operationPreview">操作记录</el-button>
 						</el-col>
 					</el-row>
 				</div>
@@ -587,10 +676,11 @@ onMounted(() => {
 				<el-tag v-if="row.T_state == 5" effect="dark" type="info">已损坏</el-tag>
 			</template>
 			<template #T_class="{ row }">
-				<el-tag>{{ Pruductoptions.find(option => option.Id === row.T_class)?.T_name || '' }}</el-tag>
+				<el-tag>{{ Pruductoptions.find((option:any)=> option.Id === row.T_class)?.T_name || '' }}</el-tag>
 
 			</template>
 			<template #right="{ row }">
+				<el-button link type="primary" size="small" :icon="View" @click="preview(row.T_sn)">记录</el-button>
 				<el-button link type="success" size="small" :icon="Edit" @click="previewEdit(row)">编辑</el-button>
 				<el-button link type="danger" size="small" :icon="Delete" @click="deleteFun(row.T_sn)">删除</el-button>
 			</template>
@@ -739,6 +829,170 @@ onMounted(() => {
 				<template #tip></template>
 			</el-upload>
 		</el-dialog>
+		<el-dialog title="查看记录" v-model="dialogTableVisible"  width="60%" >
+
+			<TableBase
+				ref="recordTableRef"
+				:columns="recordColumns"
+				:requestApi="validation_recordList"
+				:initParam="recordInitParam"
+				:pagination="true"
+			>
+				<template #table-header>
+					<div class="input-suffix">
+						<el-row :gutter="20" style="margin-bottom: 0">
+							<el-col :xl="4" :lg="4" :md="4">
+								<span class="inline-flex items-center">设备编号:</span>
+								<el-input
+									v-model="recordInitParam.Validationnumber"
+									class="w-50 m-2"
+									type="text"
+									placeholder="设备编号搜索"
+									clearable
+									@change="recordSearchHandle"
+								/>
+							</el-col>
+							<el-col :xl="4" :lg="4" :md="4">
+								<span class="inline-flex items-center">状态:</span>
+								<el-select v-model="recordInitParam.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
+									<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"/>
+								</el-select>
+							</el-col>
+							<el-col :xl="4" :lg="4" :md="4">
+								<span class="inline-flex items-center">借出人</span>
+								<el-input
+									class="w-50 m-2"
+									v-model="recordInitParam.LendUser"
+									type="text"
+									placeholder="按借出人搜索"
+									clearable
+									@change="recordSearchHandle"
+								/>
+							</el-col>
+							<el-col :xl="4" :lg="4" :md="4">
+								<span class="inline-flex items-center">借出项目</span>
+								<el-input
+									class="w-50 m-2"
+									v-model="recordInitParam.T_project"
+									type="text"
+									placeholder="按借出项目搜索"
+									clearable
+									@change="recordSearchHandle"
+								/>
+							</el-col>
+							<el-col :xl="4" :lg="4" :md="4">
+								<span class="inline-flex items-center">物联网卡号:</span>
+								<el-input
+									class="w-50 m-2"
+									v-model="recordInitParam.T_iccid"
+									type="text"
+									placeholder="按物联网卡号搜索"
+									clearable
+									@change="recordSearchHandle"
+								/>
+							</el-col>
+							<el-col :xl="4" :lg="4" :md="4" style="margin-top: 10px">
+								<el-button type="primary" @click="recordSearchHandle">搜索</el-button>
+							</el-col>
+						</el-row>
+					</div>
+				</template>
+				<template #T_state="{ row }">
+					<el-tag v-if="row.T_state == 1" type="success" effect="dark"> 已出库</el-tag>
+					<el-tag v-if="row.T_state == 2" effect="dark">未出库</el-tag>
+					<el-tag v-if="row.T_state == 3" effect="dark" type="warning">维修中</el-tag>
+					<el-tag v-if="row.T_state == 4" effect="dark" type="danger">已报废</el-tag>
+					<el-tag v-if="row.T_state == 5" effect="dark" type="info">已损坏</el-tag>
+				</template>
+				<template #T_class="{ row }">
+					<el-tag>{{ Pruductoptions.find((option:any)=> option.Id === row.T_class)?.T_name || '' }}</el-tag>
+				</template>
+			</TableBase>
+		</el-dialog>
+		<el-dialog title="操作记录" v-model="operationVisible"  width="60%" >
+
+			<TableBase
+				ref="operationTableRef"
+				:columns="operationColumns"
+				:requestApi="validation_operationList"
+				:initParam="operationInitParam"
+				:pagination="true"
+			>
+				<template #table-header>
+					<div class="input-suffix">
+						<el-row :gutter="20" style="margin-bottom: 0">
+							<el-col :xl="5" :lg="5" :md="5">
+								<span class="inline-flex items-center">SN:</span>
+								<el-input
+									class="w-50 m-2"
+									v-model="operationInitParam.T_sn"
+									type="text"
+									placeholder="按SN搜索"
+									clearable
+									@change="searchHandle"
+								/>
+							</el-col>
+							<el-col :xl="5" :lg="5" :md="5">
+								<span class="inline-flex items-center">状态:</span>
+								<el-select v-model="operationInitParam.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
+									<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"/>
+								</el-select>
+							</el-col>
+							<el-col :xl="5" :lg="5" :md="5">
+								<span class="inline-flex items-center">借出人</span>
+								<el-input
+									class="w-50 m-2"
+									v-model="operationInitParam.LendUser"
+									type="text"
+									placeholder="按借出人搜索"
+									clearable
+									@change="operationSearchHandle"
+								/>
+							</el-col>
+							<el-col :xl="5" :lg="5" :md="5">
+								<span class="inline-flex items-center">借出项目</span>
+								<el-input
+									class="w-50 m-2"
+									v-model="operationInitParam.T_project"
+									type="text"
+									placeholder="按借出项目搜索"
+									clearable
+									@change="operationSearchHandle"
+								/>
+							</el-col>
+							<el-col :xl="4" :lg="4" :md="4" style="margin-top: 10px">
+								<el-button type="primary" @click="operationSearchHandle">搜索</el-button>
+							</el-col>
+						</el-row>
+					</div>
+				</template>
+				<template #T_state="{ row }">
+					<el-tag v-if="row.T_state == 1" type="success" effect="dark">出库</el-tag>
+					<el-tag v-if="row.T_state == 2" effect="dark">入库</el-tag>
+					<el-tag v-if="row.T_state == 3" effect="dark" type="warning">维修</el-tag>
+					<el-tag v-if="row.T_state == 4" effect="dark" type="danger">报废</el-tag>
+					<el-tag v-if="row.T_state == 5" effect="dark" type="info">损坏</el-tag>
+				</template>
+				<template #right="{ row }">
+					<el-button type="primary"  @click="previewSn(row.T_sn_List)">查看</el-button>
+				</template>
+			</TableBase>
+		</el-dialog>
+		<Drawer ref="drawerSnRef" :handleClose="callbackSnDrawer" size="30%">
+			<el-table
+				:data="tableSnData"
+				style="width: 100%; height: 99%"
+				:header-cell-style="{
+          background: '#dedfe0',
+          height: '50px'
+        }"
+			>
+				<template v-for="item in snColumns" :key="item">
+					<el-table-column show-overflow-tooltip v-if="item.type === 'index'" v-bind="item" />
+					<el-table-column show-overflow-tooltip v-if="item.prop" v-bind="item" />
+				</template>
+			</el-table>
+		</Drawer>
 		<snAdd ref="btnRef" @successFun="successFun"></snAdd>
 
 	</div>

+ 282 - 270
src/views/storehouse/outStock/modules/InStorageEdit.vue

@@ -1,17 +1,16 @@
 <script setup lang="ts">
-import { ElMessage } from 'element-plus'
+import type {FormInstance, FormRules} from 'element-plus'
+import {ElMessage} from 'element-plus'
 import InStorageEditSn from './InStorageEditSn.vue'
-import { ref, reactive, nextTick } from 'vue'
-import { GlobalStore } from '@/stores/index'
+import {nextTick, reactive, ref} from 'vue'
+import {GlobalStore} from '@/stores/index'
 import Drawer from '@/components/Drawer/index.vue'
-import { InStoreageFormTypes } from '@/hooks/useDepot'
+import {InStoreageFormTypes} from '@/hooks/useDepot'
 import InStorageProduct from './InStorageProduct.vue'
-import type { FormInstance, FormRules } from 'element-plus'
-import { Delete, CirclePlus } from '@element-plus/icons-vue'
-import { Storehouse_StockOut_EditGet,Storehouse_StockOut_Get } from '@/api/storehouse/index'
+import {CirclePlus, Delete} from '@element-plus/icons-vue'
+import {Storehouse_StockOut_EditGet, Storehouse_StockOut_Get} from '@/api/storehouse/index'
 import ImageCom from '@/components/Image/index.vue'
 import ReceiveUser from '../receiveUser.vue'
-import OutStockProduct from "@/views/storehouse/outStock/OutStockProduct.vue";
 
 const tableData = ref<any[]>([])
 const globalStore = GlobalStore()
@@ -22,101 +21,101 @@ const drawerSnEditRef = ref<InstanceType<typeof InStorageEditSn> | null>(null)
 const drawerProductRef = ref<InstanceType<typeof InStorageProduct> | null>(null)
 
 const form = reactive<InStoreageFormTypes>({
-  T_number: '',
-  T_depot_id: '',
-  T_product: '',//明细拼接
-  T_project:'',//关联项目
-  T_date: '',
-  T_receive:'',
-  T_receive_name:'',
-  T_remark: '',
+	T_number: '',
+	T_depot_id: '',
+	T_product: '',//明细拼接
+	T_project: '',//关联项目
+	T_date: '',
+	T_receive: '',
+	T_receive_name: '',
+	T_remark: '',
 
 })
 
 const validate_T_product = (rule: any, value: any, callback: any) => {
-    // console.log('验证',value)
-  if (value==undefined || value == '') {
-    callback(new Error('请填写产品数量'))
-  } else if (value.includes(null)) {
-    callback(new Error('请添加产品SN'))
-  } else {
-    callback()
-  }
+	// console.log('验证',value)
+	if (value == undefined || value == '') {
+		callback(new Error('请填写产品数量'))
+	} else if (value.includes(null)) {
+		callback(new Error('请添加产品SN'))
+	} else {
+		callback()
+	}
 }
 
 const rules = reactive<FormRules>({
-  T_product: [{ validator: validate_T_product, trigger: 'blur' }],
-  T_depot_id: [{ required: true, message: '请选择仓库', trigger: 'blur' }],
-  T_date: [{ required: true, message: '请选择出库日期', trigger: 'blur' }]
+	T_product: [{validator: validate_T_product, trigger: 'blur'}],
+	T_depot_id: [{required: true, message: '请选择仓库', trigger: 'blur'}],
+	T_date: [{required: true, message: '请选择出库日期', trigger: 'blur'}]
 })
 
 const columns = [
-  { type: 'index', label: '序号', width: 80, align: 'center ' },
-  { label: '产品图片', prop: 'T_img', align: 'center ', name: 'T_img' },
-  { label: '产品名称', prop: 'T_name', align: 'center ' },
-  { label: '产品分类', prop: 'T_class_name', align: 'center ' },
-  { label: '产品型号', prop: 'T_number', align: 'center ', ellipsis: true },
-  { label: '产品规格', prop: 'T_spec', align: 'center ' },
-  { label: '是否关联SN', prop: 'T_relation_sn', align: 'center ', width: 120, name: 'T_relation_sn' },
-  { label: '*数量', prop: 'count', align: 'center ', name: 'count' },
-  { label: '*关联设备', prop: 'sn', align: 'center ', name: 'sn' },
-  { prop: 'operation', label: '操作', width: 80, fixed: 'right' }
+	{type: 'index', label: '序号', width: 80, align: 'center '},
+	{label: '产品图片', prop: 'T_img', align: 'center ', name: 'T_img'},
+	{label: '产品名称', prop: 'T_name', align: 'center '},
+	{label: '产品分类', prop: 'T_class_name', align: 'center '},
+	{label: '产品型号', prop: 'T_number', align: 'center ', ellipsis: true},
+	{label: '产品规格', prop: 'T_spec', align: 'center '},
+	{label: '是否关联SN', prop: 'T_relation_sn', align: 'center ', width: 120, name: 'T_relation_sn'},
+	{label: '*数量', prop: 'count', align: 'center ', name: 'count'},
+	{label: '*关联设备', prop: 'sn', align: 'center ', name: 'sn'},
+	{prop: 'operation', label: '操作', width: 80, fixed: 'right'}
 ]
 
 const countBlurHandle = () => {
-  form.T_product = tableData.value.map(item => {
-    if (!item.count && item.T_relation_sn !== 1) return undefined
-    return `${item.Id},${item.count}|`
-  })
+	form.T_product = tableData.value.map(item => {
+		if (!item.count && item.T_relation_sn !== 1) return undefined
+		return `${item.T_product_id},${item.count}|`
+	})
 }
 const getDeviceSnToProduct = () => {
-    const DeviceSnData: any = drawerSnEditRef.value?.getDeviceSn()
-    const isEmpty = determineSNorCount(DeviceSnData)
-    if (isEmpty && isEmpty === 'count') return [undefined]
-    if (isEmpty && isEmpty === 'sn') return [null]
-    let arr = [...tableData.value]
-    let mapArr:any = []
-    let flag = false
-    for (const item of arr) {
-        if(item.count==0){
-            flag = true
-            break;
-        }
-        mapArr.push(item.T_product_id + '-' + item.count + '-' +  (item.T_device_list?item.T_device_list.join(','):''))
-    }
-    return flag?undefined:mapArr.join('|')+'|'
+	const DeviceSnData: any = drawerSnEditRef.value?.getDeviceSn()
+	const isEmpty = determineSNorCount(DeviceSnData)
+	if (isEmpty && isEmpty === 'count') return [undefined]
+	if (isEmpty && isEmpty === 'sn') return [null]
+	let arr = [...tableData.value]
+	let mapArr: any = []
+	let flag = false
+	for (const item of arr) {
+		if (item.count == 0) {
+			flag = true
+			break;
+		}
+		mapArr.push(item.T_product_id + '-' + item.count + '-' + (item.T_device_list ? item.T_device_list.join(',') : ''))
+	}
+	return flag ? undefined : mapArr.join('|') + '|'
 }
 /**
  * 判断sn or 数量是否为空
  */
 const determineSNorCount = (DeviceSnData: any) => {
-  for (const item of tableData.value) {
-    if (item.count<1 && item.T_relation_sn !== 1) return 'count'  //数量必大于0
-    // if (item.T_relation_sn === 1 && !DeviceSnData.get(item.Id) && !DeviceSnData.size) return 'sn'
-  }
-  return false
+	for (const item of tableData.value) {
+		if (item.count < 1 && item.T_relation_sn !== 1) return 'count'  //数量必大于0
+		// if (item.T_relation_sn === 1 && !DeviceSnData.get(item.Id) && !DeviceSnData.size) return 'sn'
+	}
+	return false
 }
 
 const AddInStorage = (formEl: FormInstance | undefined) => {
-    
-  if (!formEl) return
-  form.T_product = getDeviceSnToProduct()
-  formEl.validate(async valid => {
-    if (valid) {
-      const res: any = await Storehouse_StockOut_EditGet({
-        ...form
-      })
-      if (res.Code === 200) {
-        ElMessage.success('编辑成功!')
-        drawerProductRef.value?.clearSelection()
-        nextTick(() => {
-          emit('onUpdateList')
-          resetForm(ruleFormRef.value)
-          drawerRef.value?.closeDrawer()
-        })
-      }
-    }
-  })
+
+	if (!formEl) return
+	form.T_product = getDeviceSnToProduct()
+	formEl.validate(async valid => {
+		if (valid) {
+			const res: any = await Storehouse_StockOut_EditGet({
+				...form
+			})
+			if (res.Code === 200) {
+				ElMessage.success('编辑成功!')
+				drawerProductRef.value?.clearSelection()
+				nextTick(() => {
+					emit('onUpdateList')
+					resetForm(ruleFormRef.value)
+					drawerRef.value?.closeDrawer()
+				})
+			}
+		}
+	})
 }
 
 const deleteProduct = (row: any) => {
@@ -129,29 +128,33 @@ const deleteProduct = (row: any) => {
 }
 
 const callbackDrawer = (done: () => void) => {
-  resetForm(ruleFormRef.value)
-  done()
+	resetForm(ruleFormRef.value)
+	done()
 }
 /**
  * 重置表单
  */
 const resetForm = (formEl: FormInstance | undefined) => {
-  if (!formEl) return
-  drawerProductRef.value?.clearSelection()
-  drawerSnEditRef.value?.clearDeviceSn()
-  tableData.value = []
-  formEl.resetFields()
+	if (!formEl) return
+	drawerProductRef.value?.clearSelection()
+	drawerSnEditRef.value?.clearDeviceSn()
+	tableData.value = []
+	formEl.resetFields()
 }
 
 /**
  * 添加产品
  */
-const AddProductionDetailed = () => drawerProductRef.value?.openDrawer()
+const AddProductionDetailed = () => {
+	drawerProductRef.value?.openDrawer()
+	drawerProductRef.value?.getProductList()
+	// drawerProductRef.value?.getStockTotalList(form.T_depot_id)
+}
 /**
  * 单选
  */
 const ProductselectionChange = (row: any) => {
-    row.T_product_id = row.Id
+	row.T_product_id = row.Id
   const index = tableData.value.findIndex((item: any) => item.T_product_id === row.T_product_id)
   if (index === -1) {
     row.count = 0
@@ -173,65 +176,67 @@ const ProductSelectionAllChange = (selection: any[]) => {
 }
 
 
-const getStorehouseContractGet = async (Id:any) => {
-  const res: any = await Storehouse_StockOut_Get({ User_tokey: globalStore.GET_User_tokey, T_number:Id })
-  if (res.Code === 200) {
-    let arr = res.Data.T_Product
-    arr.forEach((item:any)=>{
-        tableData.value.push({
-            Id: item.Id,
-            T_class_name:item.T_product_class_name,
-            T_img:item.T_product_img,
-            T_model:item.T_number,
-            T_name: item.T_product_name,
-            count: item.T_num,
-            T_relation_sn:item.T_product_relation_sn,
-            T_spec: item.T_product_spec,
-            T_device_list:item.T_device_list,
-            T_product_id:item.T_product_id
-        })
-    })
-  }
+const getStorehouseContractGet = async (Id: any) => {
+	const res: any = await Storehouse_StockOut_Get({User_tokey: globalStore.GET_User_tokey, T_number: Id})
+	if (res.Code === 200) {
+		let arr = res.Data.T_Product
+		arr.forEach((item: any) => {
+			tableData.value.push({
+				Id: item.Id,
+				T_class_name: item.T_product_class_name,
+				T_img: item.T_product_img,
+				T_model: item.T_number,
+				T_name: item.T_product_name,
+				count: item.T_num,
+				T_relation_sn: item.T_product_relation_sn,
+				T_spec: item.T_product_spec,
+				T_device_list: item.T_device_list,
+				T_product_id: item.T_product_id
+			})
+		})
+	}
 }
 
 /**
  * 添加sn 号
  */
- 
+
 const addDeviceSn = (obj: any) => {
-    drawerSnEditRef.value?.addDeviceSn(obj.Id,1,obj.T_product_id)
-    drawerSnEditRef.value!.drawerSnRef?.openDrawer()
-    if(obj.T_device_list)drawerSnEditRef.value!.tableSnData = [...obj.T_device_list].map(item => ({ sn: item }));
+	drawerSnEditRef.value?.addDeviceSn(obj.Id, 1, obj.T_product_id)
+	drawerSnEditRef.value!.drawerSnRef?.openDrawer()
+	if (obj.T_device_list) drawerSnEditRef.value!.tableSnData = [...obj.T_device_list].map(item => ({sn: item}));
 }
 /**
  * 自动计算 count
  */
-const autoGetCount = (length: number, id: number,arr:any) => {
-  tableData.value.forEach((item: any) => {
-    if (item.Id === id) {
-        item.T_device_list = arr
-      item.count = length
-    }
-  })
+const autoGetCount = (length: number, id: number, arr: any) => {
+	tableData.value.forEach((item: any) => {
+		if (item.Id === id) {
+			item.T_device_list = arr
+			item.count = length
+		}
+	})
 }
 /**
  * 关闭 取消
  */
 const closeInStorage = () => {
-  resetForm(ruleFormRef.value)
-  drawerRef.value?.closeDrawer()
+	resetForm(ruleFormRef.value)
+	drawerRef.value?.closeDrawer()
 }
 // 注册事件
 const emit = defineEmits<{ (event: 'onUpdateList'): void }>()
 
 // 接受props
 interface ItemType {
-  T_name: string
-  Id: number
+	T_name: string
+	Id: number
 }
+
 interface PropsType {
-  options?: ItemType[]
+	options?: ItemType[]
 }
+
 const props = defineProps<PropsType>()
 /**
  * 出库调用
@@ -239,170 +244,177 @@ const props = defineProps<PropsType>()
 const openDrawer = () => drawerRef.value?.openDrawer()
 
 
-const disabledDate = (time:any)=> {  
-    const today = new Date();  
-    const isYear = today.getFullYear()//当前年
-    const isMonth = today.getMonth()+1//当前月
-    
-    const splitsYear = Number(form.T_date.split('-')[0])//已选年
-    const splitsMonth = Number(form.T_date.split('-')[1])//已选月
-    
-
-    if(isYear!==splitsYear || isMonth !==splitsMonth){
-        return true
-    }else{
-        const timeYear = time.getFullYear();  
-        const timeMonth = time.getMonth()+1; 
-        return timeYear !== isYear || timeMonth !== isMonth;   
-    }
+const disabledDate = (time: any) => {
+	const today = new Date();
+	const isYear = today.getFullYear()//当前年
+	const isMonth = today.getMonth() + 1//当前月
+
+	const splitsYear = Number(form.T_date.split('-')[0])//已选年
+	const splitsMonth = Number(form.T_date.split('-')[1])//已选月
+
+
+	if (isYear !== splitsYear || isMonth !== splitsMonth) {
+		return true
+	} else {
+		const timeYear = time.getFullYear();
+		const timeMonth = time.getMonth() + 1;
+		return timeYear !== isYear || timeMonth !== isMonth;
+	}
 }
 
 const receiveUserdialog = ref<InstanceType<typeof ReceiveUser> | null>(null)
 /**
  * 选择经办人
  */
- const selectApprover = () => receiveUserdialog.value?.openDrawer()
-const getReceiveInfo = ({ T_uuid, T_name }: { T_uuid: string; T_name: string }) => {
-  form.T_receive_name = T_name
-  form.T_receive = T_uuid
+const selectApprover = () => receiveUserdialog.value?.openDrawer()
+const getReceiveInfo = ({T_uuid, T_name}: { T_uuid: string; T_name: string }) => {
+	form.T_receive_name = T_name
+	form.T_receive = T_uuid
 }
 
 defineExpose({
-  openDrawer,getStorehouseContractGet,form
+	openDrawer, getStorehouseContractGet, form
 })
 </script>
 <template>
-  <div class="inStorage-form">
-    <Drawer ref="drawerRef" :handleClose="callbackDrawer" size="80%">
-      <template #header="{ params }">
-        <h4 :id="params.titleId" :class="params.titleClass">编辑</h4>
-      </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" />
-        </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" :disabled="true" clearable placeholder="请选择出库仓库~">
-            <el-option v-for="item in props.options" :key="item.Id" :label="item.T_name" :value="item.Id" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="出库日期:" :label-width="formLabelWidth" prop="T_date">
-          <el-date-picker
-            class="my-date-picker"
-            style="width: 21.5rem"
-            v-model="form.T_date"
-            type="date"
-            placeholder="选择日期"
-            format="YYYY-MM-DD"
-            value-format="YYYY-MM-DD"
-            :disabledDate="disabledDate"
-            :clearable="false"
-          />
-        </el-form-item>
-        <el-form-item label="关联项目:" :label-width="formLabelWidth" prop="T_project">
-          <el-input v-model="form.T_project" type="text" placeholder="关联项目" class="w-50" />
-        </el-form-item>
-
-        <el-form-item label="经办人:" :label-width="formLabelWidth" prop="T_number">
-            <el-input v-model="form.T_receive_name" placeholder="请选择经办人" class="w-50" @focus="selectApprover" />
-        </el-form-item>
-
-        <el-form-item label="出库明细:" :label-width="formLabelWidth" prop="T_product">
-          <el-table
-            :data="tableData"
-            style="width: 100%"
-            border
-            stripe
-            :header-cell-style="{
+	<div class="inStorage-form">
+		<Drawer ref="drawerRef" :handleClose="callbackDrawer" size="80%">
+			<template #header="{ params }">
+				<h4 :id="params.titleId" :class="params.titleClass">编辑</h4>
+			</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"/>
+				</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" :disabled="true" clearable
+							   placeholder="请选择出库仓库~">
+						<el-option v-for="item in props.options" :key="item.Id" :label="item.T_name" :value="item.Id"/>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="出库日期:" :label-width="formLabelWidth" prop="T_date">
+					<el-date-picker
+						class="my-date-picker"
+						style="width: 21.5rem"
+						v-model="form.T_date"
+						type="date"
+						placeholder="选择日期"
+						format="YYYY-MM-DD"
+						value-format="YYYY-MM-DD"
+						:disabledDate="disabledDate"
+						:clearable="false"
+					/>
+				</el-form-item>
+				<el-form-item label="关联项目:" :label-width="formLabelWidth" prop="T_project">
+					<el-input v-model="form.T_project" type="text" placeholder="关联项目" class="w-50"/>
+				</el-form-item>
+
+				<el-form-item label="经办人:" :label-width="formLabelWidth" prop="T_number">
+					<el-input v-model="form.T_receive_name" placeholder="请选择经办人" class="w-50"
+							  @focus="selectApprover"/>
+				</el-form-item>
+
+				<el-form-item label="出库明细:" :label-width="formLabelWidth" prop="T_product">
+					<el-table
+						:data="tableData"
+						style="width: 100%"
+						border
+						stripe
+						:header-cell-style="{
               background: '#dedfe0',
               height: '50px'
             }"
-          >
-            <template v-for="item in columns" :key="item.prop">
-              <el-table-column show-overflow-tooltip v-bind="item" v-if="item.fixed !== 'right' && !item.ellipsis">
-                <template #header v-if="item.prop === 'count' || item.prop === 'sn'">
-                  <span style="color: red">{{ item.label }}</span>
-                </template>
-                <template #default="{ row }" v-if="item.prop === item.name">
-                  <el-input
-                    v-if="item.prop === 'count' && row.T_relation_sn !== 1"
-                    v-model.number="row.count"
-                    type="text"
-                    autocomplete="off"
-                    @blur="countBlurHandle"
-                  />
-                  <div v-if="item.prop === 'sn'">
-                    <el-button
-                      v-if="row.T_relation_sn === 1"
-                      link
-                      type="primary"
-                      size="small"
-                      :icon="CirclePlus"
-                      @click="addDeviceSn(row)"
-                      >添加</el-button
-                    >
-                    <span v-else>-</span>
-                  </div>
-                  
-                  <span v-if="item.prop === 'T_relation_sn'">
+					>
+						<template v-for="item in columns" :key="item.prop">
+							<el-table-column show-overflow-tooltip v-bind="item"
+											 v-if="item.fixed !== 'right' && !item.ellipsis">
+								<template #header v-if="item.prop === 'count' || item.prop === 'sn'">
+									<span style="color: red">{{ item.label }}</span>
+								</template>
+								<template #default="{ row }" v-if="item.prop === item.name">
+									<el-input
+										v-if="item.prop === 'count' && row.T_relation_sn !== 1"
+										v-model.number="row.count"
+										type="text"
+										autocomplete="off"
+										@blur="countBlurHandle"
+									/>
+									<div v-if="item.prop === 'sn'">
+										<el-button
+											v-if="row.T_relation_sn === 1"
+											link
+											type="primary"
+											size="small"
+											:icon="CirclePlus"
+											@click="addDeviceSn(row)"
+										>添加
+										</el-button
+										>
+										<span v-else>-</span>
+									</div>
+
+									<span v-if="item.prop === 'T_relation_sn'">
                     <el-tag v-if="row.T_relation_sn === 1" effect="dark">是</el-tag>
                     <el-tag v-else type="success" effect="dark">否</el-tag>
                   </span>
-                  <ImageCom v-if="item.prop == 'T_img'" :src="row.T_img" />
-                </template>
-              </el-table-column>
-              <el-table-column show-overflow-tooltip v-if="item.ellipsis && item.prop === 'T_model'" v-bind="item">
-                <template #default="{ row }">
-                  <el-tooltip effect="dark" :content="row.T_model" placement="bottom">
-                    {{ row.T_model }}
-                  </el-tooltip>
-                </template>
-              </el-table-column>
-              <el-table-column v-bind="item" v-if="item.fixed === 'right'">
-                <template #default="{ row }">
-                  <el-button link type="danger" size="small" :icon="Delete" @click="deleteProduct(row)">删除</el-button>
-                </template>
-              </el-table-column>
-            </template>
-            <template #append>
-              <el-button type="primary" @click="AddProductionDetailed">
-                <el-icon><Plus /></el-icon><span style="margin-left: 6px">添加产品</span>
-              </el-button>
-            </template>
-          </el-table>
-        </el-form-item>
-        <el-form-item label="备注:" :label-width="formLabelWidth" prop="T_remark">
-          <el-input
-            v-model="form.T_remark"
-            :autosize="{ minRows: 4, maxRows: 6 }"
-            type="textarea"
-            placeholder="请输入备注信息"
-          />
-        </el-form-item>
-        <div class="btn">
-          <el-divider>
-            <el-button @click="closeInStorage">取消</el-button>
-            <el-button color="#626aef" @click="AddInStorage(ruleFormRef)">提交</el-button>
-          </el-divider>
-        </div>
-        <InStorageEditSn ref="drawerSnEditRef" @onCount="autoGetCount" />
-
-      </el-form>
-    </Drawer>
-    <ReceiveUser ref="receiveUserdialog" :dept_leader="0" @onUserInfo="getReceiveInfo" title="选择经办人" />
-<!--	  <OutStockProduct-->
-<!--		  ref="drawerProductRef"-->
-<!--		  :depotId="form.T_depot_id"-->
-<!--		  @ontableData="ProductselectionChange"-->
-<!--		  @ontableDataAll="ProductSelectionAllChange"-->
-<!--	  />-->
-	  <InStorageProduct
-		  ref="drawerProductRef"
-		  @ontableData="ProductselectionChange"
-		  @ontableDataAll="ProductSelectionAllChange"
-	  />
-
-  </div>
+									<ImageCom v-if="item.prop == 'T_img'" :src="row.T_img"/>
+								</template>
+							</el-table-column>
+							<el-table-column show-overflow-tooltip v-if="item.ellipsis && item.prop === 'T_model'"
+											 v-bind="item">
+								<template #default="{ row }">
+									<el-tooltip effect="dark" :content="row.T_model" placement="bottom">
+										{{ row.T_model }}
+									</el-tooltip>
+								</template>
+							</el-table-column>
+							<el-table-column v-bind="item" v-if="item.fixed === 'right'">
+								<template #default="{ row }">
+									<el-button link type="danger" size="small" :icon="Delete"
+											   @click="deleteProduct(row)">删除
+									</el-button>
+								</template>
+							</el-table-column>
+						</template>
+						<template #append>
+							<el-button type="primary" @click="AddProductionDetailed">
+								<el-icon>
+									<Plus/>
+								</el-icon>
+								<span style="margin-left: 6px">添加产品</span>
+							</el-button>
+						</template>
+					</el-table>
+				</el-form-item>
+				<el-form-item label="备注:" :label-width="formLabelWidth" prop="T_remark">
+					<el-input
+						v-model="form.T_remark"
+						:autosize="{ minRows: 4, maxRows: 6 }"
+						type="textarea"
+						placeholder="请输入备注信息"
+					/>
+				</el-form-item>
+				<div class="btn">
+					<el-divider>
+						<el-button @click="closeInStorage">取消</el-button>
+						<el-button color="#626aef" @click="AddInStorage(ruleFormRef)">提交</el-button>
+					</el-divider>
+				</div>
+				<InStorageEditSn ref="drawerSnEditRef" @onCount="autoGetCount"/>
+
+			</el-form>
+		</Drawer>
+		<ReceiveUser ref="receiveUserdialog" :dept_leader="0" @onUserInfo="getReceiveInfo" title="选择经办人"/>
+		<InStorageProduct
+			ref="drawerProductRef"
+			:depotId="form.T_depot_id"
+			:selectProductData="tableData"
+			@ontableData="ProductselectionChange"
+			@ontableDataAll="ProductSelectionAllChange"
+		/>
+
+	</div>
 </template>
 <style scoped lang="scss">
 </style>

+ 238 - 186
src/views/storehouse/outStock/modules/InStorageProduct.vue

@@ -1,15 +1,16 @@
 <script setup lang="ts">
 import {
-  Storehouse_Product_List,
-  Storehouse_ProductClass_List,
-  Storehouse_Product_Model_List,
-  Storehouse_Product_Name_List
+	Storehouse_Product_List,
+	Storehouse_Product_Model_List,
+	Storehouse_Product_Name_List,
+	Storehouse_ProductClass_List,
+	Storehouse_Stock_List
 } from '@/api/storehouse/index'
-import { ElMessage } from 'element-plus'
-import { GlobalStore } from '@/stores/index'
+import {ElMessage} from 'element-plus'
+import {GlobalStore} from '@/stores/index'
 import Drawer from '@/components/Drawer/index.vue'
-import { ref, reactive, onMounted, nextTick } from 'vue'
-import { default as vElTableInfiniteScroll } from 'el-table-infinite-scroll'
+import {computed, nextTick, onMounted, reactive, ref} from 'vue'
+import {default as vElTableInfiniteScroll} from 'el-table-infinite-scroll'
 import ImageCom from '@/components/Image/index.vue'
 
 let total = 0
@@ -21,49 +22,58 @@ const NameOptions = ref<any[]>([])
 const classOptions = ref<any[]>([])
 const modelOptions = ref<any[]>([])
 const tableProductData = ref<any[]>([])
+const productList = ref<any[]>([])
+const tableStockData:any = ref([])
 const drawerProductRef = ref<InstanceType<typeof Drawer> | null>(null)
 
+
+// props
+const props = defineProps<{ selectProductData?: any[], depotId: any }>()
+const selectProductData = ref(props.selectProductData)
+const emit = defineEmits<{ (event: 'ontableData', value: any): void; (event: 'ontableDataAll', value: any[]): void }>()
+
+
 const initParam = reactive({
-  User_tokey: globalStore.GET_User_tokey,
-  T_name: '',
-  T_model: '',
-  T_class: '',
-  page: 1,
-  page_z: 20
+	User_tokey: globalStore.GET_User_tokey,
+	T_name: '',
+	T_model: '',
+	T_class: '',
+	page: 1,
+	page_z: 20
 })
 const callbackProductDrawer = (done: () => void) => done()
 const querySearchAsync = async (queryString: string) => {
-  if (queryString) {
-    loading.value = true
-    globalStore.SET_isloading(true)
-    const results = await getNameAsync(queryString)
-    NameOptions.value = results
-    globalStore.SET_isloading(false)
-    loading.value = false
-  }
+	if (queryString) {
+		loading.value = true
+		globalStore.SET_isloading(true)
+		const results = await getNameAsync(queryString)
+		NameOptions.value = results
+		globalStore.SET_isloading(false)
+		loading.value = false
+	}
 }
 
 const getProductModelList = async () => {
-  globalStore.SET_isloading(true)
-  const res: any = await Storehouse_Product_Model_List({ T_name: autoSelect.value })
-  modelOptions.value = res.Data.map((item: any, index: number) => {
-    return {
-      value: item,
-      index: index
-    }
-  })
-  globalStore.SET_isloading(false)
+	globalStore.SET_isloading(true)
+	const res: any = await Storehouse_Product_Model_List({T_name: autoSelect.value})
+	modelOptions.value = res.Data.map((item: any, index: number) => {
+		return {
+			value: item,
+			index: index
+		}
+	})
+	globalStore.SET_isloading(false)
 }
 const handleSelect = (item: any) => {
-  initParam.T_name = item
-  getProductModelList()
+	initParam.T_name = item
+	getProductModelList()
 }
 // 搜索模型
 const searchModelHandle = () => {
-  total = 0
-  initParam.page = 1
-  tableProductData.value = []
-  getProductList()
+	total = 0
+	initParam.page = 1
+	tableProductData.value = []
+	getProductList()
 }
 
 // 保存选中的数据id,row-key就是要指定一个key标识这一行的数据
@@ -73,200 +83,242 @@ const getRowKey = (row: any) => {
 
 // 加载第二个抽屉数据
 const load = () => {
-  if (initParam.page && total === tableProductData.value.length) {
-    ElMessage.warning('没有更多数据了!!')
-    return
-  }
-  initParam.page++
-  getProductList()
+	// if (initParam.page && total === tableProductData.value.length) {
+	// 	ElMessage.warning('没有更多数据了!!')
+	// 	return
+	// }
+	// initParam.page++
+	// getProductList()
 }
 // 勾选产品
 const ProductselectionChange = (selection: any[], row: any) => emit('ontableData', row)
 const ProductSelectionAllChange = (selection: any[]) => emit('ontableDataAll', selection)
 
 const getNameAsync = async (str: string): Promise<any> => {
-  const res: any = await Storehouse_Product_Name_List({ T_name: str, T_class: initParam.T_class })
-  if (!res.Data) return
-  return res.Data.map((item: any, index: number) => {
-    return {
-      value: item,
-      index: index
-    }
-  })
+	const res: any = await Storehouse_Product_Name_List({T_name: str, T_class: initParam.T_class})
+	if (!res.Data) return
+	return res.Data.map((item: any, index: number) => {
+		return {
+			value: item,
+			index: index
+		}
+	})
 }
+
+/**
+ * 获取产品列表
+ */
+const getStockTotalList =  async(depotId: number) => {
+
+	 return new Promise( (reslove:any)=>{
+		 Storehouse_Stock_List({...initParam, page_z: 9999, T_depot_id: depotId}).then((res:any)=>{
+			 reslove(res.Data.Data)
+		 })
+	})
+
+}
+
 // 获取产品的列表
 const getProductList = async () => {
-  const res: any = await Storehouse_Product_List({ ...initParam, T_name: autoSelect.value })
-  tableProductData.value.push(...res.Data.Data)
-  total = res.Data.Num
-  if (selectProductData.value?.length) {
-    // 设置产品的选中
-    tableProductData.value.forEach((row: any) => {
-      const matchedIndex = selectProductData.value?.findIndex((item: any) => item.Id == row.Id)
-      selectTable.value?.toggleRowSelection(row, matchedIndex != -1)
-    })
-  }
+	const res: any = await Storehouse_Product_List({...initParam, page_z: 9999, T_name: autoSelect.value})
+	tableProductData.value=[...res.Data.Data || []]
+	tableStockData.value = await getStockTotalList(props.depotId)
+
+	// 创建 Map 存储 arr2 中对象,键为 Id
+	const idMap = new Map(tableProductData.value.map(item => [item.Id, item]));
+	// 生成合并后的新数组
+	productList.value = tableStockData.value
+		.filter((item: any) => idMap.has(item.T_product_id))  // 筛选存在对应关系的数据
+		.map((item: any) => ({
+			...item,
+			...idMap.get(item.T_product_id)  // 合并两个数据源
+		}));
+
+	// tableProductData.value.push(...arr2)
+
+	total = res.Data.Num
+	if (selectProductData.value?.length) {
+		// 设置产品的选中
+		productList.value.forEach((row: any) => {
+			setTimeout(() => {
+				const matchedIndex = selectProductData.value?.findIndex((item: any) => item.T_product_id == row.Id)
+				selectTable.value?.toggleRowSelection(row, matchedIndex != -1)
+			});
+		})
+	}
 }
 
 // 获取产品分类
 const getProductClassList = async () => {
-  const res: any = await Storehouse_ProductClass_List({ page: 1, page_z: 999 })
-  classOptions.value = res.Data.Data
+	const res: any = await Storehouse_ProductClass_List({page: 1, page_z: 999})
+	classOptions.value = res.Data.Data
 }
 
 onMounted(() => {
-  getProductList()
-  !classOptions.value.length && getProductClassList()
+	// getProductList()
+	!classOptions.value.length && getProductClassList()
 })
 
 const productColumns = [
-  { type: 'selection', width: 80 },
-  { prop: 'T_img', label: '产品图片', name: 'T_img' },
-  { prop: 'T_name', label: '产品名称' },
-  { prop: 'T_class_name', label: '产品分类' },
-  { prop: 'T_model', label: '产品型号', ellipsis: true },
-  { prop: 'T_spec', label: '产品规格' },
-  { prop: 'T_relation_sn', label: '关联SN', name: 'T_relation_sn' },
-  { prop: 'T_remark', label: '备注', ellipsis: true }
+	{type: 'selection', width: 80},
+	{prop: 'T_img', label: '产品图片', name: 'T_img'},
+	{prop: 'T_name', label: '产品名称'},
+	{prop: 'T_class_name', label: '产品分类'},
+	{prop: 'T_model', label: '产品型号', ellipsis: true},
+	{prop: 'T_spec', label: '产品规格'},
+	{prop: 'T_relation_sn', label: '关联SN', name: 'T_relation_sn'},
+	{prop: 'T_total', label: '库存数量'},
+	{prop: 'T_remark', label: '备注', ellipsis: true}
 ]
 
+
 const openDrawer = () => drawerProductRef.value?.openDrawer()
 const clearSelection = () => {
-  initParam.page = 1
-  tableProductData.value = []
-  selectTable.value?.clearSelection()
+	initParam.page = 1
+	tableProductData.value = []
+	selectTable.value?.clearSelection()
 }
 const selectTableChange = (row: any) => {
-  nextTick(() => {
-    selectTable.value?.toggleRowSelection(row, false)
-  })
+	nextTick(() => {
+		selectTable.value?.toggleRowSelection(row, false)
+	})
 }
 
-// props
-const props = defineProps<{ selectProductData?: any[] }>()
-const selectProductData = ref(props.selectProductData)
-const emit = defineEmits<{ (event: 'ontableData', value: any): void; (event: 'ontableDataAll', value: any[]): void }>()
 
 defineExpose({
-  openDrawer,
-  clearSelection,
-  selectTableChange
+	openDrawer,
+	clearSelection,
+	selectTableChange,
+	getProductList,
+	getStockTotalList
 })
 </script>
 
 <template>
-  <Drawer ref="drawerProductRef" :handleClose="callbackProductDrawer" size="70%">
-    <template #header="{ params }">
-      <h4 :id="params.titleId" :class="params.titleClass">选择产品</h4>
-    </template>
-    <el-card class="box-card" shadow="never">
-      <template #header>
-        <div class="input-suffix">
-          <el-row :gutter="20" style="margin-bottom: 0">
-            <el-col :xl="5" :lg="8" :md="10" class="d-flex">
-              <span class="inline-flex items-center">产品分类:</span>
-              <el-select v-model="initParam.T_class" clearable placeholder="请选择分类~">
-                <el-option v-for="item in classOptions" :key="item.Id" :label="item.T_name" :value="item.Id" />
-              </el-select>
-            </el-col>
-            <el-col :xl="7" :lg="8" :md="10" class="d-flex">
-              <span class="inline-flex items-center">产品名称:</span>
-              <el-select
-                v-model="autoSelect"
-                filterable
-                clearable
-                remote
-                reserve-keyword
-                placeholder="按产品名称搜索"
-                remote-show-suffix
-                :remote-method="querySearchAsync"
-                :loading="loading"
-                @change="handleSelect"
-              >
-                <el-option v-for="item in NameOptions" :key="item.value" :label="item.value" :value="item.value" />
-              </el-select>
-            </el-col>
-            <el-col :xl="7" :lg="8" :md="12" class="d-flex">
-              <span class="inline-flex items-center">产品型号:</span>
-              <el-select v-model="initParam.T_model" clearable placeholder="请选择型号~">
-                <el-option v-for="item in modelOptions" :key="item.index" :label="item.value" :value="item.value" />
-              </el-select>
-              <el-button type="primary" @click="searchModelHandle">搜索</el-button>
-            </el-col>
-          </el-row>
-        </div>
-      </template>
-      <el-table
-        ref="selectTable"
-        :row-key="getRowKey"
-        :data="tableProductData"
-        style="width: 100%; height: 99%"
-        :header-cell-style="{
+	<Drawer ref="drawerProductRef" :handleClose="callbackProductDrawer" size="70%">
+		<template #header="{ params }">
+			<h4 :id="params.titleId" :class="params.titleClass">选择产品</h4>
+		</template>
+		<el-card class="box-card" shadow="never">
+			<template #header>
+				<div class="input-suffix">
+					<el-row :gutter="20" style="margin-bottom: 0">
+						<el-col :xl="5" :lg="8" :md="10" class="d-flex">
+							<span class="inline-flex items-center">产品分类:</span>
+							<el-select v-model="initParam.T_class" clearable placeholder="请选择分类~">
+								<el-option v-for="item in classOptions" :key="item.Id" :label="item.T_name"
+										   :value="item.Id"/>
+							</el-select>
+						</el-col>
+						<el-col :xl="7" :lg="8" :md="10" class="d-flex">
+							<span class="inline-flex items-center">产品名称:</span>
+							<el-select
+								v-model="autoSelect"
+								filterable
+								clearable
+								remote
+								reserve-keyword
+								placeholder="按产品名称搜索"
+								remote-show-suffix
+								:remote-method="querySearchAsync"
+								:loading="loading"
+								@change="handleSelect"
+							>
+								<el-option v-for="item in NameOptions" :key="item.value" :label="item.value"
+										   :value="item.value"/>
+							</el-select>
+						</el-col>
+						<el-col :xl="7" :lg="8" :md="12" class="d-flex">
+							<span class="inline-flex items-center">产品型号:</span>
+							<el-select v-model="initParam.T_model" clearable placeholder="请选择型号~">
+								<el-option v-for="item in modelOptions" :key="item.index" :label="item.value"
+										   :value="item.value"/>
+							</el-select>
+							<el-button type="primary" @click="searchModelHandle">搜索</el-button>
+						</el-col>
+					</el-row>
+				</div>
+			</template>
+			<el-table
+				ref="selectTable"
+				:row-key="getRowKey"
+				:data="productList"
+				style="width: 100%; height: 99%"
+				:header-cell-style="{
           background: '#dedfe0',
           height: '50px'
         }"
-        v-el-table-infinite-scroll="load"
-        :infinite-scroll-immediate="false"
-        infinite-scroll-distance="'50px'"
-        @select="ProductselectionChange"
-        @select-all="ProductSelectionAllChange"
-      >
-        <template v-for="item in productColumns" :key="item">
-          <el-table-column v-if="item.type === 'index' || item.type === 'selection'" align="center" v-bind="item" />
-          <el-table-column show-overflow-tooltip v-if="!item.ellipsis && item.prop" v-bind="item">
-            <template #default="{ row }">
+				v-el-table-infinite-scroll="load"
+				:infinite-scroll-immediate="false"
+				infinite-scroll-distance="'50px'"
+				@select="ProductselectionChange"
+				@select-all="ProductSelectionAllChange"
+			>
+				<template v-for="item in productColumns" :key="item">
+					<el-table-column v-if="item.type === 'index' || item.type === 'selection'" align="center"
+									 v-bind="item"/>
+					<el-table-column show-overflow-tooltip v-if="!item.ellipsis && item.prop" v-bind="item">
+						<template #default="{ row }">
               <span v-if="item.prop === 'T_relation_sn'">
                 <el-tag v-if="row.T_relation_sn === 1" effect="dark">是</el-tag>
                 <el-tag v-else type="success" effect="dark">否</el-tag>
               </span>
-              <ImageCom v-if="item.prop === 'T_img'" :src="row.T_img" />
-            </template>
-          </el-table-column>
-          <el-table-column show-overflow-tooltip v-if="item.ellipsis && item.prop === 'T_model'" align="center" v-bind="item">
-            <template #default="{ row }">
-              <el-tooltip effect="dark" :content="row.T_model" placement="bottom">
-                {{ row.T_model }}
-              </el-tooltip>
-            </template>
-          </el-table-column>
-          <el-table-column show-overflow-tooltip v-if="item.ellipsis && item.prop === 'T_remark'" align="center" v-bind="item">
-            <template #default="{ row }">
-              <el-tooltip effect="customized" placement="left">
-                <template #content>
-                  <div class="tooltip-content">{{ row.T_remark }}</div>
-                </template>
-                {{ row.T_remark }}
-              </el-tooltip>
-            </template>
-          </el-table-column>
-        </template>
-      </el-table>
-    </el-card>
-  </Drawer>
+							<ImageCom v-if="item.prop === 'T_img'" :src="row.T_img"/>
+						</template>
+					</el-table-column>
+					<el-table-column show-overflow-tooltip v-if="item.ellipsis && item.prop === 'T_model'"
+									 align="center" v-bind="item">
+						<template #default="{ row }">
+							<el-tooltip effect="dark" :content="row.T_model" placement="bottom">
+								{{ row.T_model }}
+							</el-tooltip>
+						</template>
+					</el-table-column>
+					<el-table-column show-overflow-tooltip v-if="item.ellipsis && item.prop === 'T_remark'"
+									 align="center" v-bind="item">
+						<template #default="{ row }">
+							<el-tooltip effect="customized" placement="left">
+								<template #content>
+									<div class="tooltip-content">{{ row.T_remark }}</div>
+								</template>
+								{{ row.T_remark }}
+							</el-tooltip>
+						</template>
+					</el-table-column>
+				</template>
+			</el-table>
+		</el-card>
+	</Drawer>
 </template>
 
 <style scoped lang="scss">
 .tooltip-content {
-  max-width: 500px;
-  overflow-y: auto;
+	max-width: 500px;
+	overflow-y: auto;
 }
+
 .box-card {
-  height: 100%;
-  :deep(.el-card__body) {
-    height: calc(100% - 70px);
-  }
-  .sn-header {
-    display: flex;
-    justify-content: end;
-  }
-  .input-suffix {
-    width: 100%;
-    .inline-flex {
-      white-space: nowrap;
-    }
-    .d-flex {
-      display: flex;
-    }
-  }
+	height: 100%;
+
+	:deep(.el-card__body) {
+		height: calc(100% - 70px);
+	}
+
+	.sn-header {
+		display: flex;
+		justify-content: end;
+	}
+
+	.input-suffix {
+		width: 100%;
+
+		.inline-flex {
+			white-space: nowrap;
+		}
+
+		.d-flex {
+			display: flex;
+		}
+	}
 }
 </style>