|
|
@@ -4,6 +4,7 @@
|
|
|
var isReading = false;
|
|
|
var isConnecting = false;
|
|
|
var lastUid = "";
|
|
|
+ var seenUids = new Map();
|
|
|
|
|
|
function getEl(id) {
|
|
|
return document.getElementById(id);
|
|
|
@@ -49,6 +50,54 @@
|
|
|
reader.iso15693NumberOfBlocks = getValue("iso15693NumberOfBlocksInput", "7");
|
|
|
}
|
|
|
|
|
|
+ function getDedupeMode() {
|
|
|
+ return getValue("dedupeMode", "session");
|
|
|
+ }
|
|
|
+
|
|
|
+ function getDedupeTimeMs() {
|
|
|
+ var raw = getValue("dedupeTime", "5000");
|
|
|
+ var timeMs = parseInt(raw, 10);
|
|
|
+ if (!timeMs || timeMs < 0) {
|
|
|
+ return 5000;
|
|
|
+ }
|
|
|
+ return timeMs;
|
|
|
+ }
|
|
|
+
|
|
|
+ function clearDedupeHistory() {
|
|
|
+ seenUids.clear();
|
|
|
+ lastUid = "";
|
|
|
+ }
|
|
|
+
|
|
|
+ function checkDuplicate(uid) {
|
|
|
+ var dedupeMode = getDedupeMode();
|
|
|
+
|
|
|
+ if (dedupeMode === "none") {
|
|
|
+ return { isDup: false };
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dedupeMode === "session") {
|
|
|
+ if (seenUids.has(uid)) {
|
|
|
+ return { isDup: true };
|
|
|
+ }
|
|
|
+ return { isDup: false };
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dedupeMode === "time") {
|
|
|
+ var info = seenUids.get(uid);
|
|
|
+ var dedupeTimeMs = getDedupeTimeMs();
|
|
|
+ if (info && Date.now() - info.time < dedupeTimeMs) {
|
|
|
+ return { isDup: true };
|
|
|
+ }
|
|
|
+ return { isDup: false };
|
|
|
+ }
|
|
|
+
|
|
|
+ return { isDup: false };
|
|
|
+ }
|
|
|
+
|
|
|
+ function recordUid(uid, protocol) {
|
|
|
+ seenUids.set(uid, { protocol: protocol, time: Date.now() });
|
|
|
+ }
|
|
|
+
|
|
|
function setNfcValue(uid) {
|
|
|
var input = getEl("nfch");
|
|
|
if (!input) return;
|
|
|
@@ -67,6 +116,7 @@
|
|
|
|
|
|
function handleDisconnect(message) {
|
|
|
stopPolling();
|
|
|
+ clearDedupeHistory();
|
|
|
reader.connected = false;
|
|
|
reader.handle = null;
|
|
|
setStatus(message || "读卡器未连接", "#ef4444");
|
|
|
@@ -105,9 +155,12 @@
|
|
|
applyReaderConfig();
|
|
|
var result = await readUidBothProtocols();
|
|
|
if (result && result.uid) {
|
|
|
- if (result.uid !== lastUid) {
|
|
|
- lastUid = result.uid;
|
|
|
+ var dupCheck = checkDuplicate(result.uid);
|
|
|
+ if (dupCheck.isDup) {
|
|
|
+ return;
|
|
|
}
|
|
|
+ recordUid(result.uid, result.protocol);
|
|
|
+ lastUid = result.uid;
|
|
|
setNfcValue(result.uid);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
@@ -143,6 +196,7 @@
|
|
|
|
|
|
try {
|
|
|
applyReaderConfig();
|
|
|
+ clearDedupeHistory();
|
|
|
await reader.selectDevice();
|
|
|
setStatus("读卡器连接成功", "#16a34a");
|
|
|
showConnectButton(false);
|
|
|
@@ -167,6 +221,13 @@
|
|
|
connectReader(true);
|
|
|
});
|
|
|
}
|
|
|
+
|
|
|
+ var dedupeModeEl = getEl("dedupeMode");
|
|
|
+ if (dedupeModeEl) {
|
|
|
+ dedupeModeEl.addEventListener("change", function () {
|
|
|
+ clearDedupeHistory();
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
function init() {
|