feat: implement backend label print agent system for remote label rendering and job management
Build and Push Multi-Platform Images / build-and-push (push) Successful in 33s

This commit is contained in:
bjoernpoettker committed 2026-05-07 22:46:29 +02:00
1 parent 0c94e7b999
commit 80f862a0c0
15 files changed
+995 -15

No files matched your search

@@ -24,6 +24,7 @@ import {
InboxPostprocessingAction,
CorrespondentEmailMapping,
UserSettings,
LabelPrintJob,
} from './entities';
const entities = [
@@ -49,6 +50,7 @@ const entities = [
InboxPostprocessingAction,
CorrespondentEmailMapping,
UserSettings,
LabelPrintJob,
];
@Module({
@@ -8,6 +8,17 @@ import {
export type BarcodeActionType = 'SEND_TO_PAPERLESS' | 'SEND_BY_EMAIL';
export interface LabelInputField {
name: string;
label: string;
type: 'text' | 'number' | 'date';
}
export type LabelElement =
| { type: 'text'; content: string; x: number; y: number; fontSize: number; bold?: boolean; align?: 'left' | 'center' | 'right'; maxWidth?: number }
| { type: 'qr'; content: string; x: number; y: number; sizeMm: number }
| { type: 'line'; x1: number; y1: number; x2: number; y2: number; lineWidth?: number };
@Entity('barcode_templates')
export class BarcodeTemplate {
@PrimaryGeneratedColumn()
@@ -28,6 +39,31 @@ export class BarcodeTemplate {
@Column({ type: 'json' })
Actions!: BarcodeActionType[];
// ── Label-Konfiguration ─────────────────────────────────────
@Column({ type: 'boolean', default: false })
LabelEnabled!: boolean;
@Column({ type: 'int', nullable: true })
LabelWidthMm!: number | null;
@Column({ type: 'int', nullable: true })
LabelHeightMm!: number | null;
@Column({ type: 'json', nullable: true })
LabelInputFields!: LabelInputField[] | null;
@Column({ type: 'varchar', length: 1000, nullable: true })
LabelGetUrl!: string | null;
@Column({ type: 'varchar', length: 1000, nullable: true })
LabelPrintedUrl!: string | null;
@Column({ type: 'varchar', length: 1000, nullable: true })
LabelReleaseUrl!: string | null;
@Column({ type: 'json', nullable: true })
LabelLayout!: LabelElement[] | null;
@CreateDateColumn()
CreatedAt!: Date;
@@ -20,3 +20,4 @@ export { InboxDocument } from './inbox-document.entity';
export { InboxPostprocessingAction } from './inbox-postprocessing-action.entity';
export { CorrespondentEmailMapping } from './correspondent-email-mapping.entity';
export { UserSettings } from './user-settings.entity';
export { LabelPrintJob } from './label-print-job.entity';
@@ -0,0 +1,51 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
} from 'typeorm';
@Entity('label_print_jobs')
export class LabelPrintJob {
@PrimaryGeneratedColumn()
Id!: number;
@Column({ type: 'varchar', length: 20, default: 'pending' })
Status!: 'pending' | 'printed' | 'error';
@Column({ type: 'mediumblob', nullable: true })
LabelImageData!: Buffer | null;
@Column({ type: 'int' })
LabelWidthMm!: number;
@Column({ type: 'int' })
LabelHeightMm!: number;
@Column({ type: 'int', nullable: true })
BarcodeTemplateId!: number | null;
@Column({ type: 'json', nullable: true })
LabelVariables!: Record<string, string> | null;
@Column({ type: 'datetime', nullable: true })
LockedAt!: Date | null;
@Column({ type: 'varchar', length: 255, nullable: true })
LockedByAgent!: string | null;
@Column({ type: 'datetime', nullable: true })
PrintedAt!: Date | null;
@Column({ type: 'varchar', length: 255, nullable: true })
PrintedByAgent!: string | null;
@Column({ type: 'varchar', length: 255, nullable: true })
PrinterName!: string | null;
@Column({ type: 'text', nullable: true })
ErrorMessage!: string | null;
@CreateDateColumn()
CreatedAt!: Date;
}