2026-03-19 01:39:34 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* [MOCK-002] 证书数据源抽象层
|
|
|
|
|
|
* 通过环境变量自动切换Mock/真实API
|
|
|
|
|
|
* AI注意: 这是唯一入口,业务代码必须调用此层
|
|
|
|
|
|
*
|
|
|
|
|
|
* @module services/certificateDataSource
|
|
|
|
|
|
* @author AI-Frontend-Team
|
|
|
|
|
|
* @created 2026-03-19
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2026-03-22 11:25:28 +08:00
|
|
|
|
import { Certificate, CertificateQueryParams, CertificateStatus, CertificateType } from '@/types/certificate';
|
2026-03-20 17:53:46 +08:00
|
|
|
|
import { IDataSource } from '@/types/datasource';
|
2026-03-19 14:19:01 +08:00
|
|
|
|
import { BaseDataSource, BaseMockDataSource, DataSourceFactory } from './dataSourceFactory';
|
2026-03-19 01:39:34 +08:00
|
|
|
|
|
2026-03-22 11:25:28 +08:00
|
|
|
|
export type { Certificate } from '@/types/certificate';
|
|
|
|
|
|
export { CertificateStatus, CertificateType };
|
|
|
|
|
|
|
2026-03-19 01:39:34 +08:00
|
|
|
|
// ============================================
|
|
|
|
|
|
// 真实API实现
|
|
|
|
|
|
// ============================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 证书API数据源
|
|
|
|
|
|
* 调用真实后端API
|
|
|
|
|
|
*/
|
2026-03-19 14:19:01 +08:00
|
|
|
|
class ApiCertificateDataSource extends BaseDataSource<Certificate, CertificateQueryParams> {
|
|
|
|
|
|
constructor() {
|
|
|
|
|
|
super('/api/v1/certificate/certificates');
|
2026-03-19 01:39:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 更新证书状态(审核)
|
|
|
|
|
|
* @param id 证书ID
|
|
|
|
|
|
* @param status 新状态
|
|
|
|
|
|
* @param approvedBy 审核人
|
|
|
|
|
|
*/
|
|
|
|
|
|
async updateStatus(id: string, status: string, approvedBy?: string): Promise<Certificate> {
|
2026-03-19 14:19:01 +08:00
|
|
|
|
const response = await fetch(`${this.baseUrl}/${id}/status`, {
|
2026-03-19 01:39:34 +08:00
|
|
|
|
method: 'PUT',
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
'Content-Type': 'application/json',
|
|
|
|
|
|
},
|
|
|
|
|
|
body: JSON.stringify({ status, approvedBy }),
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
if (!response.ok) {
|
|
|
|
|
|
throw new Error(`API Error: ${response.status}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const result = await response.json();
|
|
|
|
|
|
|
|
|
|
|
|
// 更新成功后获取完整数据
|
|
|
|
|
|
const updated = await this.detail(id);
|
|
|
|
|
|
if (updated) return updated;
|
|
|
|
|
|
|
|
|
|
|
|
return result.data;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================
|
|
|
|
|
|
// Mock实现 (完全独立文件)
|
|
|
|
|
|
// ============================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* [MOCK] 证书Mock数据源
|
|
|
|
|
|
* AI注意: 这是Mock实现,不是真实业务逻辑
|
|
|
|
|
|
* 仅在REACT_APP_USE_MOCK=true时启用
|
|
|
|
|
|
*/
|
2026-03-19 14:19:01 +08:00
|
|
|
|
class MockCertificateDataSource extends BaseMockDataSource<Certificate, CertificateQueryParams> {
|
2026-03-19 01:39:34 +08:00
|
|
|
|
/** Mock数据源名称 */
|
|
|
|
|
|
readonly __MOCK_NAME__ = 'MockCertificateDataSource';
|
|
|
|
|
|
|
2026-03-19 14:19:01 +08:00
|
|
|
|
/** Mock数据 */
|
|
|
|
|
|
protected mockData: Certificate[] = [
|
2026-03-19 01:39:34 +08:00
|
|
|
|
{
|
|
|
|
|
|
id: '1',
|
|
|
|
|
|
name: 'CE认证证书',
|
2026-03-22 11:25:28 +08:00
|
|
|
|
type: CertificateType.PRODUCT_CERT,
|
|
|
|
|
|
status: CertificateStatus.APPROVED,
|
2026-03-19 01:39:34 +08:00
|
|
|
|
fileUrl: '/files/ce-cert.pdf',
|
|
|
|
|
|
fileName: 'CE-Certificate-2026.pdf',
|
|
|
|
|
|
uploadDate: '2026-03-15',
|
|
|
|
|
|
expiryDate: '2027-03-15',
|
|
|
|
|
|
approvedBy: 'admin',
|
|
|
|
|
|
approvedDate: '2026-03-16',
|
|
|
|
|
|
productId: 'P001',
|
|
|
|
|
|
productName: '工业温度传感器',
|
|
|
|
|
|
notes: '欧盟市场准入认证',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
id: '2',
|
|
|
|
|
|
name: '营业执照',
|
2026-03-22 11:25:28 +08:00
|
|
|
|
type: CertificateType.BUSINESS_LICENSE,
|
|
|
|
|
|
status: CertificateStatus.APPROVED,
|
2026-03-19 01:39:34 +08:00
|
|
|
|
fileUrl: '/files/business-license.pdf',
|
|
|
|
|
|
fileName: 'Business-License-2026.pdf',
|
|
|
|
|
|
uploadDate: '2026-01-10',
|
|
|
|
|
|
expiryDate: '2027-01-10',
|
|
|
|
|
|
approvedBy: 'admin',
|
|
|
|
|
|
approvedDate: '2026-01-11',
|
|
|
|
|
|
notes: '企业营业执照',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
id: '3',
|
|
|
|
|
|
name: 'FCC认证',
|
2026-03-22 11:25:28 +08:00
|
|
|
|
type: CertificateType.SAFETY_CERT,
|
|
|
|
|
|
status: CertificateStatus.PENDING,
|
2026-03-19 01:39:34 +08:00
|
|
|
|
fileUrl: '/files/fcc-cert.pdf',
|
|
|
|
|
|
fileName: 'FCC-Certificate.pdf',
|
|
|
|
|
|
uploadDate: '2026-03-18',
|
|
|
|
|
|
expiryDate: '2027-03-18',
|
|
|
|
|
|
productId: 'P002',
|
|
|
|
|
|
productName: 'PLC控制器',
|
|
|
|
|
|
notes: '美国FCC认证',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
id: '4',
|
|
|
|
|
|
name: 'ISO9001',
|
2026-03-22 11:25:28 +08:00
|
|
|
|
type: CertificateType.QUALITY_CERT,
|
|
|
|
|
|
status: CertificateStatus.EXPIRED,
|
2026-03-19 01:39:34 +08:00
|
|
|
|
fileUrl: '/files/iso9001.pdf',
|
|
|
|
|
|
fileName: 'ISO9001-2025.pdf',
|
|
|
|
|
|
uploadDate: '2025-01-01',
|
|
|
|
|
|
expiryDate: '2026-01-01',
|
|
|
|
|
|
approvedBy: 'admin',
|
|
|
|
|
|
approvedDate: '2025-01-02',
|
|
|
|
|
|
notes: '质量管理体系认证,已过期需要更新',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
id: '5',
|
|
|
|
|
|
name: 'RoHS认证',
|
2026-03-22 11:25:28 +08:00
|
|
|
|
type: CertificateType.PRODUCT_CERT,
|
|
|
|
|
|
status: CertificateStatus.APPROVED,
|
2026-03-19 01:39:34 +08:00
|
|
|
|
fileUrl: '/files/rohs-cert.pdf',
|
|
|
|
|
|
fileName: 'RoHS-Certificate.pdf',
|
|
|
|
|
|
uploadDate: '2026-02-20',
|
|
|
|
|
|
expiryDate: '2027-02-20',
|
|
|
|
|
|
approvedBy: 'admin',
|
|
|
|
|
|
approvedDate: '2026-02-21',
|
|
|
|
|
|
productId: 'P003',
|
|
|
|
|
|
productName: '环保型传感器',
|
|
|
|
|
|
notes: '欧盟RoHS环保认证',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
id: '6',
|
|
|
|
|
|
name: 'UL认证',
|
2026-03-22 11:25:28 +08:00
|
|
|
|
type: CertificateType.SAFETY_CERT,
|
|
|
|
|
|
status: CertificateStatus.PENDING,
|
2026-03-19 01:39:34 +08:00
|
|
|
|
fileUrl: '/files/ul-cert.pdf',
|
|
|
|
|
|
fileName: 'UL-Certificate.pdf',
|
|
|
|
|
|
uploadDate: '2026-03-19',
|
|
|
|
|
|
expiryDate: '2027-03-19',
|
|
|
|
|
|
productId: 'P004',
|
|
|
|
|
|
productName: '工业电源模块',
|
|
|
|
|
|
notes: '美国UL安全认证',
|
|
|
|
|
|
},
|
|
|
|
|
|
];
|
|
|
|
|
|
|
2026-03-19 14:19:01 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 更新证书状态(审核)
|
|
|
|
|
|
* @param id 证书ID
|
|
|
|
|
|
* @param status 新状态
|
|
|
|
|
|
* @param approvedBy 审核人
|
|
|
|
|
|
*/
|
2026-03-19 01:39:34 +08:00
|
|
|
|
async updateStatus(id: string, status: string, approvedBy?: string): Promise<Certificate> {
|
|
|
|
|
|
await this.delay(300);
|
|
|
|
|
|
|
|
|
|
|
|
const index = this.mockData.findIndex(item => item.id === id);
|
|
|
|
|
|
if (index === -1) {
|
|
|
|
|
|
throw new Error('Certificate not found');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const updates: Partial<Certificate> = {
|
2026-03-22 11:25:28 +08:00
|
|
|
|
status: status as CertificateStatus,
|
2026-03-19 01:39:34 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (status === 'APPROVED') {
|
|
|
|
|
|
updates.approvedBy = approvedBy || 'admin';
|
|
|
|
|
|
updates.approvedDate = new Date().toISOString().split('T')[0];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.mockData[index] = { ...this.mockData[index], ...updates };
|
|
|
|
|
|
return this.mockData[index];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================
|
2026-03-19 14:19:01 +08:00
|
|
|
|
// 导出数据源
|
2026-03-19 01:39:34 +08:00
|
|
|
|
// ============================================
|
|
|
|
|
|
|
2026-03-19 14:19:01 +08:00
|
|
|
|
export const certificateDataSource = DataSourceFactory.createWithMethods<
|
|
|
|
|
|
Certificate,
|
|
|
|
|
|
CertificateQueryParams,
|
|
|
|
|
|
{
|
|
|
|
|
|
updateStatus(id: string, status: string, approvedBy?: string): Promise<Certificate>;
|
|
|
|
|
|
}
|
|
|
|
|
|
>({
|
|
|
|
|
|
apiDataSource: ApiCertificateDataSource,
|
|
|
|
|
|
mockDataSource: MockCertificateDataSource,
|
|
|
|
|
|
});
|
2026-03-19 01:39:34 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Mock状态标记
|
|
|
|
|
|
* 用于调试和开发环境识别
|
|
|
|
|
|
*/
|
2026-03-19 14:19:01 +08:00
|
|
|
|
export { __MOCK__, __DATA_SOURCE_TYPE__ } from './dataSourceFactory';
|