index.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import React, { useCallback, useMemo, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { Button, Checkbox, DatePicker, Input, Select } from 'antd'
  4. import MyTable from '@/components/MyTable'
  5. import { useDispatch, useSelector } from 'react-redux'
  6. import { RootState } from '@/store'
  7. import { A4voucherSearchType, IA4voucherParams } from './types'
  8. import history, { btnFlagFu } from '@/utils/history'
  9. import {
  10. A4VOUCHER_PARAM_ROWS,
  11. A4VOUCHER_TABLE_COLUMNS,
  12. DEFAULT_A4VOUCHER_PARAMS
  13. } from './constants'
  14. import MyPopconfirm from '@/components/MyPopconfirm'
  15. import { A3_APIList } from '@/store/action/A3flow'
  16. const { RangePicker } = DatePicker
  17. function A4voucher() {
  18. // 从仓库拿数据
  19. const tableInfo = useSelector((state: RootState) => state.F1exhibition.tableInfo)
  20. const [formData, setFormData] = useState({ ...DEFAULT_A4VOUCHER_PARAMS })
  21. const formDataRef = useRef({ ...DEFAULT_A4VOUCHER_PARAMS })
  22. const dispatch = useDispatch()
  23. // 输入框的改变
  24. const txtChangeFu = useCallback(
  25. (txt: string, key: keyof IA4voucherParams) => {
  26. setFormData({
  27. ...formData,
  28. [key]: txt
  29. })
  30. },
  31. [formData]
  32. )
  33. // 顶部筛选
  34. const searchDom = useCallback(
  35. (arr: A4voucherSearchType[]) => {
  36. return arr.map(item => {
  37. return (
  38. <div key={item.name}>
  39. <span>{item.name}:</span>
  40. {item.type === '输入框' ? (
  41. <Input
  42. placeholder='请输入'
  43. maxLength={30}
  44. value={formData[item.key]}
  45. onChange={e => txtChangeFu(e.target.value, item.key)}
  46. />
  47. ) : item.type === '下拉框' ? (
  48. <Select
  49. options={item.data}
  50. placeholder='全部'
  51. allowClear={true}
  52. value={formData[item.key as 'num'] ? formData[item.key as 'num'] : null}
  53. onChange={e => setFormData({ ...formData, [item.key]: e })}
  54. />
  55. ) : item.type === '日期选择' ? (
  56. <RangePicker
  57. format='YYYY-MM-DD'
  58. allowClear={true}
  59. onChange={(e, dateStrings) => setFormData({ ...formData, [item.key]: dateStrings })}
  60. />
  61. ) : null}
  62. </div>
  63. )
  64. })
  65. },
  66. [formData, txtChangeFu]
  67. )
  68. // 点击搜索的 时间戳
  69. const [timeKey, setTimeKey] = useState(0)
  70. // 点击搜索
  71. const clickSearch = useCallback(() => {
  72. setFormData({ ...formData, pageNum: 1 })
  73. setTimeout(() => {
  74. setTimeKey(Date.now())
  75. }, 50)
  76. }, [formData])
  77. // 点击重置
  78. const resetSelectFu = useCallback(() => {
  79. setFormData({ ...DEFAULT_A4VOUCHER_PARAMS })
  80. setTimeout(() => {
  81. setTimeKey(Date.now())
  82. }, 50)
  83. }, [])
  84. // 页码变化
  85. const paginationChange = useCallback(
  86. (pageNum: number, pageSize: number) => {
  87. setFormData({ ...formData, pageNum, pageSize })
  88. setTimeout(() => {
  89. setTimeKey(Date.now())
  90. }, 50)
  91. },
  92. [formData]
  93. )
  94. // 封装发送请求的函数
  95. const getListFu = useCallback(() => {
  96. const { date, ...rest } = formDataRef.current
  97. if (Array.isArray(date) && date.length) {
  98. // @ts-ignore
  99. rest.startTime = date[0]
  100. // @ts-ignore
  101. rest.endTime = date[1]
  102. }
  103. dispatch(A3_APIList(rest))
  104. }, [dispatch])
  105. // 点击操作按钮
  106. const tableBtnFu = useCallback((item: any, key: string) => {}, [])
  107. // 点击删除
  108. const delTableFu = useCallback(async (item: any) => {}, [])
  109. const tableLastBtn = useMemo(() => {
  110. return [
  111. {
  112. title: '操作',
  113. render: (item: any) => {
  114. let obj = btnFlagFu(item)
  115. return !Object.values(obj).some(Boolean) ? (
  116. '-'
  117. ) : (
  118. <>
  119. {obj['编辑'] ? (
  120. <Button size='small' type='text' onClick={() => tableBtnFu(item, '2')}>
  121. 编辑
  122. </Button>
  123. ) : null}
  124. {obj['审批'] ? (
  125. <Button size='small' type='text' onClick={() => tableBtnFu(item, '3')}>
  126. 审批
  127. </Button>
  128. ) : null}
  129. {obj['查看'] ? (
  130. <Button size='small' type='text' onClick={() => tableBtnFu(item, '4')}>
  131. 查看
  132. </Button>
  133. ) : null}
  134. {obj['删除'] ? <MyPopconfirm txtK='删除' onConfirm={() => delTableFu(item)} /> : null}
  135. </>
  136. )
  137. }
  138. }
  139. ]
  140. }, [delTableFu, tableBtnFu])
  141. // 多选
  142. const [checkArr, setCheckArr] = useState<number[]>([])
  143. const checkFu = useCallback(
  144. (id: number) => {
  145. if (checkArr.includes(id)) setCheckArr(checkArr.filter(v => v !== id))
  146. else setCheckArr([...checkArr, id])
  147. },
  148. [checkArr]
  149. )
  150. const startBtn = useMemo(() => {
  151. return [
  152. {
  153. title: '选择',
  154. width: 60,
  155. render: (item: any) => (
  156. <Checkbox checked={checkArr.includes(item.id)} onChange={() => checkFu(item.id)} />
  157. )
  158. }
  159. ]
  160. }, [checkArr, checkFu])
  161. return (
  162. <div className={styles.A4voucher}>
  163. <div className='pageTitle'>凭证管理</div>
  164. {/* 第一行 */}
  165. <div className='C1top'>
  166. <div className='C1topll C1topllAll'>{searchDom(A4VOUCHER_PARAM_ROWS)}</div>
  167. </div>
  168. {/* 第二行 */}
  169. <div className='C1top C1top2'>
  170. <Button type='primary'>批量导出</Button>
  171. &emsp;
  172. <Button type='primary' onClick={clickSearch}>
  173. 查询
  174. </Button>
  175. &emsp;
  176. <Button onClick={resetSelectFu}>重置</Button>
  177. </div>
  178. {/* 表格 */}
  179. <MyTable
  180. yHeight={580}
  181. list={tableInfo.list}
  182. columnsTemp={A4VOUCHER_TABLE_COLUMNS}
  183. startBtn={startBtn}
  184. lastBtn={tableLastBtn}
  185. pageNum={formData.pageNum}
  186. pageSize={formData.pageSize}
  187. total={tableInfo.total}
  188. onChange={(pageNum, pageSize) => paginationChange(pageNum, pageSize)}
  189. />
  190. </div>
  191. )
  192. }
  193. const MemoA4voucher = React.memo(A4voucher)
  194. export default MemoA4voucher