数据统计 - 供应商准入情况统计模块

This commit is contained in:
linxd
2025-07-10 11:00:14 +08:00
parent 6e1276fcc9
commit 42eca55bc1
7 changed files with 91 additions and 71 deletions

View File

@ -34,6 +34,13 @@ export const AnnualReviewResultColor = {
'2': 'red',
};
// 准入方式
export const AccessTypeText = {
'online': '线上准入',
'offline': '线下准入',
'scattered': '零星采购/应急采购/个人供应商',
};
// 数据统计类型
export const StatisticsType = {
'EVALUATE': 'evaluate', // 评价情况统计

View File

@ -16,6 +16,9 @@ export default {
'dataStatistics.common.pleaseInput': 'Please input',
'dataStatistics.common.year': 'Year',
'dataStatistics.common.yearFormat': 'Year {year}',
'dataStatistics.common.accessType': 'Access Type',
'dataStatistics.common.accessYear': 'Access Year',
'dataStatistics.common.supplierType': 'Domestic/Foreign',
// Annual Review Statistics
'dataStatistics.annual.title': 'Supplier Annual Review Statistics',
@ -50,4 +53,8 @@ export default {
'dataStatistics.qualification.termOfValidity': 'Qualification Expiry Date',
'dataStatistics.qualification.validityRange': 'Expiry Date Range',
'dataStatistics.qualification.getDataFailed': 'Failed to get qualification warning statistics data',
// Admission Statistics
'dataStatistics.admission.title': 'Supplier Admission Statistics',
'dataStatistics.admission.getDataFailed': 'Failed to get admission statistics data',
};

View File

@ -16,6 +16,9 @@ export default {
'dataStatistics.common.pleaseInput': '请输入',
'dataStatistics.common.year': '年度',
'dataStatistics.common.yearFormat': '{year}年',
'dataStatistics.common.accessType': '准入方式',
'dataStatistics.common.accessYear': '准入年度',
'dataStatistics.common.supplierType': '境内/境外',
// 年审统计
'dataStatistics.annual.title': '供应商年审统计',
@ -50,4 +53,8 @@ export default {
'dataStatistics.qualification.termOfValidity': '资质到期时间',
'dataStatistics.qualification.validityRange': '到期时间范围',
'dataStatistics.qualification.getDataFailed': '获取资质预警统计数据失败',
// 准入统计
'dataStatistics.admission.title': '供应商准入统计',
'dataStatistics.admission.getDataFailed': '获取准入统计数据失败',
};

View File

@ -3,7 +3,7 @@ import { Button, Table, Input, Select, Form, Tooltip, Tag, message, DatePicker }
import type { TablePaginationConfig } from 'antd';
import { SearchOutlined, DeleteOutlined, ExportOutlined } from '@ant-design/icons';
import { useIntl } from 'umi';
import { AnnualReviewResultText, AnnualReviewResultColor } from '@/dicts/dataStatistics';
import { AccessTypeText } from '@/dicts/dataStatistics';
import { getSupplierAdmissionStatistics } from '@/servers/api/dataStatistics';
import { downloadFile } from '@/utils/download';
import moment from 'moment';
@ -26,8 +26,12 @@ const SupplierAnnualStatistics: React.FC = () => {
showQuickJumper: true,
showTotal: (total) => intl.formatMessage({ id: 'dataStatistics.common.total' }, { total }),
});
const [searchParams, setSearchParams] =
useState<DataStatistics.AnnualReviewStatisticsSearchParams>({});
const [searchParams, setSearchParams] = useState<
| (DataStatistics.SupplierAdmissionStatistics & {
annualreviewYear: string;
})
| undefined
>();
// 准入单位下拉选项 - 假数据
const companyOptions = [
@ -37,33 +41,29 @@ const SupplierAnnualStatistics: React.FC = () => {
{ label: '东莞市制造业有限公司', value: '东莞市制造业有限公司' },
];
// 年审结果选项
const annualResultOptions = Object.entries(AnnualReviewResultText).map(([key, value]) => ({
label: value,
value: key,
}));
// 获取数据
const fetchStatisticsData = async (
current = 1,
pageSize = 10,
params: DataStatistics.AnnualReviewStatisticsSearchParams = searchParams,
) => {
if (params !== searchParams) {
const fetchStatisticsData = async (current = 1, pageSize = 10, params = searchParams) => {
// 如果params没传,证明是重置
if (!params && params !== searchParams) {
setSearchParams(params);
}
setLoading(true);
try {
// 构建请求参数
const requestParams: DataStatistics.AnnualReviewStatisticsRequest = {
basePageRequest: {
const requestParams = {
pageNo: current,
pageSize: pageSize,
},
...params,
startTime: params?.annualreviewYear
? moment(params.annualreviewYear).format('YYYY-MM-DD')
: undefined,
// 结束时间为开始时间 + 1年
endTime: params?.annualreviewYear
? moment(params.annualreviewYear).add(1, 'year').format('YYYY-MM-DD')
: undefined,
};
delete requestParams.annualreviewYear;
// 调用接口
const response = await getSupplierAdmissionStatistics(requestParams);
@ -77,12 +77,12 @@ const SupplierAnnualStatistics: React.FC = () => {
});
} else {
message.error(
response.message || intl.formatMessage({ id: 'dataStatistics.annual.getDataFailed' }),
response.message || intl.formatMessage({ id: 'dataStatistics.admission.getDataFailed' }),
);
}
} catch (error) {
console.error('获取年审统计数据失败:', error);
message.error(intl.formatMessage({ id: 'dataStatistics.annual.getDataFailed' }));
console.error('获取准入统计数据失败:', error);
message.error(intl.formatMessage({ id: 'dataStatistics.admission.getDataFailed' }));
} finally {
setLoading(false);
}
@ -90,7 +90,7 @@ const SupplierAnnualStatistics: React.FC = () => {
// 首次加载获取数据
useEffect(() => {
fetchStatisticsData(pagination.current, pagination.pageSize, {});
fetchStatisticsData(pagination.current, pagination.pageSize);
}, []);
// 处理表格分页变化
@ -98,17 +98,6 @@ const SupplierAnnualStatistics: React.FC = () => {
fetchStatisticsData(newPagination.current, newPagination.pageSize, searchParams);
};
// 获取年审结果标签
const getResultTag = (result: string) => {
const color =
AnnualReviewResultColor[result as keyof typeof AnnualReviewResultColor] || 'default';
const text =
result === '1'
? intl.formatMessage({ id: 'dataStatistics.annual.qualified' })
: intl.formatMessage({ id: 'dataStatistics.annual.unqualified' });
return <Tag color={color}>{text}</Tag>;
};
const columns = [
{
title: intl.formatMessage({ id: 'dataStatistics.common.serialNumber' }),
@ -131,16 +120,24 @@ const SupplierAnnualStatistics: React.FC = () => {
),
},
{
title: intl.formatMessage({ id: 'dataStatistics.common.area' }),
dataIndex: 'area',
key: 'area',
title: intl.formatMessage({ id: 'dataStatistics.common.supplierType' }),
dataIndex: 'supplierTypeCn',
key: 'supplierTypeCn',
width: 100,
},
{
title: intl.formatMessage({ id: 'dataStatistics.common.accessType' }),
dataIndex: 'accessType',
key: 'accessType',
width: 180,
render: (type: string) => AccessTypeText[type as keyof typeof AccessTypeText] || type,
},
{
title: intl.formatMessage({ id: 'dataStatistics.common.category' }),
dataIndex: 'categoryName',
key: 'categoryName',
dataIndex: 'categoryNameList',
key: 'categoryNameList',
width: 120,
render: (text: string[]) => text.join(','),
},
{
title: intl.formatMessage({ id: 'dataStatistics.common.accessUnit' }),
@ -163,20 +160,13 @@ const SupplierAnnualStatistics: React.FC = () => {
width: 120,
},
{
title: intl.formatMessage({ id: 'dataStatistics.common.year' }),
dataIndex: 'annualreviewYear',
key: 'annualreviewYear',
title: intl.formatMessage({ id: 'dataStatistics.common.accessYear' }),
dataIndex: 'accessYear',
key: 'accessYear',
width: 100,
render: (year: string) =>
intl.formatMessage({ id: 'dataStatistics.common.yearFormat' }, { year }),
},
{
title: intl.formatMessage({ id: 'dataStatistics.annual.annualStatisticsResult' }),
dataIndex: 'annualStatisticsResult',
key: 'annualStatisticsResult',
width: 100,
render: (result: string) => getResultTag(result),
},
];
// 处理搜索
@ -187,7 +177,13 @@ const SupplierAnnualStatistics: React.FC = () => {
// 导出功能
const handleExport = () => {
const values = form.getFieldsValue();
downloadFile('/dataStatistics/exportSupplierAnnualReviewStatistics', 'GET', values);
const params = {
...values,
startTime: values.annualreviewYear ? moment(values.annualreviewYear).format('YYYY-MM-DD') : undefined,
endTime: values.annualreviewYear ? moment(values.annualreviewYear).add(1, 'year').format('YYYY-MM-DD') : undefined,
};
delete params.annualreviewYear;
downloadFile('/coscoAccessSupplier/getPageExport', 'GET', params);
};
return (
@ -218,7 +214,7 @@ const SupplierAnnualStatistics: React.FC = () => {
value: value ? moment(value) : undefined,
})}
normalize={(value) => value && value.format('YYYY')}
label={intl.formatMessage({ id: 'dataStatistics.annual.annualYear' })}
label={intl.formatMessage({ id: 'dataStatistics.common.accessYear' })}
>
<DatePicker
style={{ width: '100%' }}
@ -250,20 +246,20 @@ const SupplierAnnualStatistics: React.FC = () => {
</Select>
</Form.Item>
<Form.Item
name="annualStatisticsResult"
label={intl.formatMessage({ id: 'dataStatistics.annual.annualResult' })}
name="accessType"
label={intl.formatMessage({ id: 'dataStatistics.common.accessType' })}
>
<Select
placeholder={
intl.formatMessage({ id: 'dataStatistics.common.pleaseSelect' }) +
intl.formatMessage({ id: 'dataStatistics.annual.annualResult' })
intl.formatMessage({ id: 'dataStatistics.common.accessType' })
}
allowClear
style={{ width: 120 }}
style={{ width: 200 }}
>
{annualResultOptions.map((option) => (
<Option key={option.value} value={option.value}>
{option.label}
{Object.entries(AccessTypeText).map(([value, label]) => (
<Option key={value} value={value}>
{label}
</Option>
))}
</Select>
@ -278,7 +274,7 @@ const SupplierAnnualStatistics: React.FC = () => {
icon={<DeleteOutlined />}
onClick={() => {
form.resetFields();
fetchStatisticsData(1, pagination.pageSize, {});
fetchStatisticsData(1, pagination.pageSize);
}}
>
{intl.formatMessage({ id: 'dataStatistics.common.reset' })}

View File

@ -5,7 +5,7 @@ import { getAllEvaluateRules } from './supplierEvaluate';
// 评价情况统计列表查询
export async function getSupplierAdmissionStatistics(params: DataStatistics.SupplierAdmissionStatistics) {
return request('/api/coscoAccessSupplier/getPage', {
return request('/coscoAccessSupplier/getPage', {
method: 'POST',
data: params,
});
@ -13,7 +13,7 @@ export async function getSupplierAdmissionStatistics(params: DataStatistics.Supp
// 评价情况统计列表查询
export async function getEvaluateStatisticsList(params: DataStatistics.EvaluateStatisticsRequest) {
return request('/api/dataStatistics/evaluateStatistics/list', {
return request('/dataStatistics/evaluateStatistics/list', {
method: 'POST',
data: params,
});
@ -21,7 +21,7 @@ export async function getEvaluateStatisticsList(params: DataStatistics.EvaluateS
// 评价情况统计数据导出
export async function exportEvaluateStatistics(params: DataStatistics.EvaluateStatisticsSearchParams) {
return request('/api/dataStatistics/evaluateStatistics/export', {
return request('/dataStatistics/evaluateStatistics/export', {
method: 'POST',
data: params,
responseType: 'blob',
@ -30,7 +30,7 @@ export async function exportEvaluateStatistics(params: DataStatistics.EvaluateSt
// 年度考核统计列表查询
export async function getAnnualStatisticsList(params: any) {
return request('/api/dataStatistics/annualStatistics/list', {
return request('/dataStatistics/annualStatistics/list', {
method: 'POST',
data: params,
});
@ -38,7 +38,7 @@ export async function getAnnualStatisticsList(params: any) {
// 年度考核统计数据导出
export async function exportAnnualStatistics(params: any) {
return request('/api/dataStatistics/annualStatistics/export', {
return request('/dataStatistics/annualStatistics/export', {
method: 'POST',
data: params,
responseType: 'blob',
@ -47,7 +47,7 @@ export async function exportAnnualStatistics(params: any) {
// 供应商退出统计列表查询
export async function getExitStatisticsList(params: any) {
return request('/api/dataStatistics/exitStatistics/list', {
return request('/dataStatistics/exitStatistics/list', {
method: 'POST',
data: params,
});
@ -55,7 +55,7 @@ export async function getExitStatisticsList(params: any) {
// 供应商退出统计数据导出
export async function exportExitStatistics(params: any) {
return request('/api/dataStatistics/exitStatistics/export', {
return request('/dataStatistics/exitStatistics/export', {
method: 'POST',
data: params,
responseType: 'blob',
@ -64,7 +64,7 @@ export async function exportExitStatistics(params: any) {
// 资质预警统计列表查询
export async function getQualificationWarningStatisticsList(params: any) {
return request('/api/dataStatistics/qualificationWarningStatistics/list', {
return request('/dataStatistics/qualificationWarningStatistics/list', {
method: 'POST',
data: params,
});
@ -72,7 +72,7 @@ export async function getQualificationWarningStatisticsList(params: any) {
// 资质预警统计数据导出
export async function exportQualificationWarningStatistics(params: any) {
return request('/api/dataStatistics/qualificationWarningStatistics/export', {
return request('/dataStatistics/qualificationWarningStatistics/export', {
method: 'POST',
data: params,
responseType: 'blob',

View File

@ -26,6 +26,10 @@ declare namespace DataStatistics {
export interface SupplierAdmissionStatistics {
pageNo: number;
pageSize: number;
supplierName?: string;
startTime?: string;
endTime?: string;
accessType?: string;
// supplierName: string;
// accessType: string;
// updateYear: number;

View File

@ -17,7 +17,6 @@ export async function downloadFile(
}
});
}
const fetchUrl =
method === 'GET' && params
? `${REQUEST_BASE}${url}?${new URLSearchParams(cleanedParams as any).toString()}`