index.tsx 7.8 KB

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