seed_water_receipts_demo.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. /** php scripts/seed_water_receipts_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. // 固定批次凭据,跨日重跑也不会追加新收款或改写原登记日期。
  12. $batch = 'TEST-WATER-RECEIPTS-20260910';
  13. $samples = [
  14. ['suffix'=>'A','enterprise'=>'【测试0910】云泉科技','buckets'=>30,'cents'=>69900],
  15. ['suffix'=>'B','enterprise'=>'【测试0910】智配办公','buckets'=>10,'cents'=>29900],
  16. ['suffix'=>'C','enterprise'=>'【测试0910】清泉产业园','buckets'=>50,'cents'=>99900],
  17. ];
  18. if (!in_array('--apply',$argv,true)) {
  19. 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";
  20. exit(0);
  21. }
  22. $service = new WaterBusiness();
  23. $before = $service->overview()['today_cents'];
  24. $result = WaterModel::transaction(function () use ($samples,$batch,$service) {
  25. $ensure = function (string $kind,array $values) use ($service): int {
  26. $rows = WaterModel::forKind($kind)->where('name',$values['name'])->get()->toArray();
  27. if (count($rows) > 1) throw new RuntimeException('测试档案重名,请先核对:'.$values['name']);
  28. if ($rows) {
  29. foreach ($values as $key=>$value) {
  30. if ((string)$rows[0][$key] !== (string)$value && (!is_numeric($value) || (float)$rows[0][$key] !== (float)$value)) {
  31. throw new RuntimeException('已有测试档案已变更,不覆盖:'.$values['name']);
  32. }
  33. }
  34. return (int)$rows[0]['id'];
  35. }
  36. return $service->save($kind,$values,1)['id'];
  37. };
  38. $sku = $ensure('sku',['name'=>'【测试0910】18.9L桶装水','liters'=>18.9,'safety_stock'=>2,'status'=>1]);
  39. $results = [];
  40. foreach ($samples as $sample) {
  41. $enterprise = $ensure('enterprise',[
  42. 'name'=>$sample['enterprise'],'contact'=>'测试联系人'.$sample['suffix'],'phone'=>'TEST-ONLY-'.$sample['suffix'],
  43. 'region'=>'测试区域','address'=>'测试供水地址'.$sample['suffix'].'(模拟数据,请勿配送)','status'=>1,
  44. ]);
  45. $package = $ensure('package',[
  46. 'name'=>'【测试0910】'.$sample['buckets'].'桶套餐','sku_id'=>$sku,
  47. 'buckets'=>$sample['buckets'],'price_cents'=>$sample['cents'],'status'=>1,
  48. ]);
  49. $reference = $batch.'-'.$sample['suffix'];
  50. $order = $service->purchase(['enterprise_id'=>$enterprise,'package_id'=>$package,'reference'=>$reference],1);
  51. // 业务方法保持真实入账闭环,测试流水额外明确标记为模拟收款。
  52. if (empty($order['replayed'])) {
  53. \plugin\saiadmin\app\model\water\WaterLedger::query()->where(['kind'=>'purchase','reference'=>$reference])->update([
  54. 'note'=>'【测试数据】模拟套餐收款及权益发放,未发生真实收款',
  55. ]);
  56. }
  57. $saved = \plugin\saiadmin\app\model\water\WaterOrder::query()->where('id',$order['id'])->first()?->toArray();
  58. if ((int)$saved['amount_cents'] !== $sample['cents'] || (int)$saved['buckets'] !== $sample['buckets']) {
  59. throw new RuntimeException('测试订单金额或桶数不匹配');
  60. }
  61. $results[] = ['enterprise'=>$sample['enterprise'],'order_id'=>$order['id'],'reference'=>$reference,
  62. 'amount_yuan'=>$saved['amount_cents']/100,'buckets'=>$saved['buckets'],
  63. 'created_at'=>$saved['created_at'],'replayed'=>$order['replayed'] ?? false];
  64. }
  65. return $results;
  66. });
  67. echo json_encode(['batch'=>$batch,'today_before_yuan'=>$before/100,
  68. 'today_after_yuan'=>$service->overview()['today_cents']/100,'orders'=>$result],JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE).PHP_EOL;