64 lines
2.8 KiB
SQL
64 lines
2.8 KiB
SQL
-- =============================================================
|
|
-- 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=已回款
|