import DatePicker from '@/components/DatePicker' import FileModal from '@/components/FileModal' import { contractReturnStore } from '@/store/mobx' import { iReceivableState, iEditableCellProps } from '@/types/contract' import { iFileModal } from '@/types/file' import consts from '@/utils/consts' import { dayjsFormat, formatMoney } from '@/utils/util' import { DisconnectOutlined } from '@ant-design/icons' import { Form, Input, Popconfirm, Table } from 'antd' import locale from 'antd/es/date-picker/locale/zh_CN' import dayjs from 'dayjs' import { observer } from 'mobx-react' import React, { useEffect, useMemo, useState } from 'react' import { apiDelReturn, apiGetReturns, apiUpdateReturn } from './api' const EditableCell: React.FC = ({ editing, dataIndex, title, cellType, children, record, index, ...restProps }) => { const cellNode = cellType === 'text' ? : const isDate = useMemo(() => { return dataIndex === 'createTime' || dataIndex === 'time' }, [ dataIndex ]) return ( {editing ? ( {cellNode} ) : ( children )} ) } interface ReceivableProps { updateTreeAndContract: () => Promise } const Receivable: React.FC = ({ updateTreeAndContract }) => { const [ form ] = Form.useForm() const [ data, setData ] = useState>([]) const [ id, setId ] = useState('') const [ fileModal, setFileModal ] = useState({ visible: false, dataType: consts.DATA_TYPE.RETURN, dataId: '' }) const [ editingKey, setEditingKey ] = useState('') const delConfirm = async (id: string, contractsId: string, bidsectionId: string) => { const { code = -1 } = await apiDelReturn(id, contractsId, bidsectionId) if (code === consts.RET_CODE.SUCCESS) { const newData = data.filter(item => item.id !== id) setData(newData) updateTreeAndContract() } } useEffect(() => { if (contractReturnStore.contract.id) { if (contractReturnStore.contract.id !== id) { setId(contractReturnStore.contract.id) initData() } else if (contractReturnStore.shouldUpdate && contractReturnStore.shouldUpdate === '2') { initData() } contractReturnStore.shouldUpdate && (contractReturnStore.changeUpdate('')) } }, [ contractReturnStore.contract.id, contractReturnStore.shouldUpdate ]) const initData = async () => { const { code = -1, data = [] } = await apiGetReturns(contractReturnStore.contract.id, contractReturnStore.contract.bidsectionId) if (code === consts.RET_CODE.SUCCESS) { setData(data) } } const save = async (key: React.Key) => { try { const row = (await form.validateFields()) as iReceivableState const newData = [ ...data ] const index = newData.findIndex(item => key === item.id) if (index > -1) { const item = newData[index] const payload = { ...row, time: dayjsFormat(row.time, 'YYYY-MM-DD'), createTime: dayjsFormat(row.createTime, 'YYYY-MM-DD'), id: item.id, bidsectionId: item.bidsectionId, contractsId: item.contractsId } const { code = -1 } = await apiUpdateReturn(payload) if (code === consts.RET_CODE.SUCCESS) { newData.splice(index, 1, { ...item, ...row }) setData(newData) updateTreeAndContract() } } setEditingKey('') } catch (errInfo) { console.log('Validate Failed:', errInfo) } } const isEditing = (record: iReceivableState) => record.id === editingKey const columns = [ { dataIndex: 'sort', width: '5%', // eslint-disable-next-line react/display-name render: (_: any, record: any, index: number) => { return {index + 1} } }, { title: '回款日期', dataIndex: 'time', editable: true, width: '12%', // eslint-disable-next-line react/display-name render: (text: string) => {dayjsFormat(text, 'YYYY-MM-DD')} }, { title: '回款金额', dataIndex: 'price', editable: true, width: '12%', // eslint-disable-next-line react/display-name render: (text: string) => {formatMoney(text)} }, { title: '回款方式', dataIndex: 'way', editable: true, width: '12%' }, { title: '创建人', dataIndex: 'createUser', editable: false, width: '12%' }, { title: '创建时间', dataIndex: 'createTime', editable: true, width: '12%', // eslint-disable-next-line react/display-name render: (text: any) => {dayjsFormat(text, 'YYYY-MM-DD')} }, { title: '备注', dataIndex: 'remarks', editable: true, width: '12%' }, { title: '附件', dataIndex: 'fileCounts', // eslint-disable-next-line react/display-name render: (text: number, record: iReceivableState) => setFileModal({ ...fileModal, dataId: record.id, visible: true })}> {text} }, { title: '操作', dataIndex: 'opreate', width: '10%', // eslint-disable-next-line react/display-name render: (text: any, record: iReceivableState) => { const editable = isEditing(record) return (
{ editable ? (<> save(record.id)}>保存 setEditingKey('')}>取消) : setEditingKey(record.id)}>编辑 } delConfirm(record.id, record.contractsId, record.bidsectionId)}> 删除
) } } ] const cancel = () => { setEditingKey('') } const mergedColumns = columns.map(col => { if (!col.editable) { return col } return { ...col, onCell: (record: iReceivableState) => ({ record, cellType: col.dataIndex === 'createTime' || col.dataIndex === 'time' ? 'DatePicker' : 'text', dataIndex: col.dataIndex, title: col.title, editing: isEditing(record) }) } }) return ( <>
record.id} /> setFileModal({ ...fileModal, visible: false })} showUpload={true} uploadCallBack={() => initData()} /> ) } export default observer(Receivable)