92 lines
3.0 KiB
TypeScript
92 lines
3.0 KiB
TypeScript
|
|
import db from '../config/database';
|
|||
|
|
import { AuditService } from './AuditService';
|
|||
|
|
import { AIService } from './AIService';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* [BIZ_FIN_21] 跨租户机密利润共享对账 (Confidential Profit Sharing)
|
|||
|
|
* 负责在租户间(如联合集采、交叉分销)进行利润共享,利用同态加密技术在不暴露明文利润的情况下完成对账
|
|||
|
|
*/
|
|||
|
|
export class ConfidentialSharingService {
|
|||
|
|
/**
|
|||
|
|
* 提交机密利润数据并请求对账
|
|||
|
|
*/
|
|||
|
|
static async submitConfidentialProfit(
|
|||
|
|
tenantId: string,
|
|||
|
|
partnerTenantId: string,
|
|||
|
|
profitAmount: number,
|
|||
|
|
sharingRatio: number,
|
|||
|
|
traceId: string
|
|||
|
|
): Promise<void> {
|
|||
|
|
// 1. 同态加密利润数据 (模拟加密过程)
|
|||
|
|
const encryptedData = `HE-ENC-${profitAmount * 1.5}-${Math.random().toString(36).substring(7)}`;
|
|||
|
|
const settlementProof = 'PROOF-' + Math.random().toString(36).substring(7).toUpperCase();
|
|||
|
|
|
|||
|
|
await db.transaction(async (trx) => {
|
|||
|
|
// 2. 记录机密对账单
|
|||
|
|
const [id] = await trx('cf_confidential_sharing').insert({
|
|||
|
|
tenant_id: tenantId,
|
|||
|
|
partner_tenant_id: partnerTenantId,
|
|||
|
|
encrypted_profit_data: encryptedData,
|
|||
|
|
sharing_ratio: sharingRatio,
|
|||
|
|
settlement_proof: settlementProof
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 3. 审计记录
|
|||
|
|
await AuditService.log({
|
|||
|
|
tenant_id: tenantId,
|
|||
|
|
action: 'CONFIDENTIAL_PROFIT_SUBMITTED',
|
|||
|
|
target_type: 'FINANCE_SHARING',
|
|||
|
|
target_id: id.toString(),
|
|||
|
|
trace_id: traceId,
|
|||
|
|
new_data: JSON.stringify({ partnerTenantId, sharingRatio }),
|
|||
|
|
metadata: JSON.stringify({ settlementProof })
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 执行机密对账结算 (BIZ_FIN_21)
|
|||
|
|
*/
|
|||
|
|
static async executeConfidentialSettlement(
|
|||
|
|
sharingId: number,
|
|||
|
|
tenantId: string,
|
|||
|
|
traceId: string
|
|||
|
|
): Promise<number> {
|
|||
|
|
const record = await db('cf_confidential_sharing').where({ id: sharingId }).first();
|
|||
|
|
if (!record) throw new Error('Sharing record not found');
|
|||
|
|
|
|||
|
|
// 1. 利用 AGI 节点进行同态计算 (模拟在不解密的情况下计算应分利润)
|
|||
|
|
const calculatedShare = await AIService.calculateConfidentialShare(record.encrypted_profit_data, record.sharing_ratio);
|
|||
|
|
|
|||
|
|
await db.transaction(async (trx) => {
|
|||
|
|
// 2. 更新结算证明
|
|||
|
|
await trx('cf_confidential_sharing').where({ id: sharingId }).update({
|
|||
|
|
updated_at: db.fn.now()
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 3. 审计记录
|
|||
|
|
await AuditService.log({
|
|||
|
|
tenant_id: tenantId,
|
|||
|
|
action: 'CONFIDENTIAL_SETTLEMENT_COMPLETED',
|
|||
|
|
target_type: 'FINANCE_SHARING',
|
|||
|
|
target_id: sharingId.toString(),
|
|||
|
|
trace_id: traceId,
|
|||
|
|
new_data: JSON.stringify({ calculatedShare }),
|
|||
|
|
metadata: JSON.stringify({ sharingId })
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
return calculatedShare;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取租户所有机密共享历史
|
|||
|
|
*/
|
|||
|
|
static async getSharingHistory(tenantId: string) {
|
|||
|
|
return await db('cf_confidential_sharing')
|
|||
|
|
.where({ tenant_id: tenantId })
|
|||
|
|
.orWhere({ partner_tenant_id: tenantId })
|
|||
|
|
.orderBy('created_at', 'desc');
|
|||
|
|
}
|
|||
|
|
}
|