index.tsx 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { Button, DatePicker, Input, Select } from 'antd'
  4. import { useDispatch, useSelector } from 'react-redux'
  5. import { D5_APIdel, D5_APIgetList } from '@/store/action/D5moveStor'
  6. import { MessageFu } from '@/utils/message'
  7. import history, { btnFlagFu } from '@/utils/history'
  8. import { FourTableType } from '@/pages/B_enterTibet/B1collect/type'
  9. import MyPopconfirm from '@/components/MyPopconfirm'
  10. import { D4baseFormData, D4InputKeyType } from '../D4impStor/data'
  11. import store, { RootState } from '@/store'
  12. import { D5tableC, statusObj } from '@/utils/tableData'
  13. import dayjs from 'dayjs'
  14. import { selectObj } from '@/utils/select'
  15. import MyTable from '@/components/MyTable'
  16. const { RangePicker } = DatePicker
  17. function D5moveStor() {
  18. const dispatch = useDispatch()
  19. const [formData, setFormData] = useState(D4baseFormData)
  20. const formDataRef = useRef(D4baseFormData)
  21. const formDataOldRef = useRef(D4baseFormData)
  22. useEffect(() => {
  23. formDataRef.current = formData
  24. }, [formData])
  25. // 点击搜索的 时间戳
  26. const [timeKey, setTimeKey] = useState(0)
  27. // 点击搜索
  28. const clickSearch = useCallback(() => {
  29. setFormData({ ...formData, pageNum: 1 })
  30. setTimeout(() => {
  31. setTimeKey(Date.now())
  32. }, 50)
  33. }, [formData])
  34. // 时间选择器改变
  35. const timeChange = useCallback(
  36. (date: any, dateString: any) => {
  37. let businessTimeStart = ''
  38. let businessTimeEnd = ''
  39. if (dateString[0] && dateString[1]) {
  40. businessTimeStart = dateString[0] + ' 00:00:00'
  41. businessTimeEnd = dateString[1] + ' 23:59:59'
  42. }
  43. setFormData({ ...formData, businessTimeStart, businessTimeEnd })
  44. },
  45. [formData]
  46. )
  47. const timeChange2 = useCallback(
  48. (date: any, dateString: any) => {
  49. let startTime = ''
  50. let endTime = ''
  51. if (dateString[0] && dateString[1]) {
  52. startTime = dateString[0] + ' 00:00:00'
  53. endTime = dateString[1] + ' 23:59:59'
  54. }
  55. setFormData({ ...formData, startTime, endTime })
  56. },
  57. [formData]
  58. )
  59. // 封装发送请求的函数
  60. const getListFu = useCallback(() => {
  61. formDataOldRef.current = { ...formDataRef.current }
  62. dispatch(D5_APIgetList(formDataRef.current))
  63. }, [dispatch])
  64. useEffect(() => {
  65. getListFu()
  66. }, [getListFu, timeKey])
  67. // 输入框的改变
  68. const txtChangeFu = useCallback(
  69. (txt: string, key: D4InputKeyType) => {
  70. setFormData({
  71. ...formData,
  72. [key]: txt
  73. })
  74. },
  75. [formData]
  76. )
  77. // 点击重置
  78. const resetSelectFu = useCallback(() => {
  79. setFormData(D4baseFormData)
  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 delTableFu = useCallback(
  96. async (id: number) => {
  97. const res = await D5_APIdel(id)
  98. if (res.code === 0) {
  99. MessageFu.success('删除成功')
  100. getListFu()
  101. }
  102. },
  103. [getListFu]
  104. )
  105. // 点击各种操作按钮
  106. const tableBtnFu = useCallback((id: number, key: string) => {
  107. history.push(`/moveStor_edit/${key}/${id}`)
  108. }, [])
  109. const tableLastBtn = useMemo(() => {
  110. return [
  111. {
  112. title: '操作',
  113. render: (item: FourTableType) => {
  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.id, '2')}>
  121. 编辑
  122. </Button>
  123. ) : null}
  124. {obj['审批'] ? (
  125. <Button size='small' type='text' onClick={() => tableBtnFu(item.id, '3')}>
  126. 审批
  127. </Button>
  128. ) : null}
  129. {obj['查看'] ? (
  130. <Button size='small' type='text' onClick={() => tableBtnFu(item.id, '4')}>
  131. 查看
  132. </Button>
  133. ) : null}
  134. {obj['删除'] ? (
  135. <MyPopconfirm txtK='删除' onConfirm={() => delTableFu(item.id)} />
  136. ) : null}
  137. </>
  138. )
  139. }
  140. }
  141. ]
  142. }, [delTableFu, tableBtnFu])
  143. // 从仓库拿数据
  144. const tableInfo = useSelector((state: RootState) => state.D5moveStor.tableInfo)
  145. // 点击导出
  146. const deriveFu = useCallback(async () => {
  147. const res = await D5_APIgetList(
  148. {
  149. ...formDataOldRef.current,
  150. pageNum: 1,
  151. pageSize: 99999
  152. },
  153. true
  154. )
  155. if (res.code === 0) {
  156. if (res.data.records.length <= 0) return MessageFu.warning('当前搜索条件没有数据!')
  157. store.dispatch({
  158. type: 'layout/exInfo',
  159. payload: {
  160. name: '藏品移库',
  161. show: true,
  162. arr: [
  163. { key: 'date', txt: '移库日期' },
  164. { key: 'num', txt: '移库单编号' },
  165. { key: 'sonNum2', txt: '出库分库缩写' },
  166. { key: 'sonNum', txt: '入库分库缩写' },
  167. { key: 'deptName', txt: '发起部门' },
  168. { key: 'creatorName', txt: '发起人' },
  169. { key: 'createTime', txt: '发起日期' },
  170. { key: 'status', txt: '申请状态' }
  171. ],
  172. data: res.data.records.map((v: FourTableType) => ({
  173. ...v,
  174. status: statusObj[v.status as 1]
  175. }))
  176. }
  177. })
  178. }
  179. }, [])
  180. return (
  181. <div className={styles.D5moveStor}>
  182. <div className='pageTitle'>藏品移库</div>
  183. <div className='D5top'>
  184. <div className='D5topll'>
  185. <div>
  186. <span>移库日期范围:</span>
  187. <RangePicker
  188. value={
  189. formData.businessTimeStart
  190. ? [dayjs(formData.businessTimeStart), dayjs(formData.businessTimeEnd)]
  191. : null
  192. }
  193. onChange={timeChange}
  194. />
  195. </div>
  196. <div>
  197. <span>移库单编号:</span>
  198. <Input
  199. style={{ width: 240 }}
  200. placeholder='请输入入库单编号'
  201. maxLength={30}
  202. value={formData.num}
  203. onChange={e => txtChangeFu(e.target.value, 'num')}
  204. />
  205. </div>
  206. <div>
  207. <span>发起部门:</span>
  208. <Input
  209. style={{ width: 240 }}
  210. placeholder='请输入发起部门'
  211. maxLength={30}
  212. value={formData.deptName}
  213. onChange={e => txtChangeFu(e.target.value, 'deptName')}
  214. />
  215. </div>
  216. </div>
  217. <div className='D5toprr'>
  218. <Button type='primary' onClick={deriveFu}>
  219. 批量导出
  220. </Button>
  221. &emsp;
  222. <Button type='primary' onClick={() => history.push('/moveStor_edit/1/null')}>
  223. 新增
  224. </Button>
  225. </div>
  226. </div>
  227. <div className='D5top'>
  228. <div className='D5topll'>
  229. <div>
  230. <span>发起人:</span>
  231. <Input
  232. placeholder='请输入发起人'
  233. maxLength={30}
  234. value={formData.userName}
  235. onChange={e => txtChangeFu(e.target.value, 'userName')}
  236. />
  237. </div>
  238. <div>
  239. <span>发起日期范围:</span>
  240. <RangePicker
  241. style={{ width: 240 }}
  242. value={
  243. formData.startTime ? [dayjs(formData.startTime), dayjs(formData.endTime)] : null
  244. }
  245. onChange={timeChange2}
  246. />
  247. </div>
  248. <div>
  249. <span>申请状态:</span>
  250. <Select
  251. allowClear={true}
  252. placeholder='全部'
  253. style={{ width: 158 }}
  254. value={formData.status ? formData.status : null}
  255. onChange={e => setFormData({ ...formData, status: e })}
  256. options={selectObj['申请状态'].filter(v => v.label !== '待盘点')}
  257. />
  258. </div>
  259. <div>
  260. <span>选择角色:</span>
  261. <Select
  262. allowClear={true}
  263. style={{ width: 158 }}
  264. placeholder='全部'
  265. options={selectObj['角色']}
  266. // fieldNames={{ value: 'id', label: 'roleName' }}
  267. value={formData.userType ? formData.userType : null}
  268. onChange={e => setFormData({ ...formData, userType: e })}
  269. />
  270. </div>
  271. </div>
  272. <div className='D5toprr'>
  273. <Button type='primary' onClick={clickSearch}>
  274. 查询
  275. </Button>
  276. &emsp;<Button onClick={resetSelectFu}>重置</Button>
  277. </div>
  278. </div>
  279. {/* 表格 */}
  280. <MyTable
  281. emptyText={true}
  282. yHeight={610}
  283. list={tableInfo.list}
  284. columnsTemp={D5tableC}
  285. lastBtn={tableLastBtn}
  286. pageNum={formData.pageNum}
  287. pageSize={formData.pageSize}
  288. total={tableInfo.total}
  289. onChange={(pageNum, pageSize) => paginationChange(pageNum, pageSize)}
  290. />
  291. </div>
  292. )
  293. }
  294. const MemoD5moveStor = React.memo(D5moveStor)
  295. export default MemoD5moveStor