PayrollManagementSystem/db/queries/基础数据.sql
liuwenxin f22d14e439 feat(base): 新增基础数据六表及 V4 迁移(人员/辐射区域/拓展计划/产品/客户/归属留痕)
- TPlusSyncMixin 统一 T+ 同步预留四列(可空+普通索引,唯一键待 IT 定键后升级)
- 留痕表实体 ID 无外键冗余固化,删除保护由服务层承担
- init-dev.sql 同步六表 DDL,alembic_version 标记更新

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-13 09:49:05 +08:00

99 lines
3.9 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================================
-- 基础数据查询留档(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;