292 lines
8.1 KiB
Dart
292 lines
8.1 KiB
Dart
import 'package:json_annotation/json_annotation.dart';
|
|
|
|
part 'scheduled_task_models.g.dart';
|
|
|
|
/// 应用内统一调度的任务标识,枚举名作为 scheduled_task.taskCode,不能随 UI 文案变化。
|
|
enum ScheduledTaskType {
|
|
/// MQTT 长连接断开后的重连检查。
|
|
mqReconnect,
|
|
|
|
/// 待打印任务与打印结果同步检查。
|
|
printCheck,
|
|
|
|
/// 取餐广播本地队列检查。
|
|
broadcastCheck,
|
|
|
|
/// 打印机、电子秤、读卡器等终端硬件状态检查。
|
|
deviceStatus,
|
|
|
|
/// 检查并通过 Root 静默安装最高的已发布 Android APK 版本。
|
|
autoUpdate,
|
|
|
|
/// 服务端设备配置同步。
|
|
configSync,
|
|
|
|
/// 本部门及子部门人脸权威快照同步;MQ 用户增量也复用同一任务队列。
|
|
departmentFaceSync,
|
|
|
|
/// 商品分类数据同步。
|
|
classifySync,
|
|
|
|
/// 商品主数据同步。
|
|
productSync,
|
|
|
|
/// 本地离线订单补传。
|
|
offlineOrderSync,
|
|
|
|
/// 已支付订单的人脸等识别证据对账、上传和永久缺失上报。
|
|
orderEvidenceUpload,
|
|
|
|
/// 本机脱敏日志文件上传。
|
|
terminalLogUpload,
|
|
|
|
/// 已成功上传的过期日志清理。
|
|
expiredLogCleanup,
|
|
}
|
|
|
|
/// 任务最近一次执行状态,枚举名直接持久化到任务表和任务日志表。
|
|
enum ScheduledTaskRunStatus {
|
|
/// 尚未产生过执行记录。
|
|
notRun,
|
|
|
|
/// 任务已经开始但尚未结束。
|
|
running,
|
|
|
|
/// 任务已完成且业务结果成功。
|
|
success,
|
|
|
|
/// 任务执行失败并记录了错误信息。
|
|
failed,
|
|
|
|
/// 因网络不可用或数据未变化而无需执行后续动作。
|
|
skipped,
|
|
}
|
|
|
|
/// 任务触发来源,枚举名写入 scheduled_task_log.triggerType。
|
|
enum ScheduledTaskTriggerType {
|
|
/// Cron 到点自动触发。
|
|
cron,
|
|
|
|
/// 设置页“立即执行”人工触发。
|
|
manual,
|
|
|
|
/// 后台通过 MQTT 指令触发。
|
|
mqtt,
|
|
|
|
/// 应用启动或其他内部流程触发。
|
|
system,
|
|
}
|
|
|
|
/// 任务依赖的主要资源类型,用于执行日志筛选和故障归类。
|
|
enum ScheduledTaskSourceType {
|
|
/// MQTT 消息服务。
|
|
mqtt,
|
|
|
|
/// HTTP 业务接口。
|
|
http,
|
|
|
|
/// 打印、串口或其他终端插件。
|
|
plugin,
|
|
|
|
/// 本地日志等文件系统资源。
|
|
file,
|
|
|
|
/// 不依赖远程服务的本地队列或本地逻辑。
|
|
local,
|
|
}
|
|
|
|
/// 本机文件上传记录状态,枚举名写入 file_upload_record.status。
|
|
enum FileUploadStatus {
|
|
/// 已创建上传尝试,文件尚未确认成功。
|
|
uploading,
|
|
|
|
/// 服务端确认无需上传或已经上传成功。
|
|
success,
|
|
|
|
/// 本次预检、脱敏或上传处理失败。
|
|
failed,
|
|
}
|
|
|
|
/// Cron 常用规则在选择弹窗中的分组。
|
|
enum ScheduledCronPresetGroup {
|
|
/// 按秒、分钟或小时周期执行。
|
|
interval,
|
|
|
|
/// 每天固定时间执行。
|
|
daily,
|
|
|
|
/// 每周固定星期和时间执行。
|
|
weekly,
|
|
|
|
/// 每月固定日期和时间执行。
|
|
monthly,
|
|
}
|
|
|
|
/// Cron 弹窗使用的数据模型,表达式仍以调度器实际支持的六段格式保存。
|
|
class ScheduledCronPreset {
|
|
/// 创建一条可直接应用到任务配置的 Cron 预设。
|
|
const ScheduledCronPreset({
|
|
required this.group,
|
|
required this.label,
|
|
required this.expression,
|
|
});
|
|
|
|
/// 预设在选择弹窗中的分类。
|
|
final ScheduledCronPresetGroup group;
|
|
|
|
/// 面向终端操作人员展示的规则名称。
|
|
final String label;
|
|
|
|
/// cron 0.6.2 支持的六段表达式,顺序为秒、分、时、日、月、周。
|
|
final String expression;
|
|
}
|
|
|
|
/// 定时任务可编辑配置,旧 JSON 只在 SQLite v8 首次迁移时读取。
|
|
@JsonSerializable()
|
|
class ScheduledTaskConfig {
|
|
/// 稳定任务类型,对应 scheduled_task.taskCode。
|
|
final ScheduledTaskType type;
|
|
|
|
/// 是否注册自动 Cron 调度;关闭后仍允许手动执行。
|
|
final bool enabled;
|
|
|
|
/// 六段 Cron 表达式。
|
|
final String cron;
|
|
|
|
/// 自动触发后是否必须等待连续 60 秒无人操作的完整空闲状态。
|
|
final bool idleOnly;
|
|
|
|
/// 创建一份任务调度配置。
|
|
const ScheduledTaskConfig({
|
|
required this.type,
|
|
required this.enabled,
|
|
required this.cron,
|
|
required this.idleOnly,
|
|
});
|
|
|
|
/// 从旧版 sysJson 恢复迁移用任务配置。
|
|
factory ScheduledTaskConfig.fromJson(Map<String, dynamic> json) =>
|
|
_$ScheduledTaskConfigFromJson(json);
|
|
|
|
/// 仅供旧版配置兼容和代码生成使用,不作为 v8 之后的持久化入口。
|
|
Map<String, dynamic> toJson() => _$ScheduledTaskConfigToJson(this);
|
|
|
|
/// 保留任务类型并生成包含指定变更的新配置。
|
|
ScheduledTaskConfig copyWith({
|
|
bool? enabled,
|
|
String? cron,
|
|
bool? idleOnly,
|
|
}) {
|
|
return ScheduledTaskConfig(
|
|
type: type,
|
|
enabled: enabled ?? this.enabled,
|
|
cron: cron ?? this.cron,
|
|
idleOnly: idleOnly ?? this.idleOnly,
|
|
);
|
|
}
|
|
}
|
|
|
|
/// 设置页展示的任务最近执行快照。
|
|
@JsonSerializable()
|
|
class ScheduledTaskRecord {
|
|
/// 最近一次开始执行的本地时间;从未执行时为空。
|
|
final DateTime? lastRunAt;
|
|
|
|
/// 最近一次成功完成的本地时间;尚无成功记录时为空。
|
|
final DateTime? lastSuccessAt;
|
|
|
|
/// 最近结果是否可视为成功,跳过状态也按可继续运行处理。
|
|
final bool success;
|
|
|
|
/// 最近结果的简短中文摘要。
|
|
final String message;
|
|
|
|
/// 创建任务最近执行快照。
|
|
const ScheduledTaskRecord({
|
|
this.lastRunAt,
|
|
this.lastSuccessAt,
|
|
this.success = true,
|
|
this.message = '尚未执行',
|
|
});
|
|
|
|
/// 从旧版 sysJson 恢复迁移用执行快照。
|
|
factory ScheduledTaskRecord.fromJson(Map<String, dynamic> json) =>
|
|
_$ScheduledTaskRecordFromJson(json);
|
|
|
|
/// 仅供旧版执行快照兼容和代码生成使用。
|
|
Map<String, dynamic> toJson() => _$ScheduledTaskRecordToJson(this);
|
|
}
|
|
|
|
/// 日志文件最近一次成功上传状态,用于本地未变化文件快速跳过。
|
|
@JsonSerializable()
|
|
class TerminalLogUploadState {
|
|
/// 日志根目录下使用正斜杠的相对路径。
|
|
final String relativePath;
|
|
|
|
/// 生成脱敏副本时读取的原日志快照大小,单位为字节。
|
|
final int sourceSize;
|
|
|
|
/// 生成脱敏副本时原日志文件的最后修改时间。
|
|
final DateTime sourceModifiedTime;
|
|
|
|
/// 脱敏后文件内容的 MD5 哈希。
|
|
final String sanitizedHash;
|
|
|
|
/// 服务端确认成功或无需重复上传的本地时间。
|
|
final DateTime uploadedAt;
|
|
|
|
/// 创建一条成功上传状态。
|
|
const TerminalLogUploadState({
|
|
required this.relativePath,
|
|
required this.sourceSize,
|
|
required this.sourceModifiedTime,
|
|
required this.sanitizedHash,
|
|
required this.uploadedAt,
|
|
});
|
|
|
|
/// 从旧版 sysJson 恢复待迁移的文件状态。
|
|
factory TerminalLogUploadState.fromJson(Map<String, dynamic> json) =>
|
|
_$TerminalLogUploadStateFromJson(json);
|
|
|
|
/// 仅供旧版文件状态兼容和代码生成使用。
|
|
Map<String, dynamic> toJson() => _$TerminalLogUploadStateToJson(this);
|
|
}
|
|
|
|
/// 单次终端日志上传任务的汇总统计。
|
|
@JsonSerializable()
|
|
class TerminalLogUploadSummary {
|
|
/// 本次进入处理范围的日志文件数量。
|
|
final int scanned;
|
|
|
|
/// 因本地快照未变化或服务端已有相同内容而跳过的数量。
|
|
final int skipped;
|
|
|
|
/// 本次实际上传成功的文件数量。
|
|
final int succeeded;
|
|
|
|
/// 本次脱敏、预检或上传失败的文件数量。
|
|
final int failed;
|
|
|
|
/// 本次任务内最近一次成功确认时间;没有成功文件时为空。
|
|
final DateTime? lastSuccessAt;
|
|
|
|
/// 创建一次日志上传汇总,未传入的计数按零处理。
|
|
const TerminalLogUploadSummary({
|
|
this.scanned = 0,
|
|
this.skipped = 0,
|
|
this.succeeded = 0,
|
|
this.failed = 0,
|
|
this.lastSuccessAt,
|
|
});
|
|
|
|
/// 从旧版 sysJson 恢复迁移用上传汇总。
|
|
factory TerminalLogUploadSummary.fromJson(Map<String, dynamic> json) =>
|
|
_$TerminalLogUploadSummaryFromJson(json);
|
|
|
|
/// 仅供旧版上传汇总兼容和代码生成使用。
|
|
Map<String, dynamic> toJson() => _$TerminalLogUploadSummaryToJson(this);
|
|
|
|
/// 生成设置页和任务日志共用的中文统计摘要。
|
|
String get label => '扫描 $scanned,跳过 $skipped,成功 $succeeded,失败 $failed';
|
|
}
|