Kitűzés: pontok importja, szervízek, kitüző panel

This commit is contained in:
2026-07-06 11:47:41 +02:00
parent c01fdcf012
commit 6706b2b1ba
12 changed files with 2482 additions and 4 deletions
+118 -1
View File
@@ -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();
}
}