| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- <?php
- /** php scripts/seed_water_receipts_demo.php --apply:保留可识别的模拟购水数据,重复执行不重复入账。 */
- declare(strict_types=1);
- require dirname(__DIR__) . '/vendor/autoload.php';
- \Dotenv\Dotenv::createUnsafeMutable(dirname(__DIR__))->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;
|