Skip to content

私人银行业务技术详解

高净值客户服务的系统与技术


一、业务概述

私人银行(Private Banking)是汇丰服务最高端客户的业务线,为高净值人群提供专属的金融服务和财富管理方案。与普通零售业务相比,私人银行在服务模式、产品复杂度、保密要求等方面都有显著不同。

1.1 业务线定位

私人银行主要服务以下客户群体:

  • 可投资资产超过一定门槛的客户(通常100万美元以上)
  • 企业家、高管、名人等高净值人士
  • 家族企业和超高净值家族

1.2 产品体系

私人银行的核心产品线包括:

产品类别典型产品技术复杂度
财富管理专属理财产品、基金、结构性产品
财富传承信托、遗产规划、税务筹划很高
境外资产跨境投资、美元资产配置
融资服务私人贷款、股权融资
增值服务艺术收藏、慈善顾问

二、核心业务功能

2.1 客户管理

2.1.1 私人银行客户数据模型

java
/**
 * 私人银行客户
 */
@Entity
@Table(name = "private_bank_client")
public class PrivateBankClient {

    @Id
    @Column(name = "client_id")
    private String clientId;

    @Column(name = "client_number")
    private String clientNumber;  // 客户编号

    @Column(name = "name")
    private String name;

    @Column(name = "id_type")
    private IdType idType;  // 身份证/护照/其他

    @Column(name = "id_number")
    private String idNumber;

    @Column(name = "risk_level")
    private RiskLevel riskLevel;

    @Column(name = "client_segment")
    private ClientSegment segment;  // 钻石/黑金/私人银行

    @Column(name = "relationship_manager_id")
    private String relationshipManagerId;  // 专属客户经理

    @Column(name = "total_assets")
    private BigDecimal totalAssets;  // 总资产

    @Column(name = "status")
    private ClientStatus status;

    @Column(name = "onboarding_date")
    private LocalDate onboardingDate;

    // 家庭成员信息
    @OneToMany(mappedBy = "client")
    private List<FamilyMember> familyMembers;
}

2.1.2 客户分层体系

java
/**
 * 客户分层服务
 */
@Service
public class ClientSegmentationService {

    /**
     * 评估客户等级
     */
    public ClientSegment evaluateSegment(String clientId) {
        PrivateBankClient client = clientRepository.findById(clientId)
            .orElseThrow();

        // 计算可投资资产
        BigDecimal investableAssets = calculateInvestableAssets(client);

        // 根据资产规模确定等级
        if (investableAssets.compareTo(new BigDecimal("10000000")) >= 0) {
            return ClientSegment.PRIVATE;  // 私人银行级
        } else if (investableAssets.compareTo(new BigDecimal("3000000")) >= 0) {
            return ClientSegment.BLACK_GOLD;  // 黑金级
        } else if (investableAssets.compareTo(new BigDecimal("1000000")) >= 0) {
            return ClientSegment.DIAMOND;  // 钻石级
        } else {
            return ClientSegment.STANDARD;
        }
    }

    /**
     * 分配客户经理
     */
    public void assignRelationshipManager(String clientId) {
        PrivateBankClient client = clientRepository.findById(clientId)
            .orElseThrow();

        // 根据客户等级和区域分配客户经理
        String rmId = relationshipManagerService.findAvailableRM(
            client.getSegment(),
            client.getRegion()
        );

        client.setRelationshipManagerId(rmId);
        clientRepository.save(client);
    }
}

2.2 专属理财产品

2.2.1 产品数据模型

java
/**
 * 私人银行专属产品
 */
@Entity
@Table(name = "pb_product")
public class PrivateBankProduct {

    @Id
    @Column(name = "product_id")
    private String productId;

    @Column(name = "product_name")
    private String productName;

    @Column(name = "product_type")
    private ProductType productType;  // 固收/权益/结构化/私募

    @Column(name = "min_investment")
    private BigDecimal minInvestment;  // 最低投资额

    @Column(name = "expected_return")
    private BigDecimal expectedReturn;

    @Column(name = "risk_level")
    private RiskLevel riskLevel;

    @Column(name = "lockup_period")
    private Integer lockupPeriod;  // 锁定期(天)

    @Column(name = "availability")
    private ProductAvailability availability;  // 仅对特定客户开放

    @Column(name = "status")
    private ProductStatus status;
}

2.2.2 私人银行产品销售

java
/**
 * 私人银行产品服务
 */
@Service
public class PrivateBankProductService {

    /**
     * 检查客户是否可购买产品
     */
    public PurchaseCheckResult checkPurchaseEligibility(
            String clientId,
            String productId) {

        PrivateBankClient client = clientRepository.findById(clientId)
            .orElseThrow();

        PrivateBankProduct product = productRepository.findById(productId)
            .orElseThrow();

        List<String> violations = new ArrayList<>();

        // 1. 检查客户等级
        if (client.getSegment().getLevel() < product.getRequiredSegment().getLevel()) {
            violations.add("客户等级不符合要求");
        }

        // 2. 检查最低投资额
        if (product.getMinInvestment() != null) {
            BigDecimal balance = accountService.getInvestmentBalance(clientId);
            if (balance.compareTo(product.getMinInvestment()) < 0) {
                violations.add("可投资资产不足");
            }
        }

        // 3. 检查风险等级匹配
        if (client.getRiskLevel().getLevel() < product.getRiskLevel().getLevel()) {
            violations.add("风险等级不匹配");
        }

        // 4. 检查是否为限制销售地区
        if (product.isRestrictedRegion(client.getRegion())) {
            violations.add("该地区不可销售");
        }

        return PurchaseCheckResult.builder()
            .eligible(violations.isEmpty())
            .violations(violations)
            .build();
    }

    /**
     * 执行产品购买
     */
    @Transactional
    public ProductPurchaseResult purchaseProduct(
            String clientId,
            String productId,
            BigDecimal amount) {

        // 1. 购买前检查
        PurchaseCheckResult check = checkPurchaseEligibility(clientId, productId);
        if (!check.isEligible()) {
            throw new EligibilityException(check.getViolations());
        }

        // 2. 执行购买
        PrivateBankProduct product = productRepository.findById(productId)
            .orElseThrow();

        ProductPurchase purchase = ProductPurchase.builder()
            .purchaseId(generatePurchaseId())
            .clientId(clientId)
            .productId(productId)
            .amount(amount)
            .purchaseDate(LocalDate.now())
            .status(PurchaseStatus.CONFIRMED)
            .build();

        purchaseRepository.save(purchase);

        // 3. 发送确认
        notificationService.sendPurchaseConfirmation(purchase);

        return ProductPurchaseResult.success(purchase);
    }
}

2.3 财富传承

财富传承是私人银行的核心业务之一,涉及信托、遗产规划等复杂产品。

2.3.1 家族信托

java
/**
 * 家族信托服务
 */
@Service
public class FamilyTrustService {

    /**
     * 设立家族信托
     */
    @Transactional
    public TrustCreationResult createTrust(TrustCreationRequest request) {
        // 1. 尽职调查
        performDueDiligence(request.getSettlorId());

        // 2. 信托结构设计
        TrustStructure structure = designTrustStructure(request);

        // 3. 创建信托
        FamilyTrust trust = FamilyTrust.builder()
            .trustNumber(generateTrustNumber())
            .settlorId(request.getSettlorId())
            .trusteeId(request.getTrusteeId())
            .beneficiaries(request.getBeneficiaries())
            .trustType(request.getTrustType())  // 可撤销/不可撤销
            .trustAssets(request.getTrustAssets())
            .purpose(request.getPurpose())
            .status(TrustStatus.ESTABLISHED)
            .establishmentDate(LocalDate.now())
            .build();

        trustRepository.save(trust);

        // 4. 资产转移
        assetTransferService.transferToTrust(trust, request.getTrustAssets());

        // 5. 生成信托文件
        documentService.generateTrustDeeds(trust);

        return TrustCreationResult.success(trust);
    }

    /**
     * 信托收益分配
     */
    @Transactional
    public TrustDistributionResult distributeBenefits(
            String trustId,
            DistributionRequest request) {

        FamilyTrust trust = trustRepository.findById(trustId)
            .orElseThrow();

        // 1. 校验分配条件
        validateDistribution(trust, request);

        // 2. 计算可分配金额
        BigDecimal availableAmount = trustCalculator.calculateAvailableBenefits(trust);

        // 3. 执行分配
        for (Beneficiary beneficiary : request.getBeneficiaries()) {
            BigDecimal amount = calculateBeneficiaryAmount(
                trust,
                beneficiary,
                request.getTotalAmount()
            );

            // 分配给受益人
            paymentService.payToBeneficiary(
                beneficiary.getId(),
                amount,
                "信托分配-" + trust.getTrustNumber()
            );
        }

        // 4. 记录分配
        TrustDistribution distribution = TrustDistribution.builder()
            .trustId(trustId)
            .distributionDate(LocalDate.now())
            .totalAmount(request.getTotalAmount())
            .status(DistributionStatus.COMPLETED)
            .build();

        distributionRepository.save(distribution);

        return TrustDistributionResult.success();
    }
}

2.3.2 遗产规划

java
/**
 * 遗产规划服务
 */
@Service
public class EstatePlanningService {

    /**
     * 创建遗产规划
     */
    @Transactional
    public EstatePlan createPlan(EstatePlanRequest request) {
        // 1. 资产盘点
        List<Asset> assets = assetService盘点客户资产(request.getClientId());

        // 2. 负债评估
        BigDecimal liabilities = liabilityService.评估负债(request.getClientId());

        // 3. 计算净资产
        BigDecimal netWorth = assets.stream()
            .map(Asset::getValue)
            .reduce(BigDecimal.ZERO, BigDecimal::add)
            .subtract(liabilities);

        // 4. 遗产规划建议
        List<EstateSuggestion> suggestions = generateSuggestions(
            netWorth,
            request.getFamilySituation()
        );

        // 5. 创建规划
        EstatePlan plan = EstatePlan.builder()
            .planNumber(generatePlanNumber())
            .clientId(request.getClientId())
            .totalAssets(assets.stream().map(Asset::getValue).reduce(BigDecimal.ZERO, BigDecimal::add))
            .totalLiabilities(liabilities)
            .netWorth(netWorth)
            .suggestions(suggestions)
            .status(PlanStatus.ACTIVE)
            .createDate(LocalDate.now())
            .build();

        planRepository.save(plan);

        return plan;
    }

    /**
     * 遗嘱管理
     */
    @Transactional
    public WillManagementResult manageWill(String clientId, WillDocument will) {
        // 1. 遗嘱起草
        if (will.getType() == WillType.NEW) {
            // 新建遗嘱
            Will newWill = Will.builder()
                .willId(generateWillId())
                .clientId(clientId)
                .content(will.getContent())
                .witnesses(will.getWitnesses())
                .notaryInfo(will.getNotaryInfo())
                .status(WillStatus.ACTIVE)
                .effectiveDate(will.getEffectiveDate())
                .build();

            willRepository.save(newWill);

            // 2. 撤销旧遗嘱(如有)
            willRepository.revokeActiveWills(clientId);

            return WillManagementResult.created(newWill);

        } else if (will.getType() == WillType.AMEND) {
            // 修改遗嘱(追加附言)
            Will existingWill = willRepository.findActiveWill(clientId)
                .orElseThrow(() -> new NoActiveWillException());

            // 追加附言
            existingWill.addCodicil(will.getCodicilContent());
            willRepository.save(existingWill);

            return WillManagementResult.amended(existingWill);
        }

        throw new InvalidWillOperationException();
    }
}

2.4 跨境金融服务

2.4.1 境外资产配置

java
/**
 * 跨境投资服务
 */
@Service
public class CrossBorderService {

    /**
     * 境外投资合规检查
     */
    public CrossBorderCheckResult checkInvestment(String clientId, CrossBorderRequest request) {
        PrivateBankClient client = clientRepository.findById(clientId)
            .orElseThrow();

        List<String> violations = new ArrayList<>();

        // 1. 检查投资额度(境外投资额度限制)
        BigDecimal usedQuota = crossBorderRepository.getUsedQuota(clientId, request.getYear());
        BigDecimal availableQuota = getAvailableQuota(client);

        if (request.getAmount().compareTo(availableQuota) > 0) {
            violations.add("超过境外投资额度");
        }

        // 2. 检查产品是否在白名单
        if (!investmentProductService.isWhitelisted(request.getProductId())) {
            violations.add("产品不在可投白名单");
        }

        // 3. 检查客户风险等级
        if (client.getRiskLevel().getLevel() < request.getRequiredRiskLevel()) {
            violations.add("风险等级不匹配");
        }

        // 4. 检查资金来源
        if (request.isNeedSourceCheck()) {
            boolean sourceVerified = fundSourceService.verifySource(clientId, request.getAmount());
            if (!sourceVerified) {
                violations.add("资金来源待核实");
            }
        }

        return CrossBorderCheckResult.builder()
            .passed(violations.isEmpty())
            .violations(violations)
            .availableQuota(availableQuota)
            .build();
    }

    /**
     * 执行跨境汇款
     */
    @Transactional
    public CrossBorderTransferResult transferAbroad(
            String clientId,
            CrossBorderTransferRequest request) {

        // 1. 额度检查
        CrossBorderCheckResult check = checkInvestment(clientId,
            toCheckRequest(request));

        if (!check.isPassed()) {
            throw new ComplianceException(check.getViolations());
        }

        // 2. 外汇申报
        FXDeclaration declaration = fxDeclarationService.submit(request);

        // 3. 执行汇款
        TransferResult transfer = transferService.execute(
            clientId,
            request.getToAccount(),
            request.getAmount(),
            request.getCurrency()
        );

        // 4. 更新额度使用
        crossBorderRepository.recordUsage(
            clientId,
            request.getAmount(),
            LocalDate.now().getYear()
        );

        return CrossBorderTransferResult.builder()
            .transferId(transfer.getTransferId())
            .declarationId(declaration.getDeclarationId())
            .build();
    }
}

三、数据流转

3.1 私人银行业务数据流

┌────────────┐     ┌─────────────┐     ┌──────────────┐     ┌─────────┐
│  客户关系  │ ──→ │  资产配置  │ ──→ │  产品购买   │ ──→ │  持仓管理│
│            │     │            │     │              │     │         │
└────────────┘     └─────────────┘     └──────────────┘     └─────────┘
      │                                       │
      ▼                                       ▼
┌────────────┐                         ┌──────────────┐
│  客户经理  │                         │  跨境/信托   │
│  工作台   │                         │  特殊处理   │
└────────────┘                         └──────────────┘

3.2 保密数据流

┌──────────────┐     ┌─────────────┐     ┌──────────────┐     ┌─────────┐
│  数据采集   │ ──→ │  权限控制   │ ──→ │  加密存储   │ ──→ │  审计日志│
│              │     │             │     │              │     │         │
└──────────────┘     └─────────────┘     └──────────────┘     └─────────┘

四、技术架构与技术选型

4.1 保密要求

私人银行的数据保密要求最高,技术实现包括:

安全措施实现方式
数据加密AES-256 透明加密
访问控制RBAC + 属性级控制
审计日志全量操作记录
网络隔离专用网络区域
水印屏幕水印+文档水印

4.2 数据加密实现

java
/**
 * 敏感数据加密服务
 */
@Service
public class SensitiveDataEncryptionService {

    @Autowired
    private KeyManagementService kms;

    /**
     * 加密敏感字段
     */
    public <T> T encryptSensitiveFields(T object) {
        Class<?> clazz = object.getClass();

        for (Field field : clazz.getDeclaredFields()) {
            if (field.isAnnotationPresent(Sensitive.class)) {
                try {
                    field.setAccessible(true);
                    Object value = field.get(object);

                    if (value != null) {
                        String encrypted = encrypt(value.toString());
                        field.set(object, encrypted);
                    }
                } catch (Exception e) {
                    throw new EncryptionException("加密字段失败: " + field.getName(), e);
                }
            }
        }

        return object;
    }

    /**
     * 字段级加密
     */
    private String encrypt(String plaintext) {
        // 使用客户专属密钥加密
        String keyId = getCurrentClientKeyId();
        return kms.encrypt(plaintext, keyId);
    }
}

/**
 * 敏感字段注解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Sensitive {
    EncryptionType type() default EncryptionType.AES256;
}

4.3 访问控制

java
/**
 * 私人银行访问控制服务
 */
@Service
public class PrivateBankAccessControlService {

    /**
     * 检查数据访问权限
     */
    public boolean canAccess(String userId, String clientId, AccessType accessType) {
        // 1. 获取用户角色
        User user = userRepository.findById(userId).orElseThrow();

        // 2. 客户经理只能看自己的客户
        if (user.hasRole(Role.RELATIONSHIP_MANAGER)) {
            return isAssignedClient(user.getId(), clientId);
        }

        // 3. 主管可以看全部
        if (user.hasRole(Role.PB_MANAGER)) {
            return true;
        }

        // 4. 合规可以看(脱敏后)
        if (user.hasRole(Role.COMPLIANCE)) {
            return true;
        }

        return false;
    }

    /**
     * 数据脱敏
     */
    public <T> T maskData(T object, AccessType accessType) {
        if (accessType == AccessType.COMPLIANCE_VIEW) {
            // 合规查看:部分敏感字段脱敏
            return maskForCompliance(object);
        }

        return object;
    }
}

五、典型开发场景

5.1 客户经理工作台

java
/**
 * 客户经理工作台服务
 */
@Service
public class RelationshipManagerWorkbenchService {

    /**
     * 获取客户经理仪表盘
     */
    public RMDashboard getDashboard(String rmId) {
        // 1. 获取负责客户列表
        List<PrivateBankClient> clients = clientRepository.findByRMId(rmId);

        // 2. 汇总资产
        BigDecimal totalAUM = clients.stream()
            .map(PrivateBankClient::getTotalAssets)
            .reduce(BigDecimal.ZERO, BigDecimal::add);

        // 3. 近期待办事项
        List<ToDoItem> todos = getPendingTasks(rmId);

        // 4. 产品到期提醒
        List<ProductMaturity> maturities = getUpcomingMaturities(clients);

        // 5. 业绩指标
        PerformanceMetrics metrics = calculatePerformance(rmId, clients);

        return RMDashboard.builder()
            .totalClients(clients.size())
            .totalAUM(totalAUM)
            .pendingTasks(todos)
            .upcomingMaturities(maturities)
            .performanceMetrics(metrics)
            .build();
    }

    /**
     * 客户健康度分析
     */
    public ClientHealthAnalysis analyzeClientHealth(String clientId) {
        PrivateBankClient client = clientRepository.findById(clientId)
            .orElseThrow();

        // 1. 资产变化趋势
        AssetTrend trend = analyzeAssetTrend(clientId);

        // 2. 产品持有分析
        ProductAnalysis productAnalysis = analyzeProductHolding(clientId);

        // 3. 活跃度分析
        ActivityLevel activity = analyzeActivity(clientId);

        // 4. 流失风险评估
        ChurnRisk churnRisk = assessChurnRisk(client, trend, productAnalysis, activity);

        return ClientHealthAnalysis.builder()
            .clientId(clientId)
            .assetTrend(trend)
            .productAnalysis(productAnalysis)
            .activityLevel(activity)
            .churnRisk(churnRisk)
            .recommendations(generateRecommendations(churnRisk))
            .build();
    }
}

5.2 专属活动管理

java
/**
 * 私人银行专属活动服务
 */
@Service
public class ExclusiveEventService {

    /**
     * 创建专属活动
     */
    @Transactional
    public ExclusiveEvent createEvent(ExclusiveEventRequest request) {
        // 1. 校验场地容量
        validateVenueCapacity(request);

        // 2. 筛选目标客户
        List<PrivateBankClient> targetClients = selectTargetClients(
            request.getTargetSegment(),
            request.getInvestmentPreference()
        );

        // 3. 创建活动
        ExclusiveEvent event = ExclusiveEvent.builder()
            .eventNumber(generateEventNumber())
            .eventName(request.getEventName())
            .eventType(request.getEventType())  // 投资沙龙/艺术鉴赏/慈善活动
            .venue(request.getVenue())
            .eventDate(request.getEventDate())
            .targetClients(targetClients)
            .capacity(request.getCapacity())
            .status(EventStatus.OPEN)
            .build();

        eventRepository.save(event);

        // 4. 发送邀请
        invitationService.sendInvitations(event, targetClients);

        return event;
    }

    /**
     * 活动报名
     */
    @Transactional
    public EventRegistration register(String eventId, String clientId) {
        ExclusiveEvent event = eventRepository.findById(eventId)
            .orElseThrow();

        // 检查是否已报名
        if (event.isRegistered(clientId)) {
            throw new AlreadyRegisteredException();
        }

        // 检查容量
        if (event.getRegisteredCount() >= event.getCapacity()) {
            throw new EventFullException();
        }

        // 注册
        EventRegistration registration = EventRegistration.builder()
            .registrationId(generateRegistrationId())
            .eventId(eventId)
            .clientId(clientId)
            .registrationDate(LocalDateTime.now())
            .status(RegistrationStatus.CONFIRMED)
            .build();

        registrationRepository.save(registration);

        event.incrementRegisteredCount();
        eventRepository.save(event);

        return registration;
    }
}

六、业务难点与解决方案

6.1 客户信息保密

问题:如何确保客户信息只在必要范围内可见?

解决方案:多层次访问控制 + 审计

java
/**
 * 敏感信息保护服务
 */
@Service
public class ClientDataProtectionService {

    /**
     * 客户信息分级
     */
    public DataClassification classifyClientData(String clientId) {
        PrivateBankClient client = clientRepository.findById(clientId)
            .orElseThrow();

        // 根据客户等级和资产规模确定数据等级
        if (client.getSegment() == ClientSegment.PRIVATE) {
            return DataClassification.TOP_SECRET;
        } else if (client.getSegment() == ClientSegment.BLACK_GOLD) {
            return DataClassification.SECRET;
        } else {
            return DataClassification.CONFIDENTIAL;
        }
    }

    /**
     * 记录数据访问审计
     */
    public void auditDataAccess(String userId, String clientId, String dataField) {
        DataAccessAudit audit = DataAccessAudit.builder()
            .userId(userId)
            .clientId(clientId)
            .dataField(dataField)
            .accessTime(LocalDateTime.now())
            .ipAddress(getCurrentIp())
            .build();

        auditRepository.save(audit);
    }

    /**
     * 定期审计报告
     */
    public List<AuditReport> generateAccessReports(LocalDate startDate, LocalDate endDate) {
        // 统计敏感数据访问情况
        List<DataAccessAudit> audits = auditRepository
            .findByDateBetween(startDate, endDate);

        // 生成异常访问报告
        return detectAnomalousAccess(audits);
    }
}

6.2 跨境合规

问题:跨境业务涉及多地合规要求

解决方案:规则引擎 + 专家系统

java
/**
 * 跨境合规服务
 */
@Service
public class CrossBorderComplianceService {

    /**
     * 综合合规检查
     */
    public ComplianceCheckResult checkCrossBorderCompliance(
            String clientId,
            CrossBorderTransaction transaction) {

        List<ComplianceViolation> violations = new ArrayList<>();

        // 1. 中国外汇合规
        violations.addAll(checkChinaFXCompliance(clientId, transaction));

        // 2. 香港金管局要求
        violations.addAll(checkHKMACompliance(clientId, transaction));

        // 3. 反洗钱检查
        violations.addAll(checkAML(clientId, transaction));

        // 4. 制裁筛查
        violations.addAll(checkSanctions(clientId, transaction));

        return ComplianceCheckResult.builder()
            .passed(violations.isEmpty())
            .violations(violations)
            .transactionId(transaction.getTransactionId())
            .checkTime(LocalDateTime.now())
            .build();
    }

    /**
     * 中国外汇合规检查
     */
    private List<ComplianceViolation> checkChinaFXCompliance(
            String clientId,
            CrossBorderTransaction transaction) {

        List<ComplianceViolation> violations = new ArrayList<>();

        // 年度总额检查
        BigDecimal annualAmount = crossBorderRepository
            .getAnnualOutflowAmount(clientId);

        if (annualAmount.add(transaction.getAmount())
                .compareTo(new BigDecimal("5000000")) > 0) {
            violations.add(ComplianceViolation.builder()
                .type(ComplianceType.FX_LIMIT)
                .description("年度境外投资额度超限")
                .severity(Severity.HIGH)
                .build());
        }

        // 资金来源检查
        if (transaction.requiresSourceCheck()) {
            boolean verified = fundSourceService.isVerified(clientId);
            if (!verified) {
                violations.add(ComplianceViolation.builder()
                    .type(ComplianceType.FUND_SOURCE)
                    .description("资金来源待核实")
                    .severity(Severity.HIGH)
                    .build());
            }
        }

        return violations;
    }
}

七、合规要求

7.1 保密等级

私人银行客户信息属于最高保密等级:

java
/**
 * 客户信息保密等级
 */
public enum DataClassification {
    TOP_SECRET,    // 极高净值客户
    SECRET,        // 高净值客户
    CONFIDENTIAL,  // 普通私人银行客户
    INTERNAL       // 内部员工信息
}

/**
 * 字段保密级别
 */
public enum FieldClassification {
    EXTREMELY_SENSITIVE,  // 账号、密码等
    SENSITIVE,            // 资产信息、交易记录
    CONFIDENTIAL,         // 基本信息
    PUBLIC                // 可公开信息
}

7.2 反洗钱强化要求

java
/**
 * 私人银行反洗钱服务
 */
@Service
public class PrivateBankAmlService {

    /**
     * 强化尽职调查(EDD)
     */
    public EnhancedDueDiligence performEDD(String clientId) {
        PrivateBankClient client = clientRepository.findById(clientId)
            .orElseThrow();

        EDDResult result = EDDResult.builder()
            .clientId(clientId)
            .investigationDate(LocalDate.now())
            .build();

        // 1. 资金来源核实
        FundSourceVerification sourceVerification = verifyFundSource(client);
        result.setFundSourceVerification(sourceVerification);

        // 2. 财富来源核实
        WealthSourceVerification wealthVerification = verifyWealthSource(client);
        result.setWealthSourceVerification(wealthVerification);

        // 3. 政治敏感人物(PEP)筛查
        boolean isPEP = pepScreeningService.isPEP(client);
        result.setPoliticalExposure(isPEP);

        // 4. 制裁名单筛查
        boolean isSanctioned = sanctionsScreeningService.check(client);
        result.setSanctioned(isSanctioned);

        // 5. 高风险地区关联
        List<String> highRiskRegions = identifyHighRiskRegions(client);
        result.setHighRiskRegions(highRiskRegions);

        // 6. 综合评估
        result.setOverallRisk(riskAssessmentService.assess(result));

        eddRepository.save(result);

        return result;
    }
}

八、常见问题与避坑指南

8.1 客户数据隔离

:客户数据未严格隔离

java
// ✅ 正确做法:数据级别隔离
@Service
public class ClientDataIsolationService {

    // 查询时自动添加客户经理ID过滤
    @FilterDef(name = "clientFilter", parameters = @ParamDef(name = "rmId", type = "string"))
    @Filter(condition = "relationship_manager_id = :rmId", name = "clientFilter")

    public List<PrivateBankClient> findAllByRMId(String rmId) {
        // 自动过滤
    }
}

8.2 操作审计遗漏

:敏感操作未记录审计日志

java
// ✅ 正确做法:AOP切面自动审计
@Aspect
@Component
public class AuditAspect {

    @Around("@annotation(SensitiveOperation)")
    public Object audit(ProceedingJoinPoint joinPoint) throws Throwable {
        // 记录操作前状态
        // 执行操作
        // 记录操作后状态和操作人
    }
}

@SensitiveOperation
public void updateClientInfo(...) { }

九、总结

私人银行业务的技术特点:

  1. 最高保密等级:客户信息严格保密,访问控制精细
  2. 复杂产品:信托、跨境投资等复杂产品
  3. 强合规要求:强化反洗钱、多地合规
  4. 专属服务:客户经理工作台、专属活动

开发建议:

  • 严格遵守保密制度
  • 理解复杂产品逻辑
  • 重视合规审计
  • 提供个性化服务体验

本文档持续更新中,如有疑问欢迎交流讨论。

> 学而时习之,不亦说乎?