/* 故障报修 * @Author: Li Hanlin * @Date: 2022-12-02 11:41:03 * @Last Modified by: Li Hanlin * @Last Modified time: 2023-02-10 17:58:21 */ import * as React from 'react'; import { useState, useMemo, useRef } from 'react'; import DrawerPro from '@/components/DrawerPro'; import AutoTable from '@/components/AutoTable'; import FormTable from "@/components/AutoTable/mtable"; import PremButton from '@/components/PremButton'; import getcolumns from './columns'; import { useRequest } from 'ahooks'; import { doFetch } from '@/utils/doFetch'; import Addform from '@/components/Addform'; import Detail from '@/components/RepaireDetail/Detail'; import dayjs from 'dayjs'; import Details from "./Details"; import Devices from "./Devices"; const formCommonColumns = [ { title: '是否可操作', dataIndex: 'isFinish', key: 'isFinish', editable: false, hideInTable: true }, { title: '设备编号', dataIndex: 'equipmentNo', key: 'equipmentNo', colProps: { sm: 3, }, editable: false }, { title: '设备名称', dataIndex: 'equipmentName', key: 'equipmentName', colProps: { sm: 3, }, editable: false }, { title: '设备型号', dataIndex: 'equipmentModelName', key: 'equipmentModelName', colProps: { sm: 3, }, editable: false }, { title: '每期单价(元)', dataIndex: 'unitPrice', key: 'unitPrice', colProps: { sm: 2, }, editable: false }, { title: '押金(元)', dataIndex: 'deposit', key: 'deposit', editable: false, colProps: { sm: 2, }, }, { title: '结束租赁时间', dataIndex: 'endLeaseDate', key: 'endLeaseDate', editable: false, colProps: { sm: 3, }, }, { title: '采集状态', dataIndex: 'collectStatusName', key: 'collectStatusName', editable: false, colProps: { sm: 2, }, } ]; function Contract(props) { let actionRef = useRef(), formRef = useRef(); const [drawer, setdrawer] = useState({ open: false, }), [activeTabKey, setactiveTabKey] = useState('1'), [amount, camount] = useState(0), [intelligenceList, cil] = useState([]); const { run, loading, runAsync } = useRequest(doFetch, { manual: true, onSuccess: (res, params) => { if (res?.code == '0000') { actionRef?.current?.reload(); setdrawer((s) => ({ ...s, open: false, })); } }, }); const rightExtra = (text, row, _, action) => { //1未开始 2进行中 3已到期 4待押金退还 let ifs = row.status == 1, ifsa = row.status == 2, ifsb = row.status == 3, ifsc = row.status == 4; return [ ifs && <PremButton key='start' btn={{ size: 'small', onClick: async () => { let res = await doFetch({ url: '/lease/umContractEquipment/queryBeforeStart', params: { contractId: row.id } }); cil(res?.data?.dataList ?? []); setdrawer((s) => ({ ...s, open: true, item: { ...row, intelligenceList: res?.data?.dataList ?? [] }, val: 'start', title: '开始', fields: [ { title: '合同起租日', dataIndex: 'startLeaseDate', key: 'startLeaseDate', valueType: 'date', formItemProps: { rules: [{ required: true, message: '此项为必填项' }] }, colProps: { span: 8 }, }, { title: '合同终止日', dataIndex: 'endLeaseDate', key: 'endLeaseDate', valueType: 'date', fieldProps: { disabled: true }, colProps: { span: 8 }, formItemProps: { rules: [{ required: true, message: '此项为必填项' }] } }, { title: '第一期回款形式', dataIndex: 'firstCollection', key: 'firstCollection', valueType: 'select', options: [ { label: '现金', value: 1 }, { label: '银行承兑', value: 2 }, ], colProps: { span: 8 }, formItemProps: { rules: [{ required: true, message: '此项为必填项' }] }, }, { title: '租赁设备', dataIndex: 'intelligenceList', key: 'intelligenceList', valueType: 'formList', initialValue: [ { state: 'all', title: '标题', }, ], colProps: { xs: 24, sm: 24, }, columns: [ { title: '设备ID', dataIndex: 'equipmentId', key: 'equipmentId', colProps: { sm: 6, }, editable: false, hideInTable: true }, { title: '是否绑定智能单元', dataIndex: 'isBindUnit', key: 'isBindUnit', colProps: { sm: 6, }, editable: false, hideInTable: true }, { title: '设备编号', dataIndex: 'equipmentNo', key: 'equipmentNo', colProps: { sm: 6, }, editable: false }, { title: '设备名称', dataIndex: 'equipmentName', key: 'equipmentName', colProps: { sm: 6, }, editable: false }, { title: '设备型号', dataIndex: 'equipmentModelName', key: 'equipmentModelName', colProps: { sm: 6, }, editable: false }, { title: '关联智能单元', dataIndex: 'ledgerEquipmentId', key: 'ledgerEquipmentId', valueType: 'select', fieldProps: { placeholder: '请选择', }, formItemProps: { rules: [ { required: true, message: '此项为必填项', }, ], }, colProps: { sm: 6, }, options: { path: '/lease/umLeaseLedger/intelligentUnitSelectbox', linkParams: { equipmentId: 'id', }, }, hideInForm: { isBindUnit: [1] }, hideInFormShowKey: 'intelligentUnitNo' }, ], creatorButtonProps: false, deleteIconProps: false, }, { title: '起租单上传', dataIndex: 'startLeaseFileList', key: 'startLeaseFileList', valueType: 'uploadBtn', fieldProps: { limit: 1, }, colProps: { span: 24 }, }, { title: '发用单文件', dataIndex: 'hairuseFileList', key: 'hairuseFileList', valueType: 'uploadBtn', fieldProps: { limit: 1, }, colProps: { span: 24 }, }, { title: '租赁物交付确认单文件', dataIndex: 'leaseDeliverFileList', key: 'leaseDeliverFileList', valueType: 'uploadBtn', fieldProps: { limit: 1, }, colProps: { span: 24 }, } ] })); }, }} > 开始 </PremButton>, ifs && <PremButton key='edit' btn={{ size: 'small', onClick: async () => { let res1 = await doFetch({ url: pathconfig.detail, params: { id: row.id } }), res2 = await doFetch({ url: "/lease/umContractEquipment/queryByContractId", params: { contractId: row.id } }); let details = { ...(res1?.data?.data ?? {}), contractEquipmentList: res2?.data?.dataList ?? [] } camount(row.amount); setdrawer((s) => ({ ...s, open: true, item: details, val: 'edit', title: '编辑' })); }, }} > 修改 </PremButton>, ifs && <PremButton key='remove' pop={{ title: '是否删除该合同?', okText: '确认', cancelText: '取消', onConfirm: async () => { runAsync({ url: pathconfig.delete, params: { id: row.id, } }); }, }} btn={{ size: 'small', type: 'danger', }} > 删除 </PremButton>, ifsa && <PremButton key='out' btn={{ size: 'small', onClick: async () => { let res = await doFetch({ url: '/lease/umContractEquipment/queryBeforeRentout', params: { contractId: row.id } }); setdrawer((s) => ({ ...s, open: true, item: { ...row, deviceList: res?.data?.dataList ?? [] }, val: 'out', title: '退租', fields: [ { title: '', dataIndex: 'deviceList', key: 'deviceList', valueType: 'formList', initialValue: [ { state: 'all', title: '标题', }, ], colProps: { xs: 24, sm: 24, }, columns: [ ...formCommonColumns, { title: '实际结束时间', dataIndex: 'realEndDate', key: 'realEndDate', valueType: 'date', colProps: { sm: 3, }, hideInForm: { isFinish: [2] }, hideInFormShowKey: 'realEndDate' }, { title: '违约金(元)', dataIndex: 'violatePrice', key: 'violatePrice', colProps: { sm: 3, }, valueType: 'digit', precision: 2, hideInForm: { isFinish: [2] }, hideInFormShowKey: 'violatePrice' }, ], creatorButtonProps: false, deleteIconProps: false, } ] })); }, }} > 退租 </PremButton>, ifsb && <PremButton key='break' btn={{ size: 'small', onClick: async () => { let res = await doFetch({ url: '/lease/umContractEquipment/queryBeforeEndOrHandle', params: { contractId: row.id } }); setdrawer((s) => ({ ...s, open: true, item: { ...row, deviceList: res?.data?.dataList ?? [] }, val: 'break', title: '结束', fields: [ { title: '返程运费', dataIndex: 'returnFreight', key: 'returnFreight', colProps: { span: 8 }, valueType: 'digit', precision: 2, formItemProps: { rules: [{ required: true, message: '此项为必填项' }] } }, { title: '返程运费承担方', dataIndex: 'returnBear', key: 'returnBear', valueType: 'select', options: [ { label: '客户', value: '1' }, { label: '平台', value: '2' }, ], colProps: { span: 8 }, formItemProps: { rules: [{ required: true, message: '此项为必填项' }] } }, ] })); }, }} > 结束 </PremButton>, ifsc && <PremButton key='handle' btn={{ size: 'small', onClick: async () => { let res = await doFetch({ url: '/lease/umContractEquipment/queryBeforeEndOrHandle', params: { contractId: row.id } }); setdrawer((s) => ({ ...s, open: true, item: { ...row, deviceList: res?.data?.dataList ?? [] }, val: 'handle', title: '处理', fields: [ { title: '退还押金', dataIndex: 'refund', key: 'refund', colProps: { span: 8 }, valueType: 'digit', precision: 2, formItemProps: { rules: [{ required: true, message: '此项为必填项' }] } }, { title: '租赁物归还确认单上传', dataIndex: 'leaseReturnFileList', key: 'leaseReturnFileList', valueType: 'uploadBtn', fieldProps: { limit: 1, }, colProps: { span: 24 }, }, { title: '押金归还确认单上传', dataIndex: 'refundFileList', key: 'refundFileList', valueType: 'uploadBtn', fieldProps: { limit: 1, }, colProps: { span: 24 }, }, ] })); }, }} > 处理 </PremButton> ] } const columns = useMemo(() => { let defcolumn = getcolumns(setdrawer, drawer).filter((it) => it.key == activeTabKey)[0]?.columns; let defpath = getcolumns(setdrawer, drawer).filter((it) => it.key == activeTabKey)[0]?.pathconfig ?? {}; if (activeTabKey == 1) { return defcolumn.concat({ title: '操作', valueType: 'option', width: 150, render: (text, row, _, action) => rightExtra(text, row, _, action), }); } else { return defcolumn; } }, [activeTabKey, drawer]); const pathconfig = useMemo(() => { let defpath = getcolumns(setdrawer).filter((it) => it.key == activeTabKey)[0]?.pathconfig ?? {}; return defpath; }, [activeTabKey]); const calculateContractAmount = (list = [], month = 0) => { const sum = list?.reduce((prev, next) => { if (Number(prev + next)) { return Number((prev + next).toFixed(2)); } }, 0); camount(month == 0 || month ? ((sum ?? 0) * 100) * month / 100 : 0); }; const changeList = (list = []) => { list.forEach(it => { if (it.unitPrice && it.zxPrice) { it.rebatePrice = Number(((it.unitPrice ?? 0) - (it.zxPrice ?? 0)).toFixed(2)) } else { it.rebatePrice = '' } }); return list; }; const getEndLeaseDate = (start) => { let end = dayjs(start).add(drawer.item.tenancy, 'months').subtract(1, 'day'); return end; }; function getOnlyDom() { switch (drawer.type) { case 'detail': return <Details drawer={drawer} />; case 'device': return <Devices drawer={drawer} />; } } return ( <div style={{ position: 'relative' }}> <AutoTable pagetitle={<h3 className="page-title">租赁合同</h3>} columns={columns} path={pathconfig?.list} actionRef={actionRef} pageextra={pathconfig?.enableadd ? 'add' : null} resizeable={false} addconfig={{ // access: 'sysDepartment_save', name: '新增', btn: { disabled: false, type: 'primary', onClick: () => { setdrawer((s) => ({ ...s, open: true, item: { registrationDate: dayjs().format('YYYY-MM-DD'), contractEquipmentList: [ { equipmentId: '', unitPrice: '', zxPrice: '', rebatePrice: '', deposit: '', remark: '' } ] }, title: '新增', val: 'add' })); }, }, }} tabList={getcolumns()} activeTabKey={activeTabKey} onTabChange={(key) => { setactiveTabKey(key); }} /> <DrawerPro {...drawer} fields={(drawer.val != 'add' && drawer.val != 'edit') ? drawer.fields : columns} detailpath={drawer.val == 'only' ? pathconfig?.detail : null} detailData={drawer?.item} defaultFormValue={drawer?.item} params={{ id: drawer?.item?.id }} formRef={formRef} placement="right" onClose={() => { setdrawer((s) => ({ ...s, open: false, })); }} onFinish={async (vals) => { let newVals = JSON.parse(JSON.stringify(vals)); if (drawer?.val == 'add') { await runAsync({ url: pathconfig?.add, params: { ...newVals, amount } }); } else if (drawer?.val == 'edit') { await runAsync({ url: pathconfig?.edit, params: { ...newVals, id: drawer?.item?.id, amount } }); } else if (drawer?.val == 'start') { delete newVals.intelligenceList; await runAsync({ url: '/lease/umContract/start', params: { ...newVals, id: drawer?.item?.id } }); } else if (drawer?.val == 'out') { let contractEquipmentList = newVals.deviceList?.filter(it => { if (it.isFinish == 1) { return { id: it.id, realEndDate: it.realEndDate, violatePrice: it.violatePrice } } }) await runAsync({ url: '/lease/umContract/rentout', params: { contractEquipmentList, id: drawer?.item?.id } }); } else if (drawer?.val == 'break') { await runAsync({ url: '/lease/umContract/end', params: { ...newVals, id: drawer?.item?.id } }); } else if (drawer?.val == 'handle') { await runAsync({ url: '/lease/umContract/handle', params: { ...newVals, id: drawer?.item?.id } }); } }} onValuesChange={(changedValues, allValues) => { for (let i in changedValues) { if (i == 'contractEquipmentList' || i == 'tenancy') { calculateContractAmount(allValues['contractEquipmentList']?.map(it => it.unitPrice ?? 0), allValues['tenancy']); } if (i == 'contractEquipmentList') { let newList = changeList(allValues['contractEquipmentList']); formRef?.current?.setFieldsValue({ ['contractEquipmentList']: newList }); setdrawer((s) => { return { ...s, item: { ...s.item, contractEquipmentList: newList } } }) } if (i == 'startLeaseDate') { let end = getEndLeaseDate(changedValues[i]); formRef?.current?.setFieldsValue({ ['endLeaseDate']: end }); setdrawer((s) => { return { ...s, item: { ...s.item, endLeaseDate: end } } }) } if (i == 'intelligenceList') { let params = changedValues[i], equipmentId = params.length > 0 ? intelligenceList[params.length - 1]?.equipmentId : ""; params = params.length > 0 ? params[params.length - 1] : {}; doFetch({ url: '/lease/umLeaseLedger/bound', params: { ...params, id: equipmentId } }); } } }} submitter={{ render: (props, doms) => { return [ <div key='render' className='spread' style={{ position: 'fixed', bottom: 12, width: 'calc(100% - 62px)' }}> { (drawer.val == 'add' || drawer.val == 'edit') && <div key='amount' style={{ color: 'red', fontSize: 16, fontWeight: 500 }}> <span>合同金额(单位:元):</span> <span>{amount}</span> </div> } <div> <PremButton key='rest' btn={{ onClick: () => { props.form?.resetFields() }, style: { marginRight: 8 } }} > 重置 </PremButton> <PremButton key='submit' btn={{ type: "primary", onClick: () => { props.form?.submit?.() }, }} > 提交 </PremButton> </div> </div> ]; }, }} childrenposition={(drawer.val == 'break' || drawer.val == 'handle') ? 'top' : ''} > { drawer.val == 'only' && getOnlyDom() } { (drawer.val == 'break' || drawer.val == 'handle') && <FormTable columns={[ ...formCommonColumns, { title: '实际结束时间', dataIndex: 'realEndDate', key: 'realEndDate', colProps: { sm: 3, }, editable: false }, { title: '违约金(元)', dataIndex: 'violatePrice', key: 'violatePrice', colProps: { sm: 3, }, editable: false }, ]} dataSource={drawer?.item?.deviceList} resizeable={false} pageextra="none" /> } </DrawerPro> </div> ); } export default Contract;