-- ============================================================= -- CRM 逾期(overdue)判定与索引 -- 说明: -- 逾期以「当前日期」实时判定,无需新增存储字段。 -- 前端在列表/详情中展示「逾期 N 天」标签,规则如下: -- - 项目 : 结束日期(end_date) < 今天 且 状态 != 已完成(3) -- - 合同 : 到期日期(expire_date) < 今天 且 状态 != 已完成(2) / 已作废(3) -- - 回款明细: 计划回款日期(plan_date) < 今天 且 明细状态 != 已回款(3) -- 本脚本仅补充判定所需的日期索引,并给出等价 SQL 供统计/定时任务使用。 -- ============================================================= -- 1) 项目:结束日期索引(逾期判定 + 按结束日期排序) ALTER TABLE `yz_backend_crm_project` ADD INDEX `idx_end_date` (`end_date`); -- 2) 合同:到期日期索引(逾期判定 + 按到期日期排序) ALTER TABLE `yz_backend_crm_contract` ADD INDEX `idx_expire_date` (`expire_date`); -- 3) 回款明细逾期:plan_date 内嵌于 items(JSON),无法建单列索引。 -- 如需按「逾期回款明细」做服务端统计,建议将回款明细拆为独立子表 -- (如 yz_backend_crm_payback_item,含 plan_date DATE 列),再建索引。 -- 当前版本逾期在应用层(前端/接口)实时计算,items 已含 plan_date。 -- ============================================================= -- 等价查询(统计「逾期」记录,供运营/定时任务参考) -- 注意:DATE(end_date) < CURDATE() 表示「结束日期在今天之前」。 -- ============================================================= -- 逾期项目(结束日期已过且未完成) SELECT id, project_name, end_date, status FROM `yz_backend_crm_project` WHERE `delete_time` IS NULL AND `end_date` IS NOT NULL AND DATE(`end_date`) < CURDATE() AND `status` <> 3; -- 3=已完成 -- 逾期合同(到期日期已过且非已完成/已作废) SELECT id, contract_name, expire_date, status FROM `yz_backend_crm_contract` WHERE `delete_time` IS NULL AND `expire_date` IS NOT NULL AND DATE(`expire_date`) < CURDATE() AND `status` NOT IN (2, 3); -- 2=已完成, 3=已作废 -- 逾期回款明细(MySQL 5.7+ 可用 JSON 函数;低版本建议在应用层计算) -- 列出「存在任一逾期明细」的回款计划 SELECT p.id, p.contract_name, j.seq, j.name, j.plan_date, j.status FROM `yz_backend_crm_payback` p, JSON_TABLE( p.items, '$[*]' COLUMNS ( seq INT PATH '$.seq', name VARCHAR(100) PATH '$.name', plan_date DATE PATH '$.plan_date', status INT PATH '$.status' ) ) j WHERE p.`delete_time` IS NULL AND j.plan_date IS NOT NULL AND DATE(j.plan_date) < CURDATE() AND j.status <> 3; -- 3=已回款