validation.vue 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196
  1. <script setup lang="ts">
  2. import {
  3. exportFile,
  4. exportOperationFile,
  5. readValidation,
  6. updateValidation,
  7. uploadFile,
  8. validation_add,
  9. validation_del,
  10. validation_List,
  11. validation_operationList,
  12. validation_recordList,
  13. validation_update,
  14. validationTool_class_list
  15. } from '@/api/storehouse'
  16. import {User_List} from '@/api/user/index';
  17. import TableBase from '@/components/TableBase/index.vue'
  18. import {computed, nextTick, onMounted, reactive, ref} from 'vue'
  19. import {GlobalStore} from '@/stores'
  20. import type {ColumnProps} from '@/components/TableBase/interface'
  21. import {Delete, Edit, View} from '@element-plus/icons-vue'
  22. import type {FormInstance, UploadInstance} from 'element-plus'
  23. import {ElLoading, ElMessage, ElMessageBox} from 'element-plus'
  24. import snAdd from './modules/snAdd.vue'
  25. import Drawer from "@/components/Drawer/index.vue";
  26. const formLabelWidth = ref('100px')
  27. const uploadRef = ref<UploadInstance>()
  28. const uploadFiles = ref<File[]>([]) // 新增:用于存储上传的文件
  29. const globalStore = GlobalStore()
  30. const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
  31. const recordTableRef = ref<InstanceType<typeof TableBase> | null>(null)
  32. const operationTableRef = ref<InstanceType<typeof TableBase> | null>(null)
  33. const drawerSnRef = ref<InstanceType<typeof Drawer> | null>(null)
  34. const initParam = reactive({
  35. User_tokey: globalStore.GET_User_tokey,
  36. Validationnumber: '',
  37. T_state: '',
  38. T_sn: '',
  39. T_imei: '',
  40. T_iccid: '',
  41. LendUser: '',
  42. T_project: '',
  43. T_class: ''
  44. })
  45. const recordInitParam = reactive({
  46. User_tokey: globalStore.GET_User_tokey,
  47. Validationnumber: '',
  48. T_state: '',
  49. T_sn: '',
  50. T_imei: '',
  51. T_iccid: '',
  52. LendUser: '',
  53. T_project: '',
  54. T_class: ''
  55. })
  56. const operationInitParam = reactive({
  57. User_tokey: globalStore.GET_User_tokey,
  58. T_state: '',
  59. T_sn: '',
  60. LendUser: '',
  61. T_project: '',
  62. })
  63. const columns: ColumnProps[] = [
  64. {type: 'index', label: '序号', width: 80},
  65. {prop: 'Validationnumber', label: '设备编号', ellipsis: true},
  66. {prop: 'T_sn', label: '设备SN', ellipsis: true, width: 180},
  67. {prop: 'T_imei', label: '模组imei', ellipsis: true},
  68. {prop: 'T_iccid', label: '物联网卡号', ellipsis: true},
  69. {prop: 'T_state', label: '状态', name: 'T_state'},
  70. {prop: 'T_class', label: '设备类型', name: 'T_class'},
  71. {prop: 'LendUser', label: '借出人', ellipsis: true},
  72. {prop: 'T_project', label: '借出项目', ellipsis: true},
  73. {prop: 'T_remark', label: '备注', ellipsis: true},
  74. {prop: 'operation', label: '操作', width: 260, fixed: 'right'}
  75. ]
  76. const recordColumns: ColumnProps[] = [
  77. {type: 'index', label: '序号', width: 80},
  78. {prop: 'Validationnumber', label: '设备编号', ellipsis: true},
  79. {prop: 'T_sn', label: '设备SN', ellipsis: true, width: 180},
  80. {prop: 'T_imei', label: '模组imei', ellipsis: true},
  81. {prop: 'T_iccid', label: '物联网卡号', ellipsis: true},
  82. {prop: 'T_state', label: '状态', name: 'T_state'},
  83. {prop: 'T_class', label: '设备类型', name: 'T_class'},
  84. {prop: 'LendUser', label: '借出(归还)人', ellipsis: true},
  85. {prop: 'T_project', label: '关联项目', ellipsis: true},
  86. {prop: 'T_remark', label: '备注', ellipsis: true},
  87. {prop: 'CreateTime', label: '操作时间', ellipsis: true},
  88. ]
  89. const operationColumns: ColumnProps[] = [
  90. {type: 'index', label: '序号', width: 80},
  91. {prop: 'BatchNumber', label: '操作时间', width: 190},
  92. {prop: 'T_state', label: '操作', name: 'T_state', width: 90},
  93. {prop: 'LendUser', label: '借出(归还)人', ellipsis: true},
  94. {prop: 'T_project', label: '关联项目', name: 'T_project', ellipsis: true, width: 300},
  95. {prop: 'T_remark', label: '备注', ellipsis: true},
  96. {prop: 'T_sn_quantity', label: '设备数量'},
  97. {prop: 'operation', label: 'SN', width: 100, fixed: 'right', align: 'center'}
  98. ]
  99. const snColumns = [
  100. {type: 'index', label: '序号', width: 80, align: 'center '},
  101. {label: '关联项目', prop: 'T_project', align: 'center '},
  102. {label: '数量', prop: 'T_number', align: 'center '},
  103. {label: 'SN', prop: 'T_sn', align: 'center '}
  104. ]
  105. // 搜索
  106. const options = reactive([
  107. {name: '已出库', id: 1},
  108. {name: '未出库', id: 2},
  109. {name: '维修中', id: 3},
  110. {name: '已报废', id: 4},
  111. {name: '已损坏', id: 5}
  112. ])
  113. const searchHandle = () => {
  114. TableRef.value?.searchTable()
  115. }
  116. const recordSearchHandle = () => {
  117. recordTableRef.value?.searchTable()
  118. }
  119. const operationSearchHandle = () => {
  120. operationTableRef.value?.searchTable()
  121. }
  122. /**
  123. * 删除
  124. */
  125. const deleteFun = (row: any) => {
  126. ElMessageBox.confirm('删除操作,是否立即删除?', '删除', {
  127. confirmButtonText: '立即删除',
  128. cancelButtonText: '取消',
  129. type: 'warning',
  130. center: true
  131. })
  132. .then(async () => {
  133. const result: any = await validation_del({t_sn: row})
  134. if (result.Code == 200) {
  135. ElMessage.success('删除成功')
  136. TableRef.value?.searchTable()
  137. }
  138. })
  139. // eslint-disable-next-line @typescript-eslint/no-empty-function
  140. .catch(() => {
  141. })
  142. }
  143. //导出文件excel
  144. const exportExcel = async () => {
  145. try {
  146. const response: any = await exportFile({
  147. User_tokey: globalStore.GET_User_tokey,
  148. Validationnumber: initParam.Validationnumber,
  149. T_state: initParam.T_state,
  150. T_sn: initParam.T_sn,
  151. T_imei: initParam.T_imei,
  152. T_iccid: initParam.T_iccid,
  153. LendUser: initParam.LendUser,
  154. T_project: initParam.T_project,
  155. T_class: initParam.T_class
  156. })
  157. // 处理返回的二进制文件并触发下载
  158. const blob = new Blob([response], {type: 'application/vnd.ms-excel;charset=utf8'})
  159. const url = window.URL.createObjectURL(blob)
  160. const a = document.createElement('a')
  161. a.href = url
  162. const now = new Date();
  163. const formattedDate = `${now.getFullYear()}${(now.getMonth() + 1).toString().padStart(2, '0')}${now.getDate().toString().padStart(2, '0')}_${now.getHours().toString().padStart(2, '0')}${now.getMinutes().toString().padStart(2, '0')}`;
  164. a.download = `验证工具记录表_${formattedDate}.xlsx`;
  165. document.body.appendChild(a)
  166. a.click()
  167. a.remove()
  168. window.URL.revokeObjectURL(url)
  169. ElMessage.success('导出成功')
  170. } catch (error) {
  171. ElMessage.error('导出失败,请检查网络连接')
  172. }
  173. }
  174. const exportOperationExcel = async () => {
  175. try {
  176. const response: any = await exportOperationFile({
  177. User_tokey: globalStore.GET_User_tokey,
  178. T_state: operationInitParam.T_state,
  179. T_sn: operationInitParam.T_sn,
  180. LendUser: operationInitParam.LendUser,
  181. T_project: operationInitParam.T_project,
  182. })
  183. // 处理返回的二进制文件并触发下载
  184. const blob = new Blob([response], {type: 'application/vnd.ms-excel;charset=utf8'})
  185. const url = window.URL.createObjectURL(blob)
  186. const a = document.createElement('a')
  187. a.href = url
  188. const now = new Date();
  189. const formattedDate = `${now.getFullYear()}${(now.getMonth() + 1).toString().padStart(2, '0')}${now.getDate().toString().padStart(2, '0')}_${now.getHours().toString().padStart(2, '0')}${now.getMinutes().toString().padStart(2, '0')}`;
  190. a.download = `验证工具操作记录表_${formattedDate}.xlsx`;
  191. document.body.appendChild(a)
  192. a.click()
  193. a.remove()
  194. window.URL.revokeObjectURL(url)
  195. ElMessage.success('导出成功')
  196. } catch (error) {
  197. ElMessage.error('导出失败,请检查网络连接')
  198. }
  199. }
  200. const showInStorageForm = ref(false)
  201. const dialogTableVisible = ref(false)
  202. const operationVisible = ref(false)
  203. const inStorageFormRef = ref<FormInstance | null>(null)
  204. const inStorageForm = reactive({
  205. T_sn: '',
  206. Validationnumber: '',
  207. T_remark: '',
  208. T_class: null
  209. })
  210. interface InStorageItem {
  211. T_sn: string
  212. Validationnumber: string
  213. T_remark: string
  214. }
  215. // 获取设备类型
  216. const Pruductoptions = ref<any[]>([
  217. {
  218. Id: '',
  219. T_name: ''
  220. }
  221. ])
  222. const getValidationToolClassList = async () => {
  223. const res: any = await validationTool_class_list({page: 1, page_z: 999})
  224. Pruductoptions.value = res.Data.Data
  225. }
  226. const pendingItems = ref<InStorageItem[]>([])
  227. const pageSize = ref(8)
  228. const currentPage = ref(1)
  229. const paginatedPendingItems = computed(() => {
  230. const start = (currentPage.value - 1) * pageSize.value
  231. const end = start + pageSize.value
  232. return pendingItems.value.slice(start, end)
  233. })
  234. const rules = reactive({
  235. T_sn: [{required: true, message: '请输入SN', trigger: 'blur'}],
  236. Validationnumber: [{required: true, message: '请输入设备编号', trigger: 'blur'}],
  237. T_class: [{required: true, message: '请选择设备类型', trigger: 'blur'}]
  238. })
  239. const extractSN = (fullSN: string): string => {
  240. if (fullSN.length === 24 && fullSN.startsWith('03') && fullSN.endsWith('000001')) {
  241. return fullSN.substring(2, 18)
  242. }
  243. return fullSN
  244. }
  245. /**
  246. * 处理SN输入,自动提取中间数据并更新输入框显示
  247. * @param formType 表单类型:'inStorageForm' | 'lendForm' | 'editForm'
  248. */
  249. const handleSNInput = (formType: string) => {
  250. let form: any
  251. switch (formType) {
  252. case 'inStorageForm':
  253. form = inStorageForm
  254. break
  255. case 'lendForm':
  256. form = lendForm
  257. break
  258. case 'editForm':
  259. form = editForm
  260. break
  261. default:
  262. return
  263. }
  264. if (form.T_sn) {
  265. const extractedSN = extractSN(form.T_sn)
  266. // 如果提取的SN与原始SN不同,说明需要自动处理
  267. if (extractedSN !== form.T_sn) {
  268. form.T_sn = extractedSN
  269. }
  270. }
  271. }
  272. // 入库
  273. const submitInStorageForm = () => {
  274. inStorageFormRef.value?.validate(async (valid: boolean) => {
  275. if (valid) {
  276. console.log(inStorageForm.T_sn)
  277. const extractedSN = extractSN(inStorageForm.T_sn)
  278. if (pendingItems.value.some((item: any) => item.T_sn === extractedSN)) {
  279. inStorageForm.T_sn = ''
  280. ElMessage.warning('已存在相同的SN,不能添加')
  281. return
  282. }
  283. const result: any = await readValidation({sn: extractedSN})
  284. if ((result.Code == 200) && (result.Data.T_state == 2)) {
  285. //1-已出库 2-待使用 3-待维修
  286. inStorageForm.T_sn = ''
  287. ElMessage.warning('当前SN已入库不能重复入库')
  288. return
  289. }
  290. pendingItems.value.unshift({...inStorageForm, T_sn: extractedSN})
  291. inStorageForm.T_sn = ''
  292. inStorageForm.Validationnumber = ''
  293. inStorageForm.T_remark = ''
  294. ElMessage.success('已添加到待提交列表')
  295. if ('speechSynthesis' in window) {
  296. const utterance = new SpeechSynthesisUtterance('添加成功')
  297. window.speechSynthesis.speak(utterance)
  298. } else {
  299. console.warn('Web Speech API 不被支持')
  300. }
  301. }
  302. })
  303. }
  304. const removePendingItem = (index: number) => {
  305. pendingItems.value.splice(index, 1)
  306. ElMessage.success('已从待提交列表中移除')
  307. }
  308. // 归还
  309. const submitInStoragePendingItems = async () => {
  310. if (pendingItems.value.length === 0) {
  311. ElMessage.warning('暂无数据可提交')
  312. return
  313. }
  314. const rest = JSON.parse(JSON.stringify(pendingItems.value))
  315. try {
  316. const result: any = await validation_add(rest)
  317. if (result.Code === 200) {
  318. ElMessage.success('提交成功')
  319. pendingItems.value = []
  320. inStorageForm.T_sn = ''
  321. inStorageForm.Validationnumber = ''
  322. inStorageForm.T_remark = ''
  323. searchHandle()
  324. nextTick(() => {
  325. showInStorageForm.value = false
  326. })
  327. } else {
  328. ElMessage.error('提交失败')
  329. }
  330. } catch (error) {
  331. ElMessage.error('提交失败,请检查网络连接')
  332. }
  333. }
  334. const handlePageChange = (page: number) => {
  335. currentPage.value = page
  336. }
  337. const showLendForm = ref(false)
  338. const lendFormRef = ref<FormInstance | null>(null)
  339. const lendForm = reactive({
  340. T_sn: '',
  341. Validationnumber: '',
  342. T_remark: '',
  343. LendUser: '',
  344. T_project: ''
  345. })
  346. interface LendItem {
  347. T_sn: string
  348. Validationnumber: string
  349. T_remark: string
  350. LendUser: string
  351. T_project: string
  352. }
  353. const pendingLendItems = ref<LendItem[]>([])
  354. const lendPageSize = ref(8)
  355. const lendCurrentPage = ref(1)
  356. const paginatedPendingLendItems = computed(() => {
  357. const start = (lendCurrentPage.value - 1) * lendPageSize.value
  358. const end = start + lendPageSize.value
  359. return pendingLendItems.value.slice(start, end)
  360. })
  361. const lendRules = reactive({
  362. T_sn: [{required: true, message: '请输入SN', trigger: 'blur'}],
  363. LendUser: [{required: true, message: '请输入借出人', trigger: 'blur'}]
  364. })
  365. const submitLendForm = () => {
  366. console.log()
  367. lendFormRef.value?.validate(async (valid: boolean) => {
  368. if (valid) {
  369. const extractedSN = extractSN(lendForm.T_sn)
  370. console.log(lendForm.T_sn)
  371. if (pendingLendItems.value.some((item: any) => item.T_sn === extractedSN)) {
  372. lendForm.T_sn = ''
  373. ElMessage.warning('已存在相同的SN,不能添加')
  374. return
  375. }
  376. const result: any = await readValidation({sn: extractedSN})
  377. if (result.Code !== 200) {
  378. lendForm.T_sn = ''
  379. ElMessage.warning('当前SN未入库不能借出')
  380. return
  381. }
  382. if (result.Data.T_state == 5) {
  383. ElMessage.warning('设备已损坏')
  384. if ('speechSynthesis' in window) {
  385. const utterance = new SpeechSynthesisUtterance('设备已损坏')
  386. window.speechSynthesis.speak(utterance)
  387. } else {
  388. console.warn('Web Speech API 不被支持')
  389. }
  390. return
  391. }
  392. if (result.Data.T_state != 2) {
  393. lendForm.T_sn = ''
  394. ElMessage.warning('当前SN未入库不能借出')
  395. return
  396. }
  397. pendingLendItems.value.unshift({
  398. T_sn: extractedSN,
  399. Validationnumber: lendForm.Validationnumber,
  400. T_remark: lendForm.T_remark,
  401. LendUser: lendForm.LendUser,
  402. T_project: lendForm.T_project
  403. })
  404. lendForm.T_sn = ''
  405. lendForm.T_remark = ''
  406. ElMessage.success('已添加到待提交列表')
  407. if ('speechSynthesis' in window) {
  408. const utterance = new SpeechSynthesisUtterance('添加成功')
  409. window.speechSynthesis.speak(utterance)
  410. } else {
  411. console.warn('Web Speech API 不被支持')
  412. }
  413. pendingLendItems.value = pendingLendItems.value.filter((value: any, index: any, self: any) => { //去重
  414. return self.findIndex((t: any) => (t.T_sn === value.T_sn)) === index;
  415. });
  416. } else {
  417. }
  418. })
  419. }
  420. const removePendingLendItem = (index: number) => {
  421. pendingLendItems.value.splice(index, 1)
  422. ElMessage.success('已从待提交列表中移除')
  423. }
  424. const submitLendPendingItems = async () => {
  425. if (pendingLendItems.value.length === 0) {
  426. ElMessage.warning('暂无数据可提交')
  427. return
  428. }
  429. const rest = JSON.parse(JSON.stringify(pendingLendItems.value))
  430. const result: any = await validation_update(rest)
  431. if (result.Code == 200) {
  432. ElMessage.success('提交成功')
  433. pendingLendItems.value = []
  434. lendForm.T_sn = ''
  435. lendForm.T_remark = ''
  436. lendForm.LendUser = ''
  437. lendForm.T_project = ''
  438. searchHandle()
  439. nextTick(() => {
  440. showLendForm.value = false
  441. })
  442. } else {
  443. ElMessage.error('提交失败')
  444. }
  445. }
  446. const handleLendPageChange = (page: number) => {
  447. lendCurrentPage.value = page
  448. }
  449. const showEditForm = ref(false)
  450. const ImportEdit = ref(false)
  451. const editFormRef = ref<FormInstance | null>(null)
  452. const editForm = reactive({
  453. T_sn: '',
  454. Validationnumber: '',
  455. T_remark: '',
  456. T_state: '',
  457. T_class: ''
  458. })
  459. const previewEdit = async (row: any) => {
  460. showEditForm.value = true
  461. const result: any = await readValidation({sn: row.T_sn})
  462. if (result.Code === 200) {
  463. Object.assign(editForm, result.Data)
  464. } else {
  465. ElMessage.error('获取数据失败')
  466. }
  467. }
  468. const preview = (T_sn: any) => {
  469. recordInitParam.T_sn = T_sn
  470. dialogTableVisible.value = true
  471. recordTableRef.value?.searchTable()
  472. }
  473. const callbackSnDrawer = (done: () => void) => done()
  474. const operationPreview = () => {
  475. operationVisible.value = true
  476. operationTableRef.value?.searchTable()
  477. }
  478. const tableSnData = ref<any[]>([])
  479. const previewSn = (devicelist: any[]) => {
  480. drawerSnRef.value?.openDrawer()
  481. if (!devicelist) return
  482. tableSnData.value = devicelist.map((item: string) => {
  483. return {
  484. sn: item
  485. }
  486. })
  487. }
  488. const submitEditForm = () => {
  489. editFormRef.value?.validate(async (valid: boolean): Promise<void> => {
  490. if (valid) {
  491. const result: any = await updateValidation(editForm)
  492. if (result.Code === 200) {
  493. ElMessage.success('编辑成功')
  494. showEditForm.value = false
  495. searchHandle()
  496. } else {
  497. ElMessage.error('编辑失败')
  498. }
  499. } else {
  500. // do nothing
  501. }
  502. })
  503. }
  504. const handleFileChange = (file: any, fileList: any) => {
  505. uploadFiles.value = fileList.map((item: any) => item.raw) // 新增:更新上传文件列表
  506. }
  507. const submitUpload = async () => {
  508. if (uploadFiles.value.length === 0) {
  509. // 修改:使用 uploadFiles.value
  510. ElMessage.warning('请先选择文件')
  511. return
  512. }
  513. const formData = new FormData()
  514. uploadFiles.value.forEach((file: File) => {
  515. // 修改:遍历 uploadFiles.value
  516. formData.append('excelFile', file)
  517. })
  518. const loading = ElLoading.service({
  519. // 新增:显示加载动画
  520. lock: true,
  521. text: '正在上传文件...',
  522. background: 'rgba(0, 0, 0, 0.7)'
  523. })
  524. try {
  525. const result: any = await uploadFile(formData)
  526. if (result.Code === 200) {
  527. ElMessage.success('文件上传成功')
  528. // 处理上传成功后的逻辑
  529. searchHandle()
  530. uploadFiles.value = [] // 新增:清除文件上传列表
  531. } else {
  532. ElMessage.error('文件上传失败')
  533. }
  534. } catch (error) {
  535. ElMessage.error('文件上传失败,请检查网络连接')
  536. } finally {
  537. loading.close() // 新增:关闭加载动画
  538. }
  539. }
  540. const btnRef = ref()
  541. const openDrawer = (tit: string, row: any, snItems: any) => {
  542. btnRef.value.outerVisible = true
  543. btnRef.value.data.title = tit
  544. btnRef.value.data.snItems = snItems
  545. btnRef.value.data.fromData = row
  546. }
  547. interface AddSnItem {
  548. T_sn: string
  549. Validationnumber: string
  550. T_remark: string
  551. }
  552. const holdRepairForm = reactive({
  553. T_sn: '',
  554. T_remark: '',
  555. })
  556. const holdScrapForm = reactive({
  557. T_sn: '',
  558. T_remark: '',
  559. })
  560. const holdReturnForm = reactive({
  561. T_sn: '',
  562. T_remark: '',
  563. })
  564. const ReturnSnItems = ref<AddSnItem[]>([])
  565. const RepairSnItems = ref<AddSnItem[]>([])
  566. const ScrapSnItems = ref<AddSnItem[]>([])
  567. const successFun = () => {
  568. TableRef.value?.searchTable()
  569. btnRef.value.data.fromData.T_remark = ''
  570. if (btnRef.value.data.title == '归还') {
  571. ReturnSnItems.value = [];
  572. }
  573. if (btnRef.value.data.title == '维修') {
  574. RepairSnItems.value = [];
  575. }
  576. if (btnRef.value.data.title == '报废') {
  577. ScrapSnItems.value = [];
  578. }
  579. }
  580. // 远程搜索用户的方法
  581. const remoteMethod = async (query: string) => {
  582. if (query.trim()) {
  583. userLoading.value = true;
  584. try {
  585. const res: any = await User_List({
  586. User_tokey: globalStore.GET_User_tokey,
  587. T_name: query,
  588. page_z: 100
  589. });
  590. if (res.Code === 200) {
  591. // 确保数据格式正确
  592. const formattedOptions = res.Data.Data?.map((user: any) => ({
  593. T_uuid: user.T_uuid,
  594. T_name: user.T_name
  595. })) || [];
  596. userOptions.value = formattedOptions;
  597. // 添加调试信息
  598. console.log('搜索结果:', formattedOptions);
  599. }
  600. } catch (error) {
  601. ElMessage.error('搜索用户失败');
  602. console.error('搜索用户错误:', error);
  603. } finally {
  604. userLoading.value = false;
  605. }
  606. } else {
  607. userOptions.value = [];
  608. }
  609. };
  610. // 选择用户后的处理函数
  611. const handleUserChange = (value: string) => {
  612. if (value) {
  613. const selectedUser = userOptions.value.find(user => user.T_uuid === value);
  614. if (selectedUser) {
  615. lendForm.LendUser = selectedUser.T_name;
  616. }
  617. } else {
  618. lendForm.LendUser = '';
  619. }
  620. };
  621. // 用户搜索相关
  622. const userOptions = ref<any[]>([]);
  623. const userLoading = ref(false);
  624. onMounted(() => {
  625. getValidationToolClassList()
  626. })
  627. </script>
  628. <template>
  629. <div class="list">
  630. <TableBase
  631. ref="TableRef"
  632. :columns="columns"
  633. :requestApi="validation_List"
  634. :initParam="initParam"
  635. :pagination="true"
  636. >
  637. <template #table-header>
  638. <div class="input-suffix">
  639. <el-row :gutter="20" style="margin-bottom: 0">
  640. <el-col :xl="3" :lg="3" :md="3">
  641. <span class="inline-flex items-center">设备编号:</span>
  642. <el-input
  643. v-model="initParam.Validationnumber"
  644. class="w-50 m-2"
  645. type="text"
  646. placeholder="设备编号搜索"
  647. clearable
  648. @change="searchHandle"
  649. />
  650. </el-col>
  651. <el-col :xl="3" :lg="3" :md="3">
  652. <span class="inline-flex items-center">状态:</span>
  653. <el-select v-model="initParam.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
  654. <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"/>
  655. </el-select>
  656. </el-col>
  657. <el-col :xl="3" :lg="3" :md="3">
  658. <span class="inline-flex items-center">SN:</span>
  659. <el-input
  660. class="w-50 m-2"
  661. v-model="initParam.T_sn"
  662. type="text"
  663. placeholder="按SN搜索"
  664. clearable
  665. @change="searchHandle"
  666. />
  667. </el-col>
  668. <el-col :xl="3" :lg="3" :md="3">
  669. <span class="inline-flex items-center">设备类型:</span>
  670. <el-select v-model="initParam.T_class" class="w-50 m-2" clearable
  671. placeholder="请选择设备类型~">
  672. <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name"
  673. :value="item.Id"/>
  674. </el-select>
  675. </el-col>
  676. <el-col :xl="3" :lg="3" :md="3">
  677. <span class="inline-flex items-center">模组imei:</span>
  678. <el-input
  679. class="w-50 m-2"
  680. v-model="initParam.T_imei"
  681. type="text"
  682. placeholder="按模组imei搜索"
  683. clearable
  684. @change="searchHandle"
  685. />
  686. </el-col>
  687. <el-col :xl="3" :lg="3" :md="3">
  688. <span class="inline-flex items-center">借出人</span>
  689. <el-input
  690. class="w-50 m-2"
  691. v-model="initParam.LendUser"
  692. type="text"
  693. placeholder="按借出人搜索"
  694. clearable
  695. @change="searchHandle"
  696. />
  697. </el-col>
  698. <el-col :xl="3" :lg="3" :md="3">
  699. <span class="inline-flex items-center">借出项目</span>
  700. <el-input
  701. class="w-50 m-2"
  702. v-model="initParam.T_project"
  703. type="text"
  704. placeholder="按借出项目搜索"
  705. clearable
  706. @change="searchHandle"
  707. />
  708. </el-col>
  709. <el-col :xl="3" :lg="3" :md="3">
  710. <span class="inline-flex items-center">物联网卡号:</span>
  711. <el-input
  712. class="w-50 m-2"
  713. v-model="initParam.T_iccid"
  714. type="text"
  715. placeholder="按物联网卡号搜索"
  716. clearable
  717. @change="searchHandle"
  718. />
  719. </el-col>
  720. <el-col :xl="15" :lg="15" :md="15" style="margin-top: 10px">
  721. <el-button type="primary" @click="searchHandle">搜索</el-button>
  722. <el-button type="primary" @click="showInStorageForm = true">入库
  723. </el-button>
  724. <el-button type="primary" @click="showLendForm = true">借出
  725. </el-button>
  726. <el-button type="primary" @click="openDrawer('归还',holdReturnForm,ReturnSnItems)">归还
  727. </el-button>
  728. <el-button type="warning" @click="openDrawer('维修',holdRepairForm,RepairSnItems)">维修
  729. </el-button>
  730. <el-button type="danger" @click="openDrawer('报废',holdScrapForm,ScrapSnItems)">报废
  731. </el-button>
  732. <el-button type="success" @click="ImportEdit = true">模板导入</el-button>
  733. <el-button type="success" @click="exportExcel">导出</el-button>
  734. <el-button type="primary" @click="operationPreview">操作记录</el-button>
  735. </el-col>
  736. </el-row>
  737. </div>
  738. </template>
  739. <template #T_state="{ row }">
  740. <el-tag v-if="row.T_state == 1" type="success" effect="dark"> 已出库</el-tag>
  741. <el-tag v-if="row.T_state == 2" effect="dark">未出库</el-tag>
  742. <el-tag v-if="row.T_state == 3" effect="dark" type="warning">维修中</el-tag>
  743. <el-tag v-if="row.T_state == 4" effect="dark" type="danger">已报废</el-tag>
  744. <el-tag v-if="row.T_state == 5" effect="dark" type="info">已损坏</el-tag>
  745. <el-tag v-if="row.T_state == 6" effect="light" type="warning">转移中</el-tag>
  746. </template>
  747. <template #T_class="{ row }">
  748. <el-tag>{{ Pruductoptions.find((option: any) => option.Id === row.T_class)?.T_name || '' }}</el-tag>
  749. </template>
  750. <template #right="{ row }">
  751. <el-button link type="primary" size="small" :icon="View" @click="preview(row.T_sn)">记录</el-button>
  752. <el-button link type="success" size="small" :icon="Edit" @click="previewEdit(row)">编辑</el-button>
  753. <el-button link type="danger" size="small" :icon="Delete" @click="deleteFun(row.T_sn)">删除</el-button>
  754. </template>
  755. </TableBase>
  756. <el-dialog title="入库" v-model="showInStorageForm" width="50%">
  757. <el-form :model="inStorageForm" :rules="rules" ref="inStorageFormRef">
  758. <el-form-item label="SN" prop="T_sn">
  759. <el-input v-model="inStorageForm.T_sn" placeholder="请输入SN" @keyup.enter="submitInStorageForm" @input="handleSNInput('inStorageForm')"></el-input>
  760. </el-form-item>
  761. <el-form-item label="设备编号" prop="Validationnumber">
  762. <el-input v-model="inStorageForm.Validationnumber" placeholder="请输入设备编号"></el-input>
  763. </el-form-item>
  764. <el-form-item label="设备类型" prop="T_class">
  765. <el-select v-model="inStorageForm.T_class" class="w-50 m-2" clearable placeholder="请选择设备类型~">
  766. <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name" :value="item.Id"/>
  767. </el-select>
  768. </el-form-item>
  769. <el-form-item label="备注">
  770. <el-input v-model="inStorageForm.T_remark" type="textarea" placeholder="请输入备注"></el-input>
  771. </el-form-item>
  772. </el-form>
  773. <!-- 新增数据条数提示 -->
  774. <div style="margin: 10px 0">
  775. <span>当前待提交数据条数: {{ pendingItems.length }}</span>
  776. </div>
  777. <el-table :data="paginatedPendingItems" style="width: 100%; margin-top: 20px">
  778. <el-table-column type="index" label="序号" width="80"></el-table-column>
  779. <!-- 添加序号列 -->
  780. <el-table-column prop="T_sn" label="SN" width="300"></el-table-column>
  781. <el-table-column prop="Validationnumber" label="设备编号"></el-table-column>
  782. <el-table-column prop="T_class" label="设备类型"></el-table-column>
  783. <el-table-column prop="T_remark" label="备注"></el-table-column>
  784. <el-table-column label="操作" width="180">
  785. <template #default="scope">
  786. <el-button type="danger" size="small" @click="removePendingItem(scope.$index)">删除</el-button>
  787. </template>
  788. </el-table-column>
  789. </el-table>
  790. <el-pagination
  791. background
  792. layout="prev, pager, next"
  793. :total="pendingItems.length"
  794. :page-size="pageSize"
  795. :current-page="currentPage"
  796. @current-change="handlePageChange"
  797. style="margin-top: 20px; text-align: right"
  798. />
  799. <template #footer>
  800. <span class="dialog-footer">
  801. <el-button @click="showInStorageForm = false">取消</el-button>
  802. <el-button type="primary" @click="submitInStorageForm">添加到暂存</el-button>
  803. <!-- 新增提交按钮 -->
  804. <el-button type="primary" @click="submitInStoragePendingItems">提交</el-button>
  805. </span>
  806. </template>
  807. </el-dialog>
  808. <el-dialog title="借出" v-model="showLendForm" width="50%">
  809. <el-form :model="lendForm" :rules="lendRules" ref="lendFormRef">
  810. <!-- 新增借出人和借出项目 -->
  811. <el-form-item class="m-b-6" :label-width="formLabelWidth" label="借出人" prop="LendUser">
  812. <el-select
  813. v-model="lendForm.LendUser"
  814. filterable
  815. remote
  816. reserve-keyword
  817. placeholder="请输入接收人"
  818. :remote-method="remoteMethod"
  819. :loading="userLoading"
  820. class="w-50"
  821. @change="handleUserChange"
  822. :clearable="true"
  823. >
  824. <el-option
  825. v-for="item in userOptions"
  826. :key="item.T_uuid"
  827. :label="item.T_name"
  828. :value="item.T_uuid"
  829. />
  830. </el-select>
  831. </el-form-item>
  832. <el-form-item class="m-b-6" :label-width="formLabelWidth" label="借出项目" prop="T_project">
  833. <el-input v-model="lendForm.T_project" placeholder="请输入借出项目"></el-input>
  834. </el-form-item>
  835. <el-form-item class="m-b-6" :label-width="formLabelWidth" label="SN" prop="T_sn">
  836. <el-input v-model="lendForm.T_sn" placeholder="请输入SN" @keyup.enter="submitLendForm" @input="handleSNInput('lendForm')"></el-input>
  837. </el-form-item>
  838. <el-form-item class="m-b-6" :label-width="formLabelWidth" label="备注">
  839. <el-input v-model="lendForm.T_remark" type="textarea" placeholder="请输入备注"></el-input>
  840. </el-form-item>
  841. </el-form>
  842. <!-- 新增数据条数提示 -->
  843. <div style="margin: 10px 0">
  844. <span>当前待提交数据条数: {{ pendingLendItems.length }}</span>
  845. </div>
  846. <el-table :data="paginatedPendingLendItems" style="width: 100%; margin-top: 20px">
  847. <el-table-column type="index" label="序号" width="80"></el-table-column>
  848. <!-- 添加序号列 -->
  849. <el-table-column prop="T_sn" label="SN" width="300"></el-table-column>
  850. <el-table-column prop="LendUser" label="借出人"></el-table-column>
  851. <el-table-column prop="T_project" label="借出项目"></el-table-column>
  852. <el-table-column prop="T_remark" label="备注"></el-table-column>
  853. <el-table-column label="操作" width="180">
  854. <template #default="scope">
  855. <el-button type="danger" size="small" @click="removePendingLendItem(scope.$index)">删除
  856. </el-button>
  857. </template>
  858. </el-table-column>
  859. </el-table>
  860. <el-pagination
  861. background
  862. layout="prev, pager, next"
  863. :total="pendingLendItems.length"
  864. :page-size="lendPageSize"
  865. :current-page="lendCurrentPage"
  866. @current-change="handleLendPageChange"
  867. style="margin-top: 20px; text-align: right"
  868. />
  869. <template #footer>
  870. <span class="dialog-footer">
  871. <el-button @click="showLendForm = false">取消</el-button>
  872. <el-button type="primary" @click="submitLendForm">添加到暂存</el-button>
  873. <!-- 新增提交按钮 -->
  874. <el-button type="primary" @click="submitLendPendingItems">提交</el-button>
  875. </span>
  876. </template>
  877. </el-dialog>
  878. <el-dialog title="编辑" v-model="showEditForm" width="50%">
  879. <el-form :model="editForm" ref="editFormRef">
  880. <el-form-item label="SN" prop="T_sn">
  881. <el-input v-model="editForm.T_sn" placeholder="请输入SN" @input="handleSNInput('editForm')"></el-input>
  882. </el-form-item>
  883. <el-form-item label="设备编号" prop="Validationnumber">
  884. <el-input v-model="editForm.Validationnumber" placeholder="请输入设备编号"></el-input>
  885. </el-form-item>
  886. <el-form-item label="状态">
  887. <el-select v-model="editForm.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
  888. <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"/>
  889. </el-select>
  890. </el-form-item>
  891. <el-form-item label="设备类型">
  892. <el-select v-model="editForm.T_class" class="w-50 m-2" clearable placeholder="请选择设备类型~">
  893. <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name" :value="item.Id"/>
  894. </el-select>
  895. </el-form-item>
  896. <el-form-item label="备注">
  897. <el-input v-model="editForm.T_remark" type="textarea" placeholder="请输入备注"></el-input>
  898. </el-form-item>
  899. </el-form>
  900. <template #footer>
  901. <span class="dialog-footer">
  902. <el-button @click="showEditForm = false">取消</el-button>
  903. <el-button type="primary" @click="submitEditForm">提交</el-button>
  904. </span>
  905. </template>
  906. </el-dialog>
  907. <el-dialog title="模板导入" v-model="ImportEdit" width="50%">
  908. <el-upload ref="uploadRef" class="upload-demo" :auto-upload="false" @change="handleFileChange">
  909. <template #trigger>
  910. <el-button type="primary">模板导入</el-button>
  911. </template>
  912. <el-button class="ml-3" type="success" @click="submitUpload"> 提交文件</el-button>
  913. <template #tip></template>
  914. </el-upload>
  915. </el-dialog>
  916. <el-dialog title="查看记录" v-model="dialogTableVisible" width="60%">
  917. <TableBase
  918. ref="recordTableRef"
  919. :columns="recordColumns"
  920. :requestApi="validation_recordList"
  921. :initParam="recordInitParam"
  922. :pagination="true"
  923. >
  924. <template #table-header>
  925. <div class="input-suffix">
  926. <el-row :gutter="20" style="margin-bottom: 0">
  927. <el-col :xl="4" :lg="4" :md="4">
  928. <span class="inline-flex items-center">设备编号:</span>
  929. <el-input
  930. v-model="recordInitParam.Validationnumber"
  931. class="w-50 m-2"
  932. type="text"
  933. placeholder="设备编号搜索"
  934. clearable
  935. @change="recordSearchHandle"
  936. />
  937. </el-col>
  938. <el-col :xl="4" :lg="4" :md="4">
  939. <span class="inline-flex items-center">状态:</span>
  940. <el-select v-model="recordInitParam.T_state" class="w-50 m-2" clearable
  941. placeholder="请选择状态~">
  942. <el-option v-for="item in options" :key="item.id" :label="item.name"
  943. :value="item.id"/>
  944. </el-select>
  945. </el-col>
  946. <el-col :xl="4" :lg="4" :md="4">
  947. <span class="inline-flex items-center">借出(归还)人</span>
  948. <el-input
  949. class="w-50 m-2"
  950. v-model="recordInitParam.LendUser"
  951. type="text"
  952. placeholder="按借出(归还)人搜索"
  953. clearable
  954. @change="recordSearchHandle"
  955. />
  956. </el-col>
  957. <el-col :xl="4" :lg="4" :md="4">
  958. <span class="inline-flex items-center">关联项目</span>
  959. <el-input
  960. class="w-50 m-2"
  961. v-model="recordInitParam.T_project"
  962. type="text"
  963. placeholder="按关联项目搜索"
  964. clearable
  965. @change="recordSearchHandle"
  966. />
  967. </el-col>
  968. <el-col :xl="4" :lg="4" :md="4">
  969. <span class="inline-flex items-center">物联网卡号:</span>
  970. <el-input
  971. class="w-50 m-2"
  972. v-model="recordInitParam.T_iccid"
  973. type="text"
  974. placeholder="按物联网卡号搜索"
  975. clearable
  976. @change="recordSearchHandle"
  977. />
  978. </el-col>
  979. <el-col :xl="4" :lg="4" :md="4" style="margin-top: 10px">
  980. <el-button type="primary" @click="recordSearchHandle">搜索</el-button>
  981. </el-col>
  982. </el-row>
  983. </div>
  984. </template>
  985. <template #T_state="{ row }">
  986. <el-tag v-if="row.T_state == 1" type="success" effect="dark"> 已出库</el-tag>
  987. <el-tag v-if="row.T_state == 2" effect="dark">未出库</el-tag>
  988. <el-tag v-if="row.T_state == 3" effect="dark" type="warning">维修中</el-tag>
  989. <el-tag v-if="row.T_state == 4" effect="dark" type="danger">已报废</el-tag>
  990. <el-tag v-if="row.T_state == 5" effect="dark" type="info">已损坏</el-tag>
  991. <el-tag v-if="row.T_state == 6" effect="light" type="warning">转移</el-tag>
  992. <el-tag v-if="row.T_state == 7" effect="light" type="info">取消转移</el-tag>
  993. <el-tag v-if="row.T_state == 8" effect="light" type="success">已接收</el-tag>
  994. </template>
  995. <template #T_class="{ row }">
  996. <el-tag>{{ Pruductoptions.find((option: any) => option.Id === row.T_class)?.T_name || '' }}</el-tag>
  997. </template>
  998. </TableBase>
  999. </el-dialog>
  1000. <el-dialog title="操作记录" v-model="operationVisible" width="60%">
  1001. <TableBase
  1002. ref="operationTableRef"
  1003. :columns="operationColumns"
  1004. :requestApi="validation_operationList"
  1005. :initParam="operationInitParam"
  1006. :pagination="true"
  1007. >
  1008. <template #table-header>
  1009. <div class="input-suffix">
  1010. <el-row :gutter="20" style="margin-bottom: 0">
  1011. <el-col :xl="5" :lg="5" :md="5">
  1012. <span class="inline-flex items-center">SN:</span>
  1013. <el-input
  1014. class="w-50 m-2"
  1015. v-model="operationInitParam.T_sn"
  1016. type="text"
  1017. placeholder="按SN搜索"
  1018. clearable
  1019. @change="searchHandle"
  1020. />
  1021. </el-col>
  1022. <el-col :xl="5" :lg="5" :md="5">
  1023. <span class="inline-flex items-center">状态:</span>
  1024. <el-select v-model="operationInitParam.T_state" class="w-50 m-2" clearable
  1025. placeholder="请选择状态~">
  1026. <el-option v-for="item in options" :key="item.id" :label="item.name"
  1027. :value="item.id"/>
  1028. </el-select>
  1029. </el-col>
  1030. <el-col :xl="5" :lg="5" :md="5">
  1031. <span class="inline-flex items-center">借出(归还)人</span>
  1032. <el-input
  1033. class="w-50 m-2"
  1034. v-model="operationInitParam.LendUser"
  1035. type="text"
  1036. placeholder="按借出(归还)人搜索"
  1037. clearable
  1038. @change="operationSearchHandle"
  1039. />
  1040. </el-col>
  1041. <el-col :xl="5" :lg="5" :md="5">
  1042. <span class="inline-flex items-center">关联项目</span>
  1043. <el-input
  1044. class="w-50 m-2"
  1045. v-model="operationInitParam.T_project"
  1046. type="text"
  1047. placeholder="按关联项目搜索"
  1048. clearable
  1049. @change="operationSearchHandle"
  1050. />
  1051. </el-col>
  1052. <el-col :xl="4" :lg="4" :md="4" style="margin-top: 10px">
  1053. <el-button type="primary" @click="operationSearchHandle">搜索</el-button>
  1054. <el-button type="success" @click="exportOperationExcel">导出</el-button>
  1055. </el-col>
  1056. </el-row>
  1057. </div>
  1058. </template>
  1059. <template #T_state="{ row }">
  1060. <el-tag v-if="row.T_state == 1" type="success" effect="dark">出库</el-tag>
  1061. <el-tag v-if="row.T_state == 2" effect="dark">入库</el-tag>
  1062. <el-tag v-if="row.T_state == 3" effect="dark" type="warning">维修</el-tag>
  1063. <el-tag v-if="row.T_state == 4" effect="dark" type="danger">报废</el-tag>
  1064. <el-tag v-if="row.T_state == 5" effect="dark" type="info">损坏</el-tag>
  1065. <el-tag v-if="row.T_state == 6" effect="light" type="warning">转移</el-tag>
  1066. <el-tag v-if="row.T_state == 7" effect="light" type="info">取消转移</el-tag>
  1067. <el-tag v-if="row.T_state == 8" effect="light" type="success">已接收</el-tag>
  1068. </template>
  1069. <template #T_project="{ row }">
  1070. <div v-for="(item, index) in row.T_project" :key="index"> {{ item }}</div>
  1071. </template>
  1072. <template #right="{ row }">
  1073. <el-button type="primary" @click="previewSn(row.T_sn_List)">查看</el-button>
  1074. </template>
  1075. </TableBase>
  1076. </el-dialog>
  1077. <Drawer ref="drawerSnRef" :handleClose="callbackSnDrawer" size="40%">
  1078. <el-table
  1079. :data="tableSnData"
  1080. style="width: 100%; height: 99%"
  1081. :header-cell-style="{
  1082. background: '#dedfe0',
  1083. height: '50px'
  1084. }"
  1085. >
  1086. <template v-for="item in snColumns" :key="item.prop">
  1087. <el-table-column show-overflow-tooltip v-if="item.type === 'index'" v-bind="item"/>
  1088. <el-table-column
  1089. show-overflow-tooltip
  1090. v-else-if="item.prop === 'T_project'"
  1091. :label="item.label"
  1092. :width="item.width"
  1093. align="center"
  1094. >
  1095. <template #default="scope">
  1096. {{ scope.row.sn.T_project }}
  1097. </template>
  1098. </el-table-column>
  1099. <el-table-column
  1100. show-overflow-tooltip
  1101. v-else-if="item.prop === 'T_number'"
  1102. :label="item.label"
  1103. :width="item.width"
  1104. align="center"
  1105. >
  1106. <template #default="scope">
  1107. {{ scope.row.sn.T_sn.length }}
  1108. </template>
  1109. </el-table-column>
  1110. <el-table-column
  1111. show-overflow-tooltip
  1112. v-else-if="item.prop === 'T_sn'"
  1113. :label="item.label"
  1114. :width="item.width"
  1115. align="center"
  1116. >
  1117. <template #default="scope">
  1118. <div v-for="(item, index) in scope.row.sn.T_sn" :key="index"> {{ item }}</div>
  1119. </template>
  1120. </el-table-column>
  1121. </template>
  1122. </el-table>
  1123. </Drawer>
  1124. <snAdd ref="btnRef" @successFun="successFun"></snAdd>
  1125. </div>
  1126. </template>
  1127. <style scoped lang="scss">
  1128. @import '@/styles/var.scss';
  1129. .list {
  1130. @include f-direction;
  1131. }
  1132. // .input-suffix {
  1133. // width: 100%;
  1134. // .w-50 {
  1135. // width: 33.33%;
  1136. // }
  1137. // }
  1138. </style>