# -*- coding: utf-8 -*- """票 05 前置 DB 探查 v2:交割前提 / 提醒样例 / 导入与待发表现状。""" import json import pymysql CONF = dict(host='8.129.84.155', port=3306, user='root', password='Itc@123456', database='crm', charset='utf8mb4', autocommit=True, connect_timeout=10) ADMIN = '739564171091247104' BUDDY = '744842318024015872' def q(cur, sql, args=None): cur.execute(sql, args or ()) return [dict(r) for r in cur.fetchall()] out = {} conn = pymysql.connect(**CONF) try: cur = conn.cursor(pymysql.cursors.DictCursor) # 1. admin/BUDDY 用户 out['users'] = q(cur, """ SELECT * FROM crm_auth_user WHERE id IN (%s, %s) AND deleted = 0""", (ADMIN, BUDDY)) # 2. 部门全量(本地找 leader 列) out['depts'] = q(cur, "SELECT * FROM sys_dept WHERE deleted = 0 ORDER BY id") # 3. 全部用户(找潜在销售/总监) out['all_users'] = q(cur, """ SELECT id, username, account, dept_id, enabled, employment_status, title FROM crm_auth_user WHERE deleted = 0 ORDER BY id""") # 4. admin/BUDDY 名下客户分布(交割范围) out['owner_dist'] = q(cur, """ SELECT owner_user_id, owner_user_name_snapshot, COUNT(*) cnt, SUM(archive_status = 1) active_cnt FROM customer WHERE deleted = 0 GROUP BY owner_user_id, owner_user_name_snapshot""") # 5. 提醒锚点样例 out['anchor_samples'] = q(cur, """ SELECT id, customer_no, customer_name, owner_user_id, archive_status, last_valid_follow_time, enter_pool_time FROM customer WHERE customer_name LIKE '%%提醒%%' OR customer_name LIKE '%%e2c-跟进%%'""") # 6. customer_pending_notice 现状 + 结构 out['pending_notice_cnt'] = q(cur, "SELECT COUNT(*) cnt FROM customer_pending_notice") out['pending_notice_rows'] = q(cur, "SELECT * FROM customer_pending_notice LIMIT 5") out['pending_notice_cols'] = [c['Field'] for c in q(cur, "SHOW COLUMNS FROM customer_pending_notice")] # 7. dedup / reminder 单例表 out['dedup_rule_tables'] = q(cur, "SHOW TABLES LIKE '%%dedup%%'") out['reminder_rule_tables'] = q(cur, "SHOW TABLES LIKE '%%reminder%%'") for t in out['reminder_rule_tables']: tn = list(t.values())[0] out['reminder_rows_' + tn] = q(cur, f"SELECT * FROM {tn}") # 8. customer_transfer 现状 out['transfers'] = q(cur, """ SELECT id, transfer_no, from_user_id, from_user_name, to_director_id, to_director_name, reason, status, total_count, assigned_count FROM customer_transfer ORDER BY id DESC LIMIT 10""") # 9. seed 商机绑定(经 opportunity_customer 中间表) out['opp_bind'] = q(cur, """ SELECT o.id, o.opp_name, o.opp_status, o.deleted, oc.customer_id, oc.customer_role, oc.delete_key, c.customer_name FROM opportunity o JOIN opportunity_customer oc ON oc.opportunity_id = o.id JOIN customer c ON c.id = oc.customer_id WHERE c.customer_name LIKE '%%e2c%%'""") # 10. 交割样例客户 out['transfer_custs'] = q(cur, """ SELECT id, customer_no, customer_name, owner_user_id, archive_status, last_valid_follow_time FROM customer WHERE customer_name LIKE '%%e2c-交割%%'""") # 11. 导入任务表 out['import_tables'] = q(cur, "SHOW TABLES LIKE '%%import%%'") if any('import_task' in list(t.values())[0] for t in out['import_tables']): out['import_task_cnt'] = q(cur, "SELECT COUNT(*) cnt FROM customer_import_task") # 12. 字典:全拉本地过滤(列名未知,防御式) out['dict_groups'] = q(cur, "SELECT * FROM dict_group WHERE deleted = 0") out['dict_items_all'] = q(cur, "SELECT * FROM dict_item WHERE deleted = 0") finally: conn.close() with open(r'e:\code\crm-backend-matt\.scratch\customer-e2e\db-scout-heavy.json', 'w', encoding='utf-8') as f: json.dump(out, f, ensure_ascii=False, indent=1, default=str) print('OK -> db-scout-heavy.json')