seed_water_dispatch_demo.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. /** php scripts/seed_water_dispatch_demo.php --apply:模拟配送及库存预警,整批事务且不重复初始化。 */
  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. $service = new WaterBusiness();
  12. $batch = 'TEST-WATER-DISPATCH-20260910';
  13. $apply = in_array('--apply',$argv,true);
  14. $replayed = false;
  15. if ($apply) {
  16. $replayed = WaterModel::transaction(function () use ($service,$batch) {
  17. $sku = \plugin\saiadmin\app\model\water\WaterSku::query()->where('name','【测试0910】18.9L桶装水')->lock(true)->first()?->toArray();
  18. if (!$sku) throw new RuntimeException('缺少上一批测试规格,请先添加测试收款数据');
  19. // 锁定同一测试规格后检查整批标记;用户后续推进任务也不会被重置。
  20. if (\plugin\saiadmin\app\model\water\WaterLedger::query()->where(['kind'=>'demo_seed','reference'=>$batch])->first()?->toArray()) return true;
  21. $skuId = (int)$sku['id'];
  22. $sources = [];
  23. foreach (['A','B','C'] as $suffix) {
  24. $order = \plugin\saiadmin\app\model\water\WaterOrder::query()->where('reference','TEST-WATER-RECEIPTS-20260910-'.$suffix)->first()?->toArray();
  25. if (!$order || (int)$order['sku_id'] !== $skuId) throw new RuntimeException('缺少匹配的原始测试订单');
  26. $enterprise = \plugin\saiadmin\app\model\water\WaterEnterprise::query()->where('id',$order['enterprise_id'])->first()?->toArray();
  27. if (!$enterprise || !str_starts_with($enterprise['name'],'【测试0910】')) throw new RuntimeException('测试企业标识已更改,停止初始化');
  28. $sources[$suffix] = $order;
  29. }
  30. $service->stock(['sku_id'=>$skuId,'mode'=>'inbound','quantity'=>100,'reference'=>$batch.'-STOCK',
  31. 'note'=>'【测试数据】模拟仓库入库100桶,未发生真实入库'],1);
  32. $tasks = [];
  33. foreach ([['A',8,'pending'],['B',6,'assigned'],['C',10,'transit']] as [$suffix,$quantity,$state]) {
  34. $id = $service->createDelivery(['enterprise_id'=>$sources[$suffix]['enterprise_id'],'sku_id'=>$skuId,'quantity'=>$quantity],1)['id'];
  35. if ($state !== 'pending') $service->transition(['id'=>$id,'action'=>'assign','driver'=>'【测试】配送员'.$suffix,'driver_phone'=>'TEST-DRIVER-'.$suffix],1);
  36. if ($state === 'transit') $service->transition(['id'=>$id,'action'=>'depart'],1);
  37. $tasks[] = $id;
  38. }
  39. foreach ([['D','待补货体验中心',1,2],['E','待补货商务楼',3,5]] as [$suffix,$name,$full,$threshold]) {
  40. $name = '【测试0910】'.$name;
  41. if (\plugin\saiadmin\app\model\water\WaterEnterprise::query()->where('name',$name)->count()) throw new RuntimeException('测试企业重名,停止避免覆盖:'.$name);
  42. $enterprise = $service->save('enterprise',['name'=>$name,'contact'=>'测试联系人'.$suffix,'phone'=>'TEST-ONLY-'.$suffix,
  43. 'region'=>'测试区域','address'=>'测试供水地址'.$suffix.'(模拟数据,请勿配送)'],1)['id'];
  44. $reference = $batch.'-PURCHASE-'.$suffix;
  45. $service->purchase(['enterprise_id'=>$enterprise,'package_id'=>$sources['B']['package_id'],'reference'=>$reference],1);
  46. \plugin\saiadmin\app\model\water\WaterLedger::query()->where(['kind'=>'purchase','reference'=>$reference])->update(['note'=>'【测试数据】为未建单补货演示发放套餐权益,未发生真实收款']);
  47. $service->stock(['sku_id'=>$skuId,'enterprise_id'=>$enterprise,'mode'=>'site_count','quantity'=>$full,
  48. 'reference'=>$batch.'-SITE-'.$suffix,'note'=>'【测试数据】模拟现场满桶盘点'],1);
  49. $accountId = (int)\plugin\saiadmin\app\model\water\WaterAccount::query()->where(['enterprise_id'=>$enterprise,'sku_id'=>$skuId])->value('id');
  50. }
  51. \plugin\saiadmin\app\model\water\WaterLedger::query()->insert(['kind'=>'demo_seed','sku_id'=>$skuId,'enterprise_id'=>0,'quantity'=>0,'amount_cents'=>0,
  52. 'reference'=>$batch,'note'=>'【测试数据】配送初始化完成,任务ID:'.implode(',',$tasks),'created_by'=>1,'created_at'=>date('Y-m-d H:i:s')]);
  53. return false;
  54. });
  55. }
  56. $overview = $service->overview();
  57. echo json_encode([
  58. 'mode'=>$apply ? 'applied' : 'inspect', 'replayed'=>$replayed,
  59. 'plan'=>'3 deliveries: pending 8, assigned 6, transit 10; inbound 100; 2 extra unassigned alerts with 10-bucket purchases each.',
  60. 'today_yuan'=>$overview['today_cents']/100,'states'=>$overview['states'],'stock'=>$overview['stock'],
  61. 'deliveries'=>$service->listing('dispatch',['keyword'=>'【测试0910】','limit'=>100])['data'],
  62. 'alerts'=>$service->listing('alerts',['keyword'=>'【测试0910】','limit'=>100])['data'],
  63. ],JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE).PHP_EOL;