ERPTurbo_Admin/packages/app-operation/src/components/Biz/BizDetail.tsx
shenyifei 22889e3f1b refactor(components): 重构业务详情组件布局并添加付款记录功能
- 移除未使用的 column 工具函数
- 将平铺模式的卡片布局改为直接映射渲染
- 统一移动端和桌面端的卡片方向为垂直布局
- 移除动态列跨度计算,统一设置为 24 列
- 在付款记录列表中添加付款任务 VO 属性
- 从付款记录列表中移除账号列的固定宽度
- 将付款记录列表集成到付款任务详情的标签页中
- 更新本地化文件中的付款记录和任务编号字段
- 调整付款记录列表的容器样式配置
2026-01-07 15:50:49 +08:00

270 lines
5.6 KiB
TypeScript

import { BizValueType, ButtonAccess } from '@/components';
import { formLayout } from '@/utils/formLayout';
import { useIntl } from '@@/exports';
import {
DrawerForm,
ModalForm,
ProCard,
ProDescriptions,
ProFormDependency,
} from '@ant-design/pro-components';
import { useState } from 'react';
import { BizDetailProps } from './typing';
export default function BizDetail<
BizVO extends Record<string, any>,
Func extends Record<string, any>,
>(props: BizDetailProps<BizVO, Func>) {
const {
row,
rowId,
rowKey,
permission,
intlPrefix,
formType,
method,
methodUpper,
func,
formContext,
formContextMode = 'tab',
trigger,
fieldProps,
initValues,
isMobile,
columns,
positionKey,
showDetail = true,
} = props;
const [open, setOpen] = useState(false);
const intl = useIntl();
/** 渲染 formContext 内容 */
const renderFormContext = (data: any, form: any, colSpan: number) => {
if (!formContext) return null;
const contextItems = formContext(data?.[`${method}VO`], async () => {
const { data } = await func?.[`show${methodUpper}`]({
[`${method}ShowQry`]: {
[`${rowKey}`]: rowId,
},
});
form.setFieldValue(`${method}VO`, data);
})?.filter((item) => {
// @ts-ignore
return !item.display || item.display(data?.[`${method}VO`]);
});
// 平铺模式:直接垂直堆叠所有内容
if (formContextMode === 'flat') {
return contextItems?.map((item, index) => (
<ProCard
key={item.key || index}
bordered={true}
headerBordered={false}
title={item.label}
style={{
marginBottom: 16,
}}
// @ts-ignore
subTitle={item.subTitle}
>
{item.children}
</ProCard>
));
}
// Tab 模式:使用 tabs 渲染
return (
<ProCard
bordered={true}
headerBordered={true}
colSpan={colSpan}
tabs={{
tabPosition: 'top',
activeKey: data.activeKey,
items: contextItems,
onChange: (key) => {
form.setFieldValue('activeKey', key);
},
}}
/>
);
};
let rest = {
title: intl.formatMessage({
id: intlPrefix + '.modal.view.title',
}),
autoFocusFirstInput: true,
submitTimeout: 2000,
open: fieldProps?.open || open,
onOpenChange: fieldProps?.onOpenChange || setOpen,
request: async (): Promise<any> => {
const { data } = await func?.[`show${methodUpper}`]({
[`${method}ShowQry`]: {
[`${rowKey}`]: rowId,
},
});
const extra = await initValues?.(rowId!);
return {
[`${rowKey}`]: rowId,
[`${method}VO`]: data,
...extra,
isMobile,
};
},
};
const renderForm = () => {
if (formType === 'drawer' || formType === 'step') {
return (
<DrawerForm<BizVO>
{...fieldProps}
{...formLayout(isMobile)}
width={isMobile ? '100%' : '85%'}
drawerProps={{
destroyOnHidden: true,
}}
submitter={{
searchConfig: {
resetText: '关闭',
},
submitButtonProps: {
style: {
display: 'none',
},
},
}}
{...rest}
>
{columns && showDetail && (
<ProFormDependency name={[`${method}VO`, 'isMobile', 'activeKey']}>
{(data, form) => {
return (
<ProCard ghost={true} gutter={24} direction={'column'}>
<ProCard
bordered={true}
headerBordered={true}
colSpan={24}
style={{
marginBottom: 16,
}}
>
<ProDescriptions<BizVO, BizValueType>
params={{ data: data[`${method}VO`] }}
request={async (params) =>
Promise.resolve({
success: true,
data: params?.data,
})
}
columns={[...columns]}
/>
</ProCard>
{renderFormContext(data, form, 24)}
</ProCard>
);
}}
</ProFormDependency>
)}
</DrawerForm>
);
}
if (formType === 'modal') {
return (
<ModalForm<BizVO>
{...fieldProps}
{...formLayout(isMobile)}
modalProps={{
destroyOnHidden: true,
}}
submitter={{
searchConfig: {
resetText: '关闭',
},
submitButtonProps: {
style: {
display: 'none',
},
},
}}
{...rest}
>
{columns && (
<ProFormDependency name={[`${method}VO`, 'isMobile', 'activeKey']}>
{(data, form) => {
return (
<ProCard ghost={true} gutter={24} direction={'column'}>
<ProCard
bordered={true}
headerBordered={true}
colSpan={24}
style={{
marginBottom: 16,
}}
>
<ProDescriptions<BizVO, BizValueType>
params={{ data: data[`${method}VO`] }}
request={async (params) =>
Promise.resolve({
success: true,
data: params?.data,
})
}
columns={[...columns]}
/>
</ProCard>
{renderFormContext(data, form, 24)}
</ProCard>
);
}}
</ProFormDependency>
)}
</ModalForm>
);
}
};
const renderTrigger = () => {
if (trigger) {
return (
<div
onClick={() => {
setOpen(true);
}}
>
{trigger?.(row)}
</div>
);
}
return (
<ButtonAccess
permission={permission + '-view'}
key="view"
type="link"
onClick={(event) => {
setOpen(true);
event.stopPropagation();
}}
positionKey={positionKey}
>
{intl.formatMessage({
id: intlPrefix + '.modal.view.button',
})}
</ButtonAccess>
);
};
return (
<>
{renderTrigger()}
{renderForm()}
</>
);
}