index.tsx 5.1 KB

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