| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- <?php
- /** Add an enterprise address book and link future delivery snapshots without changing old tasks. */
- require dirname(__DIR__) . '/vendor/autoload.php';
- \Dotenv\Dotenv::createUnsafeMutable(dirname(__DIR__))->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";
|