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