migrate_water_engineering.php 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <?php
  2. /** Additive repair migration; does not grant new privileges to existing roles or change balances. */
  3. require dirname(__DIR__) . '/vendor/autoload.php';
  4. \Dotenv\Dotenv::createUnsafeMutable(dirname(__DIR__))->load();
  5. \support\App::loadAllConfig(['route']);
  6. use plugin\saiadmin\app\model\water\WaterPackage;
  7. use plugin\saiadmin\app\model\system\SystemMenu;
  8. if (!in_array('--apply', $argv, true)) {
  9. echo "Plan: add package metadata, finance approval records and shared road quota table; register separate delete/finance permissions. No balance changes or role grants.\n";
  10. exit;
  11. }
  12. $db = (new WaterPackage())->getConnection();
  13. $schema = $db->getSchemaBuilder();
  14. foreach (['category' => 'VARCHAR(30) NULL', 'includes_device' => 'TINYINT NULL', 'description' => 'TEXT NULL'] as $column => $type) {
  15. if (!$schema->hasColumn('sa_water_package', $column)) $db->statement("ALTER TABLE sa_water_package ADD COLUMN `$column` $type");
  16. }
  17. $db->statement("CREATE TABLE IF NOT EXISTS sa_water_finance_request (
  18. id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, enterprise_id BIGINT UNSIGNED NOT NULL,
  19. kind VARCHAR(30) NOT NULL, checkout_id BIGINT UNSIGNED NULL, amount_cents BIGINT UNSIGNED NOT NULL,
  20. reference VARCHAR(100) NOT NULL, note VARCHAR(255) NOT NULL, status VARCHAR(20) NOT NULL DEFAULT 'pending',
  21. request_key VARCHAR(80) NOT NULL, payload_hash CHAR(64) NOT NULL, created_by BIGINT UNSIGNED NOT NULL,
  22. reviewed_by BIGINT UNSIGNED NULL, review_note VARCHAR(255) NULL, reviewed_at DATETIME NULL,
  23. result LONGTEXT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL,
  24. UNIQUE KEY request_key(created_by,request_key), UNIQUE KEY evidence(kind,reference), UNIQUE KEY checkout_refund(checkout_id),
  25. KEY enterprise_requests(enterprise_id,id), KEY pending_requests(status,id)
  26. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
  27. $db->statement("CREATE TABLE IF NOT EXISTS sa_water_road_quota (
  28. name VARCHAR(64) PRIMARY KEY, next_at BIGINT UNSIGNED NOT NULL DEFAULT 0,
  29. lease_hash CHAR(64) NULL, lease_until BIGINT UNSIGNED NOT NULL DEFAULT 0, actor_id BIGINT UNSIGNED NULL,
  30. quota_day CHAR(10) NOT NULL DEFAULT '', day_count INT UNSIGNED NOT NULL DEFAULT 0
  31. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
  32. $permissions = [
  33. 'packages' => ['delete' => '删除套餐'],
  34. 'finance' => ['balance_read' => '查询企业余额', 'balance_credit' => '申请企业余额充值', 'balance_refund' => '申请企业退款', 'balance_review' => '审核企业资金申请'],
  35. ];
  36. $db->transaction(function () use ($permissions) {
  37. foreach ($permissions as $module => $actions) {
  38. $parent = SystemMenu::query()->where('code', 'Water' . ucfirst($module))->whereNull('delete_time')->first();
  39. if (!$parent) throw new RuntimeException('Missing water menu: ' . $module);
  40. foreach ($actions as $action => $name) {
  41. $slug = 'water:' . $module . ':' . $action;
  42. if (SystemMenu::query()->where('slug', $slug)->whereNull('delete_time')->exists()) continue;
  43. SystemMenu::query()->create([
  44. 'parent_id' => $parent->id, 'name' => $name, 'code' => 'Water' . ucfirst($module) . str_replace('_', '', ucwords($action, '_')),
  45. 'slug' => $slug, 'type' => 3, 'method' => $action === 'balance_read' ? 'GET' : 'POST', 'sort' => 0,
  46. 'is_iframe' => 2, 'is_keep_alive' => 2, 'is_hidden' => 2, 'is_fixed_tab' => 2, 'is_full_page' => 2,
  47. 'generate_id' => 0, 'status' => 1, 'remark' => '独立供水业务权限;需显式授予角色',
  48. 'created_by' => 1, 'updated_by' => 1, 'create_time' => date('Y-m-d H:i:s'), 'update_time' => date('Y-m-d H:i:s'),
  49. ]);
  50. }
  51. }
  52. });
  53. \plugin\saiadmin\app\cache\UserAuthCache::clear();
  54. \plugin\saiadmin\app\cache\UserMenuCache::clearMenuCache();
  55. echo "Applied additive engineering tables, package metadata and unassigned independent permissions.\n";