import Authorization from '@/components/Authorization' import { ZhSubmitButton } from '@/components/Button' import OssUploadModal from '@/components/OssUpload' import { contractReturnStore, tenderStore } from '@/store/mobx' import { iIncomeTree, iShowTemplateState, iTemplateState } from '@/types/contract' import { iFile } from '@/types/file' import { apiSaveFileInfo } from '@/utils/common/api' import { contractConsts } from '@/utils/common/constStatus' import consts from '@/utils/consts' import { Button, Input, message, Radio, Table, Tabs } from 'antd' import Modal from 'antd/lib/modal/Modal' import { RadioChangeEvent } from 'antd/lib/radio' import { ColumnsType } from 'antd/lib/table' import { observer } from 'mobx-react' import React, { KeyboardEvent, useEffect, useRef, useState } from 'react' import { apiGetIncome, apiResfulContractTree, apiUpdateName, apiUpdateSerial } from '../../api' import { apiContractIncome, apiSetTemplate } from '../Modal/api' import Detail from '../Tabs/Detail' import File from '../Tabs/File' import Receivable from '../Tabs/Receivable' import styles from './index.module.scss' interface iTableContentPorps { changeModalType: (type: string) => void row: iIncomeTree setRow: (record: iIncomeTree) => void history: any } const GCsheet: React.FC = ({ changeModalType, row, setRow, history }) => { const [ sectionTemplate, setSectionTemplate ] = useState({ isShow: false, template: '', loading: false }) const [ tempalte, setTempalte ] = useState<{template1: iTemplateState, template2: iTemplateState}>({ template1: { attribution: '', children: undefined, depth: 0, id: 0, isEnd: false, leaf: false, name: '', parentId: 0, serial: '' }, template2: { attribution: '', children: undefined, depth: 0, id: 0, isEnd: false, leaf: false, name: '', parentId: 0, serial: '' } }) // 阿里oss弹窗控制器 const [ visible, setVisible ] = useState(false) const { TabPane } = Tabs useEffect(() => { initData() }, []) const initData = async () => { const data = await apiContractIncome(tenderStore.bid) if (data.code === consts.RET_CODE.SUCCESS) { if (data.isTemplate && data.isTemplate === 1) { setSectionTemplate({ ...sectionTemplate, isShow: true }) setTempalte({ ...tempalte, template1: data.sectionTemplate1, template2: data.sectionTemplate2 }) } else { contractReturnStore.updateTree(data.sectionTree.children) } } } interface HandleLabelProps { id: string bidsectionId: string name?: string } const handleNewLabel = async (type: string, payload: HandleLabelProps) => { let RET_CODE: number = -1 if (type === 'create') { payload.name = inputEl.current?.state.value const { code = -1 } = await apiResfulContractTree('add', payload) RET_CODE = code } if (type === 'edit') { const name = inputEl.current?.state.value const { code = -1 } = await apiUpdateName(payload.id, payload.bidsectionId, name) RET_CODE = code } if (RET_CODE === consts.RET_CODE.SUCCESS) { contractReturnStore.resetTree(tenderStore.tender.bidsectionId) } } const codeChange = async (row: iIncomeTree, value: string) => { const { code = -1 } = await apiUpdateSerial(row.id, row.bidsectionId, value) if (code === consts.RET_CODE.SUCCESS) { initData() } } const inputEl = useRef(null) const modalColumns: ColumnsType = [ { title: '项目节', dataIndex: 'serial', width: '30%', // eslint-disable-next-line react/display-name render: (text: string, row: iTemplateState) => { const { attribution = '', serial = '' } = row return {`${attribution}${serial}`} } }, { title: '名称', dataIndex: 'name', width: '70%' } ] const TableColumns: ColumnsType = [ { title: '编号', dataIndex: 'code', width: '15%', // eslint-disable-next-line react/display-name render: (text: string, row: iIncomeTree) => { if (row.isEdit) { return ( ) => codeChange(row, e.currentTarget.value)} />) } else { return {row.code} } // return {row.code} } }, { title: '项目名称', dataIndex: 'name', render: (text:any, record: iIncomeTree) => { if (record.isEdit || record.isNew) { const type = record.isEdit ? 'edit' : 'create' return ( handleNewLabel(type, { id: type === 'edit' ? record.id : record.parentId, bidsectionId: record.bidsectionId })} onBlur={() => handleNewLabel(type, { id: type === 'edit' ? record.id : record.parentId, bidsectionId: record.bidsectionId })} />) } else { return {text} } } }, { title: '合同名称', dataIndex: 'contractName' }, { title: '合同编号', dataIndex: 'contractCode' }, { title: '合同金额', dataIndex: 'contractPrice', align: 'right', // eslint-disable-next-line react/display-name render: (text:any, record: iIncomeTree) => record.contractCode ? {text} : '' }, { title: '回款金额', dataIndex: 'contractReturned', align: 'right', // eslint-disable-next-line react/display-name render: (text:any, record: iIncomeTree) => record.contractCode ? {text} : '' }, { title: '状态', dataIndex: 'contractStatus', // eslint-disable-next-line react/display-name render: (_: any, record: iIncomeTree) => record.contractCode ? {contractConsts[record.contractStatus].text} : '' } ] // modal 确认 - 回调 const handleModalConfirm = async () => { setSectionTemplate({ ...sectionTemplate, loading: true }) if (!sectionTemplate.template) { setSectionTemplate({ ...sectionTemplate, loading: false }) return message.error('请选择项目节模板!') } const { code = -1 } = await apiSetTemplate(sectionTemplate.template, tenderStore.tender.bidsectionId, 0) if (code === consts.RET_CODE.SUCCESS) { await initData() } setSectionTemplate({ ...sectionTemplate, loading: false, isShow: false }) } // modal 关闭 - 回调 const handleModalCancel = () => { history.push('/console/contract/content/summary') } // 模板选择radio切换回调 const handleRadioEvent = (e: RadioChangeEvent) => { if (e.target.checked) { setSectionTemplate({ ...sectionTemplate, template: e.target.value }) } } const onClickRow = (record: iIncomeTree) => { return { onClick() { rowClickHandler(record.id, record.bidsectionId, record.isEdit, record.isNew) }, onDoubleClick() { contractReturnStore.rowChange(row.id) } } } // 行点击回调 const rowClickHandler = async (id: string, bid: string, isEdit?: boolean, isNew?: boolean) => { if (!isEdit && !isNew) { const { code = -1, section = {}, contract: newContract = {} } = await apiGetIncome(id, bid) if (code === consts.RET_CODE.SUCCESS) { setRow(section) contractReturnStore.updateContract(newContract) } } } const handleRowClass = (record: iIncomeTree) => { return record.id === row.id ? 'ant-table-row-selected' : '' } const tabOnClick = (key: string) => { contractReturnStore.changeUpdate(key) } // 阿里oss上传弹窗 const onShow = (show: boolean) => setVisible(show) const onCreate = async (fileList: iFile[]) => { const { code = -1 } = await apiSaveFileInfo(fileList, consts.DATA_TYPE.CONTRACT_RETURN, row.contractId) if (code === consts.RET_CODE.SUCCESS) { setVisible(false) contractReturnStore.changeUpdate('3') } } return sectionTemplate.isShow ? handleModalConfirm()} width='70vw' >
默认项目节无法修改,可自行增加维护子节点
handleRadioEvent(e)}>项目节模板1
{ tempalte.template1?.children && tempalte.template1?.children.length? record.id} defaultExpandAllRows={true} /> : '' }
handleRadioEvent(e)}>项目节模板2
{ tempalte.template2?.children && tempalte.template2?.children.length?
record.id} defaultExpandAllRows={true} /> : '' } :
{ contractReturnStore.showTable ? dataSource={contractReturnStore.tree} columns={TableColumns} bordered pagination={false} rowKey={record => record.id} defaultExpandAllRows={true} onRow={onClickRow} rowClassName={handleRowClass} style={{ height: '100%', overflowY: 'scroll' }} /> : '' }
tabOnClick(key)} tabBarExtraContent={{ right:
{ contractReturnStore.contract.id && contractReturnStore.contract.status === contractConsts.status.checking ? <> : '' } { contractReturnStore.contract.id && contractReturnStore.contract.status === contractConsts.status.willClose ? : '' } { contractReturnStore.contract.id && contractReturnStore.contract.status === contractConsts.status.closed ? changeModalType('unlock')}>解锁合同 : '' }
}}>
setVisible(false)} onCreate={onCreate} onShow={onShow} />
} export default observer(GCsheet)