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

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', '2': 'red',
}; };
// 准入方式
export const AccessTypeText = {
'online': '线上准入',
'offline': '线下准入',
'scattered': '零星采购/应急采购/个人供应商',
};
// 数据统计类型 // 数据统计类型
export const StatisticsType = { export const StatisticsType = {
'EVALUATE': 'evaluate', // 评价情况统计 'EVALUATE': 'evaluate', // 评价情况统计

View File

@ -16,6 +16,9 @@ export default {
'dataStatistics.common.pleaseInput': 'Please input', 'dataStatistics.common.pleaseInput': 'Please input',
'dataStatistics.common.year': 'Year', 'dataStatistics.common.year': 'Year',
'dataStatistics.common.yearFormat': '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 // Annual Review Statistics
'dataStatistics.annual.title': 'Supplier Annual Review Statistics', 'dataStatistics.annual.title': 'Supplier Annual Review Statistics',
@ -50,4 +53,8 @@ export default {
'dataStatistics.qualification.termOfValidity': 'Qualification Expiry Date', 'dataStatistics.qualification.termOfValidity': 'Qualification Expiry Date',
'dataStatistics.qualification.validityRange': 'Expiry Date Range', 'dataStatistics.qualification.validityRange': 'Expiry Date Range',
'dataStatistics.qualification.getDataFailed': 'Failed to get qualification warning statistics data', '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.pleaseInput': '请输入',
'dataStatistics.common.year': '年度', 'dataStatistics.common.year': '年度',
'dataStatistics.common.yearFormat': '{year}年', 'dataStatistics.common.yearFormat': '{year}年',
'dataStatistics.common.accessType': '准入方式',
'dataStatistics.common.accessYear': '准入年度',
'dataStatistics.common.supplierType': '境内/境外',
// 年审统计 // 年审统计
'dataStatistics.annual.title': '供应商年审统计', 'dataStatistics.annual.title': '供应商年审统计',
@ -50,4 +53,8 @@ export default {
'dataStatistics.qualification.termOfValidity': '资质到期时间', 'dataStatistics.qualification.termOfValidity': '资质到期时间',
'dataStatistics.qualification.validityRange': '到期时间范围', 'dataStatistics.qualification.validityRange': '到期时间范围',
'dataStatistics.qualification.getDataFailed': '获取资质预警统计数据失败', '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 type { TablePaginationConfig } from 'antd';
import { SearchOutlined, DeleteOutlined, ExportOutlined } from '@ant-design/icons'; import { SearchOutlined, DeleteOutlined, ExportOutlined } from '@ant-design/icons';
import { useIntl } from 'umi'; import { useIntl } from 'umi';
import { AnnualReviewResultText, AnnualReviewResultColor } from '@/dicts/dataStatistics'; import { AccessTypeText } from '@/dicts/dataStatistics';
import { getSupplierAdmissionStatistics } from '@/servers/api/dataStatistics'; import { getSupplierAdmissionStatistics } from '@/servers/api/dataStatistics';
import { downloadFile } from '@/utils/download'; import { downloadFile } from '@/utils/download';
import moment from 'moment'; import moment from 'moment';
@ -26,8 +26,12 @@ const SupplierAnnualStatistics: React.FC = () => {
showQuickJumper: true, showQuickJumper: true,
showTotal: (total) => intl.formatMessage({ id: 'dataStatistics.common.total' }, { total }), showTotal: (total) => intl.formatMessage({ id: 'dataStatistics.common.total' }, { total }),
}); });
const [searchParams, setSearchParams] = const [searchParams, setSearchParams] = useState<
useState<DataStatistics.AnnualReviewStatisticsSearchParams>({}); | (DataStatistics.SupplierAdmissionStatistics & {
annualreviewYear: string;
})
| undefined
>();
// 准入单位下拉选项 - 假数据 // 准入单位下拉选项 - 假数据
const companyOptions = [ const companyOptions = [
@ -37,33 +41,29 @@ const SupplierAnnualStatistics: React.FC = () => {
{ label: '东莞市制造业有限公司', value: '东莞市制造业有限公司' }, { label: '东莞市制造业有限公司', value: '东莞市制造业有限公司' },
]; ];
// 年审结果选项
const annualResultOptions = Object.entries(AnnualReviewResultText).map(([key, value]) => ({
label: value,
value: key,
}));
// 获取数据 // 获取数据
const fetchStatisticsData = async ( const fetchStatisticsData = async (current = 1, pageSize = 10, params = searchParams) => {
current = 1, // 如果params没传,证明是重置
pageSize = 10, if (!params && params !== searchParams) {
params: DataStatistics.AnnualReviewStatisticsSearchParams = searchParams,
) => {
if (params !== searchParams) {
setSearchParams(params); setSearchParams(params);
} }
setLoading(true); setLoading(true);
try { try {
// 构建请求参数 // 构建请求参数
const requestParams: DataStatistics.AnnualReviewStatisticsRequest = { const requestParams = {
basePageRequest: { pageNo: current,
pageNo: current, pageSize: pageSize,
pageSize: pageSize,
},
...params, ...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); const response = await getSupplierAdmissionStatistics(requestParams);
@ -77,12 +77,12 @@ const SupplierAnnualStatistics: React.FC = () => {
}); });
} else { } else {
message.error( message.error(
response.message || intl.formatMessage({ id: 'dataStatistics.annual.getDataFailed' }), response.message || intl.formatMessage({ id: 'dataStatistics.admission.getDataFailed' }),
); );
} }
} catch (error) { } catch (error) {
console.error('获取年审统计数据失败:', error); console.error('获取准入统计数据失败:', error);
message.error(intl.formatMessage({ id: 'dataStatistics.annual.getDataFailed' })); message.error(intl.formatMessage({ id: 'dataStatistics.admission.getDataFailed' }));
} finally { } finally {
setLoading(false); setLoading(false);
} }
@ -90,7 +90,7 @@ const SupplierAnnualStatistics: React.FC = () => {
// 首次加载获取数据 // 首次加载获取数据
useEffect(() => { 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); 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 = [ const columns = [
{ {
title: intl.formatMessage({ id: 'dataStatistics.common.serialNumber' }), title: intl.formatMessage({ id: 'dataStatistics.common.serialNumber' }),
@ -131,16 +120,24 @@ const SupplierAnnualStatistics: React.FC = () => {
), ),
}, },
{ {
title: intl.formatMessage({ id: 'dataStatistics.common.area' }), title: intl.formatMessage({ id: 'dataStatistics.common.supplierType' }),
dataIndex: 'area', dataIndex: 'supplierTypeCn',
key: 'area', key: 'supplierTypeCn',
width: 100, 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' }), title: intl.formatMessage({ id: 'dataStatistics.common.category' }),
dataIndex: 'categoryName', dataIndex: 'categoryNameList',
key: 'categoryName', key: 'categoryNameList',
width: 120, width: 120,
render: (text: string[]) => text.join(','),
}, },
{ {
title: intl.formatMessage({ id: 'dataStatistics.common.accessUnit' }), title: intl.formatMessage({ id: 'dataStatistics.common.accessUnit' }),
@ -163,20 +160,13 @@ const SupplierAnnualStatistics: React.FC = () => {
width: 120, width: 120,
}, },
{ {
title: intl.formatMessage({ id: 'dataStatistics.common.year' }), title: intl.formatMessage({ id: 'dataStatistics.common.accessYear' }),
dataIndex: 'annualreviewYear', dataIndex: 'accessYear',
key: 'annualreviewYear', key: 'accessYear',
width: 100, width: 100,
render: (year: string) => render: (year: string) =>
intl.formatMessage({ id: 'dataStatistics.common.yearFormat' }, { year }), 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 handleExport = () => {
const values = form.getFieldsValue(); 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 ( return (
@ -218,7 +214,7 @@ const SupplierAnnualStatistics: React.FC = () => {
value: value ? moment(value) : undefined, value: value ? moment(value) : undefined,
})} })}
normalize={(value) => value && value.format('YYYY')} normalize={(value) => value && value.format('YYYY')}
label={intl.formatMessage({ id: 'dataStatistics.annual.annualYear' })} label={intl.formatMessage({ id: 'dataStatistics.common.accessYear' })}
> >
<DatePicker <DatePicker
style={{ width: '100%' }} style={{ width: '100%' }}
@ -250,20 +246,20 @@ const SupplierAnnualStatistics: React.FC = () => {
</Select> </Select>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="annualStatisticsResult" name="accessType"
label={intl.formatMessage({ id: 'dataStatistics.annual.annualResult' })} label={intl.formatMessage({ id: 'dataStatistics.common.accessType' })}
> >
<Select <Select
placeholder={ placeholder={
intl.formatMessage({ id: 'dataStatistics.common.pleaseSelect' }) + intl.formatMessage({ id: 'dataStatistics.common.pleaseSelect' }) +
intl.formatMessage({ id: 'dataStatistics.annual.annualResult' }) intl.formatMessage({ id: 'dataStatistics.common.accessType' })
} }
allowClear allowClear
style={{ width: 120 }} style={{ width: 200 }}
> >
{annualResultOptions.map((option) => ( {Object.entries(AccessTypeText).map(([value, label]) => (
<Option key={option.value} value={option.value}> <Option key={value} value={value}>
{option.label} {label}
</Option> </Option>
))} ))}
</Select> </Select>
@ -278,7 +274,7 @@ const SupplierAnnualStatistics: React.FC = () => {
icon={<DeleteOutlined />} icon={<DeleteOutlined />}
onClick={() => { onClick={() => {
form.resetFields(); form.resetFields();
fetchStatisticsData(1, pagination.pageSize, {}); fetchStatisticsData(1, pagination.pageSize);
}} }}
> >
{intl.formatMessage({ id: 'dataStatistics.common.reset' })} {intl.formatMessage({ id: 'dataStatistics.common.reset' })}

View File

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

View File

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

View File

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