ERPTurbo_Admin/packages/app-operation/src/components/Reconciliation/ReconciliationInvoiceList.tsx
shenyifei 832a0299df feat(reconciliation): 添加对账发票列表中的开票公司字段
- 在 DealerPaymentAccountList 组件中新增 accountId 参数
- 在 ReconciliationInvoiceList 中引入 DealerPaymentAccountList 组件并显示开票公司信息
- 新增开票公司列用于显示经销商支付账户信息
- 将发票日期字段从 dateTime 类型改为 dateRange 类型并调整显示格式
- 更新业务服务类型定义中对账发票相关字段
- 添加经销商、公司和支付账户信息的对象类型定义
- 在中文语言包中增加开票公司字段翻译
2026-01-13 12:03:21 +08:00

352 lines
8.3 KiB
TypeScript

import {
BizContainer,
BizValueType,
DealerPaymentAccountList,
DealerSelect,
ModeType,
ProFormUploadMaterial,
ReconciliationSelect,
} from '@/components';
import { business } from '@/services';
import { formatCurrency } from '@/utils/format';
import { useIntl } from '@@/exports';
import {
ProColumns,
ProFormDatePicker,
ProFormDependency,
ProFormMoney,
ProFormSelect,
} from '@ant-design/pro-components';
import { ProDescriptionsItemProps } from '@ant-design/pro-descriptions';
import dayjs from 'dayjs';
import React from 'react';
interface IReconciliationInvoiceListProps {
ghost?: boolean;
reconciliationId?: BusinessAPI.ReconciliationInvoiceVO['reconciliationId'];
dealerId?: BusinessAPI.ReconciliationInvoiceVO['dealerId'];
search?: boolean;
onValueChange?: () => void;
mode?: ModeType;
trigger?: () => React.ReactNode;
}
export default function ReconciliationInvoiceList(
props: IReconciliationInvoiceListProps,
) {
const {
ghost = false,
reconciliationId,
dealerId,
search = true,
mode = 'page',
trigger,
onValueChange,
} = props;
const intl = useIntl();
const intlPrefix = 'reconciliationInvoice';
// 定义表格列
const columns: ProColumns<
BusinessAPI.ReconciliationInvoiceVO,
BizValueType
>[] = [
{
title: intl.formatMessage({ id: intlPrefix + '.column.invoiceSn' }),
dataIndex: 'invoiceSn',
key: 'invoiceSn',
},
{
title: intl.formatMessage({ id: intlPrefix + '.column.dealer' }),
dataIndex: 'dealerVO',
key: 'dealerId',
valueType: 'dealer',
hidden: !!dealerId,
},
{
title: intl.formatMessage({ id: intlPrefix + '.column.account' }),
dataIndex: 'dealerPaymentAccountVO',
key: 'accountId',
render: (_, record) => {
const { dealerPaymentAccountVO } = record;
return (
dealerPaymentAccountVO && (
<DealerPaymentAccountList
ghost={true}
mode={'detail'}
search={false}
accountId={dealerPaymentAccountVO.accountId}
trigger={() => {
return <a>{dealerPaymentAccountVO.companyName}</a>;
}}
/>
)
);
},
},
{
title: intl.formatMessage({ id: intlPrefix + '.column.company' }),
dataIndex: 'companyVO',
key: 'companyId',
valueType: 'company',
},
{
title: intl.formatMessage({ id: intlPrefix + '.column.invoiceAmount' }),
dataIndex: 'invoiceAmount',
key: 'invoiceAmount',
valueType: 'money',
search: false,
render: (_, record) => (
<span className="text-green-600 font-medium">
{formatCurrency(record.invoiceAmount)}
</span>
),
},
{
title: intl.formatMessage({ id: intlPrefix + '.column.invoiceDate' }),
dataIndex: 'invoiceDate',
key: 'invoiceDate',
valueType: 'dateRange',
render: (_, record) => (
<span>
{record.invoiceDate && dayjs(record.invoiceDate).format('YYYY-MM-DD')}
</span>
),
},
];
const formContext = [
<DealerSelect key={'dealerId'} />,
<ProFormDependency key={'reconciliationId'} name={['dealerId']}>
{({ dealerId }, form) => {
return (
dealerId && (
<>
<ReconciliationSelect
key={'reconciliationId'}
params={{
dealerId,
state: 'RECONCILED',
}}
onFinish={(reconciliationVOList) => {
const reconciliation = reconciliationVOList[0];
form.setFieldsValue({
pendingAmount: reconciliation?.reconciliationAmount,
});
}}
/>
<ProFormSelect
key="accountId"
name="accountId"
label={intl.formatMessage({
id: intlPrefix + '.form.accountId.label',
})}
placeholder={intl.formatMessage({
id: intlPrefix + '.form.accountId.placeholder',
})}
required
rules={[
{
required: true,
message: intl.formatMessage({
id: intlPrefix + '.form.accountId.required',
}),
},
]}
dependencies={['dealerId']}
request={async (params) => {
const { data } =
await business.dealerPaymentAccount.listDealerPaymentAccount(
{
dealerPaymentAccountListQry: {
...params,
},
},
);
return (
data?.map((item) => ({
label: item.companyName,
value: item.accountId,
})) || []
);
}}
/>
</>
)
);
}}
</ProFormDependency>,
<ProFormMoney
key="pendingAmount"
name="pendingAmount"
label={intl.formatMessage({
id: intlPrefix + '.form.pendingAmount.label',
})}
disabled
readonly
/>,
<ProFormDependency key="currentInvoiceAmount" name={['pendingAmount']}>
{({ pendingAmount }) => (
<ProFormMoney
name="currentInvoiceAmount"
label={intl.formatMessage({
id: intlPrefix + '.form.currentInvoiceAmount.label',
})}
placeholder={intl.formatMessage({
id: intlPrefix + '.form.currentInvoiceAmount.placeholder',
})}
required
rules={[
{
required: true,
message: intl.formatMessage({
id: intlPrefix + '.form.currentInvoiceAmount.required',
}),
},
]}
fieldProps={{
max: pendingAmount,
}}
/>
)}
</ProFormDependency>,
<ProFormSelect
key="companyId"
name="companyId"
label={intl.formatMessage({ id: intlPrefix + '.form.companyId.label' })}
placeholder={intl.formatMessage({
id: intlPrefix + '.form.companyId.placeholder',
})}
required
rules={[
{
required: true,
message: intl.formatMessage({
id: intlPrefix + '.form.companyId.required',
}),
},
]}
request={async (params) => {
const { data } = await business.company.listCompany({
companyListQry: {
...params,
},
});
return (
data?.map((item) => ({
label: item.fullName,
value: item.companyId,
})) || []
);
}}
/>,
<ProFormDatePicker
key="invoiceDate"
name="invoiceDate"
label={intl.formatMessage({ id: intlPrefix + '.form.invoiceDate.label' })}
placeholder={intl.formatMessage({
id: intlPrefix + '.form.invoiceDate.placeholder',
})}
required
rules={[
{
required: true,
message: intl.formatMessage({
id: intlPrefix + '.form.invoiceDate.required',
}),
},
]}
fieldProps={{
style: { width: '100%' },
}}
/>,
<ProFormUploadMaterial
mode={'file'}
key={'invoiceImgList'}
tooltip={intl.formatMessage({ id: intlPrefix + '.form.invoiceFile.tip' })}
label={intl.formatMessage({
id: intlPrefix + '.form.invoiceFile.label',
})}
transform={(fileList: BusinessAPI.MaterialVO[]) => {
console.log('fileList', fileList);
return {
invoiceImgList: fileList,
invoiceImg: fileList.map((item: BusinessAPI.MaterialVO) => {
// const itemInfo = await getImageInfo(item.url);
return {
/** 文件名 */
fileName: item.name,
/** 文件路径 */
filePath: item.url,
/** 文件类型 */
fileType: item.url.split('.').pop(),
/** 文件大小 */
fileSize: 0,
};
}),
};
}}
name={'invoiceFile'}
fieldProps={{
maxCount: 9,
}}
/>,
];
const detailColumns: ProDescriptionsItemProps<
BusinessAPI.ReconciliationInvoiceVO,
BizValueType
>[] = columns as ProDescriptionsItemProps<
BusinessAPI.ReconciliationInvoiceVO,
BizValueType
>[];
return (
<BizContainer<
typeof business.reconciliationInvoice,
BusinessAPI.ReconciliationInvoiceVO,
BusinessAPI.ReconciliationInvoicePageQry
>
rowKey={'reconciliationInvoiceId'}
permission={'operation-reconciliation-invoice'}
func={business.reconciliationInvoice}
method={'reconciliationInvoice'}
methodUpper={'ReconciliationInvoice'}
intlPrefix={intlPrefix}
modeType={mode}
onValueChange={onValueChange}
container={{ ghost }}
remark={{ mode: 'editor' }}
status={false}
page={{
fieldProps: {
bordered: true,
ghost,
//@ts-ignore
search,
//@ts-ignore
params: {
...(reconciliationId && { reconciliationId }),
...(dealerId && { dealerId }),
},
},
columns,
options: () => [],
}}
create={{
formType: 'drawer',
formContext,
trigger,
}}
update={false}
destroy={false}
detail={{
rowId: reconciliationId,
formType: 'drawer',
columns: detailColumns,
trigger,
}}
/>
);
}