diff --git a/src/components/EvaluateTemplateTable/EvaluateTemplateTable.tsx b/src/components/EvaluateTemplateTable/EvaluateTemplateTable.tsx index a780901..d26ceae 100644 --- a/src/components/EvaluateTemplateTable/EvaluateTemplateTable.tsx +++ b/src/components/EvaluateTemplateTable/EvaluateTemplateTable.tsx @@ -1,7 +1,7 @@ // 供应商评价 模板管理新增中的table import React, { useState, useEffect } from 'react'; import { useIntl } from 'umi'; -import { Table, Input, Button, Select, InputNumber, message, Popconfirm } from 'antd'; +import { Table, Input, Button, Select, InputNumber, message, Popconfirm, Switch } from 'antd'; import { PlusOutlined, MinusCircleOutlined, @@ -13,6 +13,7 @@ import type { DictItem } from '@/servers/api/dicts'; import { StarLevel, StarLevelText } from '@/dicts/supplierTemplateDict'; import { generateUUID } from '@/utils/utils'; import './EvaluateTemplateTable.less'; +import { useUser } from '@/hooks/useUser'; const { Option } = Select; const { TextArea } = Input; @@ -24,6 +25,8 @@ interface EvaluateTemplateTableProps { isCheck?: boolean; // 是否显示勾选操作,如果为true则在表格最后一列增加勾选操作项 onSelect?: (selectedItems: any[]) => void; // 勾选回调函数 defaultSelectedIds?: string[]; // 默认选中的二级指标ID数组 + firstIsAdd?: boolean; // 是否可追加一级指标 默认是 + disableType?: string; // 禁用指标类型 } // 内部使用的数据结构,扁平化后的行数据 @@ -50,6 +53,18 @@ interface TableRowItem { selected?: boolean; // 是否选中 disabledSt?: boolean; // 是否禁用一级 disabledNd?: boolean; // 是否禁用二级 + + // 因为table是需要扁平化数据,所以需要添加以下字段 + baseIndicatorEdit?: string; // 基本指标是否可编辑 0.是、1.否 + descIndicatorEdit?: string; // 指标说明是否可编辑(0.是、1.否) + scoreEdit?: string; // 分值是否可编辑(0.是、1.否) + indicatorStEdit?: string; // 该一级指标是否可编辑(0.是、1.否) + + + indicatorStEditST?: string; // 该一级指标是否可编辑(0.是、1.否) + baseIndicatorEditST?: string; // 基本指标是否可编辑 0.是、1.否 + descIndicatorEditST?: string; // 指标说明是否可编辑(0.是、1.否) + scoreEditST?: string; // 分值是否可编辑(0.是、1.否) } const EvaluateTemplateTable: React.FC = ({ @@ -59,11 +74,23 @@ const EvaluateTemplateTable: React.FC = ({ isCheck = false, onSelect, defaultSelectedIds = [], + firstIsAdd = true, + disableType = '', }) => { + const { getUserRole } = useUser(); const intl = useIntl(); const [dataSource, setDataSource] = useState([]); const [indicatorTypes, setIndicatorTypes] = useState([]); const [loadingTypes, setLoadingTypes] = useState(false); + const [isFirstDisabled, setIsFirstDisabled] = useState(!firstIsAdd); + + useEffect(() => { + setIsFirstDisabled(!firstIsAdd); + if (disableType) { + const newIndicatorTypes = indicatorTypes.filter((item) => item.code !== disableType); + setIndicatorTypes(newIndicatorTypes); + } + }, [firstIsAdd, disableType]); // 获取指标类型字典 const fetchIndicatorTypes = async () => { @@ -106,8 +133,6 @@ const EvaluateTemplateTable: React.FC = ({ orderBy: typeof item.stOrderBy === 'string' ? parseInt(item.stOrderBy) : item.stOrderBy, ndOrderBy: typeof item.orderBy === 'string' ? parseInt(item.orderBy) : item.orderBy, selected: defaultSelectedIds.includes(item.id), // 根据defaultSelectedIds设置选中状态 - disabledSt: item.disabledSt ?? false, - disabledNd: item.disabledNd, })); } @@ -132,10 +157,10 @@ const EvaluateTemplateTable: React.FC = ({ ndOrderBy: typeof ndItem.orderBy === 'string' ? parseInt(ndItem.orderBy) : ndItem.orderBy, selected: defaultSelectedIds.includes(ndItem.id), // 根据defaultSelectedIds设置选中状态 - // 关键点1:将API数据中的disabled属性映射到表格数据的disabledSt和disabledNd - // 这确保了一级指标的禁用状态正确传递到所有相关行,二级指标保持自己的禁用状态 - disabledSt: stItem.disabled, // 根据disabled设置一级禁用状态 - disabledNd: ndItem.disabled, // 根据disabled设置二级禁用状态 + indicatorStEditST: stItem.indicatorStEdit, + baseIndicatorEditST: stItem.baseIndicatorEdit, + descIndicatorEditST: stItem.descIndicatorEdit, + scoreEditST: stItem.scoreEdit, }); }); }); @@ -174,6 +199,10 @@ const EvaluateTemplateTable: React.FC = ({ id: firstItem.stId || tempStId, baseIndicator: firstItem.baseIndicator || '', descIndicator: firstItem.descIndicator || '', + indicatorStEdit: firstItem.indicatorStEditST || 0, + baseIndicatorEdit: firstItem.baseIndicatorEditST || 0, + descIndicatorEdit: firstItem.descIndicatorEditST || 0, + scoreEdit: firstItem.scoreEditST || 0, score: firstItem.stScore || '0', orderBy: firstItem.orderBy || stIndex + 1, indicatorType: firstItem.indicatorType || '', @@ -229,7 +258,6 @@ const EvaluateTemplateTable: React.FC = ({ const currentValueStr = JSON.stringify(value); const currentDataSourceApiStr = dataSource.length > 0 ? JSON.stringify(convertTableDataToApiData(dataSource)) : ''; - if (currentValueStr !== currentDataSourceApiStr) { const tableData = convertApiDataToTableData(value); // 保留现有项的key,确保稳定性 @@ -256,7 +284,6 @@ const EvaluateTemplateTable: React.FC = ({ return newItem; }); - // 确保所有key都是唯一的 setDataSource(ensureUniqueKeys(updatedTableData)); } else { @@ -278,7 +305,6 @@ const EvaluateTemplateTable: React.FC = ({ selected: defaultSelectedIds.includes(item.ndId || ''), })); - setDataSource(newData); // 如果有onSelect回调,传递所有选中的项 @@ -293,10 +319,8 @@ const EvaluateTemplateTable: React.FC = ({ // 更新数据源 const updateDataSource = (newData: TableRowItem[]) => { - // 确保每行都有唯一稳定的key const finalData = ensureUniqueKeys(newData); - setDataSource(finalData); if (onChange) { // 转换回API格式再传递给父组件 @@ -325,6 +349,7 @@ const EvaluateTemplateTable: React.FC = ({ // 处理输入变化 const handleInputChange = (val: any, record: TableRowItem, field: string) => { + console.log('handleInputChange', val, record, field); const newData = [...dataSource]; const index = newData.findIndex((item) => item.key === record.key); if (index > -1) { @@ -406,7 +431,7 @@ const EvaluateTemplateTable: React.FC = ({ disabledNd: false, // 默认不禁用二级指标 }; // 制作数据源的副本,避免直接修改状态 - const newData = dataSource.map(item => ({ ...item })); + const newData = dataSource.map((item) => ({ ...item })); // 找到当前记录所在的一级指标组的最后一行 let insertIndex = -1; @@ -429,7 +454,6 @@ const EvaluateTemplateTable: React.FC = ({ newData.push(newItem); } - updateDataSource(newData); }; @@ -495,7 +519,6 @@ const EvaluateTemplateTable: React.FC = ({ newData.push(newItem); } - updateDataSource(newData); }; @@ -542,13 +565,13 @@ const EvaluateTemplateTable: React.FC = ({ if (index === 0) { // 关键点5:检查同组内是否有任何行的disabledSt为true // 这是解决问题的核心,通过这个判断来决定是否禁用整个一级指标组的控件 - const anyDisabled = level1Items.some(item => !!item.disabledSt); + const anyDisabled = level1Items.some((item) => !!item.disabledSt); // 关键点6:创建一个临时记录,使用组内任何行的禁用状态 // 这样确保只要组内有一行禁用,整个组的一级指标控件都会显示为禁用状态 const tempRecord = { ...record, - disabledSt: anyDisabled + disabledSt: anyDisabled, }; return { @@ -566,6 +589,18 @@ const EvaluateTemplateTable: React.FC = ({ }; }; + const filterColumns = (col: any) => { + if ((isDetail || getUserRole() != 'admin') && ['level1Action', 'indicator_st_edit', 'base_indicator_edit', 'desc_indicator_edit', 'score_edit'].includes(col.key)) { + return false; + } + return true; + }; + const filterColumnsSecond = (col: any) => { + if ((isDetail || getUserRole() != 'admin') && ['level2Action'].includes(col.key)) { + return false; + } + return true; + }; const columns = [ { title: intl.formatMessage({ id: 'supplierTemplateManage.evaluateTable.levelOne' }), @@ -603,7 +638,7 @@ const EvaluateTemplateTable: React.FC = ({ })} style={{ width: '100%' }} loading={loadingTypes} - disabled={record.disabledSt} + disabled={record.indicatorStEditST === "1"} > {indicatorTypes.map((item) => (