记账户与账期关系梳理

正式记账户与账期

1. 核心关系

记账户与账期核心关系

记账户主档:crm_service_bookkeeping

账期/账单表:crm_bookkeeping_order

关系:

crm_service_bookkeeping.id -> 对应多条 -> crm_bookkeeping_order.bka_id

crm_service_bookkeeping.bka_order_id -> 指向当前正在使用的账期 -> crm_bookkeeping_order.id

简单理解:

  • 记账户是一户企业的主档。
  • 账期是这户企业每一段记账服务周期。
  • 一个记账户可以有多条账期。
  • 当前正在使用哪条账期,由记账户表里的 bka_order_id 指向。
  • 当前账期启用后,会把账期里的金额、合同账期、实际账期等字段同步回记账户主档。

2. 状态说明

记账户状态:crm_service_bookkeeping.bka_status

含义
1 正常
2 流失
3 本公司注销
4 欠费
5 未开启
6 禁用

账期状态:crm_bookkeeping_order.status

含义
0 未启用
1 启用中
2 到期
-1 禁用

3. 创建入口

创建记账户入口与落库流程

入口一:记账户列表新增

前端:

src/views/bookkeeping/index.vue

操作链路:

记账户列表 -> 点击新增 -> handleCreate() -> ServiceBka.initData(type=12) -> 提交 -> /api/dingtalk/service_bka/create

后端:

routes/api.php

接口:

POST /api/dingtalk/service_bka/create

对应方法:

BookkeepingController@serviceBkaCreate

入口二:工单/服务详情录入记账户

前端:

src/views/service/components/ServiceDetail.vue

操作链路:

服务详情 -> 点击录入记账户 -> addBka() -> 带入合同记账金额、起止日期、材料费等信息 -> /api/dingtalk/service_bka/create

后端同样走:

BookkeepingController@serviceBkaCreate

4. 创建记账户时做了什么

后端方法:

BookkeepingController@serviceBkaCreate

创建流程:

用户提交记账户表单 -> 校验登录用户 -> 校验重复提交 -> 校验企业名称/税号是否重复 -> 校验记账开始/结束日期 -> 校验工单类型是否允许创建记账户 -> 校验金额是否超过合同金额 -> 创建 crm_service_bookkeeping -> 创建 crm_bookkeeping_order -> 账期默认 status = 0 未启用 -> 回写账期 ID 到记账户 bka_order_id

关键结论:

  • 创建记账户时,会同步创建第一条账期。
  • 但是这条账期默认是未启用状态。
  • 所以:创建记账户不等于启用账期。

5. 账期新增 / 编辑

账期新增编辑启用删除

前端入口:

记账户详情 -> 账期记录 -> 新增账期 / 编辑账期

接口:

POST /api/dingtalk/bookkeeping/post_zhangqi

后端方法:

BookkeepingController@postZhangqi

流程:

点击新增/编辑账期 -> 提交 post_zhangqi -> 校验 edit_zhangqi_user 权限 -> 校验实际账期 real_start_date / real_end_date 是否重叠 -> 判断是新增还是编辑 -> 保存 crm_bookkeeping_order -> 如果编辑的是当前 bka_order_id 对应账期 -> 同步账期字段到记账户主档 -> 写入操作记录 BkaOperationLog

同步字段包括:

字段 含义
contract_bookkeeping_time 记账月数
contract_bookkeeping_song 赠送月数
total_money 总记账费
contract_bookkeeping_start_date 合同账期开始
contract_bookkeeping_end_date 合同账期结束
contract_month_money 月记账费
real_start_date 实际记账开始
real_end_date 实际记账结束
contract_no 合同号
bka_order_id 当前账期 ID

6. 启用账期

前端入口:

记账户详情 -> 账期记录 -> 点击启用

接口:

POST /api/dingtalk/bookkeeping/enable_zhangqi

后端方法:

BookkeepingController@enableZhangqi

流程:

点击启用账期 -> 提交 bka_order_idbka_id -> 校验 edit_zhangqi_user 权限 -> 查询账期 -> 判断账期是否已禁用 -> 校验实际账期是否存在 -> 判断今天是否在实际账期范围内 -> 更新记账户为正常 -> 同步账期字段到记账户主档 -> 更新记账户 bka_order_id -> 更新账期 status = 1 启用 -> 写入操作记录

启用条件:

  • real_start_date 必须存在。
  • real_end_date 必须存在。
  • 今天必须满足:real_start_date <= 今天 <= real_end_date

不满足时:

  • 账期未开始 -> 不允许启用。
  • 账期已过期 -> 不允许启用。
  • 没有实际账期 -> 不允许启用。

启用后结果:

  • 账期 status = 1
  • 记账户 bka_status = 1 正常
  • 记账户主档同步当前账期信息。

7. 删除 / 禁用 / 作废相关

删除账期

前端入口:

记账户详情 -> 账期记录 -> 删除

接口:

POST /api/dingtalk/bookkeeping/del_zhangqi

后端方法:

BookkeepingController@delZhangqi

流程:

点击删除账期 -> 校验 edit_zhangqi_user 权限 -> 删除 crm_bookkeeping_order -> 刷新记账户 remind_renewal_date -> 写入操作记录

说明:

当前主线页面看到的是删除账期,不是软作废。

禁用账期

部分特殊业务会把账期改成 status = -1

典型场景:

D2 特殊回款 / 业绩逻辑

流程:

D2 合同业绩完成 -> 查找该记账户下 status = 0status = 1 的账期 -> 将旧账期改成 status = -1 禁用 -> 创建新账期 -> 新账期直接 status = 1 启用 -> 同步记账户主档

记账户禁用

合同/业绩作废相关逻辑中,可能会禁用记账户。

流程:

合同或业绩作废 -> 找到关联记账户 -> 更新记账户 bka_status = 6 禁用 -> 企业名称追加作废标识 -> 写入操作记录

注意:

这是记账户级别的禁用,不是账期删除。

8. 自动到期与自动启用

自动到期自动续上与续费账期生成

定时任务顺序:

时间 命令 作用
01:00 command:autoChangeBookkeepingStatus 自动处理记账户到期
01:10 command:autoChangeBookkeepingOrderStatus 自动处理账期到期
01:30 command:autoRenewalBookkeepingStatus 自动启用可生效账期

01:00 自动处理记账户到期

命令:

command:autoChangeBookkeepingStatus

逻辑:

查询正常记账户 -> real_end_date < 今天 -> 记账户改为欠费 -> bka_status = 4 -> 当前账期改为到期 -> status = 2

流程:

正常记账户 -> 实际账期已结束 -> 记账户变欠费 -> 当前账期变到期

01:10 自动处理账期到期

命令:

command:autoChangeBookkeepingOrderStatus

逻辑:

查询账期 -> real_end_date < 今天 -> 更新账期 -> status = 2 到期

流程:

账期实际结束日期小于今天 -> 账期状态改为到期

01:30 自动启用可生效账期

命令:

command:autoRenewalBookkeepingStatus

逻辑:

查询未启用账期 -> status = 0 -> 今天在合同账期或实际账期范围内 -> 记账户状态为正常或欠费 -> 判断同一记账户是否已有启用账期 -> 如果已有启用账期,则跳过 -> 如果没有启用账期,则启用当前账期 -> 同步记账户主档 -> 账期 status = 1

流程:

未启用账期 -> 当前日期可生效 -> 记账户正常或欠费 -> 没有其他启用中账期 -> 自动启用 -> 同步记账户 -> 写入系统操作记录

核心规则:

自动任务会先处理到期,再处理续上。所以顺序必须是:

先到期 -> 再启用新账期

如果一个记账户昨天到期,今天凌晨会:

先变欠费 -> 再查是否有新的未启用账期 -> 有则自动启用并恢复正常 -> 没有则保持欠费

9. 总流程汇总

创建记账户 -> 创建第一条未启用账期 -> 人工或定时任务启用账期 -> 启用后同步记账户主档 -> 到期后记账户欠费、账期到期 -> 续费生成新账期 -> 再次人工或自动启用。

作者:wangxuqian  创建时间:2026-02-06 16:55
最后编辑:wangxuqian  更新时间:2026-07-24 15:55