<?php
require __DIR__.'/db.php';$report=['lane'=>$lane,'passed'=>false,'HTTP'=>0,'DML'=>0,'DDL'=>0,'actual_business_query_executions'=>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 scope');$nameSha=$lane==='B'?'f483ba1c130ac167b850ae5099196f085b2f5b7db2faf5787a201eb5f7dbf321':'8b7f1416ace012169e9ac5c94fceb49115287a7006c1f0712ebac2d30af000b4';$staffs=array_values(array_filter($q('SELECT ID,UUID,NAME FROM '.$p.'staff WHERE NAME LIKE ?',['CDXPAY%']),static function($r)use($nameSha){return hash('sha256',$r['name'])===$nameSha;}));$check(count($staffs)===1,'Exact marked Staff');$staff=$staffs[0];$users=$q('SELECT ID,UUID,STAFF_UUID,NAME,MOBILE,ACCOUNT,TYPE,IS_DELETE FROM '.$p.'user WHERE STAFF_UUID=? AND IS_DELETE=0',[$staff['uuid']]);$check(count($users)===1&&(int)$users[0]['type']===1&&$users[0]['account']===$staff['name']&&$users[0]['name']===$staff['name'],'Exact marked author/name mapping');$user=$users[0];$check((int)$q('SELECT COUNT(*) AS CNT FROM '.$p.'user WHERE IS_DELETE=0 AND STAFF_UUID<>? AND NAME LIKE ?',['','%'.$user['name'].'%'])[0]['cnt']===1,'Exact nickname LIKE scope unique');
foreach(['user'=>['id','uuid','name','mobile','staff_uuid','is_delete'],'staff_department'=>['staff_uuid','department_uuid'],'department'=>['uuid','name'],'meal_order'=>['id','user_id','is_delete','order_status','bind_time','meal_times','equipment_code','restaurant_id','cash','subsidy','gift','refund_amount','pay_price'],'meal_order_refund'=>['id','user_id','meal_order_id','is_delete']]as $t=>$required){$cols=$lane==='B'?$q('SELECT COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$p.$t]):$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($p.$t)]);$names=array_map(static function($c){return strtolower($c['column_name']);},$cols);$missing=array_values(array_diff($required,$names));$check($missing===[],'Required source columns '.$t);$report['tables'][$t]=['columns'=>array_values(array_filter($cols,static function($c)use($required){return in_array(strtolower($c['column_name']),$required,true);})), 'missing'=>$missing];}
$scopeCount=(int)$q('SELECT COUNT(*) AS CNT FROM '.$p.'meal_order WHERE USER_ID=? AND IS_DELETE=0',[$user['id']])[0]['cnt'];$refundCount=(int)$q('SELECT COUNT(*) AS CNT FROM '.$p.'meal_order_refund WHERE USER_ID=? AND IS_DELETE=0',[$user['id']])[0]['cnt'];$check($scopeCount<=100&&$refundCount<=100,'Own source counts cap100');$save('private-own-reference.json',['staff'=>$staff,'user'=>$user]);$report['scope']=['staff_name_sha256'=>$nameSha,'user_name_sha256'=>hash('sha256',$user['name']),'user_uuid_length'=>strlen($user['uuid']),'matched_users'=>1,'own_order_count'=>$scopeCount,'own_refund_count'=>$refundCount];
require __DIR__.'/init.php';\think\Config::set('database.debug',true);\think\Db::clear();$trace=[];\think\Db::listen(static function($sql)use(&$trace){$trace[]=$sql;});$logic=new \app\p\logic\MealOrder();$report['constructor_SQL']=$trace;$check($trace===[],'Actual constructors no SQL');$model=new \app\model\User();$where=['user.is_delete'=>0,'user.staff_uuid'=>['<>',''],'user.name'=>['like','%'.$user['name'].'%']];$query=$model->alias('user');$compiled=[];$compiled['users']=(clone $query)->where($where)->field(['user.id','user.name','user.mobile','user.staff_uuid'])->order('user.id','asc')->fetchSql(true)->select();$totalWhere=array_merge($where,['meal_order.is_delete'=>0,'meal_order.order_status'=>\app\common\enum\order\OrderStatus::COMPLETED,'meal_order.bind_time'=>['between',['2001-01-01 00:00:00','2001-12-31 23:59:59']]]);$compiled['order_summary']=(clone $query)->join('meal_order meal_order','user.id = meal_order.user_id')->where($totalWhere)->field(['count(*) consume_count','sum(meal_order.cash) cash_amount','sum(meal_order.subsidy) subsidy_amount','sum(meal_order.gift) gift_amount','sum(meal_order.refund_amount) refund_amount','sum(IFNULL(meal_order.pay_price, 0) - IFNULL(meal_order.refund_amount, 0)) pay_amount'])->fetchSql(true)->find();$totalWhere['refund.is_delete']=0;$compiled['refund_summary']=(clone $query)->join('meal_order meal_order','user.id = meal_order.user_id')->join('meal_order_refund refund','meal_order.id = refund.meal_order_id')->where($totalWhere)->field(['count(*) refund_count'])->fetchSql(true)->find();$save('private-compiled-SQL.json',['compiled'=>$compiled,'trace_during_compile'=>$trace]);$report['compiler']=['keys'=>array_keys($compiled),'compiled_sha256'=>array_map(static function($s){return hash('sha256',$s);},$compiled),'all_alias_user_quoted'=>array_map(static function($s){return strpos($s,'`user`')!==false;},$compiled),'raw_user_dot_present'=>array_map(static function($s){return preg_match('/(?<![`A-Za-z_])user\./',$s)===1;},$compiled)];$report['source_SHA']=['Logic'=>hash_file('sha256',__DIR__.'/source/application/p/logic/MealOrder.php'),'Controller'=>hash_file('sha256',__DIR__.'/source/application/p/controller/MealOrder.php'),'TPBuilder'=>hash_file('sha256',$root.'/thinkphp/library/think/db/builder/Mysql.php'),'DMConnector'=>hash_file('sha256',__DIR__.'/source/application/cores/database/Dm.php')];$report['passed']=true;
}catch(Throwable $e){$save('private-metadata-error.json',['class'=>get_class($e),'message'=>$e->getMessage()]);$report['failure']=['class'=>get_class($e),'reason_sha256'=>hash('sha256',$e->getMessage()),'missing_columns'=>$missing??[]];}$save('private-metadata-compile.json',$report);echo json_encode($report,JSON_UNESCAPED_UNICODE),"\n";exit($report['passed']?0:2);
