对接供应商评价任务新增

This commit is contained in:
linxd
2025-06-24 20:32:55 +08:00
parent d7df286214
commit a7271653a6
7 changed files with 450 additions and 67 deletions

View File

@ -27,6 +27,9 @@ interface EvaluateTemplateTableProps {
value?: any[];
onChange?: (value: any[]) => void;
isDetail?: boolean; // 是否详情展示用如果为true则将input都改为text展示并且将操作列隐藏
isCheck?: boolean; // 是否显示勾选操作如果为true则在表格最后一列增加勾选操作项
onSelect?: (selectedItems: any[]) => void; // 勾选回调函数
defaultSelectedIds?: string[]; // 默认选中的二级指标ID数组
}
// 内部使用的数据结构,扁平化后的行数据
@ -44,12 +47,16 @@ interface TableRowItem {
desc?: string;
orderBy?: number;
ndOrderBy?: number;
selected?: boolean; // 是否选中
}
const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
value = [],
onChange,
isDetail = false,
isCheck = false,
onSelect,
defaultSelectedIds = [],
}) => {
const [dataSource, setDataSource] = useState<TableRowItem[]>([]);
const [form] = Form.useForm();
@ -86,7 +93,8 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
ndScore: item.score || '0',
isStar: item.isStar || StarLevel.NO,
orderBy: typeof item.stOrderBy === 'string' ? parseInt(item.stOrderBy) : item.stOrderBy,
ndOrderBy: typeof item.orderBy === 'string' ? parseInt(item.orderBy) : item.orderBy
ndOrderBy: typeof item.orderBy === 'string' ? parseInt(item.orderBy) : item.orderBy,
selected: defaultSelectedIds.includes(item.id) // 根据defaultSelectedIds设置选中状态
}));
}
@ -109,7 +117,8 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
isStar: ndItem.isStar || StarLevel.NO,
desc: ndItem.desc,
orderBy: typeof stItem.orderBy === 'string' ? parseInt(stItem.orderBy) : stItem.orderBy,
ndOrderBy: typeof ndItem.orderBy === 'string' ? parseInt(ndItem.orderBy) : ndItem.orderBy
ndOrderBy: typeof ndItem.orderBy === 'string' ? parseInt(ndItem.orderBy) : ndItem.orderBy,
selected: defaultSelectedIds.includes(ndItem.id) // 根据defaultSelectedIds设置选中状态
});
});
});
@ -208,9 +217,13 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
(existing.baseIndicator === newItem.baseIndicator && existing.subIndicator === newItem.subIndicator)
);
// 如果找到现有项保留其key
// 如果找到现有项保留其key和selected状态
if (existingItem) {
return { ...newItem, key: existingItem.key };
return {
...newItem,
key: existingItem.key,
selected: defaultSelectedIds.includes(newItem.ndId || '') ? true : existingItem.selected
};
}
return newItem;
@ -229,6 +242,27 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
}
}, [value]);
// 处理defaultSelectedIds变化
useEffect(() => {
if (defaultSelectedIds.length > 0 && dataSource.length > 0) {
const newData = dataSource.map(item => ({
...item,
selected: defaultSelectedIds.includes(item.ndId || '')
}));
console.log("newData",newData)
setDataSource(newData);
// 如果有onSelect回调传递所有选中的项
if (onSelect) {
const selectedItems = newData.filter(item => item.selected);
// 转换为API格式再传递给父组件
const selectedApiData = convertTableDataToApiData(selectedItems);
onSelect(selectedApiData);
}
}
}, [defaultSelectedIds]);
// 更新数据源
const updateDataSource = (newData: TableRowItem[]) => {
// 确保每行都有唯一稳定的key
@ -242,6 +276,25 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
}
};
// 处理勾选状态变化
const handleCheckChange = (record: TableRowItem, checked: boolean) => {
console.log("handleCheckChange")
const newData = [...dataSource];
const index = newData.findIndex((item) => item.key === record.key);
if (index > -1) {
newData[index] = { ...newData[index], selected: checked };
setDataSource(newData);
// 如果有onSelect回调传递所有选中的项
if (onSelect) {
const selectedItems = newData.filter(item => item.selected);
// 转换为API格式再传递给父组件
const selectedApiData = convertTableDataToApiData(selectedItems);
onSelect(selectedApiData);
}
}
};
// 处理输入变化
const handleInputChange = (val: any, record: TableRowItem, field: string) => {
const newData = [...dataSource];
@ -311,7 +364,8 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
isStar: StarLevel.NO,
desc: '',
orderBy: dataSource.length + 1, // 确保正确的排序
ndOrderBy: 1 // 设置二级指标初始排序
ndOrderBy: 1, // 设置二级指标初始排序
selected: false, // 默认未选中
};
// 制作数据源的副本,避免直接修改状态
@ -375,7 +429,8 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
ndScore: '0',
isStar: StarLevel.NO,
desc: '',
ndOrderBy: dataSource.filter(item => item.baseIndicator === parent.baseIndicator).length + 1
ndOrderBy: dataSource.filter(item => item.baseIndicator === parent.baseIndicator).length + 1,
selected: false, // 默认未选中
};
// 找到当前记录所在的位置
@ -698,6 +753,20 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
);
},
},
// 添加勾选列只在isCheck为true时显示
...(isCheck ? [{
title: '勾选',
key: 'check',
align: 'center',
width: 80,
render: (_: any, record: TableRowItem) => (
<input
type="checkbox"
checked={record.selected}
onChange={(e) => handleCheckChange(record, e.target.checked)}
/>
),
}] : []),
].filter((col) => !(isDetail && col.key === 'level2Action')),
},
];