/** * 功能描述:声明平台资源详情的字段顺序、固定关联表列和 JSON 展示规则。 * 版本:v1.0.0 */ export type ResourceCollectionContract = { columns: string[]; jsonColumns?: string[]; relationIdentityKeys?: Record; }; export type ResourceDetailContract = { leadingKeys?: string[]; hiddenKeys?: string[]; relationResources?: Record; collections?: Record; }; const contracts: Record = { gasorder_contract: { leadingKeys: [ 'contract_no', 'contract_status', 'title', 'user_account_identity', 'gas_basic_identity', 'delivery_basic_identity', 'identity', ], collections: { products: { columns: [ 'bound_at', 'product_name', 'product_code', 'product_type_name', 'product_params', 'unit_price', 'product_info_identity', 'unbound_at', 'unbind_reason', ], jsonColumns: ['product_params'], }, revisions: { columns: [ 'occurred_at', 'action', 'contract_status', 'effective_at', 'expired_at', 'operator_name', 'operator_identity', 'reason', ], relationIdentityKeys: { operator_name: 'operator_identity' }, }, }, }, gasorder_basic: { leadingKeys: [ 'order_no', 'request_no', 'order_status', 'gasorder_contract_identity', 'creator_type', 'creator_identity', 'user_account_identity', 'gas_basic_identity', 'delivery_basic_identity', 'staff_account_identity', 'identity', 'status', ], hiddenKeys: ['operator_name'], relationResources: { gasorder_contract_identity: '/gasorder_contract', user_account_identity: '/user_account', gas_basic_identity: '/gas_basic', delivery_basic_identity: '/delivery_basic', staff_account_identity: '/staff_account', }, collections: { items: { columns: [ 'product_name', 'product_code', 'product_type_name', 'product_params', 'unit_price', ], jsonColumns: ['product_params'], }, assignments: { columns: [ 'assigned_at', 'gas_basic_display_name', 'delivery_basic_display_name', 'staff_account_display_name', 'assigner_name', 'reason', ], relationIdentityKeys: { gas_basic_display_name: 'gas_basic_identity', delivery_basic_display_name: 'delivery_basic_identity', staff_account_display_name: 'staff_account_identity', assigner_name: 'assigner_identity', }, }, statuses: { columns: ['occurred_at', 'from_status', 'to_status', 'operator_name', 'reason'], relationIdentityKeys: { operator_name: 'operator_identity' }, }, tracks: { columns: [ 'attempt_no', 'staff_account_display_name', 'staff_account_identity', 'started_at', 'completed_at', ], relationIdentityKeys: { staff_account_display_name: 'staff_account_identity', }, }, confirmations: { columns: [ 'confirmed_at', 'confirm_type', 'recipient_name', 'recipient_phone', 'proof_uri', 'remark', ], }, payments: { columns: ['attempt_no', 'payment_no', 'payment_order_identity', 'amount', 'payment_status'], }, }, }, gasorder_track: { leadingKeys: [ 'gasorder_basic_identity', 'staff_account_identity', 'attempt_no', 'started_at', 'completed_at', 'identity', 'status', ], relationResources: { gasorder_basic_identity: '/gasorder_basic', staff_account_identity: '/staff_account', }, collections: { points: { columns: [ 'occurred_at', 'received_at', 'longitude', 'latitude', 'accuracy', 'speed', 'direction', 'source', 'request_no', ], }, }, }, payment_order: { leadingKeys: [ 'payment_no', 'payment_status', 'request_no', 'business_type', 'business_identity', 'user_identity', 'amount', 'identity', ], }, wallet_record: { leadingKeys: [ 'record_no', 'request_no', 'direction', 'trade_type', 'amount', 'wallet_basic_identity', 'identity', ], }, ec_order: { leadingKeys: [ 'order_no', 'order_status', 'request_no', 'user_account_identity', 'payable_amount', 'total_amount', 'identity', ], }, }; const jsonFieldKeys = new Set([ 'params', 'product_params', 'product_snapshot', 'args', 'callback_msg', ]); /** 返回资源专属详情契约;没有专属规则时使用空契约。 */ export function resourceDetailContract(name: string): ResourceDetailContract { return contracts[name] ?? {}; } /** 判断主详情字段是否应使用完整 JSON 查看器,内容不做脱敏或改写。 */ export function isResourceJsonField(key: string) { return jsonFieldKeys.has(key); } /** 返回集合字段对应的稳定唯一标识字段。 */ export function collectionRelationIdentityKey( resourceName: string, collectionKey: string, column: string, ) { return contracts[resourceName]?.collections?.[collectionKey] ?.relationIdentityKeys?.[column] ?? ''; } /** 判断集合字段是否应使用完整 JSON 查看器。 */ export function isCollectionJsonField( resourceName: string, collectionKey: string, column: string, ) { return Boolean( contracts[resourceName]?.collections?.[collectionKey] ?.jsonColumns?.includes(column), ); }