vf107/src/worker/passRecordWorker.js
@@ -12,7 +12,7 @@
 *
 * 职责:
 * - 常驻运行,只要 MQTT 连接就持续上报
 * - 每次加载所有未删除的通行记录(d1_pass_record)
 * - 每次加载所有未上报的通行记录(d1_pass_record)
 * - 每隔 5 秒上报一条
 * - 发完当前批次后,自动重新加载最新记录
 */
@@ -29,10 +29,12 @@
    return mqtt_map.get("MQTT_STATUS") === "connected"
}
// 加载新批次:查询所有未删除的记录(按时间升序)
// 加载新批次:查询所有未删除且未上报的记录(按时间升序)
function loadNewBatch() {
    try {
        currentBatch = sqliteService.d1_pass_record.findAllOrderByTimeStampAsc()
        let sql = `SELECT * FROM d1_pass_record WHERE reported = 0 OR reported IS NULL ORDER BY timeStamp ASC`
        let result = sqliteService.select(sql)
        currentBatch = result || []
        currentIndex = 0
    } catch (err) {
        logger.error("[passRecordWorker] Failed to load batch:", err)
@@ -59,29 +61,70 @@
        return
    }
    let extra = record.extra ? JSON.parse(record.extra) : ""
    let extra2 = record.extra2 ? JSON.parse(record.extra2) : ""
    let accessRecord = {
        userId: record.userId,
        type: record.type,
        result: record.result,
        timeStamp: mqttService.timestampToDateString(record.timeStamp || 0),
        result: record.result || 0,
        error: record.message || "",
        // permissionId: record.permissionId || "", // TODO
        door: config.get("houseName") || "",
        users: [
            {
                userId: record.userId || "",
        name: extra && extra.name ? extra.name : "",
        timeStamp: record.timeStamp,
        extra: {},
        error: record.message
                userType: extra && extra.type ? extra.type : 0,
                accessType: extra && extra.accessType !== undefined ? extra.accessType : "",
                card: extra && extra.card ? extra.card : "",
                face: extra && extra.face ? extra.face : "",
                finge: extra && extra.finge ? extra.finge : ""
    }
        ]
    }
    // 如果是双人认证,添加第二个用户信息
    if (record.userId2) {
        let secondUser = {
            userId: record.userId2 || "",
            name: extra2 && extra2.name ? extra2.name : "",
            userType: extra2 && extra2.type ? extra2.type : 0,
            accessType: extra2 && extra2.accessType !== undefined ? extra2.accessType : "",
            card: extra2 && extra2.card ? extra2.card : "",
            face: extra2 && extra2.face ? extra2.face : "",
            finge: extra2 && extra2.finge ? extra2.finge : ""
        }
        // 根据认证类型添加相应的认证信息
        if (extra2 && extra2.accessType == 200 && extra2.card) {
            secondUser.card = extra2.card
        } else if (extra2 && extra2.accessType == 300) {
            // 人脸认证,face字段可以留空或添加相应信息
        } else if (extra2 && extra2.accessType == 500) {
            // 指纹认证,finge字段可以留空或添加相应信息
        }
        accessRecord.users.push(secondUser)
    }
    if (record.type == 300) {
        if (std.exist(record.code) && config.get("access.uploadToCloud")) {
            accessRecord.code = dxCommonUtils.fs.fileToBase64(record.code)
        if (std.exist(record.code)) {
            // 人脸认证,将图片转换为base64填充到face字段
            accessRecord.users[0].face = dxCommonUtils.fs.fileToBase64(record.code)
            if (currentIndex > 0) {
                currentBatch[currentIndex - 1].code = ""
            }
        } else {
            accessRecord.code = ""
            accessRecord.users[0].face = ""
        }
        // 如果有第二个用户的二维码
        if (record.code2) {
            accessRecord.users[1] = accessRecord.users[1] || {}
            accessRecord.users[1].code = record.code2
        }
    }
    // 发送
    try {
        const sn = config.get("sys.sn") || "default"
        driver.mqtt.send(
            "access_device/v2/event/access",
            `access_device/v2/event/${sn}/access`,
            JSON.stringify(
                mqttService.mqttReply(
                    record.id,
@@ -90,6 +133,13 @@
                )
            )
        )
        // 标记记录为已上报
        try {
            let updateSql = `UPDATE d1_pass_record SET reported = 1 WHERE id = '${record.id}'`
            sqliteService.exec(updateSql)
        } catch (updateErr) {
            logger.error("[passRecordWorker] Failed to update reported status for record", record.id, updateErr)
        }
    } catch (e) {
        logger.error("[passRecordWorker] Send failed for record", record.id, e)
    }