load(); \support\App::loadAllConfig(['route']); date_default_timezone_set('Asia/Shanghai'); use support\Db; use plugin\saiadmin\app\model\water\WaterModel; use plugin\saiadmin\app\service\WaterBusiness; // 固定批次凭据,跨日重跑也不会追加新收款或改写原登记日期。 $batch = 'TEST-WATER-RECEIPTS-20260910'; $samples = [ ['suffix'=>'A','enterprise'=>'【测试0910】云泉科技','buckets'=>30,'cents'=>69900], ['suffix'=>'B','enterprise'=>'【测试0910】智配办公','buckets'=>10,'cents'=>29900], ['suffix'=>'C','enterprise'=>'【测试0910】清泉产业园','buckets'=>50,'cents'=>99900], ]; if (!in_array('--apply',$argv,true)) { echo "Plan: 3 test enterprises, 1 test SKU, 3 test packages, 3 simulated receipts totaling CNY 1997.00 and 90 buckets of entitlement. No external payment.\n"; exit(0); } $service = new WaterBusiness(); $before = $service->overview()['today_cents']; $result = WaterModel::transaction(function () use ($samples,$batch,$service) { $ensure = function (string $kind,array $values) use ($service): int { $rows = WaterModel::forKind($kind)->where('name',$values['name'])->get()->toArray(); if (count($rows) > 1) throw new RuntimeException('测试档案重名,请先核对:'.$values['name']); if ($rows) { foreach ($values as $key=>$value) { if ((string)$rows[0][$key] !== (string)$value && (!is_numeric($value) || (float)$rows[0][$key] !== (float)$value)) { throw new RuntimeException('已有测试档案已变更,不覆盖:'.$values['name']); } } return (int)$rows[0]['id']; } return $service->save($kind,$values,1)['id']; }; $sku = $ensure('sku',['name'=>'【测试0910】18.9L桶装水','liters'=>18.9,'safety_stock'=>2,'status'=>1]); $results = []; foreach ($samples as $sample) { $enterprise = $ensure('enterprise',[ 'name'=>$sample['enterprise'],'contact'=>'测试联系人'.$sample['suffix'],'phone'=>'TEST-ONLY-'.$sample['suffix'], 'region'=>'测试区域','address'=>'测试供水地址'.$sample['suffix'].'(模拟数据,请勿配送)','status'=>1, ]); $package = $ensure('package',[ 'name'=>'【测试0910】'.$sample['buckets'].'桶套餐','sku_id'=>$sku, 'buckets'=>$sample['buckets'],'price_cents'=>$sample['cents'],'status'=>1, ]); $reference = $batch.'-'.$sample['suffix']; $order = $service->purchase(['enterprise_id'=>$enterprise,'package_id'=>$package,'reference'=>$reference],1); // 业务方法保持真实入账闭环,测试流水额外明确标记为模拟收款。 if (empty($order['replayed'])) { \plugin\saiadmin\app\model\water\WaterLedger::query()->where(['kind'=>'purchase','reference'=>$reference])->update([ 'note'=>'【测试数据】模拟套餐收款及权益发放,未发生真实收款', ]); } $saved = \plugin\saiadmin\app\model\water\WaterOrder::query()->where('id',$order['id'])->first()?->toArray(); if ((int)$saved['amount_cents'] !== $sample['cents'] || (int)$saved['buckets'] !== $sample['buckets']) { throw new RuntimeException('测试订单金额或桶数不匹配'); } $results[] = ['enterprise'=>$sample['enterprise'],'order_id'=>$order['id'],'reference'=>$reference, 'amount_yuan'=>$saved['amount_cents']/100,'buckets'=>$saved['buckets'], 'created_at'=>$saved['created_at'],'replayed'=>$order['replayed'] ?? false]; } return $results; }); echo json_encode(['batch'=>$batch,'today_before_yuan'=>$before/100, 'today_after_yuan'=>$service->overview()['today_cents']/100,'orders'=>$result],JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE).PHP_EOL;