gaoluyang
22 小时以前 e71d71bf43c2307c89d3592adf08c1b32fcd0907
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import sys,json
from pathlib import Path
from datetime import datetime
sys.stdout.reconfigure(encoding='utf-8')
ROOT=Path(__file__).resolve().parent
sys.path.insert(0,str(ROOT.parent/'iqc-import-20261012/deps'))
import pymysql
manifest=json.loads((ROOT/'backlog-inserted-ids.json').read_text(encoding='utf-8'))
ids=[r['follow_id'] for r in manifest['records']]
assert len(ids)==1773 and len(set(ids))==len(ids)
args=dict(host='36.213.150.237',port=10000,user='root',password=sys.stdin.readline().strip(),database='mom-hm',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor,autocommit=False,connect_timeout=15,read_timeout=60)
conn=pymysql.connect(**args)
try:
    with conn.cursor() as q:
        q.execute('SELECT DATABASE() db,NOW() now');state=q.fetchone();assert state['db']=='mom-hm'
        clause=','.join(['%s']*len(ids))
        q.execute('SELECT * FROM crm_follow_up_record WHERE id IN ('+clause+') ORDER BY id FOR UPDATE',ids)
        before=q.fetchall();assert len(before)==len(ids)
        for r in before:
            assert r['creator']=='0' and r['type']==5
            assert all(r[field] in ('[]','') for field in ('business_ids','contact_ids','pic_urls'))
        backup=ROOT/('followup-list-repair-backup-'+state['now'].strftime('%Y%m%d-%H%M%S')+'.json')
        backup.write_text(json.dumps(before,ensure_ascii=False,indent=2,default=str),encoding='utf-8')
        q.execute("UPDATE crm_follow_up_record SET business_ids=CASE WHEN business_ids='[]' THEN '' ELSE business_ids END, contact_ids=CASE WHEN contact_ids='[]' THEN '' ELSE contact_ids END, pic_urls=CASE WHEN pic_urls='[]' THEN '' ELSE pic_urls END, update_time=update_time WHERE id IN ("+clause+") AND (business_ids='[]' OR contact_ids='[]' OR pic_urls='[]')",ids)
        changed=q.rowcount
        q.execute('SELECT * FROM crm_follow_up_record WHERE id IN ('+clause+') ORDER BY id',ids)
        after=q.fetchall()
        for old,current in zip(before,after):
            assert all(current[k]==v for k,v in old.items() if k not in ('business_ids','contact_ids','pic_urls'))
            assert all(current[field]=='' for field in ('business_ids','contact_ids','pic_urls'))
        q.execute('SELECT COUNT(*) count FROM system_operate_log WHERE trace_id=%s',(manifest['batch'],));assert q.fetchone()['count']==1773
        conn.commit()
    with pymysql.connect(**args) as verify:
        with verify.cursor() as q:
            q.execute('SELECT * FROM crm_follow_up_record WHERE id IN ('+clause+') ORDER BY id',ids)
            assert q.fetchall()==after
    result=dict(database='mom-hm',repaired_records=changed,records_verified=len(after),committed=True,verified_after_commit=True,backup=str(backup))
    (ROOT/'followup-list-repair-result.json').write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf-8')
    print(json.dumps(result,ensure_ascii=False))
except Exception:
    conn.rollback();raise
finally:conn.close()