ERPTurbo_Admin/packages/app-operation/src/components/Supplier/SupplierFarmerList.tsx
shenyifei b53d26ec65 feat(components): 添加供应商瓜农组件和支付任务管理功能
- 添加 SupplierFarmerList 和 SupplierStallList 组件
- 添加 PaymentTaskList、PaymentTaskCreate、InvoicerStatisticCard 等支付任务相关组件
- 将 MelonFarmerList 重命名为 SupplierFarmerList 并移至 Supplier 目录
- 在 BizContainer 中添加 supplier 类型渲染支持
- 为 BizDetail 组件添加 formContextMode 属性和渲染逻辑
- 添加供应商类型到 BizValueType 类型定义中
- 添加开票方统计卡片和订单供应商发票列表组件
- 更新组件导出配置和本地化文件
2026-01-06 11:10:08 +08:00

353 lines
7.9 KiB
TypeScript

import {
BizContainer,
BizValueType,
MaterialList,
ModeType,
} from '@/components';
import { business } from '@/services';
import { formatBankCard, formatIdCard, formatPhone } from '@/utils/format';
import { formatParam } from '@/utils/formatParam';
import { useIntl } from '@@/exports';
import { EyeInvisibleOutlined, EyeTwoTone } from '@ant-design/icons';
import {
ActionType,
ProColumns,
ProFormText,
} from '@ant-design/pro-components';
import { ProDescriptionsItemProps } from '@ant-design/pro-descriptions';
import { ProFormUploadMaterial } from '@chageable/components';
import React, { useRef, useState } from 'react';
interface ISupplierFarmerListProps {
ghost?: boolean;
supplierId?: BusinessAPI.SupplierVO['supplierId'];
search?: boolean;
onValueChange?: () => void;
mode?: ModeType;
trigger?: () => React.ReactNode;
}
export default function SupplierFarmerList(props: ISupplierFarmerListProps) {
const {
ghost = false,
supplierId,
search = true,
mode = 'page',
trigger,
onValueChange,
} = props;
const intl = useIntl();
const intlPrefix = 'supplierFarmer';
const actionRef = useRef<ActionType>();
const [showIdCard, setShowIdCard] = useState<Record<string, boolean>>({});
const [showBankCard, setShowBankCard] = useState<Record<string, boolean>>({});
const [showPhone, setShowPhone] = useState<Record<string, boolean>>({});
const columns: ProColumns<BusinessAPI.SupplierVO, BizValueType>[] = [
{
title: intl.formatMessage({ id: intlPrefix + '.column.name' }),
dataIndex: 'name',
key: 'name',
renderText: (text: string) => <span className="font-medium">{text}</span>,
},
{
title: intl.formatMessage({
id: intlPrefix + '.column.idCard',
}),
dataIndex: 'idCard',
key: 'idCard',
render: (_, record) => (
<div className="flex items-center">
<span>
{formatIdCard(record.idCard!, showIdCard[record.supplierId])}
</span>
<span
className="ml-2 cursor-pointer"
onClick={() => {
setShowIdCard((prev) => ({
...prev,
[record.supplierId]: !prev[record.supplierId],
}));
}}
>
{showIdCard[record.supplierId] ? (
<EyeTwoTone />
) : (
<EyeInvisibleOutlined />
)}
</span>
</div>
),
},
{
title: intl.formatMessage({ id: intlPrefix + '.column.phone' }),
dataIndex: 'phone',
key: 'phone',
render: (_, record) => (
<div className="flex items-center">
<span>{formatPhone(record.phone, showPhone[record.supplierId])}</span>
<span
className="ml-2 cursor-pointer"
onClick={() => {
setShowPhone((prev) => ({
...prev,
[record.supplierId]: !prev[record.supplierId],
}));
}}
>
{showPhone[record.supplierId] ? (
<EyeTwoTone />
) : (
<EyeInvisibleOutlined />
)}
</span>
</div>
),
},
{
title: intl.formatMessage({ id: intlPrefix + '.column.bankName' }),
dataIndex: 'bankName',
key: 'bankName',
search: false,
},
{
title: intl.formatMessage({ id: intlPrefix + '.column.bankCard' }),
dataIndex: 'bankCard',
key: 'bankCard',
render: (_, record) => (
<div className="flex items-center">
<span>
{formatBankCard(record.bankCard, showBankCard[record.supplierId])}
</span>
<span
className="ml-2 cursor-pointer"
onClick={() => {
setShowBankCard((prev) => ({
...prev,
[record.supplierId]: !prev[record.supplierId],
}));
}}
>
{showBankCard[record.supplierId] ? (
<EyeTwoTone />
) : (
<EyeInvisibleOutlined />
)}
</span>
</div>
),
},
{
title: intl.formatMessage({ id: intlPrefix + '.column.wechatQr' }),
dataIndex: 'wechatQr',
valueType: 'image',
key: 'wechatQr',
search: false,
},
];
const formContext = [
<ProFormText key={'type'} name={'type'} hidden={true} />,
<ProFormText key={'payeeName'} name={'payeeName'} hidden={true} />,
<ProFormText
key={'name'}
name={'name'}
label={intl.formatMessage({ id: intlPrefix + '.form.name.label' })}
required={true}
placeholder={intl.formatMessage({
id: intlPrefix + '.form.name.placeholder',
})}
transform={(value) => {
return {
name: value,
payeeName: value,
};
}}
rules={[
{
required: true,
message: intl.formatMessage({
id: intlPrefix + '.form.name.required',
}),
},
]}
/>,
<ProFormText
key={'idCard'}
name={'idCard'}
label={intl.formatMessage({ id: intlPrefix + '.form.idCard.label' })}
required={true}
placeholder={intl.formatMessage({
id: intlPrefix + '.form.idCard.placeholder',
})}
rules={[
{
required: true,
message: intl.formatMessage({
id: intlPrefix + '.form.idCard.required',
}),
},
]}
/>,
<ProFormText
key={'phone'}
name={'phone'}
label={intl.formatMessage({ id: intlPrefix + '.form.phone.label' })}
required={true}
placeholder={intl.formatMessage({
id: intlPrefix + '.form.phone.placeholder',
})}
rules={[
{
required: true,
message: intl.formatMessage({
id: intlPrefix + '.form.phone.required',
}),
},
]}
/>,
<ProFormText
key={'bankName'}
name={'bankName'}
label={intl.formatMessage({ id: intlPrefix + '.form.bankName.label' })}
required={true}
placeholder={intl.formatMessage({
id: intlPrefix + '.form.bankName.placeholder',
})}
rules={[
{
required: true,
message: intl.formatMessage({
id: intlPrefix + '.form.bankName.required',
}),
},
]}
/>,
<ProFormText
key={'bankCard'}
name={'bankCard'}
label={intl.formatMessage({ id: intlPrefix + '.form.bankCard.label' })}
required={true}
placeholder={intl.formatMessage({
id: intlPrefix + '.form.bankCard.placeholder',
})}
rules={[
{
required: true,
message: intl.formatMessage({
id: intlPrefix + '.form.bankCard.required',
}),
},
]}
/>,
<ProFormUploadMaterial
key={'wechatQr'}
label={intl.formatMessage({
id: intlPrefix + '.form.wechatQr.label',
})}
name={'wechatQrList'}
transform={(value) => {
return {
wechatQrList: value,
wechatQr: value[0],
};
}}
fieldProps={{
maxCount: 1,
actionRef: actionRef,
toolBarRender: () => [
<MaterialList
key={'create'}
ghost={true}
mode={'create'}
search={false}
onValueChange={() => actionRef.current?.reload()}
/>,
],
request: async (params, sorter, filter) => {
const { data, success, totalCount } =
await business.material.pageMaterial({
materialPageQry: formatParam<typeof params>(
params,
sorter,
filter,
),
});
return {
data: data || [],
total: totalCount,
success,
};
},
}}
/>,
];
const detailColumns: ProDescriptionsItemProps<
BusinessAPI.SupplierVO,
BizValueType
>[] = columns as ProDescriptionsItemProps<
BusinessAPI.SupplierVO,
BizValueType
>[];
return (
<BizContainer<
typeof business.supplier,
BusinessAPI.SupplierVO,
BusinessAPI.SupplierPageQry,
BusinessAPI.SupplierCreateCmd,
BusinessAPI.SupplierUpdateCmd
>
rowKey={'supplierId'}
permission={'operation-supplier'}
func={business.supplier}
method={'supplier'}
methodUpper={'Supplier'}
intlPrefix={intlPrefix}
modeType={mode}
onValueChange={onValueChange}
container={{
ghost,
}}
remark={{
mode: 'editor',
}}
status
page={{
fieldProps: {
bordered: true,
ghost,
//@ts-ignore
search,
params: {
type: 'FARMER',
},
},
columns,
}}
create={{
formType: 'drawer',
formContext,
initValues: {
status: true,
type: 'FARMER',
},
}}
update={{
formType: 'drawer',
formContext,
}}
destroy={{}}
detail={{
rowId: supplierId,
formType: 'drawer',
columns: detailColumns,
trigger,
}}
/>
);
}