"""Remove placeholder labels without inventing measurement or sampling facts.""" 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 assert not (P/'display-labels-result.json').exists(),'Already processed.' preview=json.loads((P/'display-labels-preview.json').read_text(encoding='utf8')) mapping={'演示:符合现有方案描述(非真实实测)':'待复核','演示样品,非真实质检记录':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("SET time_zone='+08:00'") q.execute('SELECT DATABASE() db,NOW() now,GET_LOCK(%s,10) locked',('quality-indicator-20261014',));state=q.fetchone();assert state['db']=='mom-hm' and state['locked']==1 tables=sorted({x['table'] for x in preview});before={} for t in tables: q.execute('SELECT * FROM '+t+' WHERE deleted=0 ORDER BY id FOR UPDATE');before[t]=q.fetchall() backup=P/('display-labels-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') expected={};counts={};changes=[] for batch in preview: t=batch['table'];col=batch['column'];live={x['id']:x for x in before[t]};groups={} assert col in {'value','sampling_location','check_method'} for p in batch['rows']: old=live[p['id']];assert old[col]==p['value'] and p['value'] in mapping new=mapping[p['value']];groups.setdefault(new,[]).append(p['id']);expected.setdefault((t,p['id']),{})[col]=new changes.append({'table':t,'id':p['id'],'field':col,'old':p['value'],'new':new}) counts[t+'.'+col]=len(batch['rows']) for new,ids in groups.items(): q.execute('UPDATE '+t+' SET `'+col+'`=%s,updater=%s,update_time=update_time WHERE deleted=0 AND id IN ('+','.join(['%s']*len(ids))+')',[new,'289',*ids]);assert q.rowcount==len(ids) after={} for t,rows in before.items(): q.execute('SELECT * FROM '+t+' WHERE deleted=0 ORDER BY id');after[t]=q.fetchall();assert len(rows)==len(after[t]) for old,new in zip(rows,after[t]): assert old['id']==new['id'];updates=expected.get((t,old['id']),{});diff={k for k in old if old[k]!=new[k]};assert diff<=(set(updates)|{'updater'} if updates else set()) for col,val in updates.items():assert new[col]==val c.commit() for t,rows in after.items(): q.execute('SELECT * FROM '+t+' WHERE deleted=0 ORDER BY id');assert q.fetchall()==rows result={'committed':True,'verified':True,'at':str(state['now']),'count':len(changes),'counts':counts,'changes':changes,'backup':backup.name,'numeric_measurements_states_relations_and_times_unchanged':True} (P/'display-labels-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)',('quality-indicator-20261014',)) c.close()