|
|
@@ -0,0 +1,237 @@
|
|
|
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
|
|
+import styles from './index.module.scss'
|
|
|
+import { GoodsType } from '../SonGoodsList/data'
|
|
|
+import { Button, Cascader, Checkbox, Input, Modal, Select } from 'antd'
|
|
|
+import { openLink } from '@/utils/history'
|
|
|
+import { MessageFu } from '@/utils/message'
|
|
|
+import MyTable from '@/components/MyTable'
|
|
|
+import MyPopconfirm from '@/components/MyPopconfirm'
|
|
|
+
|
|
|
+type Props = {
|
|
|
+ API_getList: any
|
|
|
+ baseFormData: any
|
|
|
+ topSelectDom: any
|
|
|
+ columnsTemp: any
|
|
|
+ closeFu: () => void
|
|
|
+ dataResFu: (data: GoodsType[]) => void
|
|
|
+ oldCheckArr: GoodsType[]
|
|
|
+ // 单选
|
|
|
+ isOne?: boolean
|
|
|
+ //其他额外的参数
|
|
|
+ canObj?: any
|
|
|
+}
|
|
|
+
|
|
|
+function SelectGoods({
|
|
|
+ API_getList,
|
|
|
+ baseFormData,
|
|
|
+ topSelectDom,
|
|
|
+ columnsTemp,
|
|
|
+ closeFu,
|
|
|
+ dataResFu,
|
|
|
+ oldCheckArr,
|
|
|
+ isOne,
|
|
|
+ canObj
|
|
|
+}: Props) {
|
|
|
+ const [formData, setFormData] = useState({ ...baseFormData })
|
|
|
+ const formDataRef = useRef({ ...baseFormData })
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ formDataRef.current = { ...formData }
|
|
|
+ }, [formData])
|
|
|
+
|
|
|
+ // 点击搜索的 时间戳
|
|
|
+ const [timeKey, setTimeKey] = useState(0)
|
|
|
+
|
|
|
+ // 点击搜索
|
|
|
+ const clickSearch = useCallback(() => {
|
|
|
+ setTimeout(() => {
|
|
|
+ setTimeKey(Date.now())
|
|
|
+ }, 50)
|
|
|
+ }, [])
|
|
|
+
|
|
|
+ // 点击重置
|
|
|
+ const resetSelectFu = useCallback(() => {
|
|
|
+ setFormData({ ...baseFormData })
|
|
|
+ setTimeout(() => {
|
|
|
+ setTimeKey(Date.now())
|
|
|
+ }, 50)
|
|
|
+ }, [baseFormData])
|
|
|
+
|
|
|
+ const [tableList, setTableList] = useState<GoodsType[]>([])
|
|
|
+ const [tableListAll, setTableListAll] = useState<GoodsType[]>([])
|
|
|
+
|
|
|
+ // 封装发送请求的函数
|
|
|
+ const getList = useCallback(async () => {
|
|
|
+ let canObjTemp = canObj || {}
|
|
|
+ const obj = {
|
|
|
+ ...formDataRef.current,
|
|
|
+ ...canObjTemp
|
|
|
+ }
|
|
|
+
|
|
|
+ const res = await API_getList(obj)
|
|
|
+ if (res.code === 0) {
|
|
|
+ setTableList(res.data.records || [])
|
|
|
+ if (timeKey === 0) setTableListAll(res.data.records || [])
|
|
|
+ }
|
|
|
+ }, [API_getList, canObj, timeKey])
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ getList()
|
|
|
+ }, [getList])
|
|
|
+
|
|
|
+ // 多选
|
|
|
+ const [checkArr, setCheckArr] = useState<GoodsType[]>([])
|
|
|
+
|
|
|
+ // 旧数组
|
|
|
+ useEffect(() => {
|
|
|
+ setCheckArr(oldCheckArr)
|
|
|
+ }, [oldCheckArr])
|
|
|
+
|
|
|
+ // 过滤掉 tableList 里面没有的id
|
|
|
+ const resNum = useMemo(() => {
|
|
|
+ const tableIds = tableListAll.map(v => v.id)
|
|
|
+ const arr = checkArr.filter(v => tableIds.includes(v.id))
|
|
|
+ return arr.length
|
|
|
+ }, [checkArr, tableListAll])
|
|
|
+
|
|
|
+ const checkFu = useCallback(
|
|
|
+ (item: GoodsType) => {
|
|
|
+ // 单选
|
|
|
+ if (isOne) {
|
|
|
+ if (checkArr && checkArr.length && item.id === checkArr[0].id) {
|
|
|
+ setCheckArr([])
|
|
|
+ } else setCheckArr([item])
|
|
|
+ } else {
|
|
|
+ if (checkArr.map(v => v.id).includes(item.id))
|
|
|
+ setCheckArr(checkArr.filter(v => v.id !== item.id))
|
|
|
+ else setCheckArr([...checkArr, item])
|
|
|
+ }
|
|
|
+ },
|
|
|
+ [checkArr, isOne]
|
|
|
+ )
|
|
|
+ const staBtn = useMemo(() => {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ title: isOne ? '单选' : '选择',
|
|
|
+ width: 50,
|
|
|
+ render: (item: GoodsType) => (
|
|
|
+ <Checkbox
|
|
|
+ checked={checkArr.map(v => v.id).includes(item.id)}
|
|
|
+ onChange={() => checkFu(item)}
|
|
|
+ ></Checkbox>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }, [checkArr, checkFu, isOne])
|
|
|
+
|
|
|
+ const tableLastBtn = useMemo(() => {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ render: (item: GoodsType) => {
|
|
|
+ return (
|
|
|
+ <Button size='small' type='text' onClick={() => openLink(`/goodsLook/${item.id}`)}>
|
|
|
+ 查看
|
|
|
+ </Button>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }, [])
|
|
|
+
|
|
|
+ // 点击提交
|
|
|
+ const btnOk = useCallback(() => {
|
|
|
+ dataResFu(checkArr)
|
|
|
+ if (!isOne) MessageFu.success('提交成功')
|
|
|
+ closeFu()
|
|
|
+ }, [checkArr, closeFu, dataResFu, isOne])
|
|
|
+
|
|
|
+ // 顶部筛选
|
|
|
+ const searchDom = useCallback(
|
|
|
+ (arr: any[]) => {
|
|
|
+ return arr.map(item => {
|
|
|
+ return (
|
|
|
+ <div key={item.name}>
|
|
|
+ {item.type === 'Input' ? (
|
|
|
+ <Input
|
|
|
+ value={formData[item.key]}
|
|
|
+ onChange={e => setFormData({ ...formData, [item.key]: e.target.value })}
|
|
|
+ placeholder={item.name}
|
|
|
+ maxLength={30}
|
|
|
+ showCount
|
|
|
+ />
|
|
|
+ ) : item.type === 'Select' ? (
|
|
|
+ <Select
|
|
|
+ options={item.options}
|
|
|
+ placeholder={item.name}
|
|
|
+ allowClear={true}
|
|
|
+ value={formData[item.key] || null}
|
|
|
+ onChange={e => setFormData({ ...formData, [item.key]: e })}
|
|
|
+ />
|
|
|
+ ) : item.type === 'Cascader' ? (
|
|
|
+ <Cascader
|
|
|
+ changeOnSelect
|
|
|
+ options={item.options}
|
|
|
+ placeholder={item.name}
|
|
|
+ fieldNames={{ label: 'name', value: 'id', children: 'children' }}
|
|
|
+ allowClear={!item.must}
|
|
|
+ value={formData[item.key] ? formData[item.key].split(',') : []}
|
|
|
+ onChange={e => setFormData({ ...formData, [item.key]: e ? e.join(',') : '' })}
|
|
|
+ />
|
|
|
+ ) : null}
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ })
|
|
|
+ },
|
|
|
+ [formData]
|
|
|
+ )
|
|
|
+
|
|
|
+ return (
|
|
|
+ <Modal
|
|
|
+ wrapClassName={styles.SelectGoods}
|
|
|
+ open={true}
|
|
|
+ title={
|
|
|
+ <div className='sgtit'>
|
|
|
+ <div>选择藏品</div> <div>已选中 {resNum} 条</div>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+ footer={[]}
|
|
|
+ >
|
|
|
+ <div className='sgMain'>
|
|
|
+ <div className='sgTop'>
|
|
|
+ <div className='sgtopll'>{searchDom(topSelectDom)}</div>
|
|
|
+ <div className='sgtoprr'>
|
|
|
+ <Button type='primary' onClick={clickSearch}>
|
|
|
+ 查询
|
|
|
+ </Button>
|
|
|
+  
|
|
|
+ <Button onClick={resetSelectFu}>重置</Button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* 表格 */}
|
|
|
+ <MyTable
|
|
|
+ yHeight={575}
|
|
|
+ classKey='ZGaddNow'
|
|
|
+ list={tableList}
|
|
|
+ columnsTemp={columnsTemp}
|
|
|
+ staBtn={staBtn}
|
|
|
+ lastBtn={tableLastBtn}
|
|
|
+ pagingInfo={false}
|
|
|
+ />
|
|
|
+
|
|
|
+ <div className='sgMainBtn'>
|
|
|
+ <Button type='primary' disabled={resNum === 0 && isOne} onClick={btnOk}>
|
|
|
+ 提交
|
|
|
+ </Button>
|
|
|
+  
|
|
|
+ <MyPopconfirm txtK='取消' onConfirm={closeFu} />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Modal>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+const MemoSelectGoods = React.memo(SelectGoods)
|
|
|
+
|
|
|
+export default MemoSelectGoods
|