优化合同个管理和产品管理相关功能

This commit is contained in:
2026-09-12 23:29:45 +08:00
parent 2b1874943f
commit 4455b95e37
92 changed files with 5367 additions and 3144 deletions
+63
View File
@@ -0,0 +1,63 @@
-- =============================================================
-- 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=已回款