From e491cdb48129752324c4e3764f99bd9203c56dec Mon Sep 17 00:00:00 2001
From: lgq <1015864684@qq.com>
Date: 星期二, 31 三月 2026 09:48:44 +0800
Subject: [PATCH] 1.新增VF205门禁机代码

---
 vf205_access/src/service/accessService.js |  501 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 501 insertions(+), 0 deletions(-)

diff --git a/vf205_access/src/service/accessService.js b/vf205_access/src/service/accessService.js
new file mode 100644
index 0000000..0bdd955
--- /dev/null
+++ b/vf205_access/src/service/accessService.js
@@ -0,0 +1,501 @@
+/**
+ * 闂ㄧ閫氳鏈嶅姟妯″潡
+ * 澶勭悊闂ㄧ閫氳鐩稿叧鐨勪笟鍔¢�昏緫锛屽寘鎷汉鑴�/瀵嗙爜鐧藉悕鍗曟牎楠屻�佹潈闄愬垽鏂�侀�氳璁板綍淇濆瓨绛�
+ */
+import logger from "../../dxmodules/dxLogger.js"
+import std from "../../dxmodules/dxStd.js"
+import config from "../../dxmodules/dxConfig.js"
+import common from "../../dxmodules/dxCommon.js"
+import map from '../../dxmodules/dxMap.js'
+import bus from '../../dxmodules/dxEventBus.js'
+import driver from "../driver.js"
+import mqttService from "./mqttService.js"
+import sqliteService from "./sqliteService.js"
+import utils from '../common/utils/utils.js'
+import http from "../../dxmodules/dxHttp.js"
+import grainService from './grainService.js'
+const accessService = {}
+
+/**
+ * 灏嗗崄杩涘埗鏁拌浆鎹负灏忕搴忓崄鍏繘鍒跺瓧绗︿覆
+ * @param {number} decimalNumber - 鍗佽繘鍒舵暟
+ * @param {number} byteSize - 瀛楄妭澶у皬
+ * @returns {string} 灏忕搴忓崄鍏繘鍒跺瓧绗︿覆
+ */
+function decimalToLittleEndianHex(decimalNumber, byteSize) {
+    const littleEndianBytes = [];
+    for (let i = 0; i < byteSize; i++) {
+        littleEndianBytes.push(decimalNumber & 0xFF);
+        decimalNumber >>= 8; // 鐩稿綋浜庨櫎浠�256
+    }
+    const littleEndianHex = littleEndianBytes
+        .map((byte) => byte.toString(16).padStart(2, '0'))
+        .join('');
+    return littleEndianHex;
+}
+
+/**
+ * 灏嗘暟鎹寘杞崲涓哄瓧绗︿覆鏍煎紡
+ * @param {object} pack - 鏁版嵁鍖呭璞�
+ * @returns {string} 杞崲鍚庣殑瀛楃涓�
+ */
+function pack2str(pack) {
+    pack.data = (!pack.data) ? [] : pack.data.match(/.{2}/g)
+    let len = decimalToLittleEndianHex(pack.data.length, 2)
+    let str = "55aa" + pack.cmd + pack.result + len + pack.data.join('')
+    let crc = common.calculateBcc([0x55, 0xaa, parseInt(pack.cmd, 16), parseInt(pack.result, 16), pack.data.length % 256, pack.data.length / 256].concat(pack.data.map(v => parseInt(v, 16))))
+    return str + crc.toString(16).padStart(2, '0')
+}
+
+/**
+ * 浜鸿劯/瀵嗙爜鐧藉悕鍗曟牎楠�
+ * @param {object} data - 閫氳鏁版嵁锛屽寘鍚玹ype锛堢爜鍒讹級鍜宑ode锛堢爜鍐呭锛�
+ * @param {string} fileName - 閫氳鍥剧墖鏂囦欢璺緞
+ * @param {boolean|undefined} similarity - 鐩镐技搴﹂獙璇佺粨鏋滐紝false琛ㄧず楠岃瘉澶辫触
+ * @returns {number|string|boolean} -1锛堝弬鏁伴敊璇級锛�0锛堥�氳鎴愬姛锛夛紝1锛堝湪绾块獙璇侊級锛宻tring锛堟牎楠屽け璐ョ殑鍘熷洜锛夛紝false锛堥�氳鍔犻攣锛�
+ */
+accessService.access = function (data, fileName, similarity) {
+    // 閫氳鍔犻攣锛岄槻姝㈤噸澶嶉獙璇�
+    let lockMap = map.get("access_lock")
+    if (lockMap.get("access_lock")) {
+        logger.error("[access]: 閫氳鍔犻攣锛岃绋嶅悗鍐嶈瘯")
+        return false
+    }
+    lockMap.put("access_lock", true)
+
+    try {
+        // 璁板綍閫氳鏃堕棿鎴�
+        data.time = Math.floor(Date.parse(new Date()) / 1000)
+        
+        // 鏍规嵁code鏌ヨ鍑瘉
+        let res
+        if (data.type == "300") {
+            // 浜鸿劯绫诲瀷锛屼娇鐢╱serId鏌ヨ
+            res = sqliteService.d1_voucher.findByUserIdAndType(data.code, data.type)
+        } else {
+            // 鍏朵粬绫诲瀷锛屼娇鐢╟ode鏌ヨ
+            res = sqliteService.d1_voucher.findByCodeAndType(data.code, data.type)
+        }
+        
+        // 鏉冮檺璁よ瘉缁撴灉
+        let ret = true
+        // 鏄惁鏄檶鐢熶汉
+        let isStranger = false
+
+        if (similarity === false) {
+            // 濡傛灉鐩镐技搴﹂獙璇佸け璐ワ紝鍒欎笉杩涜璁よ瘉
+            ret = false
+            isStranger = true
+        } else {
+            // 楠岃瘉鍑瘉鏄惁瀛樺湪
+            if (res.length == 0) {
+                logger.error("[access]: 閫氳澶辫触锛屾病鏌ヨ鍒板嚟璇侊紒")
+                ret = false
+                isStranger = true
+            } else {
+                // 鍑瘉瀛樺湪锛岃幏鍙栫敤鎴蜂俊鎭�
+                data.userId = res[0].userId
+                data.keyId = res[0].id
+                
+                // 鏍规嵁userId鏌ヨ浜哄憳淇℃伅
+                res = sqliteService.d1_person.findByUserId(data.userId)
+                if (res.length == 0) {
+                    logger.error("[access]: 閫氳澶辫触锛屾病鏌ヨ鍒颁汉鍛橈紒")
+                    ret = false
+                    isStranger = true
+                } else {
+                    // 鑾峰彇浜哄憳濮撳悕銆佽韩浠借瘉鍙峰拰韬唤绫诲瀷
+                    let idCard
+                    let userType = 0
+                    try {
+                        idCard = JSON.parse(res[0].extra).idCard
+                        userType = JSON.parse(res[0].extra).type || 0
+                    } catch (error) {
+                        logger.error("鏃犺韩浠借瘉鍙锋垨绫诲瀷")
+                    }
+                    data.extra = { name: res[0].name, idCard: idCard, type: userType }
+                }
+                
+                // 澶勭悊鍙屼汉璁よ瘉淇℃伅
+                if (data.dualAuthInfo) {
+                    logger.info("[access]: 澶勭悊鍙屼汉璁よ瘉淇℃伅: " + JSON.stringify(data.dualAuthInfo))
+                    // 瀛樺偍绗竴鐢ㄦ埛淇℃伅
+                    let firstUserId = data.dualAuthInfo.firstUserId
+                    // 鏌ヨ绗竴鐢ㄦ埛鐨勮缁嗕俊鎭�
+                    let res1 = sqliteService.d1_person.findByUserId(firstUserId)
+                    if (res1.length > 0) {
+                        // 鑾峰彇绗竴鐢ㄦ埛鐨勫鍚嶃�佽韩浠借瘉鍙峰拰韬唤绫诲瀷
+                        let idCard1
+                        let firstUserType = 0
+                        try {
+                            idCard1 = JSON.parse(res1[0].extra).idCard
+                            firstUserType = JSON.parse(res1[0].extra).type || 0
+                        } catch (error) {
+                            logger.error("鏃犵涓�鐢ㄦ埛韬唤璇佸彿鎴栫被鍨�")
+                        }
+                        data.userId = firstUserId
+                        data.extra = { name: res1[0].name, idCard: idCard1, type: firstUserType }
+                    } else {
+                        // 濡傛灉娌℃湁鏌ヨ鍒扮涓�鐢ㄦ埛淇℃伅锛屼娇鐢ㄩ粯璁ゅ��
+                        data.userId = firstUserId
+                        data.extra = { name: data.dualAuthInfo.firstUserName, idCard: "", type: 0 }
+                    }
+                    // 瀛樺偍绗簩鐢ㄦ埛淇℃伅
+                    data.userId2 = data.dualAuthInfo.secondUserId
+                    // 鏌ヨ绗簩鐢ㄦ埛鐨勮缁嗕俊鎭�
+                    let res2 = sqliteService.d1_person.findByUserId(data.dualAuthInfo.secondUserId)
+                    if (res2.length > 0) {
+                        // 鑾峰彇绗簩鐢ㄦ埛鐨勫鍚嶅拰韬唤璇佸彿
+                        let idCard2
+                        let secondUserType = 0
+                        try {
+                            idCard2 = JSON.parse(res2[0].extra).idCard
+                            secondUserType = JSON.parse(res2[0].extra).type || 0
+                        } catch (error) {
+                            logger.error("鏃犵浜岀敤鎴疯韩浠借瘉鍙锋垨绫诲瀷")
+                        }
+                        data.extra2 = { name: res2[0].name, idCard: idCard2 }
+                        // 瀛樺偍绗簩鐢ㄦ埛鐨勬潈闄怚D锛堣韩浠界被鍨嬶級
+                        data.permissionId2 = secondUserType.toString()
+                    } else {
+                        // 濡傛灉娌℃湁鏌ヨ鍒扮浜岀敤鎴蜂俊鎭紝浣跨敤榛樿鍊�
+                        data.extra2 = { name: data.dualAuthInfo.secondUserName, idCard: "" }
+                        data.permissionId2 = ""
+                    }
+                    // 澶勭悊绗竴鐢ㄦ埛鐨勪汉鑴稿浘鐗�
+                    if (data.firstUserFileName) {
+                        let firstUserSrc = `/app/data/passRecord/${firstUserId}_${data.time}_1.jpg`
+                        std.ensurePathExists(firstUserSrc) // 纭繚鐩綍瀛樺湪
+                        if (std.exist(data.firstUserFileName)) {
+                            // 绉诲姩鍥剧墖鍒版寚瀹氱洰褰�
+                            common.systemBrief(`mv ${data.firstUserFileName} ${firstUserSrc}`)
+                            // 鏇存柊data涓殑code涓虹涓�鐢ㄦ埛鐨勫浘鐗囪矾寰�
+                            data.code = firstUserSrc
+                        }
+                    }
+                    // 澶勭悊绗簩鐢ㄦ埛鐨勪汉鑴稿浘鐗�
+                    if (fileName) {
+                        let secondUserSrc = `/app/data/passRecord/${data.userId2}_${data.time}_2.jpg`
+                        std.ensurePathExists(secondUserSrc) // 纭繚鐩綍瀛樺湪
+                        if (std.exist(fileName)) {
+                            // 绉诲姩鍥剧墖鍒版寚瀹氱洰褰�
+                            common.systemBrief(`mv ${fileName} ${secondUserSrc}`)
+                            // 鏇存柊data涓殑code2涓虹浜岀敤鎴风殑鍥剧墖璺緞
+                            data.code2 = secondUserSrc
+                        }
+                    }
+                }
+            }
+
+            // 楠岃瘉鏉冮檺
+            if (ret) {
+                // 鏍规嵁userId鏌ヨ鏉冮檺
+                res = sqliteService.d1_permission.findByUserId(data.userId)
+                if (res && res.length > 0 && judgmentPermission(res)) {
+                    logger.info("[access]: 鏉冮檺璁よ瘉閫氳繃")
+                    ret = true
+                    // 瀛樺偍鐢ㄦ埛韬唤绫诲瀷浣滀负鏉冮檺ID锛堟湰绯荤粺涓韩浠藉嵆鏉冮檺锛�
+                    let userType = 0
+                    try {
+                        if (data.extra) {
+                            userType = data.extra.type || 0
+                        } else {
+                            // 浠庢暟鎹簱鏌ヨ鐢ㄦ埛淇℃伅鑾峰彇韬唤绫诲瀷
+                            let userRes = sqliteService.d1_person.findByUserId(data.userId)
+                            if (userRes && userRes.length > 0) {
+                                userType = JSON.parse(userRes[0].extra).type || 0
+                            }
+                        }
+                    } catch (error) {
+                        logger.error("瑙f瀽鐢ㄦ埛绫诲瀷澶辫触")
+                    }
+                    data.permissionId = userType.toString()
+                    // 鏆傚仠浜鸿劯璁よ瘉鍔熻兘
+                    driver.face.status(false)
+                    logger.info("[access]: 鏆傚仠浜鸿劯璁よ瘉鍔熻兘")
+                } else {
+                    logger.info("[access]: 鏃犳潈闄�")
+                    ret = false
+                }
+            }
+
+            // 鏃犳潈闄愭椂锛屽皾璇曞湪绾块獙璇�
+            if (!ret && config.get('mqtt.onlinecheck') == 1 && driver.mqtt.getStatus()) {
+                logger.info("[access]: 鏃犳潈闄愶紝璧板湪绾块獙璇�")
+                let serialNo = std.genRandomStr(10)
+                driver.mqtt.send("access_device/v2/event/access_online", JSON.stringify(mqttService.mqttReply(serialNo, data, mqttService.CODE.S_000)))
+                driver.alsa.play(`/app/code/resource/${config.get("base.language") == "CN" ? "CN" : "EN"}/wav/verify.wav`)
+                
+                // 绛夊緟鍦ㄧ嚎楠岃瘉缁撴灉
+                let payload = driver.mqtt.getOnlinecheck()
+                if (payload && payload.serialNo == serialNo && payload.code == '000000') {
+                    ret = true
+                    // 鏆傚仠浜鸿劯璁よ瘉鍔熻兘
+                    driver.face.status(false)
+                    logger.info("[access]: 鏆傚仠浜鸿劯璁よ瘉鍔熻兘")
+                } else {
+                    logger.info("[access]: 鍦ㄧ嚎楠岃瘉澶辫触")
+                    ret = false
+                }
+            }
+        }
+
+        // 纭畾璇煶鏂囦欢鍚嶇О
+        let alsaFile = (data.type).toString().startsWith("10") ? '10x' : data.type
+        
+        //鏆傚仠浜鸿劯璁よ瘉鍔熻兘
+        
+
+        if (ret == true) {
+            // 楠岃瘉姘斾綋娴撳害
+            grainService.checkGasConcentration(function() {
+                // 浠庡瓨鍌ㄧ殑姘斾綋鏁版嵁涓幏鍙栭獙璇佺粨鏋�
+                const gasData = grainService.getGasData()
+                
+                if(gasData && gasData.data && gasData.data.status === "0") {
+                    logger.info("[access]: 姘斾綋娴撳害楠岃瘉鍚堟牸")
+                    // 閫氳鎴愬姛澶勭悊
+                    driver.screen.accessSuccess()
+                    logger.info("[access]: 閫氳鎴愬姛")
+                    
+                    // 鏄剧ず閫氳鎴愬姛缁撴灉
+                    bus.fire("showAccessResult", {
+                        faceAuth: true,
+                        gasConcentration: true,
+                        accessAllowed: true,
+                        message: "*浠撳唴姘斾綋娴撳害鍚堟牸锛屽厑璁搁�氳*"
+                    })
+                    
+                    // 瑙﹀彂閫氳鎴愬姛浜嬩欢锛岄�氱煡UI鏇存柊
+                    bus.fire("accessSuccess", { data: data, fileName: fileName })
+                    driver.alsa.play(`/app/code/resource/${config.get("base.language") == "CN" ? "CN" : "EN"}/wav/access_s.wav`)
+                    driver.gpio.open() // 寮�闂�
+                    savePassPic(data, fileName) // 淇濆瓨閫氳鍥剧墖
+                    reply(data, true) // 涓婃姤閫氳璁板綍
+                } else {
+                    logger.info("[access]: 姘斾綋娴撳害楠岃瘉涓嶅悎鏍�")
+                    // 閫氳澶辫触澶勭悊
+                    driver.screen.accessFail()
+                    logger.error("[access]: 閫氳澶辫触")
+                    // 瑙﹀彂澶辫触寮圭獥
+                    bus.fire("showAccessResult", {
+                        faceAuth: true,
+                        gasConcentration: false,
+                        accessAllowed: false,
+                        message: "*浠撳唴姘斾綋娴撳害涓嶅悎鏍硷紝绂佹閫氳*"
+                    })
+                    if (utils.isEmpty(similarity)) {
+                        driver.alsa.play(`/app/code/resource/${config.get("base.language") == "CN" ? "CN" : "EN"}/wav/access_f.wav`)
+                    }
+                    // if (isStranger && !config.get("sys.strangerImage")) {
+                    //     // 闄岀敓浜轰笉淇濆瓨鐓х墖
+                    // } else {
+                    //     savePassPic(data, fileName)
+                    // }
+                    savePassPic(data, fileName)
+                    // 娣诲姞姘斾綋娴撳害澶辫触淇℃伅
+                    data.message = "姘斾綋娴撳害涓嶅悎鏍�"
+                    reply(data, false) // 涓婃姤閫氳璁板綍
+                }
+            })
+
+        } else {
+            // 閫氳澶辫触澶勭悊
+            driver.screen.accessFail()
+            logger.error("[access]: 閫氳澶辫触")
+            // 瑙﹀彂澶辫触寮圭獥
+            bus.fire("showAccessResult", {
+                faceAuth: true,
+                gasConcentration: false,
+                accessAllowed: false,
+                message: "*鏉冮檺璁よ瘉澶辫触锛岀姝㈤�氳*"
+            })
+            if (utils.isEmpty(similarity)) {
+                driver.alsa.play(`/app/code/resource/${config.get("base.language") == "CN" ? "CN" : "EN"}/wav/recg_f.wav`)
+            }
+            // if (isStranger && !config.get("sys.strangerImage")) {
+            //     // 闄岀敓浜轰笉淇濆瓨鐓х墖
+            // } else {
+            //     savePassPic(data, fileName)
+            // }
+            savePassPic(data, fileName)
+
+            reply(data, false) // 涓婃姤閫氳璁板綍
+        }
+    } catch (error) {
+        logger.error(error)
+    }
+    
+    // 璇煶鎾姤闇�瑕佹椂闂达紝鎵�浠ュ欢杩�1绉掕В閿�
+    std.sleep(1000)
+    lockMap.put("access_lock", false)
+    logger.error("[access]: 瑙i攣鎴愬姛")
+    // 瑙﹀彂閫氳瑙i攣瀹屾垚浜嬩欢锛岄�氱煡UI閲嶇疆
+    // bus.fire("accessUnlockComplete")
+}
+
+/**
+ * 淇濆瓨閫氳鍥剧墖
+ * @param {object} data - 閫氳鏁版嵁
+ * @param {string} fileName - 鍥剧墖鏂囦欢璺緞
+ */
+function savePassPic(data, fileName) {
+    if (data.type == "300") { // 浠呭鐞嗕汉鑴哥被鍨�
+        // 濡傛灉鏄弻浜鸿璇侊紝宸茬粡鍦ㄥ鐞嗗弻浜鸿璇佷俊鎭椂淇濆瓨浜嗗浘鐗囷紝杩欓噷璺宠繃
+        if (data.dualAuthInfo) {
+            return
+        }
+        let src = `/app/data/passRecord/${data.userId}_${data.time}.jpg`
+        std.ensurePathExists(src) // 纭繚鐩綍瀛樺湪
+        if (std.exist(fileName)) {
+            // 绉诲姩鍥剧墖鍒版寚瀹氱洰褰�
+            common.systemBrief(`mv ${fileName} ${src}`)
+            // 鍙竻鐞嗗師濮嬩复鏃跺浘鐗囨枃浠讹紙浠ユ椂闂存埑鍛藉悕鐨勬枃浠讹級锛屼繚鐣欒皟鏁村悗鐨勫浘鐗囨枃浠�
+            common.systemBrief(`rm -rf /app/data/user/temp/[0-9]*.jpg`)
+            // 鏇存柊data涓殑code涓哄浘鐗囪矾寰�
+            data.code = src
+        } else {
+            logger.error("[access]: 閫氳澶辫触锛屽浘鐗囦笉瀛樺湪锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛�" + fileName)
+        }
+    }
+}
+
+/**
+ * 鏍¢獙鏉冮檺鏃堕棿鏄惁鍙互閫氳
+ * @param {array} permissions - 鏉冮檺璁板綍鏁扮粍
+ * @returns {boolean} true琛ㄧず鏈夋潈闄愶紝false琛ㄧず鏃犳潈闄�
+ */
+function judgmentPermission(permissions) {
+    let currentTime = Math.floor(Date.now() / 1000)
+    for (let permission of permissions) {
+        if (permission.timeType == 0) {
+            // 姘镐箙鏉冮檺
+            return true
+        } else if (permission.beginTime <= currentTime && currentTime <= permission.endTime) {
+            if (permission.timeType == 1) {
+                // 鏃堕棿娈垫潈闄�
+                return true
+            }
+            if (permission.timeType == 2) {
+                // 姣忔棩鏉冮檺
+                let seconds = Math.floor((new Date() - new Date().setHours(0, 0, 0, 0)) / 1000);
+                if (permission.repeatBeginTime <= seconds && seconds <= permission.repeatEndTime) {
+                    return true
+                }
+            }
+            if (permission.timeType == 3 && permission.period) {
+                // 鍛ㄩ噸澶嶆潈闄�
+                let dayTimes = JSON.parse(permission.period)[new Date().getDay() + 1]
+                if (dayTimes && dayTimes.split("|").some((dayTime) => isCurrentTimeInTimeRange(dayTime))) {
+                    return true
+                }
+            }
+        }
+    }
+    return false
+}
+
+/**
+ * 鍒ゆ柇褰撳墠鏃堕棿鏄惁鍦ㄦ椂闂存鍐�
+ * @param {string} time - 鏃堕棿娈靛瓧绗︿覆锛屾牸寮忓"15:00-19:00"
+ * @returns {boolean} true琛ㄧず褰撳墠鏃堕棿鍦ㄦ椂闂存鍐咃紝false琛ㄧず涓嶅湪
+ */
+function isCurrentTimeInTimeRange(time) {
+    // 鍒嗗壊寮�濮嬫椂闂村拰缁撴潫鏃堕棿
+    let [startTime, endTime] = time.split('-');
+    // 瑙f瀽寮�濮嬫椂闂寸殑灏忔椂鍜屽垎閽�
+    let [startHour, startMinute] = startTime.split(':');
+    // 瑙f瀽缁撴潫鏃堕棿鐨勫皬鏃跺拰鍒嗛挓
+    let [endHour, endMinute] = endTime.split(':');
+
+    // 鑾峰彇褰撳墠鏃堕棿
+    let currentTime = new Date();
+
+    // 鍒涘缓寮�濮嬫椂闂寸殑鏃ユ湡瀵硅薄
+    let startDate = new Date();
+    startDate.setHours(parseInt(startHour, 10));
+    startDate.setMinutes(parseInt(startMinute, 10));
+    // 鍒涘缓缁撴潫鏃堕棿鐨勬棩鏈熷璞�
+    let endDate = new Date();
+    endDate.setHours(parseInt(endHour, 10));
+    endDate.setMinutes(parseInt(endMinute, 10));
+
+    // 妫�鏌ュ綋鍓嶆椂闂存槸鍚﹀湪鏃堕棿鑼冨洿鍐�
+    return currentTime >= startDate && currentTime <= endDate;
+}
+
+/**
+ * 閫氳璁板綍涓婃姤
+ * @param {object} data - 閫氳鏁版嵁
+ * @param {boolean} result - 閫氳缁撴灉锛宼rue琛ㄧず鎴愬姛锛宖alse琛ㄧず澶辫触
+ */
+function reply(data, result) {
+    // 浣跨敤绾跨▼澶勭悊鏁翠釜reply鍑芥暟锛岄伩鍏嶅牭濉炰富杩涚▼
+    std.setTimeout(() => {
+        try {
+            // 鏋勫缓閫氳璁板綍
+            let record = {
+                id: std.genRandomStr(16),
+                result: result ? 0 : 1, // 0琛ㄧず鎴愬姛锛�1琛ㄧず澶辫触
+            }
+            
+            // 澶嶅埗data涓殑瀛楁锛屾帓闄xtra鍜宔xtra2
+            for (const key in data) {
+                if (key !== 'extra' && key !== 'extra2' && !(key in record)) {
+                    record[key] = data[key]
+                }
+            }
+            
+            // 澶勭悊extra瀛楁
+            if (data.extra) {
+                record.extra = JSON.stringify(data.extra)
+            }
+            
+            // 澶勭悊extra2瀛楁
+            if (data.extra2) {
+                record.extra2 = JSON.stringify(data.extra2)
+            }
+            
+            // 瀛樺偍閫氳璁板綍锛屽垽鏂笂闄�
+            let count = sqliteService.d1_pass_record.count()
+            let configNum = config.get("access.offlineAccessNum");
+            configNum = configNum ? configNum : 2000;
+            
+            if (configNum > 0) {
+                if (count >= configNum) {
+                    // 杈惧埌鏈�澶у瓨鍌ㄦ暟閲忥紝鍒犻櫎鏈�鏃х殑璁板綍
+                    let lastRecord = sqliteService.d1_pass_record.findAllOrderBytimeDesc({ page: 0, size: 1 })
+                    if (lastRecord && lastRecord.length == 1) {
+                        // 濡傛灉鏄汉鑴歌褰曪紝鍒犻櫎瀵瑰簲鐨勫浘鐗囨枃浠�
+                        if (lastRecord[0].type == 300) {
+                            common.systemBrief(`rm -rf ${lastRecord[0].code}`)
+                        }
+                        sqliteService.d1_pass_record.deleteByid(lastRecord[0].id)
+                    }
+                }
+                // 淇濆瓨鏂拌褰�
+                sqliteService.d1_pass_record.save(record)
+            }
+            
+            // // 鐢熸垚搴忓垪鍙�
+            // let serialNo = std.genRandomStr(10)
+            
+            // // 澶勭悊浜鸿劯鍥剧墖
+            // if (record.type == 300) {
+            //     let m = map.get("faceAccesss")
+            //     m.del(serialNo)
+            //     m.put(serialNo, record.code ? record.code : "")
+            //     // 灏嗗浘鐗囪浆鎹负base64鏍煎紡
+            //     record.code = driver.face.fileToBase64(record.code)
+            // }
+            
+            // // 鏋勫缓MQTT娑堟伅骞跺彂閫�
+            // let payload = mqttService.mqttReply(serialNo, [record], mqttService.CODE.S_000)
+            // driver.mqtt.send("access_device/v2/event/access", JSON.stringify(payload))
+        } catch (error) {
+            logger.error(`[accessService]: 澶勭悊閫氳璁板綍澶辫触: ${error.message}`)
+        }
+    }, 0)
+}
+
+export default accessService

--
Gitblit v1.9.3