diff --git a/src/app.ts b/src/app.ts index cdfe58c..305fc41 100644 --- a/src/app.ts +++ b/src/app.ts @@ -2,9 +2,9 @@ import { history } from 'umi'; export function onRouteChange({ location }: any) { const token = sessionStorage.getItem('token'); - const whiteList = ['/login', '/user/register', '/403', '/404']; + const whiteList = ['/login', '/register/supplier', '/register/expert', '/403', '/404']; if (!token && !whiteList.includes(location.pathname)) { history.replace('/login'); } - + } diff --git a/src/components/FileUpload/FileUpload.tsx b/src/components/FileUpload/FileUpload.tsx index 3f29c1a..2cf13ec 100644 --- a/src/components/FileUpload/FileUpload.tsx +++ b/src/components/FileUpload/FileUpload.tsx @@ -203,7 +203,7 @@ const FileUpload: React.FC = ({ } return ( - ); diff --git a/src/components/SupplierDetailModalContext/SupplierDetail.tsx b/src/components/SupplierDetailModalContext/SupplierDetail.tsx index 922f788..63afb66 100644 --- a/src/components/SupplierDetailModalContext/SupplierDetail.tsx +++ b/src/components/SupplierDetailModalContext/SupplierDetail.tsx @@ -1,12 +1,99 @@ import React, { useState, useEffect } from 'react'; +import { Button, Space, Descriptions } from 'antd'; +import SupplierRegisterInfo from '@/components/GlobalModal/components/SupplierRegisterInfo'; +import AccessCategoryTable from '@/components/GlobalModal/components/AccessCategoryTable'; +import TianyanchaInfo from '@/components/GlobalModal/components/TianyanchaInfo'; +import RiskList from '@/components/GlobalModal/components/RiskList'; +import { coscoSupplierBase } from '@/components/GlobalModal/services'; +import { useIntl } from 'umi'; -const SupplierDetail = ({ supplierId }: { supplierId: string | null }) => { - const [supplierDetail, setSupplierDetail] = useState(null); +interface SupplierDetailProps { + supplierId: string | null; +} + +const SupplierDetail: React.FC = ({ supplierId }) => { + const intl = useIntl(); + const [modalType, setModalType] = useState<'register' | 'category' | 'tianyancha' | 'risk'>('register'); + const [registerInfo, setRegisterInfo] = useState(null); + + // 获取供应商信息 + const fetchRegisterInfo = () => { + if (!supplierId) return; + coscoSupplierBase(supplierId).then((res) => { + const { code, data } = res; + if (code === 200) { + setRegisterInfo(data); + } + }); + }; + + // 切换 Tab + const handleSwitch = (type: typeof modalType) => { + setModalType(type); + }; + + // 渲染内容 + const renderContent = () => { + if (modalType === 'register' && registerInfo?.coscoSupplierBase) { + return ; + } + if (modalType === 'category') { + return supplierId ? : null; + } + if (modalType === 'tianyancha') { + return supplierId ? : null; + } + if (modalType === 'risk') { + return supplierId ? : null; + } + return null; + }; useEffect(() => { - console.log(supplierId); + if (supplierId) { + setModalType('register'); + fetchRegisterInfo(); + } else { + setRegisterInfo(null); + } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [supplierId]); - return
SupplierDetail
; + + if (!supplierId) return null; + + return ( + (registerInfo?.coscoSupplierBase?.supplierType !== 'pe' && registerInfo) ? ( +
+ + + + + + +
+ {renderContent()} +
+
+ ) : ( + + + {registerInfo?.coscoSupplierBase?.personName} + + + {registerInfo?.coscoSupplierBase?.idCard} + + + {registerInfo?.coscoSupplierBase?.personPhone} + + + {registerInfo?.coscoSupplierBase?.personBank} + + + {registerInfo?.coscoSupplierBase?.personAccount} + + + ) + ); }; export default SupplierDetail; diff --git a/src/components/SupplierDetailModalContext/SupplierDetailModalContext.tsx b/src/components/SupplierDetailModalContext/SupplierDetailModalContext.tsx index 1b902fe..25b2320 100644 --- a/src/components/SupplierDetailModalContext/SupplierDetailModalContext.tsx +++ b/src/components/SupplierDetailModalContext/SupplierDetailModalContext.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { Modal } from 'antd'; +import { Modal, message } from 'antd'; import SupplierDetail from './SupplierDetail'; const SupplierDetailModalContext = React.createContext<((id: string) => void) | null>(null); @@ -10,6 +10,7 @@ export const SupplierDetailModalProvider = ({ children }: { children: React.Reac const [supplierId, setSupplierId] = useState(null); const showSupplierDetail = (id: string) => { + if (!id) return message.error('此供应商信息缺失,请联系管理员'); setSupplierId(id); setVisible(true); }; @@ -17,7 +18,7 @@ export const SupplierDetailModalProvider = ({ children }: { children: React.Reac return ( {children} - setVisible(false)} footer={null}> + setVisible(false)} footer={null} width="90%"> diff --git a/src/components/SupplierDetailModalContext/readme.md b/src/components/SupplierDetailModalContext/readme.md index eff0276..8bf2310 100644 --- a/src/components/SupplierDetailModalContext/readme.md +++ b/src/components/SupplierDetailModalContext/readme.md @@ -1,3 +1,10 @@ -// 任何页面/组件 -const showSupplierDetail = useSupplierDetailModal(); - showSupplierDetail(supplier.id)}>{supplier.name} +// 任何组件中 +import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext'; + +const MyComponent = () => { + const showSupplierDetail = useSupplierDetailModal(); + + return ( + showSupplierDetail('123')}>查看供应商 + ); +}; diff --git a/src/components/SupplierSelector/SupplierSelector.tsx b/src/components/SupplierSelector/SupplierSelector.tsx index 3a79966..33485eb 100644 --- a/src/components/SupplierSelector/SupplierSelector.tsx +++ b/src/components/SupplierSelector/SupplierSelector.tsx @@ -5,6 +5,7 @@ import { getSupplierPage } from '@/servers/api/supplier'; import CategorySelector from '@/components/CategorySelector/CategorySelector'; import './SupplierSelector.less'; import { useIntl } from 'umi'; +import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext'; const { Option } = Select; @@ -83,9 +84,10 @@ const SupplierSelector: React.FC = ({ // 查询参数 const [queryParams, setQueryParams] = useState({ pageNo: 1, - pageSize: 10 + pageSize: 10, }); + const supplierDetailModal = useSupplierDetailModal(); /** * 监听初始已选供应商变化,更新内部状态 */ @@ -129,7 +131,9 @@ const SupplierSelector: React.FC = ({ */ const moveToLeft = () => { // 过滤掉右侧选中的供应商 - const remaining = chosenSuppliers.filter((item: SupplierItem) => !rightSelected.includes(item.id)); + const remaining = chosenSuppliers.filter( + (item: SupplierItem) => !rightSelected.includes(item.id), + ); // 更新已选列表 setChosenSuppliers(remaining); // 清空右侧选择状态 @@ -151,18 +155,23 @@ const SupplierSelector: React.FC = ({ if (response && response.code === 200) { // 请求成功,更新数据和分页信息 - setTableListData(response.data.records.map((item: any) => ({ - ...item, - supplierName: item.name, - }))); + setTableListData( + response.data.records.map((item: any) => ({ + ...item, + supplierName: item.name, + })), + ); setPagination({ current: queryParams.pageNo, pageSize: queryParams.pageSize, - total: response.data.total || 0 + total: response.data.total || 0, }); } else { // 请求失败,显示错误信息 - message.error(response?.message || intl.formatMessage({ id: 'supplierTaskManage.message.fetchSupplierListFailed' })); + message.error( + response?.message || + intl.formatMessage({ id: 'supplierTaskManage.message.fetchSupplierListFailed' }), + ); setTableListData([]); setPagination({ current: 1, pageSize: 10, total: 0 }); } @@ -189,10 +198,10 @@ const SupplierSelector: React.FC = ({ */ useEffect(() => { const values = form.getFieldsValue(); - setQueryParams(prev => ({ + setQueryParams((prev) => ({ ...prev, ...values, - pageNo: 1 + pageNo: 1, })); }, []); // 空依赖数组,只在组件挂载时执行一次 @@ -201,10 +210,10 @@ const SupplierSelector: React.FC = ({ * @param {any} values - 表单值 */ const handleSearch = (values: any) => { - setQueryParams(prev => ({ + setQueryParams((prev) => ({ ...prev, ...values, - pageNo: 1 + pageNo: 1, })); }; @@ -214,10 +223,10 @@ const SupplierSelector: React.FC = ({ const handleReset = () => { form.resetFields(); const values = form.getFieldsValue(); - setQueryParams(prev => ({ + setQueryParams((prev) => ({ ...prev, ...values, - pageNo: 1 + pageNo: 1, })); }; @@ -226,18 +235,13 @@ const SupplierSelector: React.FC = ({ * @param {any} paginationInfo - 分页信息 */ const handleTableChange = (paginationInfo: any) => { - setQueryParams(prev => ({ + setQueryParams((prev) => ({ ...prev, pageNo: paginationInfo.current, - pageSize: paginationInfo.pageSize + pageSize: paginationInfo.pageSize, })); }; - // 显示供应商详情 - const showSupplierDetail = (record: SupplierItem) => { - console.log(record); - }; - // 表格列定义 const columns = [ { @@ -247,7 +251,7 @@ const SupplierSelector: React.FC = ({ ellipsis: true, render: (supplierName: string, record: SupplierItem) => ( - showSupplierDetail(record)}>{supplierName} + ), }, @@ -273,34 +277,61 @@ const SupplierSelector: React.FC = ({ ), }, - ]; return (
{/* 查询表单 */}
- - + + - - + + + - + - + - + @@ -310,13 +341,18 @@ const SupplierSelector: React.FC = ({
{intl.formatMessage({ id: 'supplierTaskManage.text.availableSuppliers' })} - {intl.formatMessage({ id: 'supplierTaskManage.text.itemCount' }, { count: pagination.total })} + + {intl.formatMessage( + { id: 'supplierTaskManage.text.itemCount' }, + { count: pagination.total }, + )} +
= ({
{intl.formatMessage({ id: 'supplierTaskManage.text.selectedSuppliers' })} - {intl.formatMessage({ id: 'supplierTaskManage.text.itemCount' }, { count: chosenSuppliers.length })} + + {intl.formatMessage( + { id: 'supplierTaskManage.text.itemCount' }, + { count: chosenSuppliers.length }, + )} +
{ const intl = useIntl(); + const supplierDetailModal = useSupplierDetailModal(); const [loading, setLoading] = useState(false); const [form] = Form.useForm(); @@ -113,9 +115,9 @@ const SupplierAnnualStatistics: React.FC = () => { ellipsis: { showTitle: false, }, - render: (text: string) => ( + render: (text: string, record: DataStatistics.AnnualReviewStatisticsRecord) => ( - {text} + ), }, diff --git a/src/pages/dataStatistics/supplierAnnualStatistics/supplierAnnualStatistics.tsx b/src/pages/dataStatistics/supplierAnnualStatistics/supplierAnnualStatistics.tsx index e99cfd2..dc77a25 100644 --- a/src/pages/dataStatistics/supplierAnnualStatistics/supplierAnnualStatistics.tsx +++ b/src/pages/dataStatistics/supplierAnnualStatistics/supplierAnnualStatistics.tsx @@ -8,11 +8,13 @@ import { getSupplierAnnualReviewStatistics } from '@/servers/api/dataStatistics' import './supplierAnnualStatistics.less'; import { downloadFile } from '@/utils/download'; import moment from 'moment'; +import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext'; const { Option } = Select; const SupplierAnnualStatistics: React.FC = () => { const intl = useIntl(); + const supplierDetailModal = useSupplierDetailModal(); const [loading, setLoading] = useState(false); const [form] = Form.useForm(); @@ -125,9 +127,9 @@ const SupplierAnnualStatistics: React.FC = () => { ellipsis: { showTitle: false, }, - render: (text: string) => ( + render: (text: string, record: DataStatistics.AnnualReviewStatisticsRecord) => ( - {text} + ), }, diff --git a/src/pages/dataStatistics/supplierEvaluateStatistics/supplierEvaluateStatistics.tsx b/src/pages/dataStatistics/supplierEvaluateStatistics/supplierEvaluateStatistics.tsx index 6bbea7f..8d82127 100644 --- a/src/pages/dataStatistics/supplierEvaluateStatistics/supplierEvaluateStatistics.tsx +++ b/src/pages/dataStatistics/supplierEvaluateStatistics/supplierEvaluateStatistics.tsx @@ -9,11 +9,13 @@ import { getAllEvaluateRules } from '@/servers/api/supplierEvaluate'; import './supplierEvaluateStatistics.less'; import { downloadFile } from '@/utils/download'; import moment from 'moment'; +import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext'; const { Option } = Select; const SupplierEvaluateStatistics: React.FC = () => { const intl = useIntl(); + const supplierDetailModal = useSupplierDetailModal(); const [loading, setLoading] = useState(false); const [form] = Form.useForm(); @@ -145,9 +147,9 @@ const SupplierEvaluateStatistics: React.FC = () => { ellipsis: { showTitle: false, }, - render: (text: string) => ( + render: (text: string, record: DataStatistics.EvaluateStatisticsRecord) => ( - {text} + ), }, diff --git a/src/pages/dataStatistics/supplierExitStatistics/supplierExitStatistics.tsx b/src/pages/dataStatistics/supplierExitStatistics/supplierExitStatistics.tsx index 47341ad..bb8755a 100644 --- a/src/pages/dataStatistics/supplierExitStatistics/supplierExitStatistics.tsx +++ b/src/pages/dataStatistics/supplierExitStatistics/supplierExitStatistics.tsx @@ -7,11 +7,13 @@ import { getSupplierExitStatistics } from '@/servers/api/dataStatistics'; import moment from 'moment'; import './supplierExitStatistics.less'; import { downloadFile } from '@/utils/download'; +import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext'; const { Option } = Select; const SupplierExitStatistics: React.FC = () => { const intl = useIntl(); + const supplierDetailModal = useSupplierDetailModal(); const [loading, setLoading] = useState(false); const [form] = Form.useForm(); @@ -117,9 +119,9 @@ const SupplierExitStatistics: React.FC = () => { ellipsis: { showTitle: false, }, - render: (text: string) => ( + render: (text: string, record: DataStatistics.ExitStatisticsRecord) => ( - {text} + ), }, diff --git a/src/pages/dataStatistics/supplierQualificationWarningStatistics/supplierQualificationWarningStatistics.tsx b/src/pages/dataStatistics/supplierQualificationWarningStatistics/supplierQualificationWarningStatistics.tsx index 814c608..7789127 100644 --- a/src/pages/dataStatistics/supplierQualificationWarningStatistics/supplierQualificationWarningStatistics.tsx +++ b/src/pages/dataStatistics/supplierQualificationWarningStatistics/supplierQualificationWarningStatistics.tsx @@ -24,12 +24,14 @@ import { getSupplierQualificationExpire, exportSupplierQualificationExpire } fro import moment from 'moment'; import './supplierQualificationWarningStatistics.less'; import { downloadFile } from '@/utils/download'; +import { useSupplierDetailModal } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext'; const { Option } = Select; const { RangePicker } = DatePicker; const SupplierQualificationWarningStatistics: React.FC = () => { const intl = useIntl(); + const supplierDetailModal = useSupplierDetailModal(); const [loading, setLoading] = useState(false); const [form] = Form.useForm(); @@ -145,9 +147,9 @@ const SupplierQualificationWarningStatistics: React.FC = () => { ellipsis: { showTitle: false, }, - render: (text: string) => ( + render: (text: string, record: DataStatistics.QualificationExpireRecord) => ( - {text} + ), }, diff --git a/src/pages/register/supplier/CommonFormSections.tsx b/src/pages/register/supplier/CommonFormSections.tsx index 6f5e51e..3aa2afd 100644 --- a/src/pages/register/supplier/CommonFormSections.tsx +++ b/src/pages/register/supplier/CommonFormSections.tsx @@ -23,6 +23,7 @@ import { validateFileSize } from '@/utils/utils'; import { getRegionTree, getregionInternational } from '@/servers/api/register'; import { getDictList } from '@/servers/api/dicts'; import type { DictItem } from '@/servers/api/dicts'; +import FileUpload from '@/components/FileUpload/FileUpload'; const { Option } = Select; @@ -36,10 +37,13 @@ interface SurveySectionProps extends CommonFormSectionsProps { surveyQuestions?: API.SurveyQuestionResponse; } function convertToCascaderOptions(data: any[]): any[] { - return data.map(item => ({ + return data.map((item) => ({ label: item.name, value: item.id, - children: item.children && item.children.length > 0 ? convertToCascaderOptions(item.children) : undefined, + children: + item.children && item.children.length > 0 + ? convertToCascaderOptions(item.children) + : undefined, })); } /** @@ -50,21 +54,35 @@ export const QualificationSection: React.FC = ({ form } // 检查行是否有任何字段被填写 const hasRowValue = (formInstance: any, recordObj: any, currentField: string) => { const values = formInstance.getFieldsValue(['coscoSupplierQualifications']); - if (!values.coscoSupplierQualifications || !values.coscoSupplierQualifications[recordObj.name]) { + if ( + !values.coscoSupplierQualifications || + !values.coscoSupplierQualifications[recordObj.name] + ) { return false; } const rowData = values.coscoSupplierQualifications[recordObj.name]; - const fields = ['certType', 'certName', 'certNumber', 'certLevel', 'issuingAuthority', 'dateTime', 'termOfValidity', 'certFile']; + const fields = [ + 'certType', + 'certName', + 'certNumber', + 'certLevel', + 'issuingAuthority', + 'dateTime', + 'termOfValidity', + 'certFile', + ]; // 过滤掉当前正在验证的字段 - return fields.filter(field => field !== currentField).some(field => { - const value = rowData[field]; - if (field === 'certFile' && value) { - return value.fileList && value.fileList.length > 0; - } - return value !== undefined && value !== null && value !== ''; - }); + return fields + .filter((field) => field !== currentField) + .some((field) => { + const value = rowData[field]; + if (field === 'certFile' && value) { + return value.fileList && value.fileList.length > 0; + } + return value !== undefined && value !== null && value !== ''; + }); }; // 生成条件性验证规则 @@ -120,7 +138,8 @@ export const QualificationSection: React.FC = ({ form } @@ -134,6 +153,7 @@ export const QualificationSection: React.FC = ({ form } name={[record.name, 'certName']} rules={[createConditionalRule('certName', '请输入资质名称')]} style={{ margin: 0 }} + wrapperCol={{ span: 24 }} > @@ -147,6 +167,7 @@ export const QualificationSection: React.FC = ({ form } name={[record.name, 'certNumber']} rules={[createConditionalRule('certNumber', '请输入资质证书编号')]} style={{ margin: 0 }} + wrapperCol={{ span: 24 }} > @@ -156,10 +177,7 @@ export const QualificationSection: React.FC = ({ form } title: createRequiredTitle('资质类别和等级'), dataIndex: 'certLevel', render: (_, record) => ( - + ), @@ -172,6 +190,7 @@ export const QualificationSection: React.FC = ({ form } name={[record.name, 'issuingAuthority']} rules={[createConditionalRule('issuingAuthority', '请输入发证机构')]} style={{ margin: 0 }} + wrapperCol={{ span: 24 }} > @@ -185,6 +204,7 @@ export const QualificationSection: React.FC = ({ form } name={[record.name, 'dateTime']} rules={[createConditionalRule('dateTime', '请选择发证日期')]} style={{ margin: 0 }} + wrapperCol={{ span: 24 }} > = ({ form } name={[record.name, 'termOfValidity']} rules={[createConditionalRule('termOfValidity', '请选择资质有效期')]} style={{ margin: 0 }} + wrapperCol={{ span: 24 }} > = ({ form } name={[record.name, 'certFile']} rules={[createConditionalRule('certFile', '请上传资质证书附件')]} style={{ margin: 0 }} + wrapperCol={{ span: 24 }} > - - - + ), }, @@ -263,7 +285,7 @@ export const QualificationSection: React.FC = ({ form } export const InvoiceSection: React.FC = ({ form }) => { const [taxpayerTypeOptions, setTaxpayerTypeOptions] = useState([]); useEffect(() => { - getDictList('taxpayer_type').then(res => { + getDictList('taxpayer_type').then((res) => { if (res.code === 200) { setTaxpayerTypeOptions(res.data); } @@ -280,10 +302,13 @@ export const InvoiceSection: React.FC = ({ form }) => { label="纳税人类型" rules={[{ required: true, message: '请选择纳税人类型' }]} > - ({ + label: item.dicName, + value: item.code, + }))} + /> @@ -352,7 +377,7 @@ export const BankAccountSection: React.FC = ({ form, su const [addressOptions, setAddressOptions] = useState([]); const [currencyOptions, setCurrencyOptions] = useState([]); useEffect(() => { - getDictList('currency').then(res => { + getDictList('currency').then((res) => { if (res.code === 200) { setCurrencyOptions(res.data); } @@ -361,13 +386,12 @@ export const BankAccountSection: React.FC = ({ form, su useEffect(() => { if (supplierType) { const submitInterface = supplierType === 'dvs' ? getRegionTree : getregionInternational; - submitInterface().then(res => { + submitInterface().then((res) => { if (res.code === 200) { setAddressOptions(convertToCascaderOptions(res.data)); } }); } - }, [supplierType]); // 定义表格记录和表格列类型 @@ -400,42 +424,48 @@ export const BankAccountSection: React.FC = ({ form, su dataIndex: 'name', width: 60, render: (text, record, index = 0) => index + 1, - } + }, ]; // 境内企业特有列 - const domesticColumns: ColumnType[] = supplierType === 'dvs' ? [ - { - title: '银联号', - dataIndex: 'interbankNumber', - render: (text, record) => ( - - - - ), - } - ] : []; + const domesticColumns: ColumnType[] = + supplierType === 'dvs' + ? [ + { + title: '银联号', + dataIndex: 'interbankNumber', + render: (text, record) => ( + + + + ), + }, + ] + : []; // 境外企业特有列 - const foreignColumns: ColumnType[] = supplierType === 'ovs' ? [ - { - title: 'SWIFT CODE', - dataIndex: 'swiftCode', - render: (text, record) => ( - - - - ), - } - ] : []; + const foreignColumns: ColumnType[] = + supplierType === 'ovs' + ? [ + { + title: 'SWIFT CODE', + dataIndex: 'swiftCode', + render: (text, record) => ( + + + + ), + }, + ] + : []; // 通用列 const commonColumns: ColumnType[] = [ @@ -491,7 +521,7 @@ export const BankAccountSection: React.FC = ({ form, su + + - +