维护国际化

This commit is contained in:
linxd
2025-07-03 10:21:55 +08:00
parent fafb2cda44
commit cf8e9d0820
61 changed files with 2246 additions and 836 deletions

View File

@ -13,7 +13,7 @@ import {
Table,
} from 'antd';
import { SearchOutlined, DeleteOutlined } from '@ant-design/icons';
import { history } from 'umi';
import { history, useIntl } from 'umi';
import styles from './supplierEvaluateScore.less';
import {
getSupplierDimension,
@ -28,6 +28,7 @@ const { RangePicker } = DatePicker;
const { Option } = Select;
const SupplierEvaluateScore: React.FC = () => {
const intl = useIntl();
const [filterForm] = Form.useForm();
// 新增状态
const [activeTab, setActiveTab] = useState<string>('supplier');
@ -104,12 +105,12 @@ status状态
total: response.data.total || 0,
});
} else {
message.error(response.message || '获取供应商列表失败');
message.error(response.message || intl.formatMessage({ id: 'supplierEvaluateScore.message.getSupplierListFailed' }));
setSupplierTableData([]);
}
} catch (error) {
console.error('获取供应商列表失败:', error);
message.error('获取供应商列表失败');
message.error(intl.formatMessage({ id: 'supplierEvaluateScore.message.getSupplierListFailed' }));
setSupplierTableData([]);
} finally {
setSupplierTableLoading(false);
@ -130,12 +131,12 @@ status状态
total: response.data.total || 0,
});
} else {
message.error(response.message || '获取任务列表失败');
message.error(response.message || intl.formatMessage({ id: 'supplierEvaluateScore.message.getTaskListFailed' }));
setTaskTableData([]);
}
} catch (error) {
console.error('获取任务列表失败:', error);
message.error('获取任务列表失败');
message.error(intl.formatMessage({ id: 'supplierEvaluateScore.message.getTaskListFailed' }));
setTaskTableData([]);
} finally {
setTaskTableLoading(false);
@ -234,7 +235,7 @@ status状态
// 导出功能
const handleExport = async (record: any) => {
if (!record?.id) {
message.error('缺少必要参数,无法导出');
message.error(intl.formatMessage({ id: 'supplierEvaluateScore.message.exportParamMissing' }));
return;
}
@ -246,14 +247,14 @@ status状态
);
} catch (error) {
console.error('导出失败:', error);
message.error('导出失败,请稍后再试');
message.error(intl.formatMessage({ id: 'supplierEvaluateScore.message.exportFailed' }));
}
};
// 供应商Tab的表格列
const supplierColumns = [
{
title: '序号',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.index' }),
dataIndex: 'index',
key: 'index',
width: 80,
@ -261,56 +262,56 @@ status状态
(pagination.current - 1) * pagination.pageSize + index + 1,
},
{
title: '供应商名称',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.supplierName' }),
dataIndex: 'name',
key: 'name',
},
{
title: '评价主题',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.evaluateTheme' }),
dataIndex: 'evaluateTheme',
key: 'evaluateTheme',
},
{
title: '发起单位',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.tenantName' }),
dataIndex: 'tenantName',
key: 'tenantName',
},
{
title: '评价开始时间',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.startTime' }),
dataIndex: 'startTime',
key: 'startTime',
},
{
title: '评价结束时间',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.endTime' }),
dataIndex: 'endTime',
key: 'endTime',
},
{
title: '评价状态',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.statusName' }),
dataIndex: 'statusName',
key: 'statusName',
},
{
title: '提交状态',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.submissionStatus' }),
dataIndex: 'submissionStatus',
key: 'submissionStatus',
},
{
title: '提交时间',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.submissionTime' }),
dataIndex: 'submissionTime',
key: 'submissionTime',
},
{
title: '操作',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.action' }),
key: 'action',
render: (text: string, record: any) => (
<Space>
<Button type="link" onClick={() => goToScoring(record, 'supplier', 'view')}>
{intl.formatMessage({ id: 'supplierEvaluateScore.button.view' })}
</Button>
{record.status === '1' && ( // 只有待评分状态才显示打分按钮
<Button type="link" onClick={() => goToScoring(record, 'supplier', 'score')}>
{intl.formatMessage({ id: 'supplierEvaluateScore.button.score' })}
</Button>
)}
</Space>
@ -321,7 +322,7 @@ status状态
// 评价任务Tab的表格列
const taskColumns = [
{
title: '序号',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.index' }),
dataIndex: 'index',
key: 'index',
width: 80,
@ -329,40 +330,40 @@ status状态
(pagination.current - 1) * pagination.pageSize + index + 1,
},
{
title: '评价主题',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.evaluateTheme' }),
dataIndex: 'evaluateTheme',
key: 'evaluateTheme',
},
{
title: '发起单位',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.deptName' }),
dataIndex: 'deptName',
key: 'deptName',
},
{
title: '评价开始时间',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.startTime' }),
dataIndex: 'startTime',
key: 'startTime',
},
{
title: '评价结束时间',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.endTime' }),
dataIndex: 'endTime',
key: 'endTime',
},
{
title: '评价状态',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.statusName' }),
dataIndex: 'statusName',
key: 'statusName',
},
{
title: '操作',
title: intl.formatMessage({ id: 'supplierEvaluateScore.column.action' }),
key: 'action',
render: (text: string, record: any) => (
<Space>
<Button type="link" onClick={() => goToScoring(record, 'task', 'view')}>
{intl.formatMessage({ id: 'supplierEvaluateScore.button.view' })}
</Button>
<Button type="link" onClick={() => handleExport(record)}>
{intl.formatMessage({ id: 'supplierEvaluateScore.button.export' })}
</Button>
</Space>
),
@ -374,21 +375,23 @@ status状态
<div className="filter-action-row">
<div className="filter-form">
<Form form={filterForm} layout="inline">
<Form.Item name="name" label="关键字">
<Form.Item name="name" label={intl.formatMessage({ id: 'supplierEvaluateScore.form.keyword' })}>
<Input
placeholder={
activeTab === 'supplier' ? '请输入供应商名称' : '请输入评价主题'
activeTab === 'supplier'
? intl.formatMessage({ id: 'supplierEvaluateScore.form.placeholder.supplierName' })
: intl.formatMessage({ id: 'supplierEvaluateScore.form.placeholder.evaluateTheme' })
}
allowClear
/>
</Form.Item>
<Form.Item name="evaluationTime" label="评价时间">
<Form.Item name="evaluationTime" label={intl.formatMessage({ id: 'supplierEvaluateScore.form.evaluationTime' })}>
<RangePicker />
</Form.Item>
<Form.Item name="status" label="评价状态">
<Select placeholder="请选择" style={{ width: 150 }} allowClear>
<Form.Item name="status" label={intl.formatMessage({ id: 'supplierEvaluateScore.form.status' })}>
<Select placeholder={intl.formatMessage({ id: 'supplierEvaluateScore.form.placeholder.select' })} style={{ width: 150 }} allowClear>
{evaluateStatus.map((item) => (
<Option key={item.code} value={item.code}>
{item.dicName}
@ -400,10 +403,10 @@ status状态
<Form.Item className="filter-btns">
<Space>
<Button type="primary" onClick={handleSearch}>
<SearchOutlined />
<SearchOutlined /> {intl.formatMessage({ id: 'supplierEvaluateScore.button.search' })}
</Button>
<Button onClick={handleReset} type="primary" danger>
<DeleteOutlined />
<DeleteOutlined /> {intl.formatMessage({ id: 'supplierEvaluateScore.button.reset' })}
</Button>
</Space>
</Form.Item>
@ -417,7 +420,7 @@ status状态
<div className={styles.headerRow}>
<div className={styles.titleSection}>
<Title level={4} className={styles.pageTitle}>
{intl.formatMessage({ id: 'supplierEvaluateScore.title' })}
</Title>
</div>
</div>
@ -427,7 +430,7 @@ status状态
<div className="content-area">
<Tabs activeKey={activeTab} onChange={handleTabChange}>
<TabPane tab="按供应商" key="supplier">
<TabPane tab={intl.formatMessage({ id: 'supplierEvaluateScore.tab.supplier' })} key="supplier">
<Table
columns={supplierColumns}
dataSource={supplierTableData}
@ -439,12 +442,15 @@ status状态
total: pagination.total,
showSizeChanger: true,
showQuickJumper: true,
showTotal: (total) => `${total}`,
showTotal: (total) => intl.formatMessage(
{ id: 'supplierEvaluateScore.pagination.total' },
{ total }
),
}}
onChange={handleTableChange}
/>
</TabPane>
<TabPane tab="按评价任务" key="task">
<TabPane tab={intl.formatMessage({ id: 'supplierEvaluateScore.tab.task' })} key="task">
<Table
columns={taskColumns}
dataSource={taskTableData}
@ -456,7 +462,10 @@ status状态
total: pagination.total,
showSizeChanger: true,
showQuickJumper: true,
showTotal: (total) => `${total}`,
showTotal: (total) => intl.formatMessage(
{ id: 'supplierEvaluateScore.pagination.total' },
{ total }
),
}}
onChange={handleTableChange}
/>

View File

@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { history, useLocation } from 'umi';
import { history, useLocation, useIntl } from 'umi';
import {
Button,
Card,
@ -21,6 +21,7 @@ const { Title } = Typography;
const { confirm } = Modal;
const SupplierEvaluateScoreDetail: React.FC = () => {
const intl = useIntl();
const location = useLocation<{
record: SupplierEvaluateScore.SupplierDimensionData;
mode?: 'view' | 'score'; // 查看模式或打分模式
@ -52,7 +53,7 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
setMode(location.state.record.status === '1' ? 'score' : 'view');
}
} else {
message.error('缺少必要参数,无法获取详情');
message.error(intl.formatMessage({ id: 'supplierEvaluateScore.message.missingParams' }));
history.goBack();
}
}, [location]);
@ -92,7 +93,7 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
// 获取评价打分详情
const fetchScoreDetail = async () => {
if (!record?.id) {
message.error('缺少必要参数,无法获取数据');
message.error(intl.formatMessage({ id: 'supplierEvaluateScore.message.submitParamMissing' }));
return;
}
@ -107,11 +108,11 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
const formattedData = formatDataForScoreTable(response.data);
setScoreData(formattedData);
} else {
message.error(response.message || '获取评价得分明细失败');
message.error(response.message || intl.formatMessage({ id: 'supplierEvaluateScore.message.getDetailFailed' }));
}
} catch (error) {
console.error('获取评价得分明细失败:', error);
message.error('获取评价得分明细失败');
message.error(intl.formatMessage({ id: 'supplierEvaluateScore.message.getDetailFailed' }));
} finally {
setLoading(false);
}
@ -137,7 +138,7 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
// 提交评分
const handleSubmit = async () => {
if (!record?.id) {
message.error('缺少必要参数,无法提交');
message.error(intl.formatMessage({ id: 'supplierEvaluateScore.message.submitParamMissing' }));
return;
}
@ -147,17 +148,17 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
);
if (hasEmptyScore) {
message.warning('请为所有指标填写评分');
message.warning(intl.formatMessage({ id: 'supplierEvaluateScore.message.emptyScore' }));
return;
}
// 显示确认对话框
confirm({
title: '提交确认',
title: intl.formatMessage({ id: 'supplierEvaluateScore.confirm.title' }),
icon: <ExclamationCircleOutlined />,
content: '评分提交后将不可修改,确定要提交吗?',
okText: '确定',
cancelText: '取消',
content: intl.formatMessage({ id: 'supplierEvaluateScore.confirm.content' }),
okText: intl.formatMessage({ id: 'supplierEvaluateScore.confirm.ok' }),
cancelText: intl.formatMessage({ id: 'supplierEvaluateScore.confirm.cancel' }),
onOk: async () => {
setSubmitting(true);
try {
@ -175,14 +176,14 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
const response = await saveEvaluateScore(submitData);
if (response.success) {
message.success('评分保存成功');
message.success(intl.formatMessage({ id: 'supplierEvaluateScore.message.saveSuccess' }));
history.goBack();
} else {
message.error(response.message || '评分保存失败');
message.error(response.message || intl.formatMessage({ id: 'supplierEvaluateScore.message.saveFailed' }));
}
} catch (error) {
console.error('评分提交失败:', error);
message.error('评分提交失败');
message.error(intl.formatMessage({ id: 'supplierEvaluateScore.message.submitFailed' }));
} finally {
setSubmitting(false);
}
@ -193,12 +194,12 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
// 获取评价状态文本
const getStatusText = (status: string) => {
const statusMap: { [key: string]: string } = {
'1': '待评分',
'2': '已评分',
'3': '进行中',
'4': '已完成',
'1': intl.formatMessage({ id: 'supplierEvaluateScore.status.pending' }),
'2': intl.formatMessage({ id: 'supplierEvaluateScore.status.scored' }),
'3': intl.formatMessage({ id: 'supplierEvaluateScore.status.inProgress' }),
'4': intl.formatMessage({ id: 'supplierEvaluateScore.status.completed' }),
};
return statusMap[status] || '未知状态';
return statusMap[status] || intl.formatMessage({ id: 'supplierEvaluateScore.status.unknown' });
};
// 获取供应商名称
@ -228,12 +229,15 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
<div className={styles.headerRow}>
<div className={styles.titleSection}>
<Title level={4} className={styles.pageTitle}>
{getSupplierName()} -
{intl.formatMessage(
{ id: 'supplierEvaluateScore.detail.title' },
{ name: getSupplierName() }
)}
</Title>
</div>
<div className={styles.actionSection}>
<Button type="link" icon={<ArrowLeftOutlined />} onClick={handleBack}>
{intl.formatMessage({ id: 'supplierEvaluateScore.button.back' })}
</Button>
</div>
</div>
@ -242,27 +246,37 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
{scoreDetail ? (
<div className="content-area">
<Title level={5} className={styles.pageTitle} style={{textAlign: 'center'}}>
{intl.formatMessage({ id: 'supplierEvaluateScore.detail.notice' })}
</Title>
<Card title="基本信息" bordered={false}>
<Card title={intl.formatMessage({ id: 'supplierEvaluateScore.detail.basicInfo' })} bordered={false}>
<Descriptions column={2} bordered>
<Descriptions.Item label="供应商名称">{getSupplierName()}</Descriptions.Item>
<Descriptions.Item label="品类">{scoreDetail.category || '-'}</Descriptions.Item>
<Descriptions.Item label="评价主题">{getEvaluateTheme()}</Descriptions.Item>
<Descriptions.Item label="评价状态">
<Descriptions.Item label={intl.formatMessage({ id: 'supplierEvaluateScore.description.supplierName' })}>
{getSupplierName()}
</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierEvaluateScore.description.category' })}>
{scoreDetail.category || '-'}
</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierEvaluateScore.description.evaluateTheme' })}>
{getEvaluateTheme()}
</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierEvaluateScore.description.status' })}>
{getStatusText(record?.status || '') || '-'}
</Descriptions.Item>
<Descriptions.Item label="评价开始时间">
<Descriptions.Item label={intl.formatMessage({ id: 'supplierEvaluateScore.description.startTime' })}>
{record?.startTime || '-'}
</Descriptions.Item>
<Descriptions.Item label="评价结束时间">{record?.endTime || '-'}</Descriptions.Item>
<Descriptions.Item label="发起单位">{getUnitName()}</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierEvaluateScore.description.endTime' })}>
{record?.endTime || '-'}
</Descriptions.Item>
<Descriptions.Item label={intl.formatMessage({ id: 'supplierEvaluateScore.description.unit' })}>
{getUnitName()}
</Descriptions.Item>
</Descriptions>
</Card>
<Divider />
<Card title="评价打分" bordered={false}>
<Card title={intl.formatMessage({ id: 'supplierEvaluateScore.detail.scoreInfo' })} bordered={false}>
{scoreData.length > 0 ? (
<ScoreEvaluationTable
value={scoreData}
@ -270,7 +284,7 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
isDetail={!canEdit} // 如果不可编辑,则以只读方式显示
/>
) : (
<Empty description="暂无评分数据" />
<Empty description={intl.formatMessage({ id: 'supplierEvaluateScore.detail.emptyData' })} />
)}
{/* 只在打分模式下显示提交按钮,并移至底部 */}
@ -283,14 +297,14 @@ const SupplierEvaluateScoreDetail: React.FC = () => {
loading={submitting}
style={{ marginTop: 24 }}
>
{intl.formatMessage({ id: 'supplierEvaluateScore.button.submit' })}
</Button>
</div>
)}
</Card>
</div>
) : (
!loading && <Empty description="暂无评分数据" />
!loading && <Empty description={intl.formatMessage({ id: 'supplierEvaluateScore.detail.emptyData' })} />
)}
</Spin>
</div>