/* * @Author: cclu * @Date: 2022-04-28 10:47:35 * @LastEditTime: 2023-08-30 15:10:35 * @LastEditors: zzy 411037547@qq.com * @Description: 商户欠款详情 * @FilePath: \cloud-platform\src\pages\busniess\PaymentConfirm\detail.tsx */ import { connect, history } from "umi"; import useRequest from '@ahooksjs/use-request'; import { useEffect, useRef, useState } from "react"; import { PageContainer } from "@ant-design/pro-layout"; import ProTable from "@ant-design/pro-table"; import { PictureTwoTone, PlusOutlined } from "@ant-design/icons"; import { Button, Card, Col, Descriptions, Empty, message, Row, Space, Statistic, Tag, Typography, Image, Drawer, List, Avatar, Result } from "antd"; import { ModalForm, ProFormDatePicker, ProFormDigit, ProFormSelect, ProFormTextArea, ProFormUploadButton } from "@ant-design/pro-form"; import ProjectDetail from "@/pages/BussinessProject/detail"; import IconFont from "@/components/IconFont"; import ProjectItem from "./components/ProjectItem"; import type { ConnectState } from "@/models/connect"; import type { ProFormInstance } from '@ant-design/pro-form' import type { ProColumns, ActionType } from "@ant-design/pro-table"; import type { AccountReceivablesModel, PaymentConfirmModel, RemarksModel } from "./data"; import { getFieldEnum } from "@/services/options"; import { getPaymentConfirmList, getMerchantsReceivables, updatePaymentConfirm, uploadFile, savePaymentRecord, getRemarksList, updateSynchroRemarks, delPaymentConfirm, uploadAHYDFile } from "./service"; import EditPaymentTable from "./components/EditPaymentTable"; import PaymentRecord from "@/pages/BussinessProject/components/PaymentRecord"; import numeral from "numeral"; import moment from "moment"; import { transferImg } from "@/utils/format"; import './style.less'; const { Title, Text } = Typography // 更新回款信息 const handleAddUpdate = async (fields: PaymentConfirmModel, remark?: RemarksModel) => { const hide = message.loading('正在提交...'); const result = await updatePaymentConfirm(fields); hide(); if (result.Result_Code !== 100) { message.error(`${result.Result_Desc}` || `${result.Result_Code}:提交失败`); return false; } if (remark) await updateSynchroRemarks({ ...remark, TABLE_ID: fields?.PAYMENTCONFIRM_ID || result.Result_Data.PAYMENTCONFIRM_ID }) message.success("提交成功!") return result.Result_Data; }; // 删除回款信息 const handleDelete = async (id: number) => { const hide = message.loading('正在删除...'); const result = await delPaymentConfirm(id) hide(); if (result.Result_Code !== 100) { message.error(`${result.Result_Desc}` || `${result.Result_Code}:删除失败`); return false; } message.success("删除成功!") return true; }; // 保存拆分记录 const handleSavePament = async (fields: PaymentConfirmModel[]) => { const hide = message.loading('正在提交...'); const result = await savePaymentRecord(fields); hide(); if (result.Result_Code !== 100) { message.error(`${result.Result_Desc}` || `${result.Result_Code}:提交失败`); return false; } message.success("提交成功!") return true; }; // 校验图片大小 const beforeUpload = (file: any) => { const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; if (!isJpgOrPng) { message.error('You can only upload JPG/PNG file!'); } const isLt2M = file.size / 1024 / 1024 < 2; if (!isLt2M) { message.error('图片大小不超过 2MB!'); } return isJpgOrPng && isLt2M; } const MerchartsPayment: React.FC = (props: any) => { const formRef = useRef(); const actionRef = useRef(); const [tabActiveIndex, setTabActiveIndex] = useState('1') const [currentProject, setProject] = useState(undefined) const [fileList, setFileList] = useState([]) const [fieldEnumIcon, setFieldEnumIcon] = useState() // 款项类型图标 const [myRemark, setMyRemark] = useState({}) // 备注 const [step, setStep] = useState(1) // 步骤 1 填写回款信息 2.拆分回款金额到不同项目 const [imagePreviewVisible, setImagePreviewVisible] = useState(false) // 预览图片 const [currentRow, setCurrentRow] = useState() const [editFilds, setEditFilds] = useState() const [paymentList, setPaymentList] = useState() // 欠款项目 const [brandImages, setBrandImages] = useState() // 品牌图片 const [accountReceivablesList, setAccountReceivablesList] = useState<[]>() // 应收款项目 const [modalVisible, handleModalVisible] = useState(false) const pageid = props.match.params.id const currentUser = props?.currentUser // 根据用户的类型 拼接请求参数 商户访问则使用门店ids 业主访问则直接查询商户id const userDataParams = currentUser && currentUser.UserPattern === 1000 ? { MerchantsId: pageid, MERCHANTS_ID: pageid, ShowRevenueSplit: false } : { ServerpartShopIds: currentUser.ServerpartShopIds, ShowRevenueSplit: false } // 欠款商户 const { run: refreshPage, loading: merchartsLoading, data: merchartsData } = useRequest(() => { return getMerchantsReceivables(userDataParams) }) const { run: getRemark, loading: remarkLoading, data: remarkList = [] } = useRequest((params) => { return getRemarksList({ ...params, TABLE_NAME: 'T_PAYMENTCONFIRM' }) }, { manual: true }) // 生成账款类型状态枚举 const { loading: fieldLoading, data: FieldEnum } = useRequest(async () => { const data = await getFieldEnum({ FieldExplainField: "ACCOUNT_TYPE" }) const opt = {} const iconOpt = {} data?.forEach(n => { iconOpt[`${n.value}`] = { text: , status: n.value === 9000 ? 'Processing' : 'error' } opt[n.value] = { text: n.label, // status: n.value === "9000" ? 'Processing' : 'error' } }) setFieldEnumIcon(iconOpt) return opt }) useEffect(() => { if (!merchartsLoading && merchartsData && !brandImages) { if (merchartsData?.AccountReceivablesList) { // 生成品牌图列表 const brandImage = merchartsData?.AccountReceivablesList.filter((n: AccountReceivablesModel) => n.BUSINESSPROJECT_ICO ).map((item: AccountReceivablesModel) => item.BUSINESSPROJECT_ICO) setBrandImages(Array.from(new Set(brandImage))) // 生成应收款项目列表数据 按照时间排序 setAccountReceivablesList(merchartsData?.AccountReceivablesList.sort( (a: { ACCOUNT_DATE: string | number | Date; }, b: { ACCOUNT_DATE: string | number | Date; }) => new Date(a.ACCOUNT_DATE).getTime() - new Date(b.ACCOUNT_DATE).getTime())) return } setBrandImages([]) setAccountReceivablesList([]) } }, [merchartsLoading, merchartsData, brandImages]) /* 校验回款数据拆分数据并提交 */ const checkAmountAndUpdate = async () => { // 回款拆分 if (editFilds.length === 0) { message.warning("请选择需要返款的数据") return false } const endPayments = editFilds.map((n: PaymentConfirmModel) => { return { ...n, PAYMENTCONFIRM_PID: currentRow.PAYMENTCONFIRM_ID, PAYMENTDATE: currentRow.PAYMENTDATE, ACTUAL_PAYMENT: numeral(n.ACTUAL_PAYMENT).multiply(10000).value(), STAFF_ID: currentUser?.ID, // 操作人内码 STAFF_NAME: currentUser?.Name, // 操作人员 } }) const paymentPrice = endPayments.reduce((pre: any, item: any) => pre + item.ACTUAL_PAYMENT, 0,) if (paymentPrice <= numeral(currentRow.CURRENTBALANCE).multiply(10000).value()) { return await handleSavePament(endPayments) } message.warning("返款金额应小于总回款金额") return false } /* 页面头部信息描述 */ const descirption = ( <> {merchartsData?.COOPMERCHANTS_NAME} {merchartsData?.COOPMERCHANTS_LEGALPERSON && {merchartsData?.COOPMERCHANTS_LEGALPERSON}} {merchartsData?.COOPMERCHANTS_LEGALMOBILE || "-"} {merchartsData?.COOPMERCHANTS_LINKMAN && {merchartsData?.COOPMERCHANTS_LINKMAN}} {merchartsData?.COOPMERCHANTS_MOBILEPHONE || "-"} {!merchartsLoading && brandImages && brandImages.map(img =>
) }
) // 标题金额拆分小数点前后显示大小 const amountDom = (value: any) => { const stringValue = `${value}` const [intValue, floatValue] = stringValue.split(".") return floatValue ? <>{numeral(intValue).format("0,0")} .{floatValue} (万元) : <> {intValue}(万元) } // 往来款表格头部设置 const columns: ProColumns[] = [ { title: "", width: 68, dataIndex: 'ACCOUNT_TYPE', hideInSearch: true, valueType: "select", valueEnum: !fieldLoading ? fieldEnumIcon : {}, }, { title: "款项类型", dataIndex: 'ACCOUNT_TYPE', width: 120, // align: "center", hideInSearch: true, valueType: "select", valueEnum: !fieldLoading ? FieldEnum : {}, filters: true, onFilter: true, // request: async ()=>{ // return await getFieldEnum({ FieldExplainField: "ACCOUNT_TYPE" }) // }, }, { title: () =>
项目
, dataIndex: 'BUSINESSPROJECT_NAME', ellipsis: true, hideInSearch: true, sorter: (a, b) => (a.BUSINESSPROJECT_NAME || "").localeCompare((b.BUSINESSPROJECT_NAME || "")), render: (_, record) => { if (record.CURRENTBALANCE === 0) { return {record.BUSINESSPROJECT_NAME} } return _ } }, { dataIndex: 'PAYMENTCONFIRM_DESC', title: () =>
款项说明
, ellipsis: true, hideInSearch: true, render: (_, record) => { if (record.CURRENTBALANCE === 0) { return {record.PAYMENTCONFIRM_DESC} } return _ } }, { dataIndex: 'ACCOUNT_DATE', title: '应缴日期', valueType: "date", align: 'center', hideInSearch: true, width: 120, sorter: (a, b) => new Date(a.ACCOUNT_DATE || '').getTime() - new Date(b.ACCOUNT_DATE || '').getTime(), render: (_, record) => { if (record.CURRENTBALANCE === 0) { return {record?.ACCOUNT_DATE} } return _ } }, { dataIndex: 'ACCOUNT_AMOUNT', title: '应缴金额', align: 'right', hideInSearch: true, width: 120, sorter: (a, b) => a.ACCOUNT_AMOUNT - b.ACCOUNT_AMOUNT, render: (_, record) => { if (record.CURRENTBALANCE === 0) { return {record.ACCOUNT_AMOUNT || 0} } return {record?.ACCOUNT_AMOUNT || '-'} } }, { dataIndex: 'ACTUAL_PAYMENT', title: '已缴金额', hideInSearch: true, align: 'right', width: 120, sorter: (a, b) => a.ACTUAL_PAYMENT - b.ACTUAL_PAYMENT, render: (_, record) => { if (record.CURRENTBALANCE === 0) { return {record.ACTUAL_PAYMENT} } return {record?.ACTUAL_PAYMENT || '-'} } }, { dataIndex: 'CURRENTBALANCE', title: '剩余未缴', hideInSearch: true, align: 'right', width: 120, sorter: (a, b) => a.CURRENTBALANCE - b.CURRENTBALANCE, render: (_, record) => { if (record.CURRENTBALANCE === 0) { return {record.CURRENTBALANCE || 0} } return {record?.CURRENTBALANCE || '-'} }, filters: [ { text: '未清缴', value: 0 } ], onFilter: (value, record) => record.CURRENTBALANCE !== value, // onFilter: true, }, { dataIndex: 'option', title: '操作', valueType: 'option', width: "10%", align: 'center', hideInSearch: true, hideInTable: currentUser?.UserPattern === 2000, render: (_, record) => { return { (record.ACCOUNT_TYPE !== "9000" || (record.ACCOUNT_TYPE === "9000" && !record.ACTUAL_PAYMENT)) && { getRemark({ TABLE_ID: record.PAYMENTCONFIRM_ID }).then(res => { if (res) { const mine = res.find((n: any) => n.STAFF_ID === currentUser.ID) if (mine) { setMyRemark(mine) formRef.current?.setFieldsValue({ userDesc: mine.REMARKS_CONTENT || "" }) } } }) // console.log(data) const imagesPath = record.ATTACHMENT_FILES const images = transferImg(imagesPath ? imagesPath.split(',') : []) setFileList(images) setCurrentRow({ ...record }); setStep(1) // setModelType(record.ACCOUNT_TYPE === "9000" && record.ACTUAL_PAYMENT === 0 ? 3 : 2) handleModalVisible(true); }} >编辑 } {!record.ACTUAL_PAYMENT && { const suceess = await handleDelete(record?.PAYMENTCONFIRM_ID) if (suceess) { actionRef.current?.reload() } }}>删除} {record.ACCOUNT_TYPE === "9000" && record.CURRENTBALANCE !== 0 && { setCurrentRow({ ...record }); setStep(2) handleModalVisible(true); }}> 返款 } { record.ATTACHMENT_FILES && { const imagesPath = record.ATTACHMENT_FILES const images = transferImg(imagesPath ? imagesPath.split(',') : []) setFileList(images) setImagePreviewVisible(true) }}> } ; }, }, ]; // 删除图片 const handleChange = async (info: any) => { if (info.file.status === 'removed') { const deleteLoading = message.loading('正在删除...') try { const deleteIndex = fileList?.findIndex((n: any) => n.uid === info.file.uid) if (deleteIndex !== -1) { const files = [...fileList] files.splice(deleteIndex, 1) setFileList(files) } deleteLoading() return true } catch (error) { deleteLoading() message.error("删除失败") return false } } return true }; // 预览上传后的图片 const handlePreview = async () => { setFileList(fileList) setImagePreviewVisible(true) }; // 弹出框标题 const getModelTitle = () => { const type = currentRow ? '修改' : '新建' const name = currentRow && currentRow.ACCOUNT_TYPE !== "9000" ? '欠款记录' : '回款记录' return step === 2 ? '租金拆分日志' : type + name } return ( {descirption} {moment().format('YYYY/MM/DD')}} valueStyle={{ color: "#00000075", fontSize: 14 }} value={'应缴日期'} // merchartsData?.ACCOUNT_DATE /> } > {merchartsData && merchartsData.COOPMERCHANTS_ID ? <> {/* 应收款项目 */} { setTabActiveIndex(value) }} bordered={false} tabBarExtraContent={ {/* 查询时间:{moment().format('YYYY/MM/DD hh:mm:ss')} */} {merchartsData?.UNDISTRIBUTED_AMOUNT && merchartsData?.UNDISTRIBUTED_AMOUNT !== 0 ? 未分配金额:{merchartsData?.UNDISTRIBUTED_AMOUNT} : ''} 单位:万元 {/* 商户不能进行还款操作 */} {currentUser.UserPattern === 1000 && } } > {tabActiveIndex === '1' && (accountReceivablesList ? accountReceivablesList.map((n: AccountReceivablesModel) =>
{ setProject(item) }} />
) : ) } {/* 商家往来款 */} {tabActiveIndex === '2' && <> { const data = await getPaymentConfirmList({ ...pramas, ...userDataParams, AccountDate: moment().format("YYYYMMDD"), }) const list = data.data.map((n: any) => { return { ...n, ACCOUNT_AMOUNT: n.ACCOUNT_AMOUNT ? numeral(n.ACCOUNT_AMOUNT).divide(10000).value() : n.ACCOUNT_AMOUNT, ACTUAL_PAYMENT: n.ACTUAL_PAYMENT ? numeral(n.ACTUAL_PAYMENT).divide(10000).value() : n.ACTUAL_PAYMENT, CURRENTBALANCE: n.CURRENTBALANCE ? numeral(n.CURRENTBALANCE).divide(10000).value() : n.CURRENTBALANCE } }); setPaymentList([...list].reverse()) return { ...data, data: list } }} columns={columns} search={false} pagination={{ defaultPageSize: 10 }} toolBarRender={false} /> } {/* 租金拆分日志 */} {tabActiveIndex === '3' && }
{/* 编辑回款数据弹出 */} title={{getModelTitle()}} width={1024} layout={'horizontal'} wrapperCol={{ span: 16 }} labelCol={{ span: 6 }} formRef={formRef} visible={modalVisible} autoFocusFirstInput modalProps={{ onCancel: () => { }, }} onVisibleChange={(value) => { handleModalVisible(value); if (value) { formRef.current?.setFieldsValue(currentRow) } else { formRef.current?.resetFields(); setCurrentRow(undefined); setFileList([]) setEditFilds([]) } }} onFinish={async (values) => { let success: boolean | PaymentConfirmModel = false if (step === 1) { // 更新回款/欠款记录 let newValue: PaymentConfirmModel = { ...values, MERCHANTS_ID: merchartsData?.COOPMERCHANTS_ID }; if (currentRow) { // 编辑数据 newValue = { ...currentRow, ...newValue, ACCOUNT_AMOUNT: numeral(newValue.ACCOUNT_AMOUNT).multiply(10000).value(), ACTUAL_PAYMENT: numeral(newValue.ACTUAL_PAYMENT).multiply(10000).value(), CURRENTBALANCE: numeral(currentRow.ACCOUNT_TYPE === "9000" ? newValue.ACCOUNT_AMOUNT : newValue.CURRENTBALANCE).multiply(10000).value(), ACCOUNT_DATE: currentRow.ACCOUNT_TYPE === "9000" ? newValue.PAYMENTDATE : newValue.ACCOUNT_DATE }; } else { newValue = { ...newValue, ACCOUNT_TYPE: "9000", MERCHANTS_NAME: merchartsData?.COOPMERCHANTS_NAME, ACCOUNT_AMOUNT: numeral(newValue.ACCOUNT_AMOUNT).multiply(10000).value() } } newValue.ATTACHMENT_FILES = fileList.map(n => n.url).toString() const remark = { ...myRemark, TABLE_NAME: 'T_PAYMENTCONFIRM', REMARKS_CONTENT: values.userDesc } success = await handleAddUpdate({ ...newValue }, (myRemark?.REMARKS_ID || values.userDesc) ? remark : undefined); } else { success = await checkAmountAndUpdate() // 校验及提交拆分数据 } if (success) { if (actionRef.current) { actionRef.current.reload(); refreshPage() } return true; } return false; }} > {step === 1 &&
{currentRow?.BUSINESSPROJECT_NAME || merchartsData?.COOPMERCHANTS_NAME} { currentRow && currentRow?.ACCOUNT_TYPE !== "9000" ? <> { return await getFieldEnum({ FieldExplainField: "ACCOUNT_TYPE" }) }} labelCol={{ span: 12 }} /> `${value}万元` }} labelCol={{ span: 12 }} /> `${value}万元` }} readonly /> `${value}万元` }} labelCol={{ span: 10 }} readonly /> {!remarkLoading && remarkList.length > 0 && item.STAFF_ID !== currentUser.ID)} style={{ paddingLeft: 115.22, paddingRight: 85 }} renderItem={(item: RemarksModel) => ( } title={
{item.STAFF_NAME}: {item.OPERATE_DATE}
} description={{item.REMARKS_CONTENT}} />
)} /> }
: <> value ? `${value}万元` : '' }} rules={[ { validator: (_, value) => { if (!value) { return Promise.reject(new Error('请输入回款金额')) } if (value && value > 0) { return Promise.resolve() } return Promise.reject(new Error('回款金额需大于0')) }, }, ]} /> current && current > moment().endOf('day') }} /> { const formData = new FormData(); formData.append('files', info.file); formData.append('TableName', 'PAYMENTCONFIRM'); formData.append('ImageName', typeof info.file !== 'string' ? info.file?.name : ''); if (info.filename) { // const success = await uploadFile(formData) const success = await uploadAHYDFile(formData) if (success) { const list = [...fileList, { uid: `${success.ImageId}`, // 注意,这个uid一定不能少,否则上传失败 name: success.ImageName, status: 'done', url: success.ImageUrl, // url 是展示在页面上的绝对链接 imgUrl: success.ImagePath // + success.ImageUrl, }] setFileList(list) } } else { message.error("您上传的图片不存在.") } } }} /> {currentRow && !remarkLoading && remarkList.length > 0 && item.STAFF_ID !== currentUser.ID)} style={{ paddingLeft: 115.22, paddingRight: 85 }} renderItem={(item: RemarksModel) => ( } title={
{item.STAFF_NAME}: {item.OPERATE_DATE}
} description={{item.REMARKS_CONTENT}} />
)} /> } }
} {step === 2 && paymentList && n.ACCOUNT_TYPE !== "9000" && n.CURRENTBALANCE)} paymentInfo={currentRow} FieldEnum={FieldEnum} amount={currentRow?.CURRENTBALANCE || 0} onChange={setEditFilds} /> } {/* 图片预览组件 */} {fileList.length > 0 &&
{ if (!vis) { setFileList([]) } setImagePreviewVisible(vis) } }}> { fileList.map((n) => ) }
} {/* 抽屉弹出:欠款的项目详情 */} { setProject(undefined) }} closable={false} className="project-drawer" bodyStyle={{ backgroundColor: "#f9f9f9", padding: 0 }} > {currentProject !== undefined && } : history.push('/merchantManagement/workplace')}> 返回工作台 ]} /> }
); } export default connect(({ user, }: ConnectState) => ({ currentUser: user.currentUser, }))(MerchartsPayment);