initial
This commit is contained in:
@@ -1,6 +1,13 @@
|
||||
const config = require('./config');
|
||||
const apiClient = require('./api-client');
|
||||
|
||||
function parseOptionalNonNegativeNumber(value) {
|
||||
if (value === undefined || value === null || value === '') return null;
|
||||
const parsed = Number(value);
|
||||
if (!Number.isFinite(parsed) || parsed < 0) return null;
|
||||
return parsed;
|
||||
}
|
||||
|
||||
class AbandonedCallPoller {
|
||||
constructor(database, printer) {
|
||||
this.db = database;
|
||||
@@ -53,7 +60,7 @@ class AbandonedCallPoller {
|
||||
const result = await apiClient.getAbandonedCalls(
|
||||
appConfig.authToken,
|
||||
appConfig.selectedBotId,
|
||||
{ limit: 50 }
|
||||
{ limit: 200 }
|
||||
);
|
||||
|
||||
if (result.error) {
|
||||
@@ -98,18 +105,22 @@ class AbandonedCallPoller {
|
||||
const printerConfigs = this.db.getAbandonedCallPrinters();
|
||||
if (!printerConfigs || printerConfigs.length === 0) return;
|
||||
|
||||
const cooldownSeconds = parseInt(appConfig.abandonedCallPrintCooldown, 10) || 300;
|
||||
const lastPrintTime = this.db.getLastAbandonedCallPrintTime();
|
||||
const now = Math.floor(Date.now() / 1000);
|
||||
|
||||
const printablePriorities = new Set(['critical', 'high', 'medium']);
|
||||
const configuredCooldown = parseOptionalNonNegativeNumber(appConfig.abandonedCallPrintCooldown);
|
||||
const cooldownSeconds = configuredCooldown === null ? 0 : configuredCooldown;
|
||||
const minScoreForPrint = parseOptionalNonNegativeNumber(appConfig.abandonedCallMinScoreForPrint);
|
||||
let lastPrintTime = this.db.getLastAbandonedCallPrintTime();
|
||||
|
||||
for (const call of calls) {
|
||||
if (!call || !call.id) continue;
|
||||
if (this.db.hasAbandonedCallPrint(call.id)) continue;
|
||||
|
||||
const priority = call.callback_priority || 'none';
|
||||
if (!printablePriorities.has(priority)) continue;
|
||||
const score = Number(call.callback_score) || 0;
|
||||
if (minScoreForPrint !== null && score < minScoreForPrint) {
|
||||
console.log(`Abandoned call #${call.id}: skipping print (score ${score} below configured minimum ${minScoreForPrint})`);
|
||||
continue;
|
||||
}
|
||||
|
||||
const now = Math.floor(Date.now() / 1000);
|
||||
if (lastPrintTime && (now - lastPrintTime) < cooldownSeconds) {
|
||||
console.log(`Abandoned call #${call.id}: skipping print (cooldown active)`);
|
||||
continue;
|
||||
@@ -117,9 +128,18 @@ class AbandonedCallPoller {
|
||||
|
||||
try {
|
||||
const result = await this.printer.printAbandonedCallReceipt(call, printerConfigs);
|
||||
const printedCount = result ? (result.successCount || printerConfigs.length) : 0;
|
||||
this.db.addAbandonedCallPrint(call.id, printedCount);
|
||||
console.log(`Abandoned call #${call.id}: printed on ${printedCount} printer(s)`);
|
||||
const printedCount = result && typeof result.successCount === 'number'
|
||||
? result.successCount
|
||||
: (result && result.success ? printerConfigs.length : 0);
|
||||
|
||||
if (result && result.success && printedCount > 0) {
|
||||
this.db.addAbandonedCallPrint(call.id, printedCount);
|
||||
lastPrintTime = Math.floor(Date.now() / 1000);
|
||||
console.log(`Abandoned call #${call.id}: printed on ${printedCount} printer(s)`);
|
||||
} else {
|
||||
const message = result && result.error ? result.error : 'No printers succeeded';
|
||||
console.error(`Abandoned call #${call.id}: print failed: ${message}`);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`Abandoned call #${call.id}: print failed:`, err.message);
|
||||
}
|
||||
|
||||
@@ -879,7 +879,8 @@ class DatabaseManager {
|
||||
cleanOldAbandonedCallCache(maxAgeDays = 7) {
|
||||
const cutoff = Math.floor(Date.now() / 1000) - (maxAgeDays * 86400);
|
||||
this.db.prepare('DELETE FROM abandoned_calls_cache WHERE updated_at < ?').run(cutoff);
|
||||
this.db.prepare('DELETE FROM abandoned_call_prints WHERE printed_at < ?').run(cutoff);
|
||||
// Print records are dedupe state, not cache. Keep them so old calls do not
|
||||
// reprint days later after the UI cache has been cleaned.
|
||||
}
|
||||
|
||||
close() {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "kitchen-agent",
|
||||
"version": "1.0.7",
|
||||
"version": "1.0.8",
|
||||
"description": "Kitchen Agent for ThinkLink Food Order Management",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
|
||||
Reference in New Issue
Block a user