记账户与账期关系梳理
正式记账户与账期
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_id 和 bka_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 = 0 或 status = 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-07-24 15:55