import sys,json
|
from pathlib import Path
|
from datetime import datetime
|
from collections import defaultdict
|
sys.stdout.reconfigure(encoding='utf-8')
|
sys.path.insert(0,str(Path(__file__).parent/'iqc-import-20261012/deps'))
|
import pymysql
|
apply='--apply' in sys.argv
|
tables=['mes_pro_work_order','mes_pro_work_order_process','mes_pro_route_product','mes_pro_route_process','mes_md_workstation','mes_md_workstation_machine','mes_dv_machinery','mes_pro_task']
|
with pymysql.connect(host='36.213.150.237',port=10000,user='root',password=sys.stdin.readline().strip(),database='mom-hm',charset='utf8mb4',connect_timeout=15,cursorclass=pymysql.cursors.DictCursor) as c:
|
with c.cursor() as q:
|
q.execute('SELECT DATABASE() db');assert q.fetchone()['db']=='mom-hm'
|
data={}
|
for t in tables:
|
q.execute('SELECT * FROM '+t+' WHERE deleted=0 ORDER BY id'+(' FOR UPDATE' if apply else ''))
|
data[t]=q.fetchall()
|
links=defaultdict(set)
|
for r in data['mes_md_workstation_machine']:links[r['workstation_id']].add(r['machinery_id'])
|
for m in data['mes_dv_machinery']:
|
if m['workstation_id']:links[m['workstation_id']].add(m['id'])
|
needed_processes=set()
|
orders=[o for o in data['mes_pro_work_order'] if o['status']==1 and o['type']==1]
|
for o in orders:
|
processes=[p for p in data['mes_pro_work_order_process'] if p['work_order_id']==o['id']]
|
if not processes:
|
route=o['route_id']
|
if not route:
|
relations=[r for r in data['mes_pro_route_product'] if r.get('item_id')==o['product_id']]
|
route=relations[0]['route_id'] if relations else None
|
processes=[p for p in data['mes_pro_route_process'] if p['route_id']==route]
|
needed_processes.update(p['process_id'] for p in processes)
|
needed=set().union(*(links[s['id']] for s in data['mes_md_workstation'] if s['status']==0 and s['process_id'] in needed_processes))
|
active=[t for t in data['mes_pro_task'] if t['status'] not in (4,5)]
|
occupied=set().union(*(links[t['workstation_id']] for t in active)) if active else set()
|
changes=[m for m in data['mes_dv_machinery'] if m['id'] in needed-occupied and m['status']==2]
|
print(json.dumps({'confirmedOrders':len(orders),'neededMachines':len(needed),'preservedOccupied':sorted(needed&occupied),'changeToStopped':[{'id':m['id'],'name':m['name']} for m in changes]},ensure_ascii=False))
|
if apply:
|
out=Path(__file__).parent/'schedule-diagnosis-20261015';out.mkdir(exist_ok=True)
|
stamp=datetime.now().strftime('%Y%m%d%H%M%S')
|
(out/f'machines-before-{stamp}.json').write_text(json.dumps(changes,ensure_ascii=False,default=str,indent=2),encoding='utf-8')
|
for m in changes:
|
q.execute('UPDATE mes_dv_machinery SET status=1,update_time=NOW() WHERE id=%s AND deleted=0 AND status=2',(m['id'],));assert q.rowcount==1
|
q.execute('SELECT * FROM mes_dv_machinery WHERE deleted=0 ORDER BY id')
|
after={m['id']:m for m in q.fetchall()}
|
changed={m['id'] for m in changes}
|
for old in data['mes_dv_machinery']:
|
new=after[old['id']]
|
if old['id'] in changed:
|
assert new['status']==1
|
assert {k:v for k,v in old.items() if k not in ('status','update_time')}=={k:v for k,v in new.items() if k not in ('status','update_time')}
|
else:assert new==old
|
c.commit()
|
print(json.dumps({'updated':len(changes),'preservedOccupied':len(needed&occupied),'verified':True}))
|