<?php
require __DIR__.'/db.php';$report=['lane'=>$lane,'passed'=>false,'business_DML'=>0,'DDL'=>0,'HTTP'=>0];try{
if($lane==='B')$check(strpos($db->query('SELECT VERSION()')->fetchColumn(),'5.6.')===0,'MySQL5.6');else $check($db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()==='ZHCT_APP','DM identity');
foreach(['member_weight'=>['id','staff_uuid','weight','pbf','ymd','create_time'],'member_weight_status'=>['id','uuid','staff_uuid','status','energy_value','weight','years','create_time','create_by'],'user'=>['id','uuid','name']]as $name=>$required){$table=$p.$name;$cols=$lane==='B'?$q('SELECT COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,EXTRA,DATETIME_PRECISION FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$table]):$q('SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[strtoupper($table)]);$names=array_map(static function($r){return strtolower($r['column_name']);},$cols);$missing=array_values(array_diff($required,$names));$check($missing===[],'Missing source columns '.$name);$report['tables'][$name]=['columns'=>$name==='user'?array_values(array_filter($cols,static function($r)use($required){return in_array(strtolower($r['column_name']),$required,true);})): $cols,'missing'=>$missing];if($name!=='user'){$report['tables'][$name]['total_count']=(int)$q('SELECT COUNT(*) AS CNT FROM '.$table)[0]['cnt'];}}
$groups=[];foreach(['member_weight','member_weight_status']as $t){$groups[$t]=$q('SELECT S.ID,S.UUID,S.NAME,COUNT(W.ID) AS CNT FROM '.$p.'staff S JOIN '.$p.$t.' W ON W.STAFF_UUID=S.UUID WHERE S.NAME LIKE ? GROUP BY S.ID,S.UUID,S.NAME ORDER BY S.ID',['CDX%']);$report['marked_groups'][$t]=array_map(static function($r)use($hash){return ['staff_id'=>$r['id'],'staff_uuid_sha256'=>hash('sha256',$r['uuid']),'name_sha256'=>hash('sha256',$r['name']),'count'=>(int)$r['cnt']];},$groups[$t]);}
$save('private-inventory-groups.json',$groups);$report['passed']=true;
}catch(Throwable $e){$save('private-inventory-error.json',['class'=>get_class($e),'message'=>$e->getMessage()]);$report['failure']=['class'=>get_class($e),'reason_sha256'=>hash('sha256',$e->getMessage())];}$save('private-inventory.json',$report);echo json_encode($report,JSON_UNESCAPED_UNICODE),"\n";exit($report['passed']?0:2);
