Kitűzés: pontok importja, szervízek, kitüző panel
This commit is contained in:
@@ -9,7 +9,9 @@ import 'package:terepi_seged/models/measured_point.dart';
|
||||
import 'package:terepi_seged/models/note_item.dart';
|
||||
import 'package:terepi_seged/models/note_item_audio.dart';
|
||||
import 'package:terepi_seged/models/note_item_photo.dart';
|
||||
import 'package:terepi_seged/models/stakeout_point.dart';
|
||||
import 'package:terepi_seged/models/track.dart';
|
||||
import 'package:terepi_seged/services/device_identity_service.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import '../models/project.dart';
|
||||
|
||||
@@ -38,7 +40,7 @@ class AppDatabase {
|
||||
final path = p.join(dbDir.path, 'terepi_seged.db');
|
||||
|
||||
return openDatabase(path,
|
||||
version: 2,
|
||||
version: 3,
|
||||
onConfigure: (db) => db.execute('PRAGMA foreign_keys = ON'),
|
||||
onCreate: _onCreate,
|
||||
onUpgrade: _onUpgrade);
|
||||
@@ -214,6 +216,8 @@ class AppDatabase {
|
||||
await db.execute(
|
||||
'CREATE INDEX idx_imp_layers_project ON imported_layers(project_id)');
|
||||
|
||||
await _createStakeoutTable(db);
|
||||
|
||||
// Alap projekt létrehozása az első indításhoz
|
||||
final now = DateTime.now().toIso8601String();
|
||||
await db.insert('projects', {
|
||||
@@ -239,6 +243,9 @@ class AppDatabase {
|
||||
ALTER TABLE imported_layers ADD COLUMN stroke_width REAL;
|
||||
''');
|
||||
}
|
||||
if (oldVersion < 3) {
|
||||
await _createStakeoutTable(db);
|
||||
}
|
||||
}
|
||||
|
||||
// ── Projects CRUD ─────────────────────────────────────────────────
|
||||
@@ -670,4 +677,114 @@ class AppDatabase {
|
||||
);
|
||||
return rows.map(MeasuredPoint.fromMap).toList();
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// KITŰZÉS (stakeout_points) — szeizmikus line/station modell
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
Future<void> _createStakeoutTable(Database db) async {
|
||||
await db.execute('''
|
||||
CREATE TABLE IF NOT EXISTS stakeout_points (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
uuid TEXT NOT NULL UNIQUE,
|
||||
project_id INTEGER NOT NULL,
|
||||
line_id TEXT NOT NULL DEFAULT '',
|
||||
station INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
point_type TEXT NOT NULL DEFAULT 'geofon',
|
||||
source TEXT NOT NULL DEFAULT 'csv',
|
||||
plan_eov_y REAL NOT NULL,
|
||||
plan_eov_x REAL NOT NULL,
|
||||
plan_eov_z REAL,
|
||||
plan_lat REAL NOT NULL,
|
||||
plan_lon REAL NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
measured_eov_y REAL,
|
||||
measured_eov_x REAL,
|
||||
measured_eov_z REAL,
|
||||
measured_lat REAL,
|
||||
measured_lon REAL,
|
||||
dev_inline REAL,
|
||||
dev_crossline REAL,
|
||||
dev_dz REAL,
|
||||
fix_quality INTEGER,
|
||||
accuracy REAL,
|
||||
tilt_deg REAL,
|
||||
staked_at TEXT,
|
||||
is_offset INTEGER NOT NULL DEFAULT 0,
|
||||
parent_uuid TEXT,
|
||||
offset_dist REAL,
|
||||
offset_bearing REAL,
|
||||
created_by TEXT,
|
||||
device_id TEXT,
|
||||
created_at TEXT NOT NULL,
|
||||
updated_at TEXT NOT NULL,
|
||||
deleted_at TEXT,
|
||||
sync_status TEXT NOT NULL DEFAULT 'pending'
|
||||
)
|
||||
''');
|
||||
await db.execute('CREATE INDEX IF NOT EXISTS idx_sp_proj_line '
|
||||
'ON stakeout_points(project_id, line_id, station)');
|
||||
await db.execute('CREATE INDEX IF NOT EXISTS idx_sp_status '
|
||||
'ON stakeout_points(status)');
|
||||
await db.execute('CREATE INDEX IF NOT EXISTS idx_sp_sync '
|
||||
'ON stakeout_points(sync_status)');
|
||||
}
|
||||
|
||||
Future<int> insertStakeoutPoint(StakeoutPoint p) async {
|
||||
final db = await database;
|
||||
final map = p.toMap();
|
||||
map['device_id'] ??= DeviceIdentityService.to.deviceId;
|
||||
return db.insert('stakeout_points', map);
|
||||
}
|
||||
|
||||
/// Tömeges beszúrás importhoz — tranzakcióban; az azonos
|
||||
/// (projekt, vonal, station) sorokat kihagyja. Visszaadja a
|
||||
/// ténylegesen beszúrt darabszámot.
|
||||
Future<int> insertStakeoutPoints(List<StakeoutPoint> points) async {
|
||||
final db = await database;
|
||||
var inserted = 0;
|
||||
await db.transaction((txn) async {
|
||||
for (final p in points) {
|
||||
final dup = await txn.query('stakeout_points',
|
||||
columns: ['id'],
|
||||
where: 'project_id = ? AND line_id = ? AND station = ? '
|
||||
'AND deleted_at IS NULL',
|
||||
whereArgs: [p.projectId, p.lineId, p.station],
|
||||
limit: 1);
|
||||
if (dup.isNotEmpty) continue;
|
||||
final map = p.toMap();
|
||||
map['device_id'] ??= DeviceIdentityService.to.deviceId;
|
||||
await txn.insert('stakeout_points', map);
|
||||
inserted++;
|
||||
}
|
||||
});
|
||||
return inserted;
|
||||
}
|
||||
|
||||
Future<void> updateStakeoutPoint(StakeoutPoint p) async {
|
||||
final db = await database;
|
||||
final map = p.toMap()
|
||||
..['updated_at'] = DateTime.now().toIso8601String()
|
||||
..['sync_status'] = 'pending';
|
||||
await db.update('stakeout_points', map, where: 'id = ?', whereArgs: [p.id]);
|
||||
}
|
||||
|
||||
/// Soft delete — a törlés is szinkronizálható lesz (4. ütem).
|
||||
Future<void> softDeleteStakeoutPoint(int id) async {
|
||||
final db = await database;
|
||||
final now = DateTime.now().toIso8601String();
|
||||
await db.update('stakeout_points',
|
||||
{'deleted_at': now, 'updated_at': now, 'sync_status': 'pending'},
|
||||
where: 'id = ?', whereArgs: [id]);
|
||||
}
|
||||
|
||||
Future<List<StakeoutPoint>> listStakeoutPoints(int projectId) async {
|
||||
final db = await database;
|
||||
final rows = await db.query('stakeout_points',
|
||||
where: 'project_id = ? AND deleted_at IS NULL',
|
||||
whereArgs: [projectId],
|
||||
orderBy: 'line_id ASC, station ASC');
|
||||
return rows.map(StakeoutPoint.fromMap).toList();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user