const Sm4Util = require("../../utils/sm4-util"); const CARD_STRING_FIELDS = [ "CardIDCode", "CardNum", "CardType", "Gender", "IDNum", "Name", "PsamTN", "Message", "flag", "ylbxtcqbm", ]; function normalizeCardData(value) { if (!value || typeof value !== "object" || Array.isArray(value)) { return null; } const data = { CanOpen: value.CanOpen === true, Success: value.Success === true, }; for (const field of CARD_STRING_FIELDS) { if (value[field] === undefined || value[field] === null) continue; if (typeof value[field] !== "string") return null; const text = value[field].trim(); if (text.length > 256) return null; data[field] = text; } if (!data.CanOpen || !data.Success) return null; if (!data.IDNum && !data.CardNum && !data.CardIDCode) return null; return data; } function normalizeString(value, maxLength) { if (typeof value !== "string") return ""; const text = value.trim(); return text.length <= maxLength ? text : ""; } async function saveScannedCard(item, db) { const cardData = normalizeCardData(item.cardData); if (!cardData) { return { success: false, message: "卡片数据无效" }; } try { const encryptedCardData = Sm4Util.encryptDataForSm3(JSON.stringify(cardData)); const storeIds = Array.isArray(item.storeIds) ? [...new Set(item.storeIds.map((value) => normalizeString(value, 100)).filter(Boolean))] : []; const record = { encryptedCardData, encryption: "SM4", dataVersion: 1, readerType: normalizeString(item.readerType, 50) || "ZJ_HZ_310000", corpId: normalizeString(item.corpId, 100), storeIds, createTime: Date.now(), }; const result = await db.collection("scanned-card-archive").insertOne(record); return { success: true, id: result.insertedId.toString(), message: "卡片数据保存成功", }; } catch (error) { console.error("保存扫码建档数据失败:", error.message); return { success: false, message: "保存卡片数据失败" }; } } module.exports = async (item, db) => { switch (item.type) { case "saveScannedCard": return saveScannedCard(item, db); default: return { success: false, message: "未找到接口" }; } }; module.exports.normalizeCardData = normalizeCardData; module.exports.saveScannedCard = saveScannedCard;