gaoluyang
3 天以前 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
"""Clear remarks on the 23 shipment notice/outbound headers at user request."""
import sys,json
from pathlib import Path
P=Path(__file__).parent
sys.path.insert(0,str(P.parent/'iqc-import-20261012/deps'))
import pymysql
r=json.loads((P/'shipping-complete-result.json').read_text(encoding='utf8'))
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)
backup={};changed={}
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
  for table,key in [('mes_wm_sales_notice','notice_id'),('mes_wm_product_sales','sales_id')]:
   ids=[x[key] for x in r['orders']];assert len(ids)==23 and len(set(ids))==23
   marks=','.join(['%s']*len(ids))
   q.execute('SELECT * FROM '+table+' WHERE deleted=0 AND id IN ('+marks+') ORDER BY id FOR UPDATE',ids);rows=q.fetchall();assert len(rows)==23
   expected={x[key]:x for x in r['orders']}
   for row in rows:assert row['sale_order_id']==expected[row['id']]['order_id'] and row['status']==4
   backup[table]=rows
  path=P/('shipping-remarks-before-'+state['now'].strftime('%Y%m%d-%H%M%S')+'.json')
  path.write_text(json.dumps({'state':state,'tables':backup},ensure_ascii=False,default=str,indent=2),encoding='utf8')
  for table,rows in backup.items():
   ids=[x['id'] for x in rows];marks=','.join(['%s']*len(ids))
   q.execute('UPDATE '+table+' SET remark=NULL,updater=%s,update_time=%s WHERE deleted=0 AND id IN ('+marks+')',['244',state['now'],*ids]);changed[table]=q.rowcount
   q.execute('SELECT * FROM '+table+' WHERE deleted=0 AND id IN ('+marks+') ORDER BY id',ids);after=q.fetchall()
   for old,new in zip(rows,after):
    assert old['id']==new['id'] and new['remark'] is None
    assert {k for k in old if old[k]!=new[k]}<={'remark','updater','update_time'}
  c.commit()
  # Read again after commit, independently of uncommitted writes.
  for table,rows in backup.items():
   ids=[x['id'] for x in rows]
   q.execute('SELECT id,remark FROM '+table+' WHERE deleted=0 AND id IN ('+','.join(['%s']*len(ids))+')',ids)
   after=q.fetchall();assert len(after)==23 and all(x['remark'] is None for x in after)
  result={'committed':True,'verified':True,'at':str(state['now']),'cleared':changed,'backup':path.name,'scope':'发货通知及销售出库单表头备注;明细及其他字段不变'}
  (P/'shipping-remarks-cleared-result.json').write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf8');print(json.dumps(result,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()