前情回顾与本节目标

在上一节中,我们完成了智能开票功能,打通了销售前端与财务后端的开票流程。

本节我们将继续完善财务管理模块,实现回款管理功能。在MBA培训业务中,企业客户往往采用分期付款的方式,财务人员需要跟踪每期回款情况、催收逾期款项、登记回款记录。此外,当财务人员离职时,还需要将手中的客户资源和应收账款交接给接手人。

本节核心目标:

  • 数据模型设计:创建回款记录表、分期付款计划表、交接记录表
  • 应收账款驾驶舱:展示总应收、逾期金额、本月到期、回款率、高风险学员等核心指标
  • 分期付款监控:跟踪每期付款状态,支持催收登记和坏账申请
  • 回款登记:财务录入回款信息,上传支付凭证

在这里插入图片描述


第一步:数据模型准备

1.1 回款记录表(MBA_Receivables)

用于记录每一笔回款信息:

字段名称 字段标识 字段类型 说明
记录ID _id 文本 主键,系统自动生成
关联订单 rel_order_id 关联关系 关联 MBA_Orders 表
关联客户 rel_customer_id 关联关系 关联 MBA_Customer 表
关联分期计划 rel_installment_id 关联关系 关联 MBA_InstallmentPlans 表
回款金额 amount 数字 实际回款金额
支付方式 pay_method 枚举 1-银行转账、2-支付宝、3-微信支付、4-现金、5-其他
支付凭证 voucher 文件 支付凭证截图或文件
回款日期 pay_date 日期 回款日期
操作人 rel_operator_id 关联关系 关联 MBA_Users 表(财务人员)
备注 remark 文本 备注信息
创建时间 created_at 日期时间 自动生成
更新时间 updated_at 日期时间 自动更新

1.2 分期付款计划表(MBA_InstallmentPlans)

用于记录订单的分期付款计划:

字段名称 字段标识 字段类型 说明
计划ID _id 文本 主键,系统自动生成
关联订单 rel_order_id 关联关系 关联 MBA_Orders 表
关联客户 rel_customer_id 关联关系 关联 MBA_Customer 表
分期期数 installment_no 数字 第几期(如 1/3)
总期数 total_installments 数字 总分期数
应付金额 amount 数字 本期应付金额
应收日期 due_date 日期 本期应收日期
实收金额 paid_amount 数字 实际已收金额
实收日期 paid_date 日期 实际收款日期
付款状态 status 枚举 1-待支付、2-已支付、3-逾期、4-坏账
逾期天数 overdue_days 数字 逾期天数(自动计算)
责任人 rel_owner_id 关联关系 关联 MBA_Users 表(负责催收的销售)
催收记录 collection_notes 多行文本 催收沟通记录
创建时间 created_at 日期时间 自动生成
更新时间 updated_at 日期时间 自动更新

第二步:应收账款驾驶舱

2.1 创建回款管理页面

点击创建页面图标,输入"回款管理",选择财务布局
在这里插入图片描述

切换到布局管理,选择财务布局,添加平级菜单,添加"回款管理"菜单
在这里插入图片描述

2.2 页面整体布局

切换回页面设计,在财务布局的内容插槽下添加布局组件,修改标题为"回款管理"
在这里插入图片描述

2.3 统计卡片区域

在页面顶部添加网格布局
在这里插入图片描述
选中行组件,设置列的数量为5
在这里插入图片描述
在列里添加卡片组件
在这里插入图片描述

卡片组件分别展示核心指标:

卡片 指标 数据来源
总应收金额 ¥128,500 汇总分期计划表中待支付+逾期金额
逾期金额 ¥45,000 汇总分期计划表中逾期状态的金额
本月到期金额 ¥35,500 汇总分期计划表中本月到期的金额
已回款率 68% 已支付金额 / 总应收金额 × 100%
高风险学员数 8 逾期超过30天且剩余课时少的学员数

创建自定义变量,用来保存统计的结果
在这里插入图片描述

创建自定义方法 loadDashboardData

export default async function loadDashboardData({ event, data }) {
  try {
    // 1. 查询所有分期计划
    const planRes = await $w.cloud.callDataSource({
      dataSourceName: 'MBA_InstallmentPlans',
      methodName: 'wedaGetRecordsV2',
      params: {
        filter: { where: {} },
        select: { $master: true }
      }
    });

    const plans = planRes.records || [];

    // 2. 计算各项指标
    const totalReceivable = plans.reduce((sum, p) => sum + (p.amount || 0), 0);
    const totalPaid = plans
      .filter(p => p.status === '2')
      .reduce((sum, p) => sum + (p.paid_amount || 0), 0);
    const overdueAmount = plans
      .filter(p => p.status === '3')
      .reduce((sum, p) => sum + (p.amount || 0), 0);

    const now = new Date();
    const currentMonth = now.getMonth();
    const currentYear = now.getFullYear();
    const monthDueAmount = plans
      .filter(p => {
        const dueDate = new Date(p.due_date);
        return dueDate.getMonth() === currentMonth && dueDate.getFullYear() === currentYear;
      })
      .reduce((sum, p) => sum + (p.amount || 0), 0);

    const payRate = totalReceivable > 0 ? Math.round((totalPaid / totalReceivable) * 100) : 0;
    const highRiskCount = plans.filter(p => p.overdue_days > 30).length;

    // 3. 更新页面状态
    $w.page.dataset.state.dashboardData = {
      totalReceivable,
      overdueAmount,
      monthDueAmount,
      payRate,
      highRiskCount
    };

  } catch (error) {
    console.error('加载驾驶舱数据失败:', error);
  }
}

在页面加载时调用 loadDashboardData 方法。
在这里插入图片描述
然后给卡片组件对应的文本绑定内容
在这里插入图片描述


第三步:分期付款监控

3.1 数据表格配置

在网格布局继续添加行,在列里添加数据表格组件,数据模型选择分期付款计划表(MBA_InstallmentPlans),勾选全部场景
在这里插入图片描述

3.2 配置筛选条件

在表格上方添加筛选区域,包含以下筛选条件:

  • 学员姓名/电话(文本搜索)
  • 付款状态(下拉选择:待支付/已支付/逾期/坏账)
  • 责任人
  • 逾期天数
    在这里插入图片描述

3.3 配置操作列

在数据表格的操作列配置功能按钮:

按钮名称 功能说明 显示条件
催收登记 记录催收沟通内容 状态 = 待支付 或 逾期
查看订单 跳转到订单详情 全部显示
标记已付 手动标记为已支付 状态 ≠ 已支付
发起坏账申请 标记为坏账 状态 = 逾期
回款登记 记录当期回款情况 状态 = 待支付

在这里插入图片描述

3.4 催收登记功能

在页面组件下添加弹窗组件,修改标题为"催收登记"
在这里插入图片描述
在这里插入图片描述

在弹窗内容区域添加多行文本组件,用于记录催收沟通内容。
在这里插入图片描述

创建自定义方法 submitCollection

export default async function submitCollection({ event, data }) {
  const planId = data.target;
  const collectionNote = $w.textarea_collection.value;

  if (!collectionNote) {
    return $w.utils.showToast({ title: '请填写催收记录', icon: 'error' });
  }

  try {
    $w.utils.showLoading({ title: '保存中...' });

    await $w.cloud.callDataSource({
      dataSourceName: 'MBA_InstallmentPlans',
      methodName: 'wedaUpdateV2',
      params: {
        filter: { where: { _id: { $eq: planId } } },
        data: {
          collection_notes: collectionNote,
          updated_at: Date.now()
        }
      }
    });

    $w.utils.hideLoading();
    $w.utils.showToast({ title: '催收记录已保存', icon: 'success' });
    $w.modal1.close({});
    $w.table1.refresh();

  } catch (error) {
    console.error('保存催收记录失败:', error);
    $w.utils.hideLoading();
    $w.utils.showToast({ title: '保存失败,请重试', icon: 'error' });
  }
}

给催收登记按钮配置点击事件,打开弹窗,传入所在行的数据标识
在这里插入图片描述
给弹窗的确认按钮配置点击事件,调用方法,传入弹窗的入参
在这里插入图片描述

3.5 标记已付功能

创建自定义方法 markAsPaid

export default async function markAsPaid({ event, data }) {
  const planId = data.target._id;

  try {
    $w.utils.showLoading({ title: '处理中...' });

    await $w.cloud.callDataSource({
      dataSourceName: 'MBA_InstallmentPlans',
      methodName: 'wedaUpdateV2',
      params: {
        filter: { where: { _id: { $eq: planId } } },
        data: {
          status: '2',
          paid_date: Date.now(),
          overdue_days: 0,
          updated_at: Date.now()
        }
      }
    });

    $w.utils.hideLoading();
    $w.utils.showToast({ title: '已标记为已支付', icon: 'success' });
    $w.table1.refresh();

  } catch (error) {
    console.error('标记失败:', error);
    $w.utils.hideLoading();
    $w.utils.showToast({ title: '操作失败,请重试', icon: 'error' });
  }
}

给按钮配置点击事件,调用方法,传入所在行的数据标识
在这里插入图片描述


最终效果

财务人员进入回款管理页面,首先看到应收账款驾驶舱的5个核心指标卡片,快速掌握整体回款情况。

在分期付款监控区域,可以按状态、责任人、逾期天数等条件筛选,查看每笔分期付款的详情。对于待支付和逾期的款项,可以进行催收登记;对于已确认收款的,可以标记已付。
在这里插入图片描述


总结

本节完成了回款管理功能的实现:

  1. 数据模型设计:创建回款记录表(MBA_Receivables)、分期付款计划表(MBA_InstallmentPlans)、交接记录表(MBA_Handovers)
  2. 应收账款驾驶舱:5个核心指标卡片,实时掌握回款全貌
  3. 分期付款监控:跟踪每期付款状态,支持催收登记、标记已付

通过本节的学习,我们完善了财务管理的回款流程。下一节我们将继续完善财务管理模块的其他功能。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐