- TPlusSyncMixin 统一 T+ 同步预留四列(可空+普通索引,唯一键待 IT 定键后升级) - 留痕表实体 ID 无外键冗余固化,删除保护由服务层承担 - init-dev.sql 同步六表 DDL,alembic_version 标记更新 Co-Authored-By: Claude Code <noreply@anthropic.com>
99 lines
3.9 KiB
SQL
99 lines
3.9 KiB
SQL
-- ============================================================================
|
||
-- 基础数据查询留档(M2 基础数据管理)
|
||
--
|
||
-- 设计要点:
|
||
-- - 人员团队关系用 manager_id 自引用展开(NULL=经理本人或未分配),
|
||
-- M3 经理 12.5% 聚合与 M4 部门汇总均按此关系,无独立团队表
|
||
-- - 归属变更留痕(ownership_change_logs)对客户/业务/人员 ID 为无外键的
|
||
-- 冗余固化:被引用方删除后记录仍须完整可读,join 不到时以固化值为准
|
||
-- - T+ 预留列(source_no 等)当前全部为空,同步模块(M4)上线后启用
|
||
-- ============================================================================
|
||
|
||
-- 1. 人员列表(含岗位名称与直属经理姓名;分页 + 关键字筛选)
|
||
SELECT p.id,
|
||
p.personnel_name,
|
||
p.phone,
|
||
p.hire_date,
|
||
p.is_probation,
|
||
p.salary_standard,
|
||
p.status,
|
||
br.role_name,
|
||
br.role_code,
|
||
m.personnel_name AS manager_name
|
||
FROM personnel p
|
||
JOIN business_roles br ON br.id = p.business_role_id
|
||
LEFT JOIN personnel m ON m.id = p.manager_id
|
||
WHERE (:keyword IS NULL OR p.personnel_name LIKE CONCAT('%', :keyword, '%'))
|
||
AND (:status IS NULL OR p.status = :status)
|
||
ORDER BY p.id DESC
|
||
LIMIT :limit OFFSET :offset;
|
||
|
||
-- 2. 某经理的团队成员(M3 经理 12.5% 聚合的取数口径)
|
||
SELECT p.id, p.personnel_name, p.business_role_id, p.status
|
||
FROM personnel p
|
||
WHERE p.manager_id = :manager_id
|
||
AND p.status = 1;
|
||
|
||
-- 3. 人员的辐射区域与拓展计划(编辑抽屉回显,随人员整表替换维护)
|
||
SELECT region_name, remark
|
||
FROM personnel_regions
|
||
WHERE personnel_id = :personnel_id
|
||
ORDER BY id;
|
||
|
||
SELECT plan_period, plan_content, target_desc, source_no
|
||
FROM personnel_plans
|
||
WHERE personnel_id = :personnel_id
|
||
ORDER BY id;
|
||
|
||
-- 4. 产品目录(名称/规格关键字 + 类别筛选;名称+规格为组合唯一键)
|
||
SELECT id, product_name, spec_model, unit, stock_quantity, sale_price,
|
||
product_category, status
|
||
FROM products
|
||
WHERE (:keyword IS NULL OR product_name LIKE CONCAT('%', :keyword, '%')
|
||
OR spec_model LIKE CONCAT('%', :keyword, '%'))
|
||
AND (:product_category IS NULL OR product_category = :product_category)
|
||
AND (:status IS NULL OR status = :status)
|
||
ORDER BY id DESC
|
||
LIMIT :limit OFFSET :offset;
|
||
|
||
-- 5. 客户列表(公司/负责人关键字 + 分类 + 归属人员筛选)
|
||
SELECT c.id, c.company_name, c.owner_name, c.customer_type, c.status, c.owner_personnel_id,
|
||
p.personnel_name AS owner_personnel_name
|
||
FROM customers c
|
||
LEFT JOIN personnel p ON p.id = c.owner_personnel_id
|
||
WHERE (:keyword IS NULL OR c.company_name LIKE CONCAT('%', :keyword, '%')
|
||
OR c.owner_name LIKE CONCAT('%', :keyword, '%'))
|
||
AND (:customer_type IS NULL OR c.customer_type = :customer_type)
|
||
AND (:owner_personnel_id IS NULL OR c.owner_personnel_id = :owner_personnel_id)
|
||
ORDER BY c.id DESC
|
||
LIMIT :limit OFFSET :offset;
|
||
|
||
-- 6. 归属变更留痕(客户或业务维度;join 人员出姓名,人员已删时显示固化 ID)
|
||
SELECT l.id,
|
||
l.owner_type,
|
||
l.customer_id,
|
||
l.business_id,
|
||
l.old_owner_personnel_id,
|
||
l.new_owner_personnel_id,
|
||
po.personnel_name AS old_owner_name,
|
||
pn.personnel_name AS new_owner_name,
|
||
l.change_reason,
|
||
l.operator_name,
|
||
l.create_time
|
||
FROM ownership_change_logs l
|
||
LEFT JOIN personnel po ON po.id = l.old_owner_personnel_id
|
||
LEFT JOIN personnel pn ON pn.id = l.new_owner_personnel_id
|
||
WHERE (:customer_id IS NULL OR l.customer_id = :customer_id)
|
||
AND (:business_id IS NULL OR l.business_id = :business_id)
|
||
ORDER BY l.create_time DESC, l.id DESC
|
||
LIMIT :limit OFFSET :offset;
|
||
|
||
-- 7. 归属变更留痕(幂等校验辅助:人员删除保护——被归属引用者不可物理删除)
|
||
SELECT COUNT(*) AS ref_count
|
||
FROM customers c
|
||
WHERE c.owner_personnel_id = :personnel_id
|
||
UNION ALL
|
||
SELECT COUNT(*)
|
||
FROM personnel m
|
||
WHERE m.manager_id = :personnel_id;
|