| | |
| | | * |
| | | * 职责: |
| | | * - 常驻运行,只要 MQTT 连接就持续上报 |
| | | * - 每次加载所有未删除的通行记录(d1_pass_record) |
| | | * - 每次加载所有未上报的通行记录(d1_pass_record) |
| | | * - 每隔 5 秒上报一条 |
| | | * - 发完当前批次后,自动重新加载最新记录 |
| | | */ |
| | |
| | | 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) |
| | |
| | | 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, |
| | | name: extra && extra.name ? extra.name : "", |
| | | timeStamp: record.timeStamp, |
| | | extra: {}, |
| | | error: record.message |
| | | 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 : "", |
| | | 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, |
| | |
| | | ) |
| | | ) |
| | | ) |
| | | // 标记记录为已上报 |
| | | 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) |
| | | } |