import React, {useEffect, useRef, useState} from 'react';
import {
Button,
Switch,
Modal,
Form,
Input,
message,
Row,
Col,
Select,
Upload,
} from 'antd';
import {ActionType, ProTable} from '@ant-design/pro-components';
import { request } from '@@/plugin-request/request';
import DomainList from '@/pages/DataAssets/arealist';
interface DomainItem {
id: string;
areaName: string;
}
const AssetTable = () => {
const [form] = Form.useForm();
const [modalVisible, setModalVisible] = useState(false);
const [editingRecord, setEditingRecord] = useState(null);
const [domains, setDomains] = useState<DomainItem[]>([]);
const [currentDomain, setCurrentDomain] = useState<string>('');
const [currentDomainName, setCurrentDomainName] = useState<string>('');
const [systemOptions, setSystemOptions] = useState([]);
const [processOptions, setprocessOptions] = useState([]);
const [objOptions, setobjOptions] = useState([]);
const [fileList, setFileList] = useState<any[]>([]); // 存储上传的文件列表
const actionRef = useRef();
const dsType_options = [
{ value: '清洗后数据', label: '清洗后数据' },
{ value: '原始数据', label: '原始数据' },
];
// 模拟请求函数
const fetchData = async (params: { current: any; pageSize: any }) => {
const { current, pageSize, ...restParams } = params;
const response = await fetch('/ds/dsbaseinfo/getAssetsByCondition', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
...restParams,
areaId: currentDomain,
pageNum: current,
pageSize,
}),
});
const data = await response.json();
console.log(data)
return {
data: data.list || [],
total: data.total || 0,
};
};
useEffect(() => {
request('/ds/dsareainfo/list').then(res => {
if (res.data) {
setDomains(res.data);
setCurrentDomain((res.data)[0].id);
setCurrentDomainName((res.data)[0].areaName);
}
});
}, []);
// 切换左侧领域时触发
const handleDomainChange = (d: any) => {
setCurrentDomain(d.id);
setCurrentDomainName(d.areaName);
};
useEffect(() => {
if (currentDomainName && form) {
form.setFieldsValue({ areaName: currentDomainName });
form.setFieldsValue({ areaId: currentDomain });
}
}, [currentDomainName, modalVisible, form]);
// 查询筛选条件:系统、流程节点、业务对象
useEffect(() => {
if (currentDomain) {
// 请求系统数据
request('/ds/dssysinfo/byareaid', {
method: 'POST',
data: { areaId: currentDomain },
}).then(res => {
const options = res.data?.map((item: { id: string; sysName: string }) => ({
value: item.id,
label: item.sysName,
})) || [];
setSystemOptions(options);
});
// 请求流程数据
request(`/ds/dsprocessinfo/getprocessbyarea?areaId=${currentDomain}`).then(res => {
const options = res.data?.length > 0
? JSON.parse(res.data[0].proPoint).map((item: string) => ({ value: item, label: item }))
: [];
setprocessOptions(options);
});
// 请求业务对象数据
request('/ds/dsobjinfo/byareaid', {
method: 'POST',
data: { areaId: currentDomain },
}).then(res => {
const options = res.data?.map((item: { id: string; objName: string }) => ({
value: item.id,
label: item.objName,
})) || [];
setobjOptions(options);
});
}
}, [currentDomain]);
// 表格列定义
const columns = [
{
title: '资产名称',
dataIndex: 'dsName',
key: 'dsName',
valueType: 'text',
search: true,
},
{
title: '表名称',
dataIndex: 'dsTableName',
key: 'dsTableName',
valueType: 'text',
search: true,
},
{
title: '创建人',
dataIndex: 'createUser',
key: 'createUser',
valueType: 'select',
search: true,
fieldProps: {
options: [
{ value: 'GW00216679', label: '许海兵' },
{ value: 'GW00270950', label: '郭毅男' },
{ value: 'GW00223247', label: '靳晓鹏' },
{ value: 'GW00270941', label: '张开洋' },
{ value: 'GW1100584', label: '张华' },
{ value: 'GW00317510', label: '魏新龙' },
],
},
},
{
title: '系统',
dataIndex: 'sysName',
key: 'sysName',
valueType: 'select',
search: true,
fieldProps: {
options: systemOptions,
},
},
{
title: '流程节点',
dataIndex: 'processPointName',
key: 'processPointName',
valueType: 'select',
fieldProps: {
options: processOptions,
},
},
{
title: '业务对象',
dataIndex: 'bussinessObjName',
key: 'bussinessObjName',
valueType: 'select',
fieldProps: {
options: objOptions,
},
},
{
title: '数据类型',
dataIndex: 'dsType',
key: 'dsType',
valueType: 'select',
search: true,
fieldProps: {
options: [
{ value: '清洗后数据', label: '清洗后数据' },
{ value: '原始数据', label: '原始数据' },
],
},
},
{
title: '是否认证',
dataIndex: 'isConfirm',
key: 'isConfirm',
valueType: 'select',
fieldProps: {
options: [
{ value: 'true', label: '是' },
{ value: 'false', label: '否' },
],
},
},
{
title: '是否发布',
dataIndex: 'isPublished',
key: 'isPublished',
valueType: 'select',
fieldProps: {
options: [
{ value: 'true', label: '是' },
{ value: 'false', label: '否' },
],
},
},
{
title: '操作',
valueType: 'option',
render: (_: any, record: any) => (
<>
<Button type="link" onClick={() => handleEdit(record)}>
编辑
</Button>
<Button type="link" danger onClick={() => handleDelete(record)}>
删除
</Button>
<Button type="link" onClick={() => handleTogglePublish(record)}>
{record.isPublished ? '下线' : '上线'}
</Button>
</>
),
},
];
// 打开新增弹窗
const handleAdd = () => {
console.log("aaaaaaaaaaaaaa")
form.resetFields(); // 👈 清空表单
setEditingRecord(null);
setFileList([]);
setModalVisible(true);
};
// 打开编辑弹窗
const handleEdit = (record: any) => {
setEditingRecord(record);
form.setFieldsValue(record);
setModalVisible(true);
};
// 删除操作
const handleDelete = (record: any) => {
console.log('删除:', record);
message.success(`删除了:${record.assetName}`);
};
// 上线/下线操作
const handleTogglePublish = (record: any) => {
console.log('切换状态:', record);
message.success(`${record.isPublished ? '下线' : '上线'}成功`);
};
// 文件上传配置
const uploadProps = {
name: 'multipartFile',
action: 'http://localhost:8040/ds/dsdemo/addfile',
maxCount: 1,
withCredentials: true,
fileList: fileList,
onChange: (info: any) => {
const file = info.file;
const fileList = info.fileList;
if (file.status === 'done') {
// 上传成功
message.success(`${file.name} 上传成功`);
const filePath = file.response?.filePath || '#';
setFileList([file]);
form.setFieldsValue({ demoData: filePath });
} else if (file.status === 'removed') {
// 文件被删除
setFileList([]);
form.setFieldsValue({ demoData: null });
} else if (file.status === 'error') {
// 上传失败
message.error(`${file.name} 上传失败`);
} else if (file.status === 'uploading') {
// 正在上传
console.log('文件正在上传:', file.name);
}
// 始终更新 fileList 以保持 UI 同步
setFileList(fileList);
},
onRemove: () => {
setFileList([]);
form.setFieldsValue({ demoData: null });
return true;
},
};
// 表单提交
const handleOk = async () => {
try {
const values = await form.validateFields();
const payload = {
...values,
areaId: currentDomain,
};
let url = '/ds/dsbaseinfo/add'; // 默认是新增
if (editingRecord) {
url = '/ds/dsbaseinfo/update'; // 编辑
payload.id = editingRecord.id; // 从 editingRecord 中提取 id
}
// 发送请求
const res = await request(url, {
method: 'POST',
data: payload,
});
if(res){
message.success(editingRecord ? '编辑成功' : '新增成功');
setModalVisible(false);
form.resetFields();
setFileList([]);
if (actionRef.current) {
actionRef.current.reload(); // 刷新表格
} else {
console.error('❌ actionRef 未绑定到 ProTable');
}
}
} catch (error) {
message.error('提交失败');
}
};
return (
<div style={{ display: 'flex', height: '100%' }}>
<DomainList
domains={domains}
currentDomain={currentDomain}
onDomainChange={handleDomainChange}
/>
<ProTable
headerTitle="资产列表"
request={fetchData}
style={{ marginLeft: 5, maxWidth: 1650 }}
// @ts-ignore
columns={columns}
actionRef={actionRef}
rowKey="id"
pagination={{
pageSize: 10,
showSizeChanger: true,
}}
search={{
labelWidth: 120,
defaultCollapsed: false,
filterType: 'query',
}}
toolBarRender={() => [
<Button type="primary" key="add" onClick={handleAdd}>
新增
</Button>,
]}
/>
{/* 新增/编辑模态框 */}
<Modal
title={editingRecord ? '编辑资产' : '新增资产'}
open={modalVisible} // 👈 确认你用的是 open 还是 visible
onOk={handleOk}
onCancel={() => {
form.resetFields();
setModalVisible(false);
setEditingRecord(null);
setFileList([]);
}}
width={800}
>
<Form form={form} layout="vertical" initialValues={editingRecord || {}}>
<Row gutter={16}>
{/* 左侧列 */}
<Col span={12}>
<Form.Item label="领域" name="areaName" rules={[{ required: true }]}>
<Input placeholder="禁用状态" disabled />
</Form.Item>
<Form.Item label="领域ID" name="areaId" rules={[{ required: true }]} hidden>
<Input />
</Form.Item>
<Form.Item label="业务对象" name="bussinessObjName" rules={[{ required: true }]}>
<Select showSearch placeholder="请选择业务对象">
{objOptions.map((opt: any) => (
<Select.Option key={opt.value} value={opt.value}>
{opt.label}
</Select.Option>
))}
</Select>
</Form.Item>
<Form.Item label="资产名称" name="dsName" rules={[{ required: true }]}>
<Input placeholder="请输入资产名称" />
</Form.Item>
<Form.Item label="数据Owner工号" name="dsOwnerNum" rules={[{ required: true }]}>
<Input placeholder="请输入数据Owner工号" />
</Form.Item>
<Form.Item label="数据类型" name="dsType" rules={[{ required: true }]}>
<Select
showSearch
placeholder="请选择数据类型"
options={dsType_options}
/>
</Form.Item>
</Col>
{/* 右侧列 */}
<Col span={12}>
<Form.Item label="系统" name="sysName" rules={[{ required: true }]}>
<Select showSearch placeholder="请选择系统">
{systemOptions.map((opt: any) => (
<Select.Option key={opt.value} value={opt.value}>
{opt.label}
</Select.Option>
))}
</Select>
</Form.Item>
<Form.Item label="流程节点" name="processPointName" rules={[{ required: true }]}>
<Select showSearch placeholder="请选择流程节点">
{processOptions.map((opt: any) => (
<Select.Option key={opt.value} value={opt.value}>
{opt.label}
</Select.Option>
))}
</Select>
</Form.Item>
<Form.Item label="表名称" name="dsTableName" rules={[{ required: true }]}>
<Input placeholder="请输入表名称" />
</Form.Item>
<Form.Item label="数据Owner姓名" name="dsOwnerName" rules={[{ required: true }]}>
<Input placeholder="请输入数据Owner姓名" />
</Form.Item>
<Form.Item label="是否认证" name="isConfirm" valuePropName="checked">
<Switch />
</Form.Item>
</Col>
</Row>
<Row gutter={16}>
<Col span={24}>
<Form.Item label="数据描述" name="dsMemo" rules={[{ required: true }]}>
<Input.TextArea rows={2} placeholder="请输入描述信息" />
</Form.Item>
<Form.Item label="数据范围" name="dsRange">
<Input.TextArea rows={2} placeholder="请输入数据范围" />
</Form.Item>
<Form.Item label="样例数据上传">
<Upload {...uploadProps}>
<Button>选择文件</Button>
</Upload>
{/* 展示已上传文件 */}
{fileList.length > 0 &&
fileList.map(file => (
<div
key={file.uid}
style={{
marginTop: 10,
padding: '8px',
border: '1px solid #e8e8e8',
borderRadius: 4,
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
}}
>
<a href={file.url} target="http://baidu.com" rel="noopener noreferrer">
{file.name}
</a>
<Button type="link" danger onClick={() => uploadProps.onRemove?.()}>
删除
</Button>
</div>
))}
</Form.Item>
{/* 将上传文件路径保存到 Form 中 */}
<Form.Item name="demoData" noStyle>
<Input type="hidden" />
</Form.Item>
</Col>
</Row>
</Form>
</Modal>
</div>
);
};
export default AssetTable;
以上代码 点完编辑按钮弹出框 ,再打开新增 发现编辑的数据还在 怎么解决