云
昨天 74b0d9c5ab1dc316b29f8525dcffe45225d4c43c
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
43
44
45
46
47
48
49
50
51
"""Remove generated import explanations while preserving actual business remarks."""
import sys,json,re
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
def clean(table,text):
 if not text:return text
 if table=='crm_contract':
  return re.sub(r'^九月台账补录202609-L\d+,行\d+-\d+;原单[^。]+。含税合并金额[-\d.]+;净税额与合并金额尾差[-\d.]+元,按台账合并金额登记。','',text).strip() or None
 if not text.startswith('九月台账202609-L'):return text
 parts=re.split('[;。]',text)
 prefixes=('九月台账202609-L','原单据号','同号明细归同一订单','关联合并合同','本单净税额与含税金额尾差','合并组分配尾差')
 kept=[p.strip() for p in parts if p.strip() and not p.strip().startswith(prefixes)]
 return ';'.join(kept) or None
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
  before={}
  for t in ['crm_contract','erp_sale_order']:
   q.execute('SELECT * FROM '+t+' WHERE deleted=0 ORDER BY id FOR UPDATE');before[t]=q.fetchall()
  backup=P/('contract-order-remarks-before-'+state['now'].strftime('%Y%m%d-%H%M%S')+'.json')
  backup.write_text(json.dumps({'state':state,'tables':before},ensure_ascii=False,default=str,indent=2),encoding='utf8')
  changes=[];counts={};expected={}
  for t,rows in before.items():
   counts[t]=0
   for old in rows:
    remark=clean(t,old['remark'])
    if remark==old['remark']:continue
    assert not any(w in (remark or '') for w in ['九月台账','报价和合同为反推','同号明细归同一订单','合并组分配尾差'])
    # Preserve the user's previously requested distribution of update timestamps.
    q.execute('UPDATE '+t+' SET remark=%s,updater=%s,update_time=%s WHERE id=%s AND deleted=0',(remark,'291',old['update_time'],old['id']));assert q.rowcount==1
    change={'table':t,'id':old['id'],'no':old['no'],'old_remark':old['remark'],'remark':remark};changes.append(change);expected[(t,old['id'])]=change;counts[t]+=1
  after={}
  for t,rows in before.items():
   q.execute('SELECT * FROM '+t+' WHERE deleted=0 ORDER BY id');newrows=q.fetchall();after[t]=newrows;assert len(rows)==len(newrows)
   for old,new in zip(rows,newrows):
    assert old['id']==new['id'];diff={k for k in old if old[k]!=new[k]};assert diff<=({'remark','updater'} if (t,old['id']) in expected else set()),(t,old['id'],diff)
    if (t,old['id']) in expected:assert new['remark']==expected[(t,old['id'])]['remark']
  c.commit()
  for t,expected_rows in after.items():
   q.execute('SELECT * FROM '+t+' WHERE deleted=0 ORDER BY id');assert q.fetchall()==expected_rows
  result={'committed':True,'verified':True,'at':str(state['now']),'counts':counts,'changes':changes,'backup':backup.name,'update_times_and_other_business_fields_unchanged':True}
  (P/'contract-order-remarks-cleaned-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()