index.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { Button, Cascader, Checkbox, DatePicker, Input, Popconfirm, Select } from 'antd'
  4. import MyPopconfirm from '@/components/MyPopconfirm'
  5. import Y33setType, { infoType } from '@/pages/Y_goodsDetails/Y2look/Y33setType'
  6. import { C2baseFormData, C2InputKeyArr } from './data'
  7. import { C2InputKeyType } from './type'
  8. import dayjs from 'dayjs'
  9. import MyTable from '@/components/MyTable'
  10. import ImageLazy from '@/components/ImageLazy'
  11. import YtableVideo from '@/components/YtableVideo'
  12. import { C2tableC } from '@/utils/tableData'
  13. import { GoodFileType } from '@/pages/B_enterTibet/B3goodsTable/B3GaddNew/type'
  14. import { selectObj } from '@/utils/select'
  15. import { fileImgArr, fileVideoArr } from '@/store/action/layout'
  16. import { API_C2dels, API_C2downS, C2_APIgetList } from '@/store/action/C2files'
  17. import { useDispatch, useSelector } from 'react-redux'
  18. import { RootState } from '@/store'
  19. import { downFileFu, resJiLianFu } from '@/utils/history'
  20. import { MessageFu } from '@/utils/message'
  21. const { RangePicker } = DatePicker
  22. function C2files() {
  23. // 是否是藏品查询
  24. const [mediaSearch, setmediaSearch] = useState(window.location.href.includes('mediaSearch'))
  25. useEffect(() => {
  26. if (1 + 1 !== 2) console.log(setmediaSearch)
  27. }, [])
  28. const dispatch = useDispatch()
  29. const [formData, setFormData] = useState(C2baseFormData)
  30. const formDataRef = useRef(C2baseFormData)
  31. useEffect(() => {
  32. formDataRef.current = formData
  33. }, [formData])
  34. const [btnAc, setBtnAc] = useState('')
  35. // 点击搜索的 时间戳
  36. const [timeKey, setTimeKey] = useState(0)
  37. // 点击搜索
  38. const clickSearch = useCallback(() => {
  39. setFormData({ ...formData, pageNum: 1 })
  40. setTimeout(() => {
  41. setTimeKey(Date.now())
  42. }, 50)
  43. }, [formData])
  44. // 时间选择器改变
  45. const timeChange = useCallback(
  46. (date: any, dateString: any) => {
  47. let startTime = ''
  48. let endTime = ''
  49. if (dateString[0] && dateString[1]) {
  50. startTime = dateString[0] + ' 00:00:00'
  51. endTime = dateString[1] + ' 23:59:59'
  52. }
  53. setFormData({ ...formData, startTime, endTime })
  54. },
  55. [formData]
  56. )
  57. // 封装发送请求的函数
  58. const getListFu = useCallback(() => {
  59. dispatch(C2_APIgetList({ ...formDataRef.current, type: btnAc }))
  60. setCheckArr([])
  61. }, [btnAc, dispatch])
  62. useEffect(() => {
  63. getListFu()
  64. }, [getListFu, timeKey])
  65. // 输入框的改变
  66. const txtChangeFu = useCallback(
  67. (txt: string, key: C2InputKeyType) => {
  68. setFormData({
  69. ...formData,
  70. [key]: txt
  71. })
  72. },
  73. [formData]
  74. )
  75. // 点击重置
  76. const resetSelectFu = useCallback(() => {
  77. setFormData(C2baseFormData)
  78. setTimeout(() => {
  79. setTimeKey(Date.now())
  80. }, 50)
  81. }, [])
  82. // 页码变化
  83. const paginationChange = useCallback(
  84. (pageNum: number, pageSize: number) => {
  85. setFormData({ ...formData, pageNum, pageSize })
  86. setTimeout(() => {
  87. setTimeKey(Date.now())
  88. }, 50)
  89. },
  90. [formData]
  91. )
  92. // 多选
  93. const [checkArr, setCheckArr] = useState<number[]>([])
  94. const checkFu = useCallback(
  95. (id: number) => {
  96. if (checkArr.includes(id)) setCheckArr(checkArr.filter(v => v !== id))
  97. else setCheckArr([...checkArr, id])
  98. },
  99. [checkArr]
  100. )
  101. // 批量和单个设置
  102. const [typeMo, setTypeMo] = useState({} as infoType)
  103. const tableInfo = useSelector((state: RootState) => state.C2files.tableInfo)
  104. const startBtn = useMemo(() => {
  105. let arr: any = [
  106. {
  107. title: '选择',
  108. width: 50,
  109. render: (item: GoodFileType) => (
  110. <Checkbox checked={checkArr.includes(item.id)} onChange={() => checkFu(item.id)} />
  111. )
  112. },
  113. {
  114. width: 100,
  115. title: '缩略图/视频',
  116. render: (item: GoodFileType) => {
  117. const fileNameArr = item.fileName.split('.')
  118. const fileNameLast = fileNameArr[fileNameArr.length - 1]
  119. return fileImgArr.includes(fileNameLast) ? (
  120. <div className='tableImgAuto'>
  121. <ImageLazy width={60} height={60} srcBig={item.filePath} src={item.thumb} />
  122. </div>
  123. ) : fileVideoArr.includes(fileNameLast) ? (
  124. <YtableVideo src={item.filePath} />
  125. ) : (
  126. ' - '
  127. )
  128. }
  129. },
  130. {
  131. title: '附件类型',
  132. render: (item: GoodFileType) =>
  133. selectObj['附件类型'].find(v => v.value === item.type)?.label
  134. },
  135. {
  136. title: '附件用途',
  137. render: (item: GoodFileType) => (item.effect ? resJiLianFu(item.effect) : '(空)')
  138. }
  139. ]
  140. return arr
  141. }, [checkArr, checkFu])
  142. // 点击删除
  143. const delFu = useCallback(
  144. async (data: number[]) => {
  145. const res = await API_C2dels(data)
  146. if (res.code === 0) {
  147. MessageFu.success('删除成功')
  148. getListFu()
  149. }
  150. },
  151. [getListFu]
  152. )
  153. // 获取下载权限
  154. const downImg = useSelector((state: RootState) => state.A0Layout.downImg)
  155. // 点击批量下载
  156. const downsFu = useCallback(
  157. async (type: 1 | 2) => {
  158. const res = await API_C2downS(checkArr, type)
  159. if (res.code === 0) {
  160. MessageFu.success('下载成功')
  161. downFileFu(res.data, () => {
  162. setCheckArr([])
  163. })
  164. }
  165. },
  166. [checkArr]
  167. )
  168. const tableLastBtn = useMemo(() => {
  169. return [
  170. {
  171. title: '操作',
  172. render: (item: GoodFileType) => {
  173. const fileNameArr = item.fileName.split('.')
  174. const fileNameLast = fileNameArr[fileNameArr.length - 1]
  175. return (
  176. <>
  177. {downImg['图片'] === '原图和缩略图' && fileImgArr.includes(fileNameLast) ? (
  178. <Popconfirm
  179. title='请选择图片规格'
  180. onConfirm={() => downFileFu(item.filePath)}
  181. onCancel={() => downFileFu(item.thumb)}
  182. okText='原图'
  183. cancelText='缩略图'
  184. >
  185. <Button size='small' type='text'>
  186. 下载
  187. </Button>
  188. </Popconfirm>
  189. ) : (
  190. <Button
  191. size='small'
  192. type='text'
  193. onClick={() => downFileFu(item.thumb || item.filePath)}
  194. >
  195. 下载
  196. </Button>
  197. )}
  198. <>
  199. <Button
  200. hidden={mediaSearch}
  201. size='small'
  202. type='text'
  203. onClick={() =>
  204. setTypeMo({
  205. ids: [item.id],
  206. type: item.type,
  207. effect: item.effect,
  208. flag: '单个'
  209. })
  210. }
  211. >
  212. 设置
  213. </Button>
  214. {mediaSearch ? null : (
  215. <MyPopconfirm txtK='删除' onConfirm={() => delFu([item.id])} />
  216. )}
  217. </>
  218. </>
  219. )
  220. }
  221. }
  222. ]
  223. }, [delFu, downImg, mediaSearch])
  224. return (
  225. <div className={styles.C2files}>
  226. <div className='pageTitle'>{mediaSearch ? '多媒体信息' : '藏品附件'}</div>
  227. {/* 第一行 */}
  228. <div className='C2top'>
  229. <div className='C2topll'>
  230. {[{ label: '全部', value: '' }, ...selectObj['附件类型']].map(v => (
  231. <Button
  232. key={v.value}
  233. onClick={() => setBtnAc(v.value)}
  234. type={btnAc === v.value ? 'primary' : 'default'}
  235. >
  236. {v.label}
  237. </Button>
  238. ))}
  239. </div>
  240. <div className='C2toprr'>
  241. {downImg['图片'] === '原图和缩略图' ? (
  242. <Popconfirm
  243. title='请选择图片规格'
  244. onConfirm={() => downsFu(1)}
  245. onCancel={() => downsFu(2)}
  246. okText='原图'
  247. cancelText='缩略图'
  248. >
  249. <Button type='primary' disabled={checkArr.length === 0}>
  250. 批量下载
  251. </Button>
  252. </Popconfirm>
  253. ) : (
  254. <Button type='primary' disabled={checkArr.length === 0} onClick={() => downsFu(2)}>
  255. 批量下载
  256. </Button>
  257. )}
  258. {mediaSearch ? null : (
  259. <>
  260. &emsp;
  261. <Button
  262. type='primary'
  263. disabled={checkArr.length === 0}
  264. onClick={() =>
  265. setTypeMo({
  266. ids: checkArr,
  267. type: '',
  268. effect: '',
  269. flag: '多个'
  270. })
  271. }
  272. >
  273. 批量设置
  274. </Button>
  275. </>
  276. )}
  277. &emsp;
  278. <Button type='primary' onClick={clickSearch}>
  279. 查询
  280. </Button>
  281. &emsp;
  282. <Button onClick={resetSelectFu}>重置</Button>
  283. </div>
  284. </div>
  285. {/* 第二行 */}
  286. <div className='C2top C2top2'>
  287. <div className='C2topll'>
  288. {C2InputKeyArr.map(item => (
  289. <div key={item.name}>
  290. <span>{item.name}:</span>
  291. {item.type === '下拉框' ? (
  292. <Select
  293. allowClear={true}
  294. placeholder='全部'
  295. value={formData[item.key]}
  296. onChange={e => txtChangeFu(e, item.key)}
  297. options={item.data}
  298. />
  299. ) : null}
  300. {item.type === '输入框' ? (
  301. <Input
  302. placeholder='请输入'
  303. maxLength={30}
  304. value={formData[item.key]}
  305. onChange={e => txtChangeFu(e.target.value, item.key)}
  306. />
  307. ) : null}
  308. {item.type === '级联' ? (
  309. <Cascader
  310. // changeOnSelect
  311. options={item.data}
  312. value={formData.effect ? formData.effect.split(',') : null}
  313. onChange={e => txtChangeFu(e ? e.join(',') : '', item.key)}
  314. placeholder='全部'
  315. fieldNames={{ label: 'name', value: 'id', children: 'children' }}
  316. allowClear={true}
  317. />
  318. ) : null}
  319. </div>
  320. ))}
  321. <div>
  322. <span>上传起止日期:</span>
  323. <RangePicker
  324. value={
  325. formData.startTime ? [dayjs(formData.startTime), dayjs(formData.endTime)] : null
  326. }
  327. onChange={timeChange}
  328. />
  329. </div>
  330. </div>
  331. </div>
  332. {/* 表格 */}
  333. <MyTable
  334. yHeight={600}
  335. list={tableInfo.list}
  336. columnsTemp={C2tableC}
  337. lastBtn={tableLastBtn}
  338. startBtn={startBtn}
  339. pageNum={formData.pageNum}
  340. pageSize={formData.pageSize}
  341. total={tableInfo.total}
  342. onChange={(pageNum, pageSize) => paginationChange(pageNum, pageSize)}
  343. />
  344. {typeMo.flag ? (
  345. <Y33setType succFu={getListFu} info={typeMo} closeFu={() => setTypeMo({} as infoType)} />
  346. ) : null}
  347. </div>
  348. )
  349. }
  350. const MemoC2files = React.memo(C2files)
  351. export default MemoC2files