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