Merge branch 'dev' of http://59.110.10.99:53000/liuc/fe_supplier_frontend into dev
This commit is contained in:
@ -340,7 +340,6 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
|
|||||||
const updateDataSource = (newData: TableRowItem[]) => {
|
const updateDataSource = (newData: TableRowItem[]) => {
|
||||||
// 确保每行都有唯一稳定的key
|
// 确保每行都有唯一稳定的key
|
||||||
const finalData = ensureUniqueKeys(newData);
|
const finalData = ensureUniqueKeys(newData);
|
||||||
console.log('finalData', finalData);
|
|
||||||
setDataSource(finalData);
|
setDataSource(finalData);
|
||||||
if (onChange) {
|
if (onChange) {
|
||||||
// 转换回API格式再传递给父组件
|
// 转换回API格式再传递给父组件
|
||||||
@ -369,7 +368,6 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
|
|||||||
|
|
||||||
// 处理输入变化
|
// 处理输入变化
|
||||||
const handleInputChange = (val: any, record: TableRowItem, field: string) => {
|
const handleInputChange = (val: any, record: TableRowItem, field: string) => {
|
||||||
console.log('handleInputChange', val, record, field);
|
|
||||||
const newData = [...dataSource];
|
const newData = [...dataSource];
|
||||||
const index = newData.findIndex((item) => item.key === record.key);
|
const index = newData.findIndex((item) => item.key === record.key);
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
@ -839,11 +837,11 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
|
|||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<InputNumber
|
<InputNumber
|
||||||
min={0}
|
min={1}
|
||||||
max={100}
|
max={100}
|
||||||
disabled={record.scoreEditST === '1' || record.indicatorStEditST === '1'}
|
disabled={record.scoreEditST === '1' || record.indicatorStEditST === '1'}
|
||||||
value={parseFloat(cellContent) || 0}
|
value={parseFloat(cellContent) || 1}
|
||||||
onChange={(val) => handleInputChange(val?.toString() || '0', record, 'stScore')}
|
onChange={(val) => handleInputChange(val?.toString() || '1', record, 'stScore')}
|
||||||
style={{ width: '100%' }}
|
style={{ width: '100%' }}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
@ -987,11 +985,11 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
|
|||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<InputNumber
|
<InputNumber
|
||||||
min={0}
|
min={1}
|
||||||
max={100}
|
max={100}
|
||||||
disabled={record.disabledNd}
|
disabled={record.disabledNd}
|
||||||
value={parseFloat(text) || 0}
|
value={parseFloat(text) || 1}
|
||||||
onChange={(val) => handleInputChange(val?.toString() || '0', record, 'ndScore')}
|
onChange={(val) => handleInputChange(val?.toString() || '1', record, 'ndScore')}
|
||||||
style={{ width: '100%' }}
|
style={{ width: '100%' }}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
12
src/components/SupplierDetailModalContext/SupplierDetail.tsx
Normal file
12
src/components/SupplierDetailModalContext/SupplierDetail.tsx
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
const SupplierDetail = ({ supplierId }: { supplierId: string | null }) => {
|
||||||
|
const [supplierDetail, setSupplierDetail] = useState(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log(supplierId);
|
||||||
|
}, [supplierId]);
|
||||||
|
return <div>SupplierDetail</div>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SupplierDetail;
|
@ -0,0 +1,25 @@
|
|||||||
|
import React, { useState } from 'react';
|
||||||
|
import { Modal } from 'antd';
|
||||||
|
import SupplierDetail from './SupplierDetail';
|
||||||
|
|
||||||
|
const SupplierDetailModalContext = React.createContext<((id: string) => void) | null>(null);
|
||||||
|
export const useSupplierDetailModal = () => React.useContext(SupplierDetailModalContext);
|
||||||
|
|
||||||
|
export const SupplierDetailModalProvider = ({ children }: { children: React.ReactNode }) => {
|
||||||
|
const [visible, setVisible] = useState(false);
|
||||||
|
const [supplierId, setSupplierId] = useState<string | null>(null);
|
||||||
|
|
||||||
|
const showSupplierDetail = (id: string) => {
|
||||||
|
setSupplierId(id);
|
||||||
|
setVisible(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<SupplierDetailModalContext.Provider value={showSupplierDetail}>
|
||||||
|
{children}
|
||||||
|
<Modal visible={visible} onCancel={() => setVisible(false)} footer={null}>
|
||||||
|
<SupplierDetail supplierId={supplierId} />
|
||||||
|
</Modal>
|
||||||
|
</SupplierDetailModalContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
3
src/components/SupplierDetailModalContext/readme.md
Normal file
3
src/components/SupplierDetailModalContext/readme.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// 任何页面/组件
|
||||||
|
const showSupplierDetail = useSupplierDetailModal();
|
||||||
|
<span onClick={() => showSupplierDetail(supplier.id)}>{supplier.name}</span>
|
@ -233,6 +233,11 @@ const SupplierSelector: React.FC<SupplierSelectorProps> = ({
|
|||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 显示供应商详情
|
||||||
|
const showSupplierDetail = (record: SupplierItem) => {
|
||||||
|
console.log(record);
|
||||||
|
};
|
||||||
|
|
||||||
// 表格列定义
|
// 表格列定义
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
@ -240,9 +245,9 @@ const SupplierSelector: React.FC<SupplierSelectorProps> = ({
|
|||||||
dataIndex: 'supplierName',
|
dataIndex: 'supplierName',
|
||||||
width: 120,
|
width: 120,
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
render: (supplierName: string) => (
|
render: (supplierName: string, record: SupplierItem) => (
|
||||||
<Tooltip placement="topLeft" title={supplierName}>
|
<Tooltip placement="topLeft" title={supplierName}>
|
||||||
{supplierName}
|
<span onClick={()=>showSupplierDetail(record)}>{supplierName}</span>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
@ -8,8 +8,8 @@ import routes from '../../config/router.config'; // 引入你的自定义路由
|
|||||||
import { ConfigProvider, Breadcrumb } from 'antd';
|
import { ConfigProvider, Breadcrumb } from 'antd';
|
||||||
import HeaderComponent from './Header';
|
import HeaderComponent from './Header';
|
||||||
import IconFont from '@/components/IconFont/IconFont';
|
import IconFont from '@/components/IconFont/IconFont';
|
||||||
import { BreadcrumbState } from '@/models/breadcrumb';
|
import type { BreadcrumbState } from '@/models/breadcrumb';
|
||||||
|
import { SupplierDetailModalProvider } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
|
||||||
|
|
||||||
const MenuRender = (item: any, isSubMenu: boolean) => {
|
const MenuRender = (item: any, isSubMenu: boolean) => {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
@ -35,10 +35,10 @@ const MenuRender = (item: any, isSubMenu: boolean) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 递归交集过滤函数
|
// 递归交集过滤函数
|
||||||
function filterMenuByRouter(routes:any, menuRoutes:any) {
|
function filterMenuByRouter(routes: any, menuRoutes: any) {
|
||||||
return routes.reduce((result:any, route:any) => {
|
return routes.reduce((result: any, route: any) => {
|
||||||
// 只看有 name 的节点
|
// 只看有 name 的节点
|
||||||
const menu = menuRoutes.find(m => m.name === route.name);
|
const menu = menuRoutes.find((m) => m.name === route.name);
|
||||||
if (menu) {
|
if (menu) {
|
||||||
// 匹配到后,递归处理 children
|
// 匹配到后,递归处理 children
|
||||||
let children = [];
|
let children = [];
|
||||||
@ -56,7 +56,12 @@ function filterMenuByRouter(routes:any, menuRoutes:any) {
|
|||||||
}, []);
|
}, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
const BreadcrumbRender = (routeBreadcrumb: any, intl: any, history: any, dynamicBreadcrumbName: string | null) => {
|
const BreadcrumbRender = (
|
||||||
|
routeBreadcrumb: any,
|
||||||
|
intl: any,
|
||||||
|
history: any,
|
||||||
|
dynamicBreadcrumbName: string | null,
|
||||||
|
) => {
|
||||||
const breadcrumbRoutes = routeBreadcrumb?.routes;
|
const breadcrumbRoutes = routeBreadcrumb?.routes;
|
||||||
return (
|
return (
|
||||||
<Breadcrumb>
|
<Breadcrumb>
|
||||||
@ -65,22 +70,17 @@ const BreadcrumbRender = (routeBreadcrumb: any, intl: any, history: any, dynamic
|
|||||||
history.push('/');
|
history.push('/');
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<span style={{ cursor: 'pointer' }}>
|
<span style={{ cursor: 'pointer' }}>{intl.formatMessage({ id: 'menu.首页' })}</span>
|
||||||
{intl.formatMessage({ id: 'menu.首页' })}
|
|
||||||
</span>
|
|
||||||
</Breadcrumb.Item>
|
</Breadcrumb.Item>
|
||||||
{breadcrumbRoutes?.map((item: any, index: number) => {
|
{breadcrumbRoutes?.map((item: any, index: number) => {
|
||||||
// 判断是否是最后一个面包屑项且存在动态名称
|
// 判断是否是最后一个面包屑项且存在动态名称
|
||||||
const isLastItem = index === (breadcrumbRoutes.length - 1);
|
const isLastItem = index === breadcrumbRoutes.length - 1;
|
||||||
const displayName = (isLastItem && dynamicBreadcrumbName)
|
const displayName =
|
||||||
? dynamicBreadcrumbName
|
isLastItem && dynamicBreadcrumbName
|
||||||
: intl.formatMessage({ id: `menu.${item.breadcrumbName}` || '' });
|
? dynamicBreadcrumbName
|
||||||
|
: intl.formatMessage({ id: `menu.${item.breadcrumbName}` || '' });
|
||||||
|
|
||||||
return (
|
return <Breadcrumb.Item key={item.path}>{displayName}</Breadcrumb.Item>;
|
||||||
<Breadcrumb.Item key={item.path}>
|
|
||||||
{displayName}
|
|
||||||
</Breadcrumb.Item>
|
|
||||||
);
|
|
||||||
})}
|
})}
|
||||||
</Breadcrumb>
|
</Breadcrumb>
|
||||||
);
|
);
|
||||||
@ -106,47 +106,47 @@ const BasicLayout: React.FC<BasicLayoutProps> = (props) => {
|
|||||||
// routes是本地静态路由,menusFromApi是接口菜单
|
// routes是本地静态路由,menusFromApi是接口菜单
|
||||||
const finalMenus = filterMenuByRouter(routes, menusFromApi);
|
const finalMenus = filterMenuByRouter(routes, menusFromApi);
|
||||||
console.log(finalMenus);
|
console.log(finalMenus);
|
||||||
|
|
||||||
setMenuRoutes(finalMenus);
|
setMenuRoutes(finalMenus);
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ConfigProvider>
|
<ConfigProvider>
|
||||||
<ProLayout
|
<SupplierDetailModalProvider>
|
||||||
{...defaultSettings}
|
<ProLayout
|
||||||
route={{ routes }}
|
{...defaultSettings}
|
||||||
// route={{ routes: menuRoutes }}
|
route={{ routes }}
|
||||||
subMenuItemRender={(menuItemProps, defaultDom) => {
|
// route={{ routes: menuRoutes }}
|
||||||
return MenuRender(menuItemProps, true);
|
subMenuItemRender={(menuItemProps, defaultDom) => {
|
||||||
}}
|
return MenuRender(menuItemProps, true);
|
||||||
menuItemRender={(item, dom) => {
|
}}
|
||||||
return MenuRender(item, false);
|
menuItemRender={(item, dom) => {
|
||||||
}}
|
return MenuRender(item, false);
|
||||||
location={location}
|
}}
|
||||||
fixSiderbar
|
location={location}
|
||||||
layout="mix"
|
fixSiderbar
|
||||||
headerRender={() => {
|
layout="mix"
|
||||||
return <HeaderComponent />;
|
headerRender={() => {
|
||||||
}}
|
return <HeaderComponent />;
|
||||||
>
|
|
||||||
<PageContainer
|
|
||||||
ghost={true}
|
|
||||||
header={{
|
|
||||||
title: false,
|
|
||||||
breadcrumbRender: ({ breadcrumb: routeBreadcrumb }) =>
|
|
||||||
BreadcrumbRender(routeBreadcrumb, intl, history, breadcrumb.breadcrumbName),
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{children}
|
<PageContainer
|
||||||
</PageContainer>
|
ghost={true}
|
||||||
</ProLayout>
|
header={{
|
||||||
|
title: false,
|
||||||
|
breadcrumbRender: ({ breadcrumb: routeBreadcrumb }) =>
|
||||||
|
BreadcrumbRender(routeBreadcrumb, intl, history, breadcrumb.breadcrumbName),
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</PageContainer>
|
||||||
|
</ProLayout>
|
||||||
|
</SupplierDetailModalProvider>
|
||||||
</ConfigProvider>
|
</ConfigProvider>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default connect(({ breadcrumb }: { breadcrumb: BreadcrumbState }) => ({
|
export default connect(({ breadcrumb }: { breadcrumb: BreadcrumbState }) => ({
|
||||||
breadcrumb
|
breadcrumb,
|
||||||
}))(BasicLayout);
|
}))(BasicLayout);
|
||||||
|
|
||||||
|
@ -203,7 +203,6 @@ const supplierAnnualTaskManage: SupplierTaskModelType = {
|
|||||||
}
|
}
|
||||||
// 处理评价人员更新 - 更新后要保留原有对象中的indicatorIds
|
// 处理评价人员更新 - 更新后要保留原有对象中的indicatorIds
|
||||||
|
|
||||||
console.log(updatedFormData)
|
|
||||||
|
|
||||||
// 保存更新后的表单数据
|
// 保存更新后的表单数据
|
||||||
yield put({ type: 'saveTaskFormData', payload: updatedFormData });
|
yield put({ type: 'saveTaskFormData', payload: updatedFormData });
|
||||||
|
@ -263,7 +263,6 @@ const SupplierTaskModel: SupplierTaskModelType = {
|
|||||||
if (payload.taskDeptWeightList) {
|
if (payload.taskDeptWeightList) {
|
||||||
updatedFormData.taskDeptWeightList = payload.taskDeptWeightList;
|
updatedFormData.taskDeptWeightList = payload.taskDeptWeightList;
|
||||||
}
|
}
|
||||||
console.log(updatedFormData)
|
|
||||||
|
|
||||||
// 保存更新后的表单数据
|
// 保存更新后的表单数据
|
||||||
yield put({ type: 'saveTaskFormData', payload: updatedFormData });
|
yield put({ type: 'saveTaskFormData', payload: updatedFormData });
|
||||||
|
@ -310,7 +310,6 @@ const SupplierTemplateManageAdd: React.FC<PageProps> = ({ breadcrumb, dispatch }
|
|||||||
|
|
||||||
// 处理指标数据变更
|
// 处理指标数据变更
|
||||||
const handleTemplateDataChange = (data: SupplierTemplateManage.IndicatorSt[]) => {
|
const handleTemplateDataChange = (data: SupplierTemplateManage.IndicatorSt[]) => {
|
||||||
console.log('handleTemplateDataChange', data);
|
|
||||||
setTemplateData(data);
|
setTemplateData(data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user