<?php
declare(strict_types=1);
$root=$argv[1]??'';$module=$argv[2]??'';$family=$argv[3]??'';if(!in_array($module,['store','terminal'],true)||!in_array($family,['delivery','refund'],true))exit(78);
$timezone=$argv[4]??'UTC';if(!in_array($timezone,['UTC','Asia/Shanghai'],true))exit(78);date_default_timezone_set($timezone);
function getStoreId():int{return 2147001111;}
function app_name():string{return 'store';}
$GLOBALS['related_schema']=json_decode(file_get_contents(__DIR__.'/structure-B.json'),true)['tables'];
require $root.'/vendor/autoload.php';spl_autoload_register(static function($class)use($root){foreach(['app\\'=>'app/','cores\\'=>'cores/'] as $prefix=>$dir)if(strpos($class,$prefix)===0){$f=$root.'/'.$dir.str_replace('\\','/',substr($class,strlen($prefix))).'.php';if(is_file($f))require $f;}},true,true);require $root.'/app/common/database/DmBuilder.php';require $root.'/app/'.$module.'/common.php';if(getenv('RELATED_MODEL_FILE'))require getenv('RELATED_MODEL_FILE');
class OrderReadSqlCapture extends \think\db\connector\Mysql{
 public array $sql=[];public array $values=[];public string $selectKind='list';
 public function connect(array $config=[],$linkNum=0,$autoConnection=false):\PDO{throw new RuntimeException('No PDO in SQL source capture');}
 public function getFields(string $tableName):array{$name=trim(str_replace(['yoshop_','`','"'],'',$tableName));$r=[];if(!isset($GLOBALS['related_schema'][$name]))throw new RuntimeException('Unfrozen table '.$name);foreach($GLOBALS['related_schema'][$name]['columns'] as $c)$r[$c['column_name']]=['name'=>$c['column_name'],'type'=>$c['column_type'],'primary'=>$c['extra']==='auto_increment','autoinc'=>false];return $r;}
 private function capture(\think\db\BaseQuery $q,string $kind,bool $one=false):void{$q->parseOptions();$this->sql[$kind]=$this->getBuilder()->select($q,$one);$this->values[$kind]=array_map(static function($b){return $b[0];},$q->getBind(false));}
 public function value(\think\db\BaseQuery $q,string $field,$default=null,bool $one=true){$options=$q->parseOptions();$old=$options['field']??null;$q->setOption('field',(array)$field);$this->capture($q,'count',$one);if($old!==null)$q->setOption('field',$old);else $q->removeOption('field');return 1;}
 public function select(\think\db\BaseQuery $q):array{$this->capture($q,$this->selectKind);return [];}
 public function find(\think\db\BaseQuery $q):array{$this->capture($q,'detail',true);return [];}
}
$literal="order.user 中文' \\";$out=['module'=>$module,'family'=>$family,'PDO_opens'=>0,'SQL_executed'=>0,'source_sha256'=>[],'dialects'=>[]];
foreach(['mysql'=>\think\db\builder\Mysql::class,'dm'=>\app\common\database\DmBuilder::class] as $dialect=>$builder){\cores\BaseModel::$storeId=2147001111;$db=new \think\DbManager();$db->setConfig(['default'=>'mysql','connections'=>['mysql'=>['type'=>'\\'.OrderReadSqlCapture::class,'builder'=>$builder,'prefix'=>'yoshop_','fields_strict'=>false]]]);$class='app\\'.$module.'\\model\\'.($family==='delivery'?'order\\Delivery':'OrderRefund');$file=(new ReflectionClass($class))->getFileName();$out['source_sha256'][substr($file,strlen($root)+1)]=hash_file('sha256',$file);$model=new $class;$params=['searchType'=>10,'searchValue'=>$literal,'refundType'=>20,'refundStatus'=>10,'betweenTime'=>['2026-10-01','2026-10-11']];$model->getList($params);$cap=$db->connect('mysql');if($family==='delivery')$class::detail(123);else $model->getDetail(123);$out['dialects'][$dialect]=['sql'=>$cap->sql,'binds'=>$cap->values,'reserved_order_prefix'=>strpos(str_replace('`','',$cap->sql['count']),'order.')!==false,'literal_bind_unchanged'=>in_array('%'.$literal.'%',$cap->values['count'],true),'tenant_bind'=>in_array(2147001111,$cap->values['count'],true)];$out['dialects'][$dialect]['scalar_detail_id_filter']=preg_match('/(?:\s|\.)`?id`?\s*=/', $cap->sql['detail'])===1;}
echo json_encode($out,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES),"\n";
