load(); \support\App::loadAllConfig(['route']); \Webman\ThinkOrm\ThinkOrm::start(null); use plugin\saiadmin\app\model\water\WaterEnterprise; use plugin\saiadmin\app\model\water\WaterEnterpriseAddress; use plugin\saiadmin\app\model\water\WaterModel; use plugin\saiadmin\app\model\water\WaterSku; use support\think\Db; if (!in_array('--apply', $argv, true)) { echo "Plan: create sa_water_enterprise_address, seed one default address per enterprise, and add nullable delivery address_id.\n"; exit(0); } Db::execute("CREATE TABLE IF NOT EXISTS sa_water_enterprise_address ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, enterprise_id BIGINT UNSIGNED NOT NULL, label VARCHAR(80) NOT NULL DEFAULT '配送地址', contact VARCHAR(60) NOT NULL, phone VARCHAR(30) NOT NULL, region VARCHAR(80) NOT NULL DEFAULT '', address VARCHAR(255) NOT NULL, longitude DECIMAL(10,6) NULL, latitude DECIMAL(10,6) NULL, is_default TINYINT NOT NULL DEFAULT 0, status TINYINT NOT NULL DEFAULT 1, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, KEY enterprise_status (enterprise_id,status), KEY enterprise_default (enterprise_id,is_default) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); $db = (new WaterSku())->getConnection(); if (!$db->select("SHOW COLUMNS FROM sa_water_delivery LIKE 'address_id'")) { $db->statement('ALTER TABLE sa_water_delivery ADD COLUMN address_id BIGINT UNSIGNED NULL'); } if (!$db->select("SHOW INDEX FROM sa_water_delivery WHERE Key_name='delivery_address'")) { $db->statement('ALTER TABLE sa_water_delivery ADD INDEX delivery_address (address_id)'); } $now = date('Y-m-d H:i:s'); $seeded = WaterModel::transaction(function () use ($now): int { $count = 0; foreach (WaterEnterprise::query()->orderBy('id')->get() as $enterprise) { if (WaterEnterpriseAddress::query()->where('enterprise_id', $enterprise->id)->exists()) { continue; } WaterEnterpriseAddress::query()->insert([ 'enterprise_id' => $enterprise->id, 'label' => '主配送地址', 'contact' => $enterprise->contact, 'phone' => $enterprise->phone, 'region' => $enterprise->region, 'address' => $enterprise->address, 'longitude' => $enterprise->longitude, 'latitude' => $enterprise->latitude, 'is_default' => 1, 'status' => 1, 'created_at' => $enterprise->created_at ?: $now, 'updated_at' => $enterprise->updated_at ?: $now, ]); $count++; } return $count; }); echo "Applied enterprise address migration; seeded {$seeded} default addresses and preserved existing delivery snapshots.\n";