fix runid

This commit is contained in:
2026-08-03 17:54:36 +08:00
parent a3b7d3d876
commit 8c3df90a87
6 changed files with 71 additions and 10 deletions
+40 -5
View File
@@ -496,6 +496,39 @@ function createApp({
return notification;
}
function findIdentificationFeedbackRecord(database, deviceId, fileName) {
if (!deviceId || !fileName) return null;
const normalizedFileName = String(fileName);
return database.identificationFeedback.find((item) =>
item.deviceId === deviceId
&& (item.fileName === normalizedFileName || item.runId === normalizedFileName)
) || null;
}
function resolveIdentificationRunId(database, record) {
if (!record) return null;
if (record.runId) return String(record.runId);
const feedback = findIdentificationFeedbackRecord(database, record.deviceId, record.fileName);
if (feedback) return String(feedback.runId);
if (record.fileName) return String(record.fileName);
return null;
}
function enrichIdentificationFile(database, record) {
const runId = resolveIdentificationRunId(database, record);
return runId ? { ...record, runId } : { ...record };
}
function enrichNotification(database, notification) {
if (!notification || notification.type !== "identification_result_ready" || !notification.fileID) {
return notification;
}
const related = database.identificationFiles.find((item) => item.fileID === notification.fileID)
|| database.panelInbox.find((item) => item.fileID === notification.fileID);
const runId = resolveIdentificationRunId(database, related);
return runId ? { ...notification, runId } : notification;
}
async function purgeExpiredIdentificationFiles() {
return store.update(async (database) => {
backfillIdentificationFiles(database);
@@ -901,16 +934,16 @@ function createApp({
const message = database.panelInbox.find((item) => {
if (item.deviceId !== deviceId) return false;
if (item.mediaType !== "csv") return true;
return database.identificationFeedback.some((feedback) =>
feedback.deviceId === deviceId && feedback.runId === item.fileName
);
return Boolean(findIdentificationFeedbackRecord(database, deviceId, item.fileName));
});
if (!message) return { success: true, pending: false };
const runId = resolveIdentificationRunId(database, message);
return {
success: true,
pending: true,
fileID: message.fileID,
fileName: message.fileName,
runId,
mediaType: message.mediaType,
uploadTime: message.uploadTime,
url: issueDownloadUrl(req, message.fileID)
@@ -923,7 +956,7 @@ function createApp({
const database = await store.read();
const notification = database.panelNotifications.find((item) => item.deviceId === deviceId);
return notification
? { success: true, pending: true, notification }
? { success: true, pending: true, notification: enrichNotification(database, notification) }
: { success: true, pending: false };
}
case "ackPanelNotification": {
@@ -988,7 +1021,7 @@ function createApp({
const offset = (page - 1) * pageSize;
return {
success: true,
files: files.slice(offset, offset + pageSize),
files: files.slice(offset, offset + pageSize).map((record) => enrichIdentificationFile(database, record)),
total: files.length,
page,
pageSize
@@ -1065,10 +1098,12 @@ function createApp({
if (!historyRecord || !fileRecord || !store.resolveStoredFile(fileRecord.fileID)) {
return { success: false, errMsg: "辨识文件不存在" };
}
const runId = resolveIdentificationRunId(database, historyRecord);
return {
success: true,
fileID: fileRecord.fileID,
fileName: fileRecord.fileName,
runId,
mediaType: historyRecord.mediaType,
url: issueDownloadUrl(req, fileRecord.fileID)
};
+3
View File
@@ -294,6 +294,7 @@ test("panel consumes uploaded device files from an inbox without scanning folder
});
assert.equal(pending.pending, true);
assert.equal(pending.fileName, "result_20260724_120000.csv");
assert.equal(pending.runId, "result_20260724_120000.csv");
assert.equal(await (await fetch(pending.url)).text(), "t,u,p\n0,10,20\n");
assert.equal((await post({
@@ -328,6 +329,7 @@ test("panel consumes uploaded device files from an inbox without scanning folder
});
assert.equal(history.total, 2);
const csvHistory = history.files.find((file) => file.fileID === pending.fileID);
assert.equal(csvHistory.runId, "result_20260724_120000.csv");
assert.equal(csvHistory.status, "processed");
assert.ok(csvHistory.processedAt);
assert.ok(csvHistory.expiresAt);
@@ -575,6 +577,7 @@ test("panel notifications and volume configuration stay isolated by device", asy
type: "getPendingPanelNotification", deviceId, adminToken: "test-token"
});
assert.equal(identificationResult.notification.type, "identification_result_ready");
assert.equal(identificationResult.notification.runId, "identification_result.json");
});
test("admin manages companies and production lines with a stable device id", async () => {