Fehler Merge behoben

This commit is contained in:
Sven committed 2024-03-27 15:11:31 +01:00
1 parent 721dbd861c
commit eb1e18d042
10 files changed
+205 -148

No files matched your search

+2 -2
View File
@@ -202,8 +202,8 @@ class _AssignedJobsPageState extends State<AssignedJobsPage> {
MqttCore.instance.publishText("reaction", jsonEncode(message.toJson()));
MyApp.isarInstance.writeTxnSync(() {
MyApp.isarInstance.jobs.deleteSync(job.id);
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.jobs.delete(job.id);
});
MessageService().publish(Constants.messageTopicRefreshBadges, arguments: RefreshBadgesMessage());
+1 -3
View File
@@ -381,8 +381,6 @@ class _MainPageState extends State<MainPage> {
logoutMessage.pos!.acc = position.accuracy.toInt();
}
var json = jsonEncode(logoutMessage.toJson());
MqttCore.instance.publishText("session", jsonEncode(logoutMessage.toJson()));
MqttCore.instance.publishText("logout", jsonEncode(logoutMessage.toJson()));
}
}
+1 -1
View File
@@ -182,7 +182,7 @@ class _MessagesPageState extends State<MessagesPage> {
const SizedBox(width: 20),
Expanded(
child: getDefaultButton('Ja', () async => {
await MyApp.isarInstance.writeTxnSync(() async => { await MyApp.isarInstance.messages.delete(int.parse(message.id))}),
await MyApp.isarInstance.writeTxn(() async => { await MyApp.isarInstance.messages.delete(int.parse(message.id))}),
_fetchMessages(),
+33 -10
View File
@@ -379,13 +379,13 @@ class _TaskListPageState extends State<TaskListPage> {
});
}
void _processSignature(TaskInfo taskInfo) {
void _processSignature(TaskInfo taskInfo) async {
MyApp.suppressAcceptDialog = true;
SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]);
Future.delayed(const Duration(seconds: 1), () async {
showSignaturePopup(context, taskInfo, (String? signature) {
Future.delayed(const Duration(seconds: 1), () {
showSignaturePopup(context, taskInfo, (String? signature) async {
MyApp.suppressAcceptDialog = false;
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
@@ -399,15 +399,15 @@ class _TaskListPageState extends State<TaskListPage> {
_sendFinTourMessage();
_finishTaskProcessing(taskInfo);
await _finishTaskProcessing(taskInfo);
MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 2));
MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: widget.job.state == 1 ? 2 : 3));
}
});
});
}
_finishTaskProcessing(TaskInfo taskInfo) async {
Future<void> _finishTaskProcessing(TaskInfo taskInfo) async {
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.taskInfos.put(taskInfo);
});
@@ -444,7 +444,7 @@ class _TaskListPageState extends State<TaskListPage> {
message.task.pos!.long = position.longitude;
}
MqttCore.instance.publishText("job", jsonEncode(message.toJson()));
MqttCore.instance.publishText("fin_task", jsonEncode(message.toJson()));
}
FinTourTask _createAnswerHeader(TaskInfo taskInfo) {
@@ -463,10 +463,10 @@ class _TaskListPageState extends State<TaskListPage> {
return finTourTask;
}
_sendFinTourMessage() async {
Future<void> _sendFinTourMessage() async {
var message = FinTour();
message.trId = widget.tour.id;
message.com = "Mir doch egal!";
message.com = _commisionNumber;
var position = MyApp.currentPosition;
if (position != null) {
@@ -489,8 +489,31 @@ class _TaskListPageState extends State<TaskListPage> {
MqttCore.instance.publishText("fin_tour", jsonEncode(message.toJson()));
widget.tour.state = Constants.stateFinishedNotConfirmed;
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.jobs.put(widget.job);
});
checkJobFinished();
}
void checkJobFinished() async {
var jobFinished = true;
for(var tour in widget.job.tours) {
if (tour.state < 1) {
jobFinished = false;
}
}
if (jobFinished) {
widget.job.state = 2;
for(var tour in widget.job.tours) {
tour.state = 1;
}
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.jobs.put(widget.job);
});
}
}
}
+1 -12
View File
@@ -6,23 +6,12 @@ import 'package:stadtbote/model/tour_task.dart';
part 'job.g.dart';
@JsonSerializable()
class JobsPayload {
List<Job>? jobs;
JobsPayload({this.jobs});
factory JobsPayload.fromJson(Map<String, dynamic> json) => _$JobsPayloadFromJson(json);
Map<String, dynamic> toJson() => _$JobsPayloadToJson(this);
}
@collection
@JsonSerializable()
class Job {
late Id id;
@JsonKey(name: 'ver')
late int ver;
late String ver;
@JsonKey(name: 'state')
late int state;
@JsonKey(name: 'cr_filter')
+90 -24
View File
@@ -56,7 +56,7 @@ const JobSchema = CollectionSchema(
r'ver': PropertySchema(
id: 7,
name: r'ver',
type: IsarType.long,
type: IsarType.string,
),
r'vhtId': PropertySchema(
id: 8,
@@ -105,6 +105,7 @@ int _jobEstimateSize(
bytesCount += JobTourSchema.estimateSize(value, offsets, allOffsets);
}
}
bytesCount += 3 + object.ver.length * 3;
return bytesCount;
}
@@ -126,7 +127,7 @@ void _jobSerialize(
JobTourSchema.serialize,
object.tours,
);
writer.writeLong(offsets[7], object.ver);
writer.writeString(offsets[7], object.ver);
writer.writeLong(offsets[8], object.vhtId);
}
@@ -151,7 +152,7 @@ Job _jobDeserialize(
JobTour(),
) ??
[];
object.ver = reader.readLong(offsets[7]);
object.ver = reader.readString(offsets[7]);
object.vhtId = reader.readLong(offsets[8]);
return object;
}
@@ -184,7 +185,7 @@ P _jobDeserializeProp<P>(
) ??
[]) as P;
case 7:
return (reader.readLong(offset)) as P;
return (reader.readString(offset)) as P;
case 8:
return (reader.readLong(offset)) as P;
default:
@@ -928,46 +929,55 @@ extension JobQueryFilter on QueryBuilder<Job, Job, QFilterCondition> {
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verEqualTo(int value) {
QueryBuilder<Job, Job, QAfterFilterCondition> verEqualTo(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'ver',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verGreaterThan(
int value, {
String value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'ver',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verLessThan(
int value, {
String value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'ver',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verBetween(
int lower,
int upper, {
String lower,
String upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
@@ -976,6 +986,73 @@ extension JobQueryFilter on QueryBuilder<Job, Job, QFilterCondition> {
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'ver',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'ver',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verContains(String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'ver',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verMatches(String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'ver',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'ver',
value: '',
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'ver',
value: '',
));
});
}
@@ -1291,9 +1368,9 @@ extension JobQueryWhereDistinct on QueryBuilder<Job, Job, QDistinct> {
});
}
QueryBuilder<Job, Job, QDistinct> distinctByVer() {
QueryBuilder<Job, Job, QDistinct> distinctByVer({bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'ver');
return query.addDistinctBy(r'ver', caseSensitive: caseSensitive);
});
}
@@ -1353,7 +1430,7 @@ extension JobQueryProperty on QueryBuilder<Job, Job, QQueryProperty> {
});
}
QueryBuilder<Job, int, QQueryOperations> verProperty() {
QueryBuilder<Job, String, QQueryOperations> verProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'ver');
});
@@ -1370,20 +1447,9 @@ extension JobQueryProperty on QueryBuilder<Job, Job, QQueryProperty> {
// JsonSerializableGenerator
// **************************************************************************
JobsPayload _$JobsPayloadFromJson(Map<String, dynamic> json) => JobsPayload(
jobs: (json['jobs'] as List<dynamic>?)
?.map((e) => Job.fromJson(e as Map<String, dynamic>))
.toList(),
);
Map<String, dynamic> _$JobsPayloadToJson(JobsPayload instance) =>
<String, dynamic>{
'jobs': instance.jobs,
};
Job _$JobFromJson(Map<String, dynamic> json) => Job()
..id = json['id'] as int
..ver = json['ver'] as int
..ver = json['ver'] as String
..state = json['state'] as int
..crFilter = json['cr_filter'] as String?
..ordertime = json['ordertime'] as String
+3 -3
View File
@@ -203,7 +203,7 @@ Future<void> showAcceptJobsPopup(BuildContext context, List<Job> jobs, Function(
});
}
_sendAnswer(Job job, int item) {
_sendAnswer(Job job, int item) async {
var currentPosition = MyApp.currentPosition;
var message = Reaction();
@@ -219,8 +219,8 @@ _sendAnswer(Job job, int item) {
MqttCore.instance.publishText("reaction", jsonEncode(message.toJson()));
MyApp.isarInstance.writeTxnSync(() {
MyApp.isarInstance.jobs.deleteSync(job.id);
await MyApp.isarInstance.writeTxn(() async{
await MyApp.isarInstance.jobs.delete(job.id);
});
MessageService().publish(Constants.messageTopicRefreshBadges, arguments: RefreshBadgesMessage());
+1 -1
View File
@@ -19,7 +19,7 @@ class AcknowledgeJobReceived {
late int state;
late int ver;
late String ver;
late int utc;
@@ -21,7 +21,7 @@ AcknowledgeJobReceived _$AcknowledgeJobReceivedFromJson(
AcknowledgeJobReceived()
..id = json['id'] as int
..state = json['state'] as int
..ver = json['ver'] as int
..ver = json['ver'] as String
..utc = json['utc'] as int;
Map<String, dynamic> _$AcknowledgeJobReceivedToJson(
+72 -91
View File
@@ -4,11 +4,14 @@ import 'dart:math';
import 'package:archive/archive.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:http/http.dart' as http;
import 'package:isar/isar.dart';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:mqtt_client/mqtt_server_client.dart';
import 'package:stadtbote/model/enqueued_message.dart';
import 'package:stadtbote/model/job.dart';
import 'package:stadtbote/model/log_entry.dart';
import 'package:stadtbote/model/message.dart';
import 'package:stadtbote/model/status.dart';
import 'package:stadtbote/protocoll_messages/acknowledge_job.dart';
import 'package:stadtbote/protocoll_messages/bootstrap_request.dart';
@@ -16,9 +19,6 @@ import 'package:stadtbote/protocoll_messages/bootstrap_response_payload.dart';
import 'package:stadtbote/protocoll_messages/device_log_request.dart';
import 'package:stadtbote/protocoll_messages/device_log_response.dart';
import 'package:stadtbote/protocoll_messages/device_object.dart';
import 'package:stadtbote/model/job.dart';
import 'package:stadtbote/model/message.dart';
import 'package:stadtbote/protocoll_messages/payload_container.dart';
import 'package:stadtbote/protocoll_messages/start_session_message.dart';
import 'package:stadtbote/protocoll_messages/sync_jobs_message.dart';
import 'package:stadtbote/protocoll_messages/track_message.dart';
@@ -31,8 +31,6 @@ import 'package:stadtbote/tools/messages/session_info_update.dart';
import 'package:stadtbote/tools/messages/status_info_update.dart';
// ignore: depend_on_referenced_packages
import 'package:typed_data/typed_buffers.dart';
import 'package:http/http.dart' as http;
import 'package:uuid/uuid.dart';
import '../main.dart';
import '../model/session_status.dart';
@@ -52,6 +50,7 @@ class MqttCore {
late bool _disconnectInProgress = false;
late String _brokerUri;
late String _clientId;
late int _brokerPort;
late String _fromServerTopic;
late String _toServerTopic;
@@ -101,8 +100,8 @@ class MqttCore {
_mqttClient.connectionMessage = MqttConnectMessage()
.withClientIdentifier(await Util.getAppUuid())
.withWillQos(MqttQos.atMostOnce)
.withWillTopic('willTopic')
.withWillMessage('willMessage')
//.withWillTopic('willTopic')
//.withWillMessage('willMessage')
.authenticateAs("app", "apppwd");
await _mqttClient.connect();
@@ -145,83 +144,65 @@ class MqttCore {
var buffer = Uint8Buffer();
buffer.addAll(utf8.encode(text));
_mqttClient.publishMessage(topic, MqttQos.exactlyOnce, buffer);
var fullTopic = "$_toServerTopic$topic/$_clientId";
Util.logInfo("message\n$text\nsend to $topic");
}
_mqttClient.publishMessage(fullTopic, MqttQos.exactlyOnce, buffer);
publishPayloadMessage(String topic, Map<String, dynamic> payload) {
var payloadContainer = PayloadContainer();
payloadContainer.id = const Uuid().v4().toString();
payloadContainer.recv = topic;
payloadContainer.store = true;
payloadContainer.payload = payload;
var json = jsonEncode(payloadContainer.toJson());
try {
publishText(_toServerTopic, json);
} catch (e) {
_enqueueMessage(_toServerTopic, jsonEncode(payloadContainer.toJson()));
}
Util.logInfo("message\n$text\nsend to $fullTopic");
}
void _setupSubscriptions() async {
Util.logInfo('_setupSubscriptions called');
_mqttClient.updates?.listen((List<MqttReceivedMessage<MqttMessage>> c) {
_mqttClient.updates?.listen((List<MqttReceivedMessage<MqttMessage>> messages) {
try {
final MqttPublishMessage message = c[0].payload as MqttPublishMessage;
String payload = utf8.decode(MqttPublishPayload.bytesToStringAsString(message.payload.message).codeUnits);
var topic = message.variableHeader?.topicName;
for (var mqttMessage in messages) {
final MqttPublishMessage message = mqttMessage.payload as MqttPublishMessage;
Util.logInfo('message received\ntopic: $topic\nmessage: $payload');
if (message.variableHeader!.topicName.endsWith(_clientId)) {
String payload = utf8.decode(MqttPublishPayload.bytesToStringAsString(message.payload.message).codeUnits);
var topicArray = message.variableHeader?.topicName;
var topicArraySplited = topicArray!.split("/");
var topic = topicArraySplited[3];
Map<String, dynamic> messageData = jsonDecode(payload);
Util.logInfo('message received\ntopic: $topic\nmessage: $payload');
for (var entry in messageData.keys) {
if (entry == 'payload') {
var payload = messageData[entry];
for (var payloadEntry in payload.keys) {
var payloadData = payload[payloadEntry];
switch(topic) {
case 'session':
_sessionMessageReceived(jsonDecode(payload));
break;
switch(payloadEntry) {
case 'session':
_sessionMessageReceived(payloadData);
break;
case 'status':
_statusMessageReceived(jsonDecode(payload));
break;
case 'status':
_statusMessageReceived(payloadData);
break;
case 'ranks':
//_rankingMessageReceived(messageData);
break;
case 'ranks':
_rankingMessageReceived(payloadData);
break;
case 'job':
_jobMessageReceived(jsonDecode(payload));
break;
case 'jobs':
_jobMessageReceived(payloadData);
break;
case 'job_del':
_jobDeleteReceived(jsonDecode(payload));
break;
case 'job_del':
_jobDeleteReceived(payloadData);
break;
case 'sync_request':
_syncRequestReceived(jsonDecode(payload));
break;
case 'sync_request':
_syncRequestReceived(payloadData);
break;
case "mssg":
_messageMessageReceived(jsonDecode(payload));
break;
case "mssg":
_messageMessageReceived(payloadData);
break;
case "upload_device_log":
_messageUploadDeviceLogReceived(jsonDecode(payload));
break;
case "upload_device_log":
_messageUploadDeviceLogReceived(payloadData);
break;
default:
Util.logInfo('Unknown topic: $payloadEntry');
break;
}
default:
Util.logInfo('Unknown topic: $topic');
break;
}
}
}
@@ -230,8 +211,9 @@ class MqttCore {
}
});
_mqttClient.subscribe(_fromServerTopic, MqttQos.exactlyOnce);
Util.logInfo('subscribed to topic: $_fromServerTopic');
var fromServerTopic = "$_fromServerTopic#";
_mqttClient.subscribe(fromServerTopic, MqttQos.exactlyOnce);
Util.logInfo('subscribed to topic: $fromServerTopic');
MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.connected));
}
@@ -243,7 +225,7 @@ class MqttCore {
await _sendEnqueuedMessages();
var sessionStatusMessage = SessionStatus.fromJson(payloadData['status']);
var sessionStatusMessage = SessionStatus.fromJson(payloadData);
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.sessionStatus.clear();
@@ -279,28 +261,26 @@ class MqttCore {
}
void _jobMessageReceived(payloadData) async {
for (var foundJobData in payloadData) {
Job newJob = Job.fromJson(foundJobData);
Job newJob = Job.fromJson(payloadData);
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.jobs.put(newJob);
});
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.jobs.put(newJob);
});
if (newJob.state == Constants.stateAssigned) {
if (newJob.global) {
await Util.playMp3('aaa.mp3');
} else {
await Util.playMp3('job_received.mp3');
}
if (newJob.state == Constants.stateAssigned) {
if (newJob.global) {
await Util.playMp3('aaa.mp3');
} else {
await Util.playMp3('job_received.mp3');
}
}
try {
MessageService().publish<JobReceivedMessage>(Constants.messageTopicJobReceived, arguments: JobReceivedMessage(job: newJob));
} catch (ex) {
Util.logException("publish messageTopicJobReceived failed!");
}
_acknowlegdeJob(newJob);
_acknowlegdeJob(newJob);
try {
MessageService().publish<JobReceivedMessage>(Constants.messageTopicJobReceived, arguments: JobReceivedMessage(job: newJob));
} catch (ex) {
Util.logException("publish messageTopicJobReceived failed!");
}
}
@@ -402,18 +382,19 @@ class MqttCore {
handshakeMessage.ver = await Util.getAppVersion();
var jsonMap = handshakeMessage.toJson();
var json = jsonEncode(jsonMap);
var uri = "http://test-app-server.dns.army:8080=$json";
var json = Uri.encodeFull(jsonEncode(jsonMap));
var uri = "http://test-app-server.dns.army:8080/bootstrap?json=$json";
Util.logInfo("Bootstrap request: $uri");
var response = await http.get(Uri.parse(uri));
var responseText = response.body;
var bootstrapResponsePayload = BootstrapResponse.fromJson(jsonDecode(responseText)["payload"]);
var bootstrapResponsePayload = BootstrapResponse.fromJson(jsonDecode(responseText));
var brokerUriAndPortArray = bootstrapResponsePayload.broker.replaceFirst("mqtt://", "").split(":");
_brokerUri = brokerUriAndPortArray[0];
_brokerPort = int.parse(brokerUriAndPortArray[1]);
_clientId = bootstrapResponsePayload.id;
_fromServerTopic = bootstrapResponsePayload.fromServer;
_toServerTopic = bootstrapResponsePayload.toServer;
@@ -446,7 +427,7 @@ class MqttCore {
answer.sync.jobs.add(syncJob);
}
MqttCore.instance.publishPayloadMessage("server", answer.toJson());
MqttCore.instance.publishText("sync_request_response", jsonEncode(answer.toJson()));
}
void _startTrackTimer() {
@@ -460,7 +441,7 @@ class MqttCore {
trackMessage.pos!.long = position.longitude;
trackMessage.pos!.acc = position.accuracy.toInt();
publishPayloadMessage("track", trackMessage.toJson());
publishText("track", jsonEncode(trackMessage.toJson()));
}
});
}
@@ -507,6 +488,6 @@ class MqttCore {
message.received.ver = job.ver;
message.received.utc = DateTime.now().millisecondsSinceEpoch;
MqttCore.instance.publishPayloadMessage('job', message.toJson());
MqttCore.instance.publishText('job', jsonEncode(message.toJson()));
}
}