You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
4.6 KiB
116 lines
4.6 KiB
# -*- coding: utf-8 -*-
|
|
"""环境盘点:远程库 8.129.84.155 表结构 + 存量数据清查(票 02 → env-inventory.md)
|
|
坑㉕:每步新连接 autocommit=True;坑㉑:py -X utf8 执行。
|
|
"""
|
|
import sys, io, json
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
|
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, cursorclass=pymysql.cursors.DictCursor)
|
|
|
|
def q(sql, args=None):
|
|
with pymysql.connect(**CONF) as conn, conn.cursor() as cur:
|
|
cur.execute(sql, args)
|
|
return cur.fetchall()
|
|
|
|
# 0) 全表清单
|
|
tables = [r[list(r)[0]] for r in q('SHOW TABLES')]
|
|
print(f'== 全表 {len(tables)} 张 ==')
|
|
groups = {}
|
|
for t in sorted(tables):
|
|
pfx = t.split('_')[0]
|
|
groups.setdefault(pfx, []).append(t)
|
|
for pfx in sorted(groups):
|
|
print(f' [{pfx}] {" ".join(groups[pfx])}')
|
|
|
|
def cnt(t, where='1=1'):
|
|
try:
|
|
return q(f'SELECT COUNT(*) c FROM {t} WHERE {where}')[0]['c']
|
|
except Exception as e:
|
|
return f'ERR:{str(e)[:60]}'
|
|
|
|
# 1) 客户域存量
|
|
print('\n== 客户域计数(total / deleted=0) ==')
|
|
for t in ['customer', 'customer_contact', 'customer_oplog', 'customer_team_member',
|
|
'customer_view_log', 'customer_focus', 'customer_follow',
|
|
'customer_transfer_record', 'customer_import_batch', 'customer_pending_notice']:
|
|
if t in tables:
|
|
print(f' {t}: {cnt(t)} / {cnt(t, "deleted=0")}')
|
|
else:
|
|
print(f' {t}: (表不存在)')
|
|
|
|
# 2) 公海/阶段/归档分布
|
|
print('\n== customer 分布 ==')
|
|
try:
|
|
print(' owner为空(公海):', q("SELECT COUNT(*) c FROM customer WHERE deleted=0 AND owner_user_id IS NULL")[0]['c'])
|
|
print(' 归档分布:', q("SELECT archive_status, COUNT(*) c FROM customer WHERE deleted=0 GROUP BY archive_status"))
|
|
print(' 阶段分布:', q("SELECT customer_stage, COUNT(*) c FROM customer WHERE deleted=0 GROUP BY customer_stage ORDER BY c DESC LIMIT 10"))
|
|
except Exception as e:
|
|
print(' ERR:', str(e)[:120])
|
|
|
|
# 3) e2e 残留
|
|
print('\n== e2e 残留 ==')
|
|
print(' 客户 KH202609%:', cnt("customer", "customer_no LIKE 'KH202609%'"))
|
|
print(' 客户名 e2e%:', cnt("customer", "customer_name LIKE 'e2e%'"))
|
|
if 'opportunity' in tables:
|
|
namecol = 'name'
|
|
try:
|
|
q(f'SELECT {namecol} FROM opportunity LIMIT 1')
|
|
except Exception:
|
|
namecol = 'opportunity_name'
|
|
try:
|
|
print(f' 商机({namecol}) e2e-%:', q(f"SELECT COUNT(*) c FROM opportunity WHERE {namecol} LIKE 'e2e-%'")[0]['c'])
|
|
except Exception as e:
|
|
print(' 商机 ERR:', str(e)[:80])
|
|
print(' opportunity_customer:', cnt('opportunity_customer'))
|
|
print(' opportunity_customer delete_key=0:', cnt('opportunity_customer', 'delete_key=0'))
|
|
|
|
# 4) 用户/部门/角色
|
|
print('\n== 用户/部门/角色 ==')
|
|
for t in tables:
|
|
if t.endswith('_user') or t in ('sys_user', 'crm_user'):
|
|
cols = [r['Field'] for r in q(f'SHOW COLUMNS FROM {t}')]
|
|
print(f' {t} 列: {cols}')
|
|
break
|
|
try:
|
|
rows = q("SELECT id, name, dept_id FROM sys_user WHERE deleted=0 LIMIT 20") if 'sys_user' in tables else []
|
|
for r in rows:
|
|
print(f" user {r['id']} {r['name']} dept={r['dept_id']}")
|
|
except Exception as e:
|
|
print(' user ERR:', str(e)[:120])
|
|
try:
|
|
rows = q("SELECT id, name, parent_id FROM sys_dept WHERE deleted=0 ORDER BY id LIMIT 30") if 'sys_dept' in tables else []
|
|
for r in rows:
|
|
print(f" dept {r['id']} {r['name']} parent={r['parent_id']}")
|
|
except Exception as e:
|
|
print(' dept ERR:', str(e)[:120])
|
|
# debug 用户角色
|
|
try:
|
|
rows = q("SELECT ur.role_id, r.code, r.name FROM sys_user_role ur JOIN sys_role r ON r.id=ur.role_id WHERE ur.user_id='739564171091247104'")
|
|
print(' debug用户角色:', rows)
|
|
except Exception as e:
|
|
print(' role ERR:', str(e)[:120])
|
|
|
|
# 5) 字典
|
|
print('\n== 字典 ==')
|
|
dict_tables = [t for t in tables if 'dict' in t]
|
|
print(' 字典表:', dict_tables)
|
|
for t in dict_tables:
|
|
print(f' {t}: {cnt(t)}')
|
|
try:
|
|
rows = q("SELECT group_code, COUNT(*) c FROM sys_dict_item WHERE deleted=0 GROUP BY group_code ORDER BY group_code") if 'sys_dict_item' in tables else []
|
|
print(f' 字典组 {len(rows)} 组:', [(r['group_code'], r['c']) for r in rows])
|
|
except Exception as e:
|
|
print(' dict ERR:', str(e)[:120])
|
|
|
|
# 6) 客户域外键口径(opportunity_customer 结构)
|
|
print('\n== opportunity_customer 结构 ==')
|
|
try:
|
|
for r in q('SHOW COLUMNS FROM opportunity_customer'):
|
|
print(f" {r['Field']} {r['Type']}")
|
|
except Exception as e:
|
|
print(' ERR:', str(e)[:120])
|
|
|
|
print('\nDONE')
|
|
|