index.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { Button, Input, Tree, TreeDataNode } from 'antd'
  4. import D1Loc from './D1Loc'
  5. import D1goods from './D1goods'
  6. import { filterTreeByName } from '@/utils/history'
  7. import { TypeZ1dict } from '@/pages/Z_system/Z1dict/type'
  8. import { D1_APIgetTree } from '@/store/action/D1storage'
  9. type TypeTopBtn = '按库位查看' | '按藏品查看'
  10. const topBtnArr: TypeTopBtn[] = ['按库位查看', '按藏品查看']
  11. function D1storage() {
  12. const [topAc, setTopAc] = useState<TypeTopBtn>('按库位查看')
  13. // 库位传递参数给藏品
  14. const lookData = useRef<string[]>([])
  15. // 有关树------
  16. const [loding, setLoding] = useState(false)
  17. const [dictList, setDictList] = useState<TypeZ1dict[]>([])
  18. const getTreeFu = useCallback(async () => {
  19. const res = await D1_APIgetTree()
  20. if (res.code === 0) {
  21. setDictList(res.data)
  22. setLoding(true)
  23. if (res.data && res.data.length) setAcShu(res.data[0].id)
  24. }
  25. }, [])
  26. useEffect(() => {
  27. getTreeFu()
  28. }, [getTreeFu])
  29. // 当前选中的树节点ID
  30. const [acShu, setAcShu] = useState(0)
  31. // 点击树节点
  32. const onSelect = (id: any) => {
  33. // console.log('点击树节点', id)
  34. if (id[0]) setAcShu(id[0])
  35. }
  36. const [value, setValue] = useState('')
  37. const [value2, setValue2] = useState('')
  38. const timeRef = useRef(-1)
  39. const valueChange = useCallback((val: string) => {
  40. setValue(val.trim())
  41. clearTimeout(timeRef.current)
  42. timeRef.current = window.setTimeout(() => {
  43. setValue2(val.trim())
  44. }, 500)
  45. }, [])
  46. // value变化的时候获取所有dom 设置隐藏
  47. const treeDataTemp = useMemo(() => {
  48. if (value2) {
  49. return filterTreeByName(dictList, value2)
  50. } else return dictList
  51. }, [dictList, value2])
  52. // 搜索高亮
  53. const treeData = useMemo(() => {
  54. const loop = (dataTemp: any[]): TreeDataNode[] => {
  55. const data = dataTemp || []
  56. return data.map(item => {
  57. const strTitle = ((item.num ? item.num + ' - ' : '') + item.name) as string
  58. const index = strTitle.indexOf(value)
  59. const beforeStr = strTitle.substring(0, index)
  60. const afterStr = strTitle.slice(index + value.length)
  61. const title =
  62. index > -1 ? (
  63. <span key={item.id}>
  64. {beforeStr}
  65. <span className='site-tree-search-value'>{value}</span>
  66. {afterStr}
  67. </span>
  68. ) : (
  69. <span key={item.id} className='hiddenTree'>
  70. {strTitle}
  71. </span>
  72. )
  73. if (item.children) {
  74. return { title, key: item.id, children: loop(item.children) }
  75. }
  76. return {
  77. title,
  78. key: item.id
  79. }
  80. })
  81. }
  82. return loop(treeDataTemp)
  83. }, [treeDataTemp, value])
  84. // 数列表
  85. const TreeDom = useMemo(() => {
  86. return (
  87. <div className='D1Lmainll'>
  88. <div className='D1Lmainll1'>
  89. <Input
  90. style={{ width: 300 }}
  91. placeholder='请输入需要搜索仓库或区域名称'
  92. maxLength={30}
  93. value={value}
  94. onChange={e => valueChange(e.target.value)}
  95. />
  96. </div>
  97. {treeDataTemp && treeDataTemp.length ? (
  98. <div className='D1Lmainll2'>
  99. <Tree
  100. // 默认全部展开
  101. defaultExpandAll={true}
  102. // 数据
  103. treeData={treeData}
  104. // 自定义字段
  105. // fieldNames={{ title: 'name', key: 'id', children: 'children' }}
  106. // 选中
  107. selectedKeys={[acShu]}
  108. // 点击
  109. onSelect={onSelect}
  110. />
  111. </div>
  112. ) : null}
  113. {loding && treeDataTemp.length === 0 ? <div className='D1null'>暂无数据</div> : null}
  114. </div>
  115. )
  116. }, [])
  117. return (
  118. <div className={styles.D1storage}>
  119. <div className='pageTitle'>分库管理</div>
  120. <div className='D1top'>
  121. <span className='D1topllTxt'>仓库列表</span>
  122. {topBtnArr.map(v => (
  123. <Button
  124. onClick={() => {
  125. lookData.current = []
  126. setTopAc(v)
  127. }}
  128. key={v}
  129. type={topAc === v ? 'primary' : 'default'}
  130. >
  131. {v}
  132. </Button>
  133. ))}
  134. </div>
  135. <div className='D1main'>
  136. {topAc === '按库位查看' ? (
  137. <D1Loc
  138. lookFu={val => {
  139. lookData.current = val
  140. setTopAc('按藏品查看')
  141. }}
  142. />
  143. ) : null}
  144. {topAc === '按藏品查看' ? <D1goods lookData={lookData.current} /> : null}
  145. </div>
  146. </div>
  147. )
  148. }
  149. const MemoD1storage = React.memo(D1storage)
  150. export default MemoD1storage