<?php
function independentDTO($case,$scope,$snap){global $runtime,$dm;$l=$case['label'];$uid=actor()['user_id'];$custom=['success'=>'true','message'=>'ok','code'=>strpos($l,'SPORTS')!==false?10000:'10000'];if($l==='R1_SPORTS_RECORD'){ck($snap['own_sessions']===[],'This literal dataset is empty-only; no invented nonempty oracle');$custom['data']=['hasNextPage'=>false,'list'=>[]];return $custom;}if($l==='R2_SPORTS_TOTAL'){ck($snap['own_sessions']===[],'Genuine empty-only source total');$custom['data']=['duration'=>0,'calorie'=>0,'distance'=>0,'number'=>0];return $custom;}if(strpos($l,'RANK')!==false){$sessions=[];foreach($snap['global_sessions'] as $s)$sessions[$s['session_id']]=$s;$staff=[];foreach($snap['rank_staff_max'] as $s)$staff[(string)$s['ai_user_id']]=$s;$sum=[];$daySum=[];foreach($snap['health'] as $r){if($r['metric_code']!=='activity_duration'||!isset($sessions[$r['session_id']]))continue;$id=(string)$r['ai_user_id'];$time=substr($r['start_time'],0,19);$val=(float)$r['value'];if($time>='2026-01-01 00:00:00'&&$time<='2026-12-31 23:59:59')$sum[$id]=($sum[$id]??0)+$val;if(substr($time,0,10)===$scope['day'])$daySum[$id]=($daySum[$id]??0)+$val;}if($l==='R3_RANK_CURRENT'){$mine=(int)(($sum[(string)$uid]??0)*max(1,(int)($staff[(string)$uid]['staff_rows']??0)));$greater=count(array_filter($sum,static function($v)use($mine){return $v>$mine;}));$custom['data']=['userId'=>(string)$uid,'nickname'=>isset($sum[(string)$uid])?(string)($staff[(string)$uid]['nickname']??''):'','avatarUrl'=>'','value'=>$mine,'rankNo'=>$greater+1];}else{$list=[];foreach($daySum as $id=>$value)$list[]=['userId'=>(string)$id,'nickname'=>(string)($staff[(string)$id]['nickname']??''),'avatarUrl'=>'','value'=>(int)($value*max(1,(int)($staff[(string)$id]['staff_rows']??0)))];usort($list,static function($a,$b){return $b['value']<=>$a['value'];});$vals=array_column($list,'value');ck(count($vals)===count(array_unique($vals)),'No unspecified equal-value ordering in selected literal rank sample');foreach($list as $i=>&$r)$r['rankNo']=$i+1;unset($r);$custom['data']=$list;}return $custom;}
if($scope['sign_negative'])return ['message'=>'打卡活动不存在','status'=>500,'data'=>[]];$schema=json_decode(file_get_contents($runtime.'/sign-schema.json'),true);$detail=[];$hidden=['store_id','is_delete','create_by','create_time','update_time'];foreach($schema['sign_action'] as $c){$n=strtolower($c['column_name']);if(in_array($n,$hidden,true))continue;$v=$snap['sign'][0][$n];if($dm&&in_array($n,['start_time','end_time'],true)&&is_string($v)&&preg_match('/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})\.0{1,6}$/D',$v,$m)&&checkdate((int)$m[2],(int)$m[3],(int)$m[1])&&(int)$m[4]<24&&(int)$m[5]<60&&(int)$m[6]<60)$v=substr($v,0,19);$detail[$n]=$v;}$addresses=[];foreach($snap['address'] as $row){$a=[];foreach($schema['sign_address'] as $c){$n=strtolower($c['column_name']);if(!in_array($n,['is_delete','create_by','create_time','update_time'],true))$a[$n]=$row[$n];}$addresses[]=$a;}$detail['addressList']=$addresses;$files=[];foreach($snap['files'] as $f)$files[$f['file_id']]=($f['storage']==='local'?'http://customer-fast5.invalid/uploads':$f['domain']).'/'.$f['file_path'];$detail['cover_img_url']=$files[$detail['cover_img_id']]??'';$detail['rule_img_url']=$files[$detail['rule_img_id']]??'';return ['status'=>200,'message'=>'success','data'=>['detail'=>$detail]];
}
function checkDTO($label,$r){global $runtime;$actual=json_decode($r['raw_response_body'],true,512,JSON_THROW_ON_ERROR);$expected=json_decode(file_get_contents($runtime.'/expected-DTO.json'),true)[preg_replace('/_RETEST$/D','',$label)];ck($r['http_status']===200,'Original HTTP status200 including documented negative business status');$trace=null;if(isset($actual['trace_id'])){$trace=$actual['trace_id'];ck(is_string($trace)&&preg_match('/^[0-9a-f]{13}$/D',$trace),'Original dynamic trace type');unset($actual['trace_id']);}ck(json_encode($actual,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)===json_encode($expected,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES),'Entire prefrozen envelope/DTO fields/types/array and sourceobject order');saveOnce('oracle-'.$label.'.json',['expected_full_DTO_except_dynamic_trace'=>$expected,'actual_full_DTO_except_dynamic_trace'=>$actual,'full_typed_ordered_DTO'=>true,'trace_id'=>$trace,'negative'=>($expected['status']??200)===500,'empty_only'=>in_array($label,['R1_SPORTS_RECORD','R2_SPORTS_TOTAL'],true)]);
}
