seed_water_alert_search_demo.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. /** php scripts/seed_water_alert_search_demo.php --apply:10个不同名称的补货搜索/分页样例。 */
  3. declare(strict_types=1);
  4. require dirname(__DIR__).'/vendor/autoload.php';
  5. \Dotenv\Dotenv::createUnsafeMutable(dirname(__DIR__))->load();
  6. \support\App::loadAllConfig(['route']);
  7. date_default_timezone_set('Asia/Shanghai');
  8. use support\Db;
  9. use plugin\saiadmin\app\model\water\WaterModel;
  10. use plugin\saiadmin\app\service\WaterBusiness;
  11. $batch = 'TEST-WATER-ALERT-SEARCH-20260910';
  12. $examples = [
  13. ['星河科技','东城区',0,2,0], ['青禾设计','西城区',1,2,1],
  14. ['远航物流','南城区',2,2,0], ['锦程制造','北城区',3,5,1],
  15. ['晨曦教育','东城区',1,3,0], ['百川商贸','西城区',4,5,1],
  16. ['蓝湾酒店','南城区',0,2,0], ['瑞丰农业','北城区',3,4,1],
  17. ['华庭物业','东城区',2,3,0], ['博雅文化','西城区',5,6,1],
  18. ];
  19. $service = new WaterBusiness();
  20. $applied = in_array('--apply',$argv,true);
  21. $replayed = false;
  22. if ($applied) {
  23. $replayed = WaterModel::transaction(function () use ($service,$batch,$examples) {
  24. // 与之前演示脚本使用同一锁,防止并发重复初始化;不修改原测试规格。
  25. $anchor = \plugin\saiadmin\app\model\water\WaterSku::query()->where('name','【测试0910】18.9L桶装水')->lock(true)->first()?->toArray();
  26. if (!$anchor) throw new RuntimeException('缺少之前的测试数据');
  27. if (\plugin\saiadmin\app\model\water\WaterLedger::query()->where(['kind'=>'demo_seed','reference'=>$batch])->first()?->toArray()) return true;
  28. $skus = [];
  29. foreach ([['山泉水(测试)',12],['纯净水(测试)',8]] as [$name,$liters]) {
  30. if (\plugin\saiadmin\app\model\water\WaterSku::query()->where('name',$name)->count()) throw new RuntimeException('测试规格已存在,停止避免覆盖');
  31. $skus[] = $service->save('sku',['name'=>$name,'liters'=>$liters,'safety_stock'=>2],1)['id'];
  32. }
  33. $ids = [];
  34. foreach ($examples as $index=>[$name,$region,$full,$threshold,$skuIndex]) {
  35. $name .= '(测试)';
  36. if (\plugin\saiadmin\app\model\water\WaterEnterprise::query()->where('name',$name)->count()) throw new RuntimeException('测试企业已存在,停止避免覆盖:'.$name);
  37. $enterprise = $service->save('enterprise',['name'=>$name,'contact'=>'模拟联系人','phone'=>'TEST-SEARCH-'.($index+1),
  38. 'region'=>$region,'address'=>$region.'模拟供水点'.($index+1).'(测试数据,请勿配送)'],1)['id'];
  39. $sku = $skus[$skuIndex];
  40. // 使用库存盘点入口建立真实账户,不伪造收款和套餐权益。
  41. $service->stock(['enterprise_id'=>$enterprise,'sku_id'=>$sku,'mode'=>'site_count','quantity'=>$full,
  42. 'reference'=>$batch.'-'.($index+1),'note'=>'【测试数据】搜索与分页演示的现场满桶盘点'],1);
  43. $accountId = (int)\plugin\saiadmin\app\model\water\WaterAccount::query()->where(['enterprise_id'=>$enterprise,'sku_id'=>$sku])->value('id');
  44. $ids[] = $enterprise;
  45. }
  46. \plugin\saiadmin\app\model\water\WaterLedger::query()->insert(['kind'=>'demo_seed','sku_id'=>$anchor['id'],'enterprise_id'=>0,'quantity'=>0,'amount_cents'=>0,
  47. 'reference'=>$batch,'note'=>'【测试数据】10条搜索分页样例,企业ID:'.implode(',',$ids),'created_by'=>1,'created_at'=>date('Y-m-d H:i:s')]);
  48. return false;
  49. });
  50. }
  51. $first = $service->listing('alerts',['page'=>1,'limit'=>10]);
  52. $second = $service->listing('alerts',['page'=>2,'limit'=>10]);
  53. echo json_encode(['applied'=>$applied,'replayed'=>$replayed,'total'=>$first['total'],
  54. 'page1'=>array_column($first['data'],'enterprise_name'),'page2'=>array_column($second['data'],'enterprise_name'),
  55. 'search_xinghe'=>$service->listing('alerts',['keyword'=>'星河'])['total'],
  56. 'search_east'=>$service->listing('alerts',['keyword'=>'东城区'])['total'],
  57. 'search_spring'=>$service->listing('alerts',['keyword'=>'山泉水'])['total'],
  58. 'today_yuan'=>$service->overview()['today_cents']/100],JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE).PHP_EOL;