Files
makemd/server/src/services/ConfidentialSharingService.ts

92 lines
3.0 KiB
TypeScript
Raw Normal View History

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');
}
}