index.tsx 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { Button, Checkbox, DatePicker, Input, Popconfirm, Select } from 'antd'
  4. import MyTable from '@/components/MyTable'
  5. import { useDispatch, useSelector } from 'react-redux'
  6. import { RootState } from '@/store'
  7. import { A4voucherItemType, A4voucherSearchType, IA4voucherParams } from './types'
  8. import history, { downFileFu } from '@/utils/history'
  9. import {
  10. A4VOUCHER_PARAM_ROWS,
  11. A4VOUCHER_TABLE_COLUMNS,
  12. DEFAULT_A4VOUCHER_PARAMS
  13. } from './constants'
  14. import { MessageFu } from '@/utils/message'
  15. import { A4_APIDownload, A4_APIList } from '@/store/action/A4voucher'
  16. import { filterEmptyStrings } from '@/utils/objects'
  17. import { fileImgArr } from '@/store/action/layout'
  18. import { BUSINESS_DETAIL_PATH_MAP } from '../A3flow/data'
  19. const { RangePicker } = DatePicker
  20. function A4voucher() {
  21. // 从仓库拿数据
  22. const tableInfo = useSelector((state: RootState) => state.A4voucher.tableInfo)
  23. const [formData, setFormData] = useState({ ...DEFAULT_A4VOUCHER_PARAMS })
  24. const formDataRef = useRef({ ...DEFAULT_A4VOUCHER_PARAMS })
  25. const dispatch = useDispatch()
  26. // 获取下载权限
  27. const downImg = useSelector((state: RootState) => state.A0Layout.downImg)
  28. // 输入框的改变
  29. const txtChangeFu = useCallback(
  30. (txt: string, key: keyof IA4voucherParams) => {
  31. setFormData({
  32. ...formData,
  33. [key]: txt
  34. })
  35. },
  36. [formData]
  37. )
  38. // 顶部筛选
  39. const searchDom = useCallback(
  40. (arr: A4voucherSearchType[]) => {
  41. return arr.map(item => {
  42. return (
  43. <div key={item.name}>
  44. <span>{item.name}:</span>
  45. {item.type === '输入框' ? (
  46. <Input
  47. placeholder='请输入'
  48. maxLength={30}
  49. value={formData[item.key]}
  50. onChange={e => txtChangeFu(e.target.value, item.key)}
  51. />
  52. ) : item.type === '下拉框' ? (
  53. <Select
  54. options={item.data}
  55. placeholder='全部'
  56. allowClear={true}
  57. value={formData[item.key as 'goodNum'] ? formData[item.key as 'goodNum'] : null}
  58. onChange={e => setFormData({ ...formData, [item.key]: e })}
  59. />
  60. ) : item.type === '日期选择' ? (
  61. <RangePicker
  62. format='YYYY-MM-DD'
  63. allowClear={true}
  64. onChange={(e, dateStrings) => setFormData({ ...formData, [item.key]: dateStrings })}
  65. />
  66. ) : null}
  67. </div>
  68. )
  69. })
  70. },
  71. [formData, txtChangeFu]
  72. )
  73. // 点击搜索的 时间戳
  74. const [timeKey, setTimeKey] = useState(0)
  75. // 点击搜索
  76. const clickSearch = useCallback(() => {
  77. setFormData({ ...formData, pageNum: 1 })
  78. setTimeout(() => {
  79. setTimeKey(Date.now())
  80. }, 50)
  81. }, [formData])
  82. // 点击重置
  83. const resetSelectFu = useCallback(() => {
  84. setFormData({ ...DEFAULT_A4VOUCHER_PARAMS })
  85. setTimeout(() => {
  86. setTimeKey(Date.now())
  87. }, 50)
  88. }, [])
  89. // 页码变化
  90. const paginationChange = useCallback(
  91. (pageNum: number, pageSize: number) => {
  92. setFormData({ ...formData, pageNum, pageSize })
  93. setTimeout(() => {
  94. setTimeKey(Date.now())
  95. }, 50)
  96. },
  97. [formData]
  98. )
  99. // 封装发送请求的函数
  100. const getListFu = useCallback(() => {
  101. const { date, ...rest } = formDataRef.current
  102. if (Array.isArray(date) && date.length) {
  103. // @ts-ignore
  104. rest.startTime = date[0]
  105. // @ts-ignore
  106. rest.endTime = date[1]
  107. }
  108. dispatch(A4_APIList(filterEmptyStrings(rest)))
  109. }, [dispatch])
  110. // 点击操作按钮
  111. const tableBtnFu = useCallback((item: A4voucherItemType, key: string) => {
  112. switch (key) {
  113. case '1':
  114. history.push(`/${BUSINESS_DETAIL_PATH_MAP[item.moduleName]}/4/${item.moduleId}`)
  115. break
  116. }
  117. }, [])
  118. const tableLastBtn = useMemo(() => {
  119. return [
  120. {
  121. title: '操作',
  122. render: (item: any) => {
  123. const fileNameArr = item.fileName.split('.')
  124. const fileNameLast = fileNameArr[fileNameArr.length - 1]
  125. return (
  126. <>
  127. <Button size='small' type='text' onClick={() => tableBtnFu(item, '1')}>
  128. 查看
  129. </Button>
  130. {downImg['图片'] === '原图和缩略图' && fileImgArr.includes(fileNameLast) ? (
  131. <Popconfirm
  132. title='请选择图片规格'
  133. onConfirm={() => downFileFu(item.filePath)}
  134. onCancel={() => downFileFu(item.thumb)}
  135. okText='原图'
  136. cancelText='缩略图'
  137. >
  138. <Button size='small' type='text'>
  139. 下载
  140. </Button>
  141. </Popconfirm>
  142. ) : (
  143. <Button
  144. size='small'
  145. type='text'
  146. onClick={() => downFileFu(item.thumb || item.filePath)}
  147. >
  148. 下载
  149. </Button>
  150. )}
  151. </>
  152. )
  153. }
  154. }
  155. ]
  156. }, [tableBtnFu, downImg])
  157. // 多选
  158. const [checkArr, setCheckArr] = useState<number[]>([])
  159. const checkFu = useCallback(
  160. (id: number) => {
  161. if (checkArr.includes(id)) setCheckArr(checkArr.filter(v => v !== id))
  162. else setCheckArr([...checkArr, id])
  163. },
  164. [checkArr]
  165. )
  166. const startBtn = useMemo(() => {
  167. return [
  168. {
  169. title: '选择',
  170. width: 60,
  171. render: (item: any) => (
  172. <Checkbox checked={checkArr.includes(item.id)} onChange={() => checkFu(item.id)} />
  173. )
  174. }
  175. ]
  176. }, [checkArr, checkFu])
  177. const downsFu = useCallback(
  178. async (type: 1 | 2) => {
  179. const res = await A4_APIDownload(checkArr, type)
  180. if (res.code === 0) {
  181. MessageFu.success('下载成功')
  182. downFileFu(res.data, () => {
  183. setCheckArr([])
  184. })
  185. }
  186. },
  187. [checkArr]
  188. )
  189. useEffect(() => {
  190. getListFu()
  191. }, [getListFu, timeKey])
  192. useEffect(() => {
  193. formDataRef.current = formData
  194. }, [formData])
  195. return (
  196. <div className={styles.A4voucher}>
  197. <div className='pageTitle'>凭证管理</div>
  198. {/* 第一行 */}
  199. <div className='C1top'>
  200. <div className='C1topll C1topllAll'>{searchDom(A4VOUCHER_PARAM_ROWS)}</div>
  201. </div>
  202. {/* 第二行 */}
  203. <div className='C1top C1top2'>
  204. {downImg['图片'] === '原图和缩略图' ? (
  205. <Popconfirm
  206. title='请选择图片规格'
  207. onConfirm={() => downsFu(1)}
  208. onCancel={() => downsFu(2)}
  209. okText='原图'
  210. cancelText='缩略图'
  211. >
  212. <Button type='primary' disabled={checkArr.length === 0}>
  213. 批量下载
  214. </Button>
  215. </Popconfirm>
  216. ) : (
  217. <Button type='primary' disabled={checkArr.length === 0} onClick={() => downsFu(2)}>
  218. 批量下载
  219. </Button>
  220. )}
  221. &emsp;
  222. <Button type='primary' onClick={clickSearch}>
  223. 查询
  224. </Button>
  225. &emsp;
  226. <Button onClick={resetSelectFu}>重置</Button>
  227. </div>
  228. {/* 表格 */}
  229. <MyTable
  230. yHeight={580}
  231. list={tableInfo.list}
  232. columnsTemp={A4VOUCHER_TABLE_COLUMNS}
  233. startBtn={startBtn}
  234. lastBtn={tableLastBtn}
  235. pageNum={formData.pageNum}
  236. pageSize={formData.pageSize}
  237. total={tableInfo.total}
  238. onChange={(pageNum, pageSize) => paginationChange(pageNum, pageSize)}
  239. />
  240. </div>
  241. )
  242. }
  243. const MemoA4voucher = React.memo(A4voucher)
  244. export default MemoA4voucher