添加供应商点击弹框

This commit is contained in:
linxd
2025-07-16 09:26:08 +08:00
parent b8f9763f4a
commit aebb615fb6
16 changed files with 277 additions and 86 deletions

View File

@ -19,11 +19,13 @@ import {
ExamineResultColor,
} from '@/dicts/supplierAnnualReviewDict';
import styles from './supplierAnnualResult.less';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
const { Title } = Typography;
const SupplierAnnualResultDetail: React.FC = () => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
const [loading, setLoading] = useState<boolean>(false);
const [reviewDetail, setReviewDetail] = useState<supplierAnnualResult.ReviewDetailData | null>(null);
const [scoreResults, setScoreResults] = useState<supplierAnnualResult.TaskIndicatorVo[]>([]);
@ -133,7 +135,7 @@ const SupplierAnnualResultDetail: React.FC = () => {
<Card title={intl.formatMessage({ id: 'supplierAnnualResult.detail.basicInfo' })} bordered={false} className={styles['detail-card']}>
<Descriptions column={2} bordered>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierAnnualResult.detail.supplierName' })}>
{supplierName || reviewDetail.name}
<Button type="link" onClick={() => supplierDetailModal?.(reviewDetail.supplierId)}>{supplierName || reviewDetail.name}</Button>
</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierAnnualResult.detail.annualTheme' })}>
{annualTheme}

View File

@ -15,6 +15,7 @@ import {
import { ArrowLeftOutlined, SearchOutlined, DeleteOutlined } from '@ant-design/icons';
import { getAnnualResultSupplierList } from '@/servers/api/supplierAnnual';
import styles from './supplierAnnualResult.less';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
const { Title } = Typography;
const { Option } = Select;
@ -28,6 +29,7 @@ const resultOptions = [
const SupplierAnnualResultQuery: React.FC = () => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
const [form] = Form.useForm();
const [loading, setLoading] = useState<boolean>(false);
const [data, setData] = useState<supplierAnnualResult.SupplierRecord[]>([]);
@ -162,6 +164,9 @@ const SupplierAnnualResultQuery: React.FC = () => {
title: intl.formatMessage({ id: 'supplierAnnualResult.supplier.supplierName' }),
dataIndex: 'name',
key: 'name',
render: (text: string, record: supplierAnnualResult.SupplierRecord) => (
<Button type="link" onClick={() => supplierDetailModal?.(record.supplierId)}>{text}</Button>
),
},
{
title: intl.formatMessage({ id: 'supplierAnnualResult.supplier.category' }),

View File

@ -20,6 +20,7 @@ import {
AnnualReviewStatusText,
AnnualReviewStatusColor
} from '@/dicts/supplierAnnualReviewDict';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
const { Title } = Typography;
const { Option } = Select;
@ -33,6 +34,7 @@ const resultOptions = [
const SupplierAnnualResultQuery2: React.FC = () => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
const [form] = Form.useForm();
const [loading, setLoading] = useState<boolean>(false);
const [data, setData] = useState<supplierAnnualResult.ReviewRecord[]>([]);
@ -66,6 +68,7 @@ const SupplierAnnualResultQuery2: React.FC = () => {
pageNo: pagination.current,
pageSize: pagination.pageSize,
},
userId: '',
annualreviewTaskId,
...searchParams,
});
@ -182,6 +185,9 @@ const SupplierAnnualResultQuery2: React.FC = () => {
title: intl.formatMessage({ id: 'supplierAnnualResult.review.supplierName' }),
dataIndex: 'name',
key: 'name',
render: (text: string, record: supplierAnnualResult.ReviewRecord) => (
<Button type="link" onClick={() => supplierDetailModal?.(record.supplierId)}>{text}</Button>
),
},
{
title: intl.formatMessage({ id: 'supplierAnnualResult.review.category' }),

View File

@ -26,6 +26,7 @@ import {
} from '@/dicts/supplierAnnualReviewDict';
import { getDictList } from '@/servers/api/dicts';
import type { DictItem } from '@/servers/api/dicts';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
const { Option } = Select;
const { RangePicker } = DatePicker;
@ -40,6 +41,7 @@ interface AnnualReviewSearchParams {
const SupplierAnnualReview: React.FC = () => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
const [loading, setLoading] = useState<boolean>(false);
const [form] = Form.useForm();
const [reviewStatus, setReviewStatus] = useState<DictItem[]>([]);
@ -181,9 +183,9 @@ const SupplierAnnualReview: React.FC = () => {
ellipsis: {
showTitle: false,
},
render: (text: string) => (
render: (text: string, record: supplierAnnualReview.ReviewRecord) => (
<Tooltip placement="topLeft" title={text}>
{text}
<Button type="link" onClick={() => supplierDetailModal?.(record.supplierId)}>{text}</Button>
</Tooltip>
),
},

View File

@ -26,6 +26,7 @@ import {
ExamineResultText,
} from '@/dicts/supplierAnnualReviewDict';
import styles from './supplierAnnualReview.less';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
const { Title } = Typography;
const { TextArea } = Input;
@ -41,6 +42,7 @@ interface ScoreFormItem {
const SupplierAnnualReviewScore: React.FC = () => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
const [form] = Form.useForm();
const [loading, setLoading] = useState<boolean>(false);
const [submitting, setSubmitting] = useState<boolean>(false);
@ -186,7 +188,9 @@ const SupplierAnnualReviewScore: React.FC = () => {
<Descriptions.Item label={intl.formatMessage({ id: 'supplierAnnualReview.list.reviewTheme' })}>
{reviewDetail.annualreviewTheme}
</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierAnnualReview.list.supplierName' })}>{reviewDetail.name}</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierAnnualReview.list.supplierName' })}>
<Button type="link" onClick={() => supplierDetailModal?.(reviewDetail.supplierId)}>{reviewDetail.name}</Button>
</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierAnnualReview.list.department' })}>
{reviewDetail.deptName || '-'}
</Descriptions.Item>

View File

@ -23,6 +23,7 @@ import {
ExamineResultColor,
} from '@/dicts/supplierAnnualReviewDict';
import styles from './supplierAnnualReview.less';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
const { Title } = Typography;
@ -36,6 +37,7 @@ interface ScoreResult {
const SupplierAnnualReviewDetail: React.FC = () => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
const [loading, setLoading] = useState<boolean>(false);
const [reviewDetail, setReviewDetail] = useState<supplierAnnualReview.ReviewRecord | null>(null);
const [scoreResults, setScoreResults] = useState<ScoreResult[]>([]);
@ -151,7 +153,7 @@ const SupplierAnnualReviewDetail: React.FC = () => {
{reviewDetail.annualreviewTheme}
</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierAnnualReview.list.supplierName' })}>
{reviewDetail.name}
<Button type="link" onClick={() => supplierDetailModal?.(reviewDetail.supplierId)}>{reviewDetail.name}</Button>
</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierAnnualReview.list.department' })}>
{reviewDetail.deptName || '-'}

View File

@ -2,6 +2,7 @@ import React from 'react';
import { Card, Table, Button, message } from 'antd';
import { useIntl, FormattedMessage } from 'umi';
import styles from '../../supplierAnnualTaskManageDetail.less';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
interface SupplierInfoProps {
taskData: supplierAnnualTaskManage.TaskDetailData;
@ -10,7 +11,7 @@ interface SupplierInfoProps {
const SupplierInfo: React.FC<SupplierInfoProps> = ({ taskData, onViewEvaluators }) => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
// 查看供应商评价人员
const handleViewSupplierEvaluators = (record: supplierAnnualTaskManage.TaskDetailData) => {
if (record.userList && record.userList.length > 0) {
@ -35,6 +36,9 @@ const SupplierInfo: React.FC<SupplierInfoProps> = ({ taskData, onViewEvaluators
title: <FormattedMessage id="supplierAnnualTaskManage.supplierInfo.supplierName" />,
dataIndex: 'supplierName',
key: 'supplierName',
render: (text: string, record: any) => (
<Button type="link" onClick={() => supplierDetailModal?.(record.supplierId)}>{text}</Button>
),
},
{
title: <FormattedMessage id="supplierAnnualTaskManage.supplierInfo.dept" />,

View File

@ -21,11 +21,13 @@ import {
} from '@ant-design/icons';
import { history, useLocation, useIntl } from 'umi';
import { getEvaluateSupplierList, getAllEvaluateRules } from '@/servers/api/supplierEvaluate';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
const { Option } = Select;
const SupplierEvaluateResultInfo: React.FC = () => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
const location = useLocation<{ record: SupplierEvaluateResult.EvaluateTaskItem }>();
const [loading, setLoading] = useState<boolean>(false);
const [form] = Form.useForm();
@ -201,9 +203,9 @@ const SupplierEvaluateResultInfo: React.FC = () => {
ellipsis: {
showTitle: false,
},
render: (supplierName: string) => (
render: (supplierName: string, record: SupplierEvaluateResult.EvaluateSupplierItem) => (
<Tooltip placement="topLeft" title={supplierName}>
{supplierName}
<Button type="link" onClick={() => supplierDetailModal?.(record.supplierId)}>{supplierName}</Button>
</Tooltip>
),
},

View File

@ -1,18 +1,11 @@
// 供应商评价结果打分情况
import React, { useState, useEffect } from 'react';
import {
Form,
Input,
Select,
Button,
Table,
Tooltip,
message,
} from 'antd';
import { Form, Input, Select, Button, Table, Tooltip, message } from 'antd';
import type { TablePaginationConfig } from 'antd';
import { SearchOutlined, DeleteOutlined, ArrowLeftOutlined } from '@ant-design/icons';
import { history, useLocation, useIntl } from 'umi';
import { getEvaluateScoreList, getAllEvaluateRules } from '@/servers/api/supplierEvaluate';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
// 自定义类型用于传递给详情页的数据
interface DetailPageState {
@ -24,6 +17,7 @@ const { Option } = Select;
const SupplierEvaluateResultScoreByList: React.FC = () => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
const location = useLocation<{
record: SupplierEvaluateResult.EvaluateSupplierItem;
}>();
@ -36,14 +30,15 @@ const SupplierEvaluateResultScoreByList: React.FC = () => {
total: 0,
showSizeChanger: true,
showQuickJumper: true,
showTotal: (total) => intl.formatMessage(
{ id: 'supplierEvaluateResult.pagination.total' },
{ total }
),
showTotal: (total) =>
intl.formatMessage({ id: 'supplierEvaluateResult.pagination.total' }, { total }),
});
const [searchParams, setSearchParams] = useState<SupplierEvaluateResult.EvaluateScoreSearchParams>({});
const [searchParams, setSearchParams] =
useState<SupplierEvaluateResult.EvaluateScoreSearchParams>({});
const [record, setRecord] = useState<SupplierEvaluateResult.EvaluateSupplierItem | null>(null);
const [evaluateRules, setEvaluateRules] = useState<SupplierEvaluateRuleManage.EvaluateRuleItem[]>([]);
const [evaluateRules, setEvaluateRules] = useState<SupplierEvaluateRuleManage.EvaluateRuleItem[]>(
[],
);
// 获取评价规则列表
const fetchEvaluateRules = async () => {
@ -52,7 +47,10 @@ const SupplierEvaluateResultScoreByList: React.FC = () => {
if (response.success && response.data) {
setEvaluateRules(response.data);
} else {
message.error(response.message || intl.formatMessage({ id: 'supplierEvaluateResult.message.fetchRulesFailed' }));
message.error(
response.message ||
intl.formatMessage({ id: 'supplierEvaluateResult.message.fetchRulesFailed' }),
);
}
} catch (error) {
console.error('获取评价规则列表失败:', error);
@ -142,7 +140,10 @@ const SupplierEvaluateResultScoreByList: React.FC = () => {
message.info(intl.formatMessage({ id: 'supplierEvaluateResult.message.noScoreData' }));
}
} else {
message.error(response.message || intl.formatMessage({ id: 'supplierEvaluateResult.message.fetchScoreFailed' }));
message.error(
response.message ||
intl.formatMessage({ id: 'supplierEvaluateResult.message.fetchScoreFailed' }),
);
}
} catch (error) {
console.error('获取评价打分情况列表失败:', error);
@ -179,7 +180,7 @@ const SupplierEvaluateResultScoreByList: React.FC = () => {
const handleViewDetail = (scoreItem: SupplierEvaluateResult.ScoreDataItem) => {
const detailState: DetailPageState = {
record: scoreItem,
parentRecord: record
parentRecord: record,
};
history.push({
pathname: 'supplierEvaluateResultByZb',
@ -207,9 +208,11 @@ const SupplierEvaluateResultScoreByList: React.FC = () => {
ellipsis: {
showTitle: false,
},
render: (supplierName: string) => (
render: (supplierName: string, rowData: SupplierEvaluateResult.ScoreDataItem) => (
<Tooltip placement="topLeft" title={supplierName}>
{supplierName}
<Button type="link" onClick={() => supplierDetailModal?.(rowData.supplierId)}>
{supplierName}
</Button>
</Tooltip>
),
},
@ -285,12 +288,25 @@ const SupplierEvaluateResultScoreByList: React.FC = () => {
<div className="common-container">
<div className="filter-action-row">
<Form form={form} layout="inline" onFinish={handleSearch} className="filter-form">
<Form.Item name="supplierName" label={intl.formatMessage({ id: 'supplierEvaluateResult.form.supplierName' })}>
<Input placeholder={intl.formatMessage({ id: 'supplierEvaluateResult.form.placeholder.supplierName' })} allowClear />
<Form.Item
name="supplierName"
label={intl.formatMessage({ id: 'supplierEvaluateResult.form.supplierName' })}
>
<Input
placeholder={intl.formatMessage({
id: 'supplierEvaluateResult.form.placeholder.supplierName',
})}
allowClear
/>
</Form.Item>
<Form.Item name="level" label={intl.formatMessage({ id: 'supplierEvaluateResult.form.levelName' })}>
<Form.Item
name="level"
label={intl.formatMessage({ id: 'supplierEvaluateResult.form.levelName' })}
>
<Select
placeholder={intl.formatMessage({ id: 'supplierEvaluateResult.form.placeholder.levelName' })}
placeholder={intl.formatMessage({
id: 'supplierEvaluateResult.form.placeholder.levelName',
})}
allowClear
style={{ width: 150 }}
>

View File

@ -21,6 +21,7 @@ import {
} from '@/servers/api/supplierEvaluate';
import { getDictList } from '@/servers/api/dicts';
import type { DictItem } from '@/servers/api/dicts';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
const { Title } = Typography;
const { TabPane } = Tabs;
@ -29,6 +30,7 @@ const { Option } = Select;
const SupplierEvaluateScore: React.FC = () => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
const [filterForm] = Form.useForm();
// 新增状态
const [activeTab, setActiveTab] = useState<string>('supplier');
@ -265,6 +267,9 @@ status状态
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.supplierName' }),
dataIndex: 'name',
key: 'name',
render: (text: string, record: any) => (
<Button type="link" onClick={() => supplierDetailModal?.(record.supplierId)}>{text}</Button>
),
},
{
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.evaluateTheme' }),

View File

@ -2,6 +2,7 @@ import React from 'react';
import { Card, Table, Button, message } from 'antd';
import styles from '../../supplierTaskManageDetail.less';
import { useIntl } from 'umi';
import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
interface SupplierInfoProps {
taskData: SupplierTaskManage.TaskDetailData;
@ -10,7 +11,7 @@ interface SupplierInfoProps {
const SupplierInfo: React.FC<SupplierInfoProps> = ({ taskData, onViewEvaluators }) => {
const intl = useIntl();
const supplierDetailModal = useSupplierDetailModal();
// 查看供应商评价人员
const handleViewSupplierEvaluators = (record: any) => {
if (!taskData || !taskData.supplierIds) {
@ -34,7 +35,9 @@ const SupplierInfo: React.FC<SupplierInfoProps> = ({ taskData, onViewEvaluators
userList: userList,
});
} else {
message.error(intl.formatMessage({ id: 'supplierTaskManage.message.noSupplierEvaluatorsFound' }));
message.error(
intl.formatMessage({ id: 'supplierTaskManage.message.noSupplierEvaluatorsFound' }),
);
}
};
@ -50,6 +53,9 @@ const SupplierInfo: React.FC<SupplierInfoProps> = ({ taskData, onViewEvaluators
title: intl.formatMessage({ id: 'supplierTaskManage.column.supplierName' }),
dataIndex: 'supplierName',
key: 'supplierName',
render: (text: string, record: any) => (
<Button type="link" onClick={() => supplierDetailModal?.(record.supplierId)}>{text}</Button>
),
},
{
title: intl.formatMessage({ id: 'supplierTaskManage.column.deptName' }),
@ -66,10 +72,7 @@ const SupplierInfo: React.FC<SupplierInfoProps> = ({ taskData, onViewEvaluators
title: intl.formatMessage({ id: 'supplierTaskManage.column.action' }),
key: 'action',
render: (record: any) => (
<Button
type="link"
onClick={() => handleViewSupplierEvaluators(record)}
>
<Button type="link" onClick={() => handleViewSupplierEvaluators(record)}>
{intl.formatMessage({ id: 'supplierTaskManage.button.viewEvaluators' })}
</Button>
),
@ -77,7 +80,11 @@ const SupplierInfo: React.FC<SupplierInfoProps> = ({ taskData, onViewEvaluators
];
if (!taskData || !taskData.blackSupplierVos || taskData.blackSupplierVos.length === 0) {
return <div className={styles.emptyData}>{intl.formatMessage({ id: 'supplierTaskManage.text.noSupplierData' })}</div>;
return (
<div className={styles.emptyData}>
{intl.formatMessage({ id: 'supplierTaskManage.text.noSupplierData' })}
</div>
);
}
return (