import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http' import type { PlatformPermissionResource } from '@/shared/types/platformPermission' export type { PlatformPermissionResource } from '@/shared/types/platformPermission' export interface EnterpriseReview { id: number | string tenantId: number | string status: 'PENDING' | 'APPROVED' | 'REJECTED' tenantName?: string | null tenantCode?: string | null qualificationId?: number | string | null qualificationType?: string | null certificateNo?: string | null documentUrl?: string | null contactName?: string | null contactPhone?: string | null contactEmail?: string | null submittedAt?: string | null createdAt?: string | null reviewComment?: string | null [key: string]: unknown } export type PlatformTenantStatus = 'PENDING' | 'ACTIVE' | 'REJECTED' | 'INACTIVE' | string export interface PlatformTenantResource { id: number | string tenantCode: string tenantName: string status: PlatformTenantStatus legalName: string | null unifiedSocialCreditCode: string | null contactName: string | null contactPhone: string | null contactEmail: string | null servicePackage: string | null contactWechat: string | null salesOwnerName: string | null paymentTermDays: number | null enterpriseType: string | null establishedDate: string | null registeredCapital: number | string | null registeredCapitalCurrency: string | null registeredAddress: string | null internalRemark: string | null createdAt: string | null approvedAt: string | null } export interface CreatePlatformTenantRequest { tenantName: string legalName: string unifiedSocialCreditCode: string contactName: string contactPhone: string contactEmail: string servicePackage: string contactWechat: string salesOwnerName: string paymentTermDays: number enterpriseType: string establishedDate: string | null registeredCapital: number | null registeredCapitalCurrency: string registeredAddress: string internalRemark: string } export type UpdatePlatformTenantRequest = Omit export interface PlatformTenantOrderCount { tenantId: number | string orderCount: number } export interface PlatformTenantPage { records: PlatformTenantResource[] page: number size: number total: number pages: number } export interface PlatformTenantQuery { page: number size: number keyword?: string status?: PlatformTenantStatus } export interface PlatformTenantQualification { id: number | string tenantId: number | string qualificationType: 'BUSINESS_LICENSE' | string certificateNo: string | null documentUrl: string status: 'PENDING' | 'APPROVED' | 'REJECTED' | 'SUPERSEDED' reviewComment: string | null validTo?: string | null } export type PlatformQualificationType = 'BUSINESS_LICENSE' | 'LEGAL_PERSON_ID' | 'FREIGHT_FORWARDER_CERTIFICATE' | 'BANK_ACCOUNT_LICENSE' export interface PlatformQualificationUploadResponse { qualificationId: number | string reviewId: number | string | null tenantStatus: PlatformTenantStatus documentUrl: string replacedDocumentUrl?: string | null } export interface EnterpriseApprovalResponse { tenantId: number | string administratorCreated: boolean administratorUsername: string | null temporaryPassword: string | null } export interface PlatformRoleResource { id: number | string tenantId: number | string appCode: 'PLATFORM' roleCode: string roleName: string roleType: 'SYSTEM' | 'CUSTOM' | string status: 'ACTIVE' | 'INACTIVE' | string description: string | null permissionIds?: Array } export interface CreatePlatformRoleRequest { roleCode: string roleName: string description: string } export interface UpdatePlatformRoleRequest { roleName: string description: string } export interface CreatePlatformPermissionRequest { type: 'MENU' | 'BUTTON' code: string name: string parentId: number | string routePath: string | null httpMethod: null sortNo: number } export interface UpdatePlatformPermissionRequest { name: string parentId: number | string | null routePath: string | null httpMethod: string | null sortNo: number } export interface PlatformInternalUser { membershipId: number | string userId: number | string authUserId: number | string username: string displayName: string phone: string | null email: string | null memberType: string memberNo: string | null status: 'ACTIVE' | 'DISABLED' | string roleIds: Array } export interface CreatePlatformInternalUserRequest { authUserId: number | string userType: string displayName: string phone: string email: string memberNo?: string roleIds?: Array } export interface UpdatePlatformInternalUserRequest { displayName: string phone: string email: string memberNo: string roleIds: Array } export interface PlatformManagedUser { membershipId: number | string userId: number | string authUserId: number | string username: string displayName: string phone: string | null email: string | null tenantId: number | string tenantName: string memberType: string memberNo: string | null status: 'ACTIVE' | 'DISABLED' roleIds: Array roleNames: string[] lastLoginAt: string | null protectedAccount: boolean } export interface PlatformUserOptions { tenants: Array<{ id: number | string; name: string; status: string }> roles: Array<{ id: number | string; tenantId: number | string; name: string; status: string }> } export interface CreatePlatformManagedUserRequest { username: string displayName: string phone: string email: string tenantId: number | string roleIds: Array password: string status: 'ACTIVE' | 'DISABLED' } export interface UpdatePlatformManagedUserRequest { displayName: string phone: string email: string tenantId: number | string roleIds: Array } async function getData(path: string): Promise { const response = await http.get, ApiEnvelope>(path) return unwrapApiResponse(response) } async function postData(path: string, body: unknown): Promise { const response = await http.post, ApiEnvelope>(path, body) return unwrapApiResponse(response) } async function putData(path: string, body: unknown): Promise { const response = await http.put, ApiEnvelope>(path, body) return unwrapApiResponse(response) } async function deleteData(path: string): Promise { const response = await http.delete, ApiEnvelope>(path) return unwrapApiResponse(response) } export function listPlatformPermissions() { return getData('/platform/v1/iam/permissions') } export function listEnterpriseReviews() { return getData('/platform/v1/iam/reviews') } export async function listPlatformTenants(query: PlatformTenantQuery) { const response = await http.get, ApiEnvelope>( '/platform/v1/iam/tenants', { params: { page: query.page, size: query.size, ...(query.keyword ? { keyword: query.keyword } : {}), ...(query.status ? { status: query.status } : {}), }, }, ) const data = unwrapApiResponse(response) return { ...data, page: Number(data.page), size: Number(data.size), total: Number(data.total), pages: Number(data.pages), } } export function getPlatformTenant(tenantId: number | string) { return getData(`/platform/v1/iam/tenants/${tenantId}`) } export function createPlatformTenant(payload: CreatePlatformTenantRequest) { return postData('/platform/v1/iam/tenants', payload) } export function updatePlatformTenant(tenantId: number | string, payload: UpdatePlatformTenantRequest) { return putData(`/platform/v1/iam/tenants/${tenantId}`, payload) } export function changePlatformTenantStatus(tenantId: number | string, status: 'ACTIVE' | 'DISABLED') { return putData(`/platform/v1/iam/tenants/${tenantId}/status`, { status }) } export function submitPlatformTenantReview(tenantId: number | string) { return postData(`/platform/v1/iam/tenants/${tenantId}/submit-review`, {}) } export async function uploadPlatformTenantQualification( tenantId: number | string, qualificationType: PlatformQualificationType, file: File, validTo?: string, certificateNo?: string, replace = false, ) { const form = new FormData() form.append('file', file) form.append('qualificationType', qualificationType) if (validTo) form.append('validTo', validTo) if (certificateNo) form.append('certificateNo', certificateNo) if (replace) form.append('replace', 'true') const response = await http.post, ApiEnvelope>( `/platform/v1/files/qualifications/${tenantId}`, form, ) return unwrapApiResponse(response) } export function listPlatformTenantOrderCounts(tenantIds: Array) { const ids = tenantIds.map((id) => encodeURIComponent(String(id))).join(',') return getData(`/platform/v1/orders/first-leg/tenant-counts?tenantIds=${ids}`) } export function listTenantQualifications(tenantId: number | string) { return getData(`/platform/v1/iam/tenants/${tenantId}/qualifications`) } export function qualificationFileName(documentUrl: string) { const path = documentUrl.split(/[?#]/, 1)[0] const encodedName = path.split('/').filter(Boolean).at(-1) if (!encodedName) throw new Error('资质文件地址无效') let fileName: string try { fileName = decodeURIComponent(encodedName) } catch { throw new Error('资质文件地址无效') } if (!fileName || fileName === '.' || fileName === '..' || /[\\/]/.test(fileName)) { throw new Error('资质文件地址无效') } return fileName } export function downloadTenantQualification(tenantId: number | string, documentUrl: string) { const fileName = qualificationFileName(documentUrl) return http.get(`/platform/v1/files/qualifications/${tenantId}/${encodeURIComponent(fileName)}`, { responseType: 'blob', }) } export function listPlatformRoles() { return getData('/platform/v1/iam/roles') } export function createPlatformRole(payload: CreatePlatformRoleRequest) { return postData('/platform/v1/iam/roles', payload) } export function updatePlatformRole(roleId: number | string, payload: UpdatePlatformRoleRequest) { return putData(`/platform/v1/iam/roles/${roleId}`, payload) } export function changePlatformRoleStatus(roleId: number | string, status: 'ACTIVE' | 'DISABLED') { return putData(`/platform/v1/iam/roles/${roleId}/status`, { status }) } export function deletePlatformRole(roleId: number | string) { return deleteData(`/platform/v1/iam/roles/${roleId}`) } export function replacePlatformRolePermissions(roleId: number | string, permissionIds: Array) { return putData('/platform/v1/iam/roles/permissions', { roleId, permissionIds }) } export function createPlatformPermission(payload: CreatePlatformPermissionRequest) { return postData('/platform/v1/iam/permissions', payload) } export function updatePlatformPermission(permissionId: number | string, payload: UpdatePlatformPermissionRequest) { return putData(`/platform/v1/iam/permissions/${permissionId}`, payload) } export function changePlatformPermissionStatus(permissionId: number | string, status: 'ACTIVE' | 'DISABLED') { return putData(`/platform/v1/iam/permissions/${permissionId}/status`, { status }) } export function deletePlatformPermission(permissionId: number | string) { return deleteData(`/platform/v1/iam/permissions/${permissionId}`) } export function listPlatformInternalUsers() { return getData('/platform/v1/iam/internal-users') } export function createPlatformInternalUser(payload: CreatePlatformInternalUserRequest) { return postData('/platform/v1/iam/internal-users', payload) } export function updatePlatformInternalUser(membershipId: number | string, payload: UpdatePlatformInternalUserRequest) { return putData(`/platform/v1/iam/internal-users/${membershipId}`, payload) } export function changePlatformInternalUserStatus(membershipId: number | string, status: 'ACTIVE' | 'DISABLED') { return putData(`/platform/v1/iam/internal-users/${membershipId}/status`, { status }) } export function resetPlatformInternalUserPassword(membershipId: number | string, newPassword: string) { return putData(`/platform/v1/iam/internal-users/${membershipId}/password`, { newPassword }) } export function assignPlatformInternalUserRoles(membershipId: number | string, roleIds: Array) { return putData(`/platform/v1/iam/internal-users/${membershipId}/roles`, { roleIds }) } export function listPlatformManagedUsers() { return getData('/platform/v1/iam/users') } export function getPlatformUserOptions() { return getData('/platform/v1/iam/users/options') } export function createPlatformManagedUser(payload: CreatePlatformManagedUserRequest) { return postData('/platform/v1/iam/users', payload) } export function updatePlatformManagedUser(membershipId: number | string, payload: UpdatePlatformManagedUserRequest) { return putData(`/platform/v1/iam/users/${membershipId}`, payload) } export function changePlatformManagedUserStatus(membershipId: number | string, status: 'ACTIVE' | 'DISABLED') { return putData(`/platform/v1/iam/users/${membershipId}/status`, { status }) } export function resetPlatformManagedUserPassword(membershipId: number | string, newPassword: string) { return putData(`/platform/v1/iam/users/${membershipId}/password`, { newPassword }) } export function approveEnterpriseReview(reviewId: number | string, comment: string) { return postData(`/platform/v1/iam/reviews/${reviewId}/approve`, { comment }) } export function rejectEnterpriseReview(reviewId: number | string, comment: string) { return postData(`/platform/v1/iam/reviews/${reviewId}/reject`, { comment }) }