migrate_water_dispatch.php 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. <?php
  2. /** 增量迁移,默认只检查;--apply 新增结构并关联已有配送员,不变更业务库存。 */
  3. require dirname(__DIR__).'/vendor/autoload.php';
  4. \Dotenv\Dotenv::createUnsafeMutable(dirname(__DIR__))->load();
  5. \support\App::loadAllConfig(['route']);
  6. \Webman\ThinkOrm\ThinkOrm::start(null);
  7. use support\think\Db;
  8. if (!in_array('--apply',$argv,true)) { echo "Plan: add driver, shift, route tables and nullable scheduling/location columns. Preserve all business records.\n"; exit; }
  9. Db::execute("CREATE TABLE IF NOT EXISTS sa_water_driver (
  10. id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(60) NOT NULL, phone VARCHAR(30) NOT NULL,
  11. region VARCHAR(80) NOT NULL DEFAULT '', vehicle VARCHAR(40) NOT NULL DEFAULT '', capacity INT UNSIGNED NOT NULL DEFAULT 100,
  12. status TINYINT NOT NULL DEFAULT 1, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL,
  13. UNIQUE KEY driver_phone(phone)
  14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
  15. Db::execute("CREATE TABLE IF NOT EXISTS sa_water_driver_shift (
  16. id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, driver_id BIGINT UNSIGNED NOT NULL, work_date DATE NOT NULL,
  17. state VARCHAR(10) NOT NULL, updated_at DATETIME NOT NULL, UNIQUE KEY driver_date(driver_id,work_date)
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
  19. Db::execute("CREATE TABLE IF NOT EXISTS sa_water_route (
  20. id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, code VARCHAR(60) NOT NULL, driver_id BIGINT UNSIGNED NOT NULL,
  21. work_date DATE NOT NULL, region VARCHAR(80) NOT NULL DEFAULT '', capacity INT UNSIGNED NOT NULL,
  22. request_key VARCHAR(100) NOT NULL, created_by BIGINT UNSIGNED NOT NULL, created_at DATETIME NOT NULL,
  23. UNIQUE KEY route_code(code), UNIQUE KEY route_request(request_key), KEY route_date(work_date,driver_id)
  24. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
  25. $columns = [
  26. 'sa_water_route'=>['request_hash'=>"CHAR(64) NOT NULL DEFAULT ''"],
  27. 'sa_water_enterprise'=>['longitude'=>'DECIMAL(10,6) NULL','latitude'=>'DECIMAL(10,6) NULL'],
  28. 'sa_water_delivery'=>['origin_address'=>"VARCHAR(255) NOT NULL DEFAULT ''",'origin_longitude'=>'DECIMAL(10,6) NULL','origin_latitude'=>'DECIMAL(10,6) NULL',
  29. 'driver_id'=>'BIGINT UNSIGNED NULL','route_id'=>'BIGINT UNSIGNED NULL','stop_order'=>'INT UNSIGNED NOT NULL DEFAULT 0',
  30. 'scheduled_date'=>'DATE NULL','deadline_at'=>'DATETIME NULL','longitude'=>'DECIMAL(10,6) NULL','latitude'=>'DECIMAL(10,6) NULL'],
  31. ];
  32. foreach ($columns as $table=>$fields) {
  33. foreach ($fields as $name=>$definition) {
  34. if (!Db::query("SHOW COLUMNS FROM `$table` LIKE '$name'")) Db::execute("ALTER TABLE `$table` ADD COLUMN `$name` $definition");
  35. }
  36. }
  37. foreach (['driver_id','route_id','scheduled_date'] as $name) {
  38. if (!Db::query("SHOW INDEX FROM sa_water_delivery WHERE Key_name='dispatch_$name'")) Db::execute("ALTER TABLE sa_water_delivery ADD INDEX dispatch_$name (`$name`)");
  39. }
  40. // 只归档既有姓名/电话,不推断排班、在线状态或新造测试业务。
  41. Db::transaction(function () {
  42. $existing = Db::table('sa_water_delivery')->where('driver','<>','')->where('driver_phone','<>','')->select()->toArray();
  43. foreach ($existing as $task) {
  44. $id = Db::table('sa_water_driver')->where('phone',$task['driver_phone'])->value('id');
  45. if (!$id) $id = Db::table('sa_water_driver')->insertGetId(['name'=>$task['driver'],'phone'=>$task['driver_phone'],
  46. 'capacity'=>max(100,(int)$task['quantity']),'created_at'=>date('Y-m-d H:i:s'),'updated_at'=>date('Y-m-d H:i:s')]);
  47. if (!$task['driver_id']) Db::table('sa_water_delivery')->where('id',$task['id'])->update(['driver_id'=>$id]);
  48. }
  49. });
  50. echo "Applied additive dispatch migration; existing stock, entitlement and task status preserved.\n";