鸿蒙金融理财全栈:风控、合规与产品实现
这部分把金融理财项目里最容易被忽略的三块拎出来:风险控制、合规审计和产品创新。代码还是沿着 ArkTS 的分层思路写,接口各自独立,后面接页面时不会互相拖累。
一、风险控制
风控这块别做得太满,核心是把评估、监控、预警拆开。这样一来,规则变了只改对应模块,不用整条链路一起动。
1.1 风险评估
先把用户风险评估封装成一个单例工具类。这里保留异步初始化,是为了避免页面一进来就碰到未初始化的 helper。
// entry/src/main/ets/utils/RiskAssessmentUtil.ets
import risk from '@ohos.risk';
export class RiskAssessmentUtil {
private static instance: RiskAssessmentUtil | null = null;
private riskHelper: risk.RiskHelper | null = null;
static getInstance(): RiskAssessmentUtil {
if (!RiskAssessmentUtil.instance) {
RiskAssessmentUtil.instance = new RiskAssessmentUtil();
}
return RiskAssessmentUtil.instance;
}
async init(): Promise<void> {
if (!this.riskHelper) {
this.riskHelper = risk.createRiskHelper();
}
}
async assessUserRisk(): Promise<risk.RiskAssessmentResult> {
if (!this.riskHelper) return null;
const result = await this.riskHelper.assessUserRisk();
return result;
}
async getUserRiskAssessmentReport(): Promise<risk.UserRiskAssessmentReport> {
if (!this.riskHelper) return null;
const result = await this.riskHelper.getUserRiskAssessmentReport();
return result;
}
}
页面层只负责触发和展示,不把业务逻辑塞进去。初始化放在 aboutToAppear,这是个很普通但省心的处理方式,至少不会在按钮点击时才暴露空指针问题。
// entry/src/main/ets/pages/RiskAssessmentPage.ets
import { RiskAssessmentUtil } from '../utils/RiskAssessmentUtil';
@Entry
@Component
struct RiskAssessmentPage {
@State riskAssessmentResult: risk.RiskAssessmentResult | null = null;
build() {
Column({ space: 16 }) {
Text('风险评估').fontSize(18).fontWeight(FontWeight.Bold).textColor('#000000');
ButtonComponent({
text: '进行风险评估',
onClick: async () => {
await this.assessUserRisk();
},
disabled: false
});
if (this.riskAssessmentResult) {
Text(`风险等级:${this.riskAssessmentResult.riskLevel}`).fontSize(14).textColor('#000000');
Text(`风险得分:${this.riskAssessmentResult.riskScore}`).fontSize(14).textColor('#666666');
Text(`风险描述:${this.riskAssessmentResult.riskDescription}`).fontSize(14).textColor('#666666');
}
}.width('100%').height('100%').padding(16).backgroundColor('#F5F5F5');
}
aboutToAppear() {
RiskAssessmentUtil.getInstance().init();
}
async assessUserRisk(): Promise<void> {
this.riskAssessmentResult = await RiskAssessmentUtil.getInstance().assessUserRisk();
}
}
1.2 风险监控与预警
监控负责盯住产品状态,预警负责把异常抛出来。两层分开写,后面想换通知方式也不用改监控逻辑。
风险监控工具类
// entry/src/main/ets/utils/RiskMonitoringUtil.ets
import monitoring from '@ohos.monitoring';
export class RiskMonitoringUtil {
private static instance: RiskMonitoringUtil | null = null;
private monitoringHelper: monitoring.MonitoringHelper | null = null;
static getInstance(): RiskMonitoringUtil {
if (!RiskMonitoringUtil.instance) {
RiskMonitoringUtil.instance = new RiskMonitoringUtil();
}
return RiskMonitoringUtil.instance;
}
async init(): Promise<void> {
if (!this.monitoringHelper) {
this.monitoringHelper = monitoring.createMonitoringHelper();
}
}
async monitorFinancialProductRisk(): Promise<Array<monitoring.FinancialProductRisk>> {
if (!this.monitoringHelper) return [];
const result = await this.monitoringHelper.monitorFinancialProductRisk();
return result;
}
async getFinancialProductRiskReport(productId: number): Promise<monitoring.FinancialProductRiskReport> {
if (!this.monitoringHelper) return null;
const result = await this.monitoringHelper.getFinancialProductRiskReport(productId);
return result;
}
}
风险预警处理
检测到风险后生成预警记录,用户点开列表项即可处理。这个流程没有什么花活,重点是结果回来后要及时刷新 UI,不然界面会显得'已经处理了但什么也没变'。
// entry/src/main/ets/utils/RiskWarningUtil.ets
import warning from '@ohos.warning';
export class RiskWarningUtil {
private static instance: RiskWarningUtil | null = null;
private warningHelper: warning.WarningHelper | null = null;
static getInstance(): RiskWarningUtil {
if (!RiskWarningUtil.instance) {
RiskWarningUtil.instance = new RiskWarningUtil();
}
return RiskWarningUtil.instance;
}
async init(): Promise<void> {
if (!this.warningHelper) {
this.warningHelper = warning.createWarningHelper();
}
}
async issueRiskWarning(): Promise<Array<warning.RiskWarning>> {
if (!this.warningHelper) return [];
const result = await this.warningHelper.issueRiskWarning();
return result;
}
async handleRiskWarning(warningId: number): Promise<warning.RiskWarningResult> {
if (!this.warningHelper) return null;
const result = await this.warningHelper.handleRiskWarning(warningId);
return result;
}
}
二、合规审计
合规不是摆在那里的说明文档,更多时候是检查、留痕和报告三件事连起来跑。少一步都不完整。
2.1 合规检查与审计
检查偏规则匹配,审计偏过程追溯。把这两类能力包进同样的工具类接口,调用侧会轻很多。
// entry/src/main/ets/utils/ComplianceCheckUtil.ets
import compliance from '@ohos.compliance';
export class ComplianceCheckUtil {
private static instance: ComplianceCheckUtil | null = null;
private complianceHelper: compliance.ComplianceHelper | null = null;
static getInstance(): ComplianceCheckUtil {
if (!ComplianceCheckUtil.instance) {
ComplianceCheckUtil.instance = new ComplianceCheckUtil();
}
return ComplianceCheckUtil.instance;
}
async init(): Promise<void> {
if (!this.complianceHelper) {
this.complianceHelper = compliance.createComplianceHelper();
}
}
async checkFinancialProductCompliance(productId: number): Promise<compliance.ComplianceCheckResult> {
if (!this.complianceHelper) return null;
const result = await this.complianceHelper.checkFinancialProductCompliance(productId);
return result;
}
async getFinancialProductComplianceReport(productId: number): Promise<compliance.ComplianceReport> {
if (!this.complianceHelper) return null;
const result = await this.complianceHelper.getFinancialProductComplianceReport(productId);
return result;
}
}
2.2 合规报告生成
报告生成依赖历史数据,按产品 ID 去查对应档案就行。下载接口也一起保留,后面接导出流程会省很多事。
// entry/src/main/ets/utils/ComplianceReportUtil.ets
import report from '@ohos.report';
export class ComplianceReportUtil {
private static instance: ComplianceReportUtil | null = null;
private reportHelper: report.ReportHelper | null = null;
static getInstance(): ComplianceReportUtil {
if (!ComplianceReportUtil.instance) {
ComplianceReportUtil.instance = new ComplianceReportUtil();
}
return ComplianceReportUtil.instance;
}
async init(): Promise<void> {
if (!this.reportHelper) {
this.reportHelper = report.createReportHelper();
}
}
async generateFinancialProductComplianceReport(productId: number): Promise<report.ComplianceReport> {
if (!this.reportHelper) return null;
const result = await this.reportHelper.generateFinancialProductComplianceReport(productId);
return result;
}
async downloadFinancialProductComplianceReport(productId: number): Promise<report.ComplianceReportDownloadResult> {
if (!this.reportHelper) return null;
const result = await this.reportHelper.downloadFinancialProductComplianceReport(productId);
return result;
}
}
三、产品创新
创新模块主要是给运营和产品配置留出口子:新产品怎么定义、已有产品怎么优化,都从这里走。
3.1 新产品开发
通过表单收集产品名称、预期收益率等信息,再交给创新接口处理。这里的重点不是表单长什么样,而是参数最终能不能稳定地流到后端能力里。
// entry/src/main/ets/utils/ProductInnovationUtil.ets
import innovation from '@ohos.innovation';
export class ProductInnovationUtil {
private static instance: ProductInnovationUtil | null = null;
private innovationHelper: innovation.InnovationHelper | null = null;
static getInstance(): ProductInnovationUtil {
if (!ProductInnovationUtil.instance) {
ProductInnovationUtil.instance = new ProductInnovationUtil();
}
return ProductInnovationUtil.instance;
}
async init(): Promise<void> {
if (!this.innovationHelper) {
this.innovationHelper = innovation.createInnovationHelper();
}
}
async developNewFinancialProduct(productData: innovation.FinancialProductData): Promise<innovation.ProductInnovationResult> {
if (!this.innovationHelper) return null;
const result = await this.innovationHelper.developNewFinancialProduct(productData);
return result;
}
async optimizeExistingFinancialProduct(productId: number, productData: innovation.FinancialProductData): Promise<innovation.ProductInnovationResult> {
if (!this.innovationHelper) return null;
const result = await this.innovationHelper.optimizeExistingFinancialProduct(productId, productData);
return result;
}
}
3.2 推广与优化
产品上线后,持续跟踪效果比'先上再说'更重要。推广和优化拆开,是为了后面能分别看结果,不至于把曝光和效果混成一团。
// entry/src/main/ets/utils/ProductPromotionUtil.ets
import promotion from '@ohos.promotion';
export class ProductPromotionUtil {
private static instance: ProductPromotionUtil | null = null;
private promotionHelper: promotion.PromotionHelper | null = null;
static getInstance(): ProductPromotionUtil {
if (!ProductPromotionUtil.instance) {
ProductPromotionUtil.instance = new ProductPromotionUtil();
}
return ProductPromotionUtil.instance;
}
async init(): Promise<void> {
if (!this.promotionHelper) {
this.promotionHelper = promotion.createPromotionHelper();
}
}
async promoteFinancialProduct(productId: number): Promise<promotion.ProductPromotionResult> {
if (!this.promotionHelper) return null;
const result = await this.promotionHelper.promoteFinancialProduct(productId);
return result;
}
async getFinancialProductPromotionReport(productId: number): Promise<promotion.ProductPromotionReport> {
if (!this.promotionHelper) return null;
const result = await this.promotionHelper.getFinancialProductPromotionReport(productId);
return result;
}
}
四、部署与验证
代码写完以后,还是要回到 DevEco Studio 里跑一遍。金融类项目不太适合只看编译通过,流程能不能闭环更关键。
- 在
entry/src/main/module.json5里补上必要的权限声明,保证风控和审计模块能访问对应系统能力。 - 点击 Build → Build HAP,生成安装包。
- 连接真机运行,逐个验证风险评估、合规报告和产品创新的交互。
我会重点看三件事:风险评估结果是否稳定、合规报告生成是否正常、以及产品数据落库后能不能被再次读取。只要这三步顺了,后面的 UI 微调就只是时间问题。


