"""Remove only the explicitly requested leading contract-name prefix."""
|
import sys,json
|
from pathlib import Path
|
P=Path(__file__).parent
|
sys.stdout.reconfigure(encoding='utf8')
|
sys.path.insert(0,str(P.parent/'iqc-import-20261012/deps'))
|
import pymysql
|
prefix='九月台账-'
|
c=pymysql.connect(host='36.213.150.237',port=10000,user='root',password=sys.stdin.readline().strip(),database='mom-hm',charset='utf8mb4',autocommit=False,cursorclass=pymysql.cursors.DictCursor)
|
try:
|
with c.cursor() as q:
|
q.execute('SELECT DATABASE() db,NOW() now,GET_LOCK(%s,10) locked',('sales-ledger-202609',));state=q.fetchone();assert state['db']=='mom-hm' and state['locked']==1
|
q.execute('SELECT * FROM crm_contract WHERE deleted=0 ORDER BY id FOR UPDATE');before=q.fetchall()
|
selected=[r for r in before if str(r['name'] or '').startswith(prefix)]
|
path=P/('contract-name-prefix-before-'+state['now'].strftime('%Y%m%d-%H%M%S')+'.json')
|
path.write_text(json.dumps({'state':state,'contracts':before},ensure_ascii=False,default=str,indent=2),encoding='utf8')
|
changes=[]
|
for old in selected:
|
name=old['name'][len(prefix):];assert name.strip(),('Empty contract name',old['id'])
|
q.execute('UPDATE crm_contract SET name=%s,updater=%s,update_time=%s WHERE id=%s AND deleted=0 AND name=%s',(name,'291',state['now'],old['id'],old['name']));assert q.rowcount==1
|
changes.append({'id':old['id'],'old_name':old['name'],'new_name':name})
|
q.execute('SELECT * FROM crm_contract WHERE deleted=0 ORDER BY id');after=q.fetchall();changed={x['id']:x for x in changes}
|
assert len(before)==len(after)
|
for old,new in zip(before,after):
|
assert old['id']==new['id'];diff={k for k in old if old[k]!=new[k]}
|
assert diff<=({'name','updater','update_time'} if old['id'] in changed else set())
|
if old['id'] in changed:assert new['name']==changed[old['id']]['new_name']
|
c.commit()
|
q.execute('SELECT * FROM crm_contract WHERE deleted=0 ORDER BY id');assert q.fetchall()==after
|
result={'committed':True,'verified':True,'at':str(state['now']),'removed_prefix':prefix,'count':len(changes),'changes':changes,'backup':path.name,'other_contract_fields_unchanged':True}
|
(P/'contract-name-prefix-result.json').write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf8')
|
print(json.dumps({k:v for k,v in result.items() if k!='changes'},ensure_ascii=False))
|
except Exception:c.rollback();raise
|
finally:
|
with c.cursor() as q:q.execute('SELECT RELEASE_LOCK(%s)',('sales-ledger-202609',))
|
c.close()
|