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/screen.js | 1470 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,470 insertions(+), 0 deletions(-)

diff --git a/vf205_access/src/screen.js b/vf205_access/src/screen.js
new file mode 100644
index 0000000..1227934
--- /dev/null
+++ b/vf205_access/src/screen.js
@@ -0,0 +1,1470 @@
+/**
+ * 灞忓箷绠$悊妯″潡
+ * 璐熻矗灞忓箷鏄剧ず銆乁I鎺у埗銆佺敤鎴风晫闈㈢鐞嗙瓑鍔熻兘
+ */
+import dxui from '../dxmodules/dxUi.js'
+import dxMap from '../dxmodules/dxMap.js'
+import log from '../dxmodules/dxLogger.js'
+import net from '../dxmodules/dxNet.js'
+import viewUtils from './view/viewUtils.js'
+import i18n from './view/i18n.js'
+import grainService from './service/grainService.js'
+import sqliteService from './service/sqliteService.js'
+import pinyin from './view/pinyin/pinyin.js'
+import mainView from './view/mainView.js'
+import idleView from './view/idleView.js'
+import topView from './view/topView.js'
+import appView from './view/appView.js'
+import pwdView from './view/pwdView.js'
+import emergencyPwdView from './view/emergencyPwdView.js'
+import newPwdView from './view/config/newPwdView.js'
+import identityVerificationView from './view/config/identityVerificationView.js'
+import configView from './view/config/configView.js'
+import cloudCertView from './view/config/menu/cloudCertView.js'
+import doorControlView from './view/config/menu/doorControlView.js'
+import helpView from './view/config/menu/helpView.js'
+import networkSettingView from './view/config/menu/networkSettingView.js'
+import systemSettingView from './view/config/menu/systemSettingView.js'
+import deviceInfoView from './view/config/menu/deviceInfoView.js'
+import factoryTestView from './view/config/menu/factoryTestView.js'
+import localUserView from './view/config/menu/localUserView.js'
+import recordQueryView from './view/config/menu/recordQueryView.js'
+import voiceBroadcastView from './view/config/menu/voiceBroadcastView.js'
+import dockingSettingView from './view/config/menu/dockingSetting.js'
+import localUserAddView from './view/config/menu/localUser/localUserAddView.js'
+import faceEnterView from './view/config/menu/localUser/faceEnterView.js'
+import displaySettingView from './view/config/menu/systemSetting/displaySettingView.js'
+import faceRecognitionSettingView from './view/config/menu/systemSetting/faceRecognitionSettingView.js'
+import swipeCardRecognitionSettingView from './view/config/menu/systemSetting/swipeCardRecognitionSettingView.js'
+import passLogSettingView from './view/config/menu/systemSetting/passLogSettingView.js'
+import passwordOpenDoorSettingView from './view/config/menu/systemSetting/passwordOpenDoorSettingView.js'
+import passwordManagementView from './view/config/menu/systemSetting/passwordManagementView.js'
+import timeSettingView from './view/config/menu/systemSetting/timeSettingView.js'
+import systemInfoView from './view/config/menu/deviceInfo/systemInfoView.js'
+import dataCapacityInfoView from './view/config/menu/deviceInfo/dataCapacityInfoView.js'
+import recordQueryDetailView from './view/config/menu/recordQuery/recordQueryDetailView.js'
+import std from '../dxmodules/dxStd.js'
+import bus from '../dxmodules/dxEventBus.js'
+import driver from './driver.js'
+import config from '../dxmodules/dxConfig.js'
+import common from '../dxmodules/dxCommon.js'
+import configService from './service/configService.js'
+import codeService from './service/codeService.js'
+import face from '../dxmodules/dxFace.js'
+import faceService from './service/faceService.js'
+
+/**
+ * 灞忓箷绠$悊瀵硅薄
+ */
+const screen = {}
+
+/**
+ * 灞忓箷灏哄閰嶇疆
+ */
+screen.screenSize = {
+    width: 800,
+    height: 1280
+}
+
+/**
+ * UI涓婁笅鏂�
+ */
+const context = {}
+
+/**
+ * 鍒濆鍖栧睆骞曠鐞嗘ā鍧�
+ * 鍒濆鍖栨墍鏈塙I缁勪欢銆佽缃瑷�銆佸惎鍔ㄥ睆淇濊鏃跺櫒绛�
+ * 娉ㄦ剰锛氬湪main.js涓皟鐢紝鍙厑璁歌皟鐢ㄤ竴娆�
+ */
+screen.init = function () {
+    const loadMethod = dxui.loadMain
+    dxui.loadMain = function (view) {
+        if (screen.screenNow && screen.screenNow.id == view.id) {
+            return
+        }
+        screen.screenNow = view
+        pinyin.hide(true)
+        loadMethod.call(dxui, view)
+    }
+
+    dxui.init({ orientation: 0 }, context);
+    // 鍒濆鍖栨墍鏈夌粍浠�
+    pinyin.init(800, 400)
+
+    viewUtils.confirmInit()
+
+    mainView.init()
+    idleView.init()
+    topView.init()
+    appView.init()
+    pwdView.init()
+    emergencyPwdView.init()
+    newPwdView.init()
+    identityVerificationView.init()
+    configView.init()
+
+    cloudCertView.init()
+    doorControlView.init()
+    helpView.init()
+    networkSettingView.init()
+    systemSettingView.init()
+    deviceInfoView.init()
+    factoryTestView.init()
+    localUserView.init()
+    recordQueryView.init()
+    voiceBroadcastView.init()
+    dockingSettingView.init()
+
+    localUserAddView.init()
+    faceEnterView.init()
+
+    displaySettingView.init()
+    faceRecognitionSettingView.init()
+    swipeCardRecognitionSettingView.init()
+    passLogSettingView.init()
+
+
+    passwordOpenDoorSettingView.init()
+    passwordManagementView.init()
+    timeSettingView.init()
+
+    systemInfoView.init()
+    dataCapacityInfoView.init()
+    recordQueryDetailView.init()
+
+    // 璁剧疆璇█
+    // i18n.setLanguage("en-US")
+    i18n.setLanguage(config.get("base.language"))
+
+    dxui.loadMain(mainView.screenMain)
+    // dxui.loadMain(networkSettingView.screenMain)
+
+    // 鍚姩灞忎繚璁℃椂鍣�
+    idleTimerStart()
+
+    // bus浜嬩欢
+    busEvents()
+
+    // 瀹炴椂鑾峰彇鐐瑰嚮鍧愭爣
+    getClickPoint()
+
+    // 闅愯棌閿洏
+    hidePinyin()
+
+    // 浜鸿劯璺熻釜妗�
+    faceTrackingBox()
+}
+
+/**
+ * 浜鸿劯璺熻釜妗嗗鐞�
+ * 瀹氭湡鑾峰彇浜鸿劯璺熻釜鏁版嵁骞舵洿鏂拌窡韪鏄剧ず
+ */
+function faceTrackingBox() {
+    std.setInterval(() => {
+        let data = driver.face.getTrackingBox()
+        try {
+            if (data && typeof data === 'string') {
+                // 妫�鏌ユ暟鎹槸鍚︽槸鏈夋晥鐨凧SON瀛楃涓�
+                try {
+                    data = JSON.parse(data)
+                    // 鏈�澶�10涓汉
+                    if (data.type == "track" && data.faces && data.faces.length <= 10) {
+                        for (let i = 0; i < data.faces.length; i++) {
+                            let item = data.faces[i]
+                            if (item && item.rect_render && item.rect_render.length === 4) {
+                                screen.trackUpdate({ w: item.rect_render[2] - item.rect_render[0], h: item.rect_render[3] - item.rect_render[1], x: item.rect_render[0], y: item.rect_render[1] }, item.id, item.is_living)
+                            }
+                        }
+                    }
+                } catch (parseError) {
+                    log.info('screen.faceTrackingBox: 鏃犳晥鐨凧SON鏁版嵁:', data);
+                    log.error("screen.faceTrackingBox: JSON瑙f瀽閿欒:", parseError)
+                }
+            }
+        } catch (error) {
+            log.info('screen.faceTrackingBox:', data);
+            log.error("screen.faceTrackingBox:", error)
+        }
+    }, 110)
+}
+
+/**
+ * 鐐瑰嚮鍧愭爣鍙樺寲鏍囪
+ */
+let changedClickPoint
+
+/**
+ * 涓婃鐐瑰嚮鍧愭爣
+ */
+let lastClickPoint = { x: 0, y: 0 }
+
+/**
+ * 褰撳墠鐐瑰嚮鍧愭爣
+ */
+let clickPoint
+
+/**
+ * 瀹炴椂鑾峰彇鐐瑰嚮鍧愭爣
+ * 瀹氭湡鑾峰彇鐢ㄦ埛瑙︽懜灞忓箷鐨勫潗鏍囦綅缃�
+ */
+function getClickPoint() {
+    const indev = NativeObject.APP.NativeComponents.NativeIndev
+    std.setInterval(() => {
+        clickPoint = {
+            x: Math.abs(800 - indev.lvIndevGetPointVg().x),
+            y: indev.lvIndevGetPointVg().y
+        }
+
+        if (lastClickPoint.x != clickPoint.x || lastClickPoint.y != clickPoint.y) {
+            changedClickPoint = clickPoint
+        } else {
+            changedClickPoint = null
+        }
+
+        lastClickPoint = clickPoint
+    }, 5)
+}
+
+/**
+ * 闅愯棌鎷奸煶閿洏
+ * 澶勭悊鎷奸煶閿洏鐨勬樉绀哄拰闅愯棌閫昏緫锛屽綋鐢ㄦ埛鐐瑰嚮灞忓箷鍏朵粬鍖哄煙鏃惰嚜鍔ㄩ殣钘忛敭鐩�
+ */
+function hidePinyin() {
+    /**
+     * 閿洏鏄剧ず鏃剁殑鐐瑰嚮鍧愭爣
+     */
+    let showPoint
+    
+    /**
+     * 鍘熷鐨勯殣钘忔柟娉�
+     */
+    const hideMethod = pinyin.hide
+    
+    /**
+     * 鍘熷鐨勬樉绀烘柟娉�
+     */
+    const showMethod = pinyin.show
+    
+    /**
+     * 閿佸畾鏍囧織锛岄槻姝㈤噸澶嶆搷浣�
+     */
+    let lock = false
+    
+    // 閲嶅啓闅愯棌鏂规硶
+    pinyin.hide = function (isForce) {
+        if (isForce) {
+            hideMethod.call(pinyin)
+            lock = false
+            return
+        }
+        if (lock) {
+            return
+        }
+        lock = true
+        hideMethod.call(pinyin)
+        lock = false
+    }
+    
+    // 閲嶅啓鏄剧ず鏂规硶
+    pinyin.show = function (...args) {
+        if (lock) {
+            return
+        }
+        lock = true
+        showMethod.call(pinyin, ...args)
+        showPoint = clickPoint
+        lock = false
+    }
+    
+    // 瀹氭湡妫�鏌ユ槸鍚﹂渶瑕侀殣钘忛敭鐩�
+    std.setInterval(() => {
+        if (showPoint && (Math.abs(showPoint.x - clickPoint.x) > 5 && Math.abs(showPoint.y - clickPoint.y) > 5)) {
+            if (clickPoint.y < (1280 - (pinyin.getMode() == 1 ? 400 + 70 : 400))) {
+                let defocus = dxMap.get("INPUT_KEYBOARD").get("defocus")
+                if (defocus == "defocus") {
+                    dxMap.get("INPUT_KEYBOARD").del("defocus")
+                    showPoint = null
+                    pinyin.hide()
+                }
+            }
+        }
+    }, 5)
+}
+
+/**
+ * 灞忓箷绠$悊鍣ㄧ被
+ * 璐熻矗灞忓箷鐘舵�佺鐞嗭紝鍖呮嫭灞忎繚鍜岀唲灞忓姛鑳�
+ */
+class ScreenManager {
+    /**
+     * 鏋勯�犲嚱鏁�
+     * @param {object} callbacks - 鍥炶皟鍑芥暟瀵硅薄
+     */
+    constructor(callbacks = {}) {
+        /**
+         * 瀹氭椂鍣ㄥ璞�
+         */
+        this.timers = {
+            screenSaver: null, // 灞忎繚瀹氭椂鍣�
+            screenOff: null    // 鐔勫睆瀹氭椂鍣�
+        };
+
+        /**
+         * 閰嶇疆瀵硅薄
+         */
+        this.config = {
+            screenSaverDelay: 0, // 灞忎繚寤惰繜锛堟绉掞級
+            screenOffDelay: 0    // 鐔勫睆寤惰繜锛堟绉掞級
+        };
+
+        /**
+         * 鍥炶皟鍑芥暟
+         */
+        this.callbacks = {
+            onScreenSaverStart: callbacks.onScreenSaverStart || (() => { }),
+            onScreenSaverEnd: callbacks.onScreenSaverEnd || (() => { }),
+            onScreenOff: callbacks.onScreenOff || (() => { }),
+            onScreenOn: callbacks.onScreenOn || (() => { })
+        };
+
+        this.resetTimers = this.resetTimers.bind(this);
+    }
+
+    /**
+     * 閰嶇疆鏃堕棿
+     * @param {number} screenSaverDelay - 灞忎繚寤惰繜锛堟绉掞級
+     * @param {number} screenOffDelay - 鐔勫睆寤惰繜锛堟绉掞級
+     */
+    configure({ screenSaverDelay = 0, screenOffDelay = 0 }) {
+        this.config.screenSaverDelay = screenSaverDelay;
+        this.config.screenOffDelay = screenOffDelay;
+        this.resetTimers();
+    }
+
+    /**
+     * 閲嶇疆瀹氭椂鍣�
+     * 娓呴櫎鐜版湁瀹氭椂鍣ㄥ苟璁剧疆鏂扮殑瀹氭椂鍣�
+     */
+    resetTimers() {
+        // 娓呴櫎鐜版湁瀹氭椂鍣�
+        if (this.timers.screenSaver) {
+            std.clearTimeout(this.timers.screenSaver);
+        }
+        if (this.timers.screenOff) {
+            std.clearTimeout(this.timers.screenOff);
+        }
+
+        // 閫�鍑哄綋鍓嶇姸鎬�
+        this.exitScreenStates();
+
+        // 璁剧疆鏂扮殑瀹氭椂鍣�
+        if (this.config.screenOffDelay > 0) {
+            this.timers.screenOff = std.setTimeout(() => {
+                this.enterScreenOff();
+            }, this.config.screenOffDelay);
+        }
+
+        // 鍙湁褰撶唲灞忔椂闂村ぇ浜庡睆淇濇椂闂存椂鎵嶈缃睆淇濆畾鏃跺櫒
+        if (this.config.screenSaverDelay > 0 &&
+            (this.config.screenSaverDelay < this.config.screenOffDelay || this.config.screenOffDelay == 0)) {
+            this.timers.screenSaver = std.setTimeout(() => {
+                this.enterScreenSaver();
+            }, this.config.screenSaverDelay);
+        }
+    }
+
+    /**
+     * 杩涘叆灞忎繚鐘舵��
+     */
+    enterScreenSaver() {
+        const mapUI = dxMap.get("UI")
+        if (!mapUI.get("isScreenOff")) {
+            mapUI.put("isScreenSaver", true)
+            this.callbacks.onScreenSaverStart();
+        }
+    }
+
+    /**
+     * 杩涘叆鐔勫睆鐘舵��
+     */
+    enterScreenOff() {
+        const mapUI = dxMap.get("UI")
+        mapUI.put("isScreenOff", true)
+        mapUI.put("isScreenSaver", false)
+        this.callbacks.onScreenOff();
+    }
+
+    /**
+     * 閫�鍑烘墍鏈夊睆骞曠姸鎬�
+     */
+    exitScreenStates() {
+        const mapUI = dxMap.get("UI")
+        const previousState = { isScreenOff: mapUI.get("isScreenOff"), isScreenSaver: mapUI.get("isScreenSaver") };
+        mapUI.put("isScreenOff", false)
+        mapUI.put("isScreenSaver", false)
+        // 濡傛灉鐘舵�佸彂鐢熸敼鍙橈紝瑙﹀彂鐩稿簲鍥炶皟
+        if (previousState.isScreenSaver) {
+            this.callbacks.onScreenSaverEnd();
+        }
+        if (previousState.isScreenOff) {
+            this.callbacks.onScreenOn();
+        }
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鐘舵��
+     * @returns {object} 褰撳墠灞忓箷鐘舵��
+     */
+    getState() {
+        const mapUI = dxMap.get("UI")
+        return { isScreenOff: mapUI.get("isScreenOff"), isScreenSaver: mapUI.get("isScreenSaver") };
+    }
+
+    /**
+     * 娓呯悊璧勬簮
+     * 娓呴櫎鎵�鏈夊畾鏃跺櫒
+     */
+    destroy() {
+        if (this.timers.screenSaver) {
+            std.clearTimeout(this.timers.screenSaver);
+        }
+        if (this.timers.screenOff) {
+            std.clearTimeout(this.timers.screenOff);
+        }
+    }
+}
+
+/**
+ * 灞忓箷绠$悊鍣ㄥ疄渚�
+ */
+let screenManager
+
+/**
+ * 鍚姩灞忎繚璁℃椂鍣�
+ * 鍒濆鍖栧睆骞曠鐞嗗櫒锛岃缃睆淇濆拰鐔勫睆鏃堕棿锛屾娴嬬敤鎴疯Е鎽�
+ */
+function idleTimerStart() {
+    // 鍒涘缓瀹炰緥锛屼紶鍏ュ洖璋冨嚱鏁�
+    screenManager = new ScreenManager({
+        /**
+         * 灞忎繚寮�濮嬪洖璋�
+         */
+        onScreenSaverStart: () => {
+            screen.enterIdle()
+        },
+        
+        /**
+         * 灞忎繚缁撴潫鍥炶皟
+         */
+        onScreenSaverEnd: () => {
+            screen.exitIdle(true)
+        },
+        
+        /**
+         * 鐔勫睆鍥炶皟
+         */
+        onScreenOff: () => {
+            dxMap.get("screenOff").put("status", 1)
+            // 鍋滄浜鸿劯璇嗗埆
+            driver.face.status(false)
+            screen.screenNow.hide()
+            topView.screenMain.hide()
+        },
+        
+        /**
+         * 浜睆鍥炶皟
+         */
+        onScreenOn: () => {
+            screen.exitIdle(true)
+            dxMap.get("screenOff").put("status", 0)
+            // 鎭㈠浜鸿劯璇嗗埆
+            driver.face.status(true)
+            screen.screenNow.show()
+            topView.screenMain.show()
+            
+            // 閫�鍑虹唲灞忔椂鑾峰彇骞舵洿鏂版皵浣撴祿搴﹀拰鐘舵�佷俊鎭�
+            try {
+                log.info('[screen]: 閫�鍑虹唲灞忥紝鑾峰彇姘斾綋娴撳害鍜岀姸鎬佷俊鎭�')
+                grainService.checkGasConcentration()
+                grainService.checkDevConcentration()
+            } catch (error) {
+                log.error(`[screen]: 鑾峰彇姘斾綋娴撳害鍜岀姸鎬佷俊鎭敊璇�: ${error.message}`)
+            }
+        }
+    });
+
+    // 閰嶇疆鏃堕棿锛堟绉掞級
+    screenManager.configure({
+        // screenSaverDelay: 10000,  // 灞忎繚
+        // screenOffDelay: 5000     // 鐔勫睆
+        screenSaverDelay: config.get("base.screensaver") * 60 * 1000,  // 灞忎繚
+        screenOffDelay: config.get("base.screenOff") * 60 * 1000     // 鐔勫睆
+    });
+
+    // 妫�娴嬬敤鎴疯Е鎽�
+    let touchCount = 0
+    std.setInterval(() => {
+        let count = dxui.Utils.GG.NativeDisp.lvDispGetInactiveTime()
+        if (count < touchCount) {
+            screenManager.resetTimers();
+        }
+        touchCount = count
+    }, 100);
+}
+
+/**
+ * 鍒锋柊灞忓箷绠$悊鍣ㄩ厤缃�
+ * 鏇存柊灞忎繚鍜岀唲灞忔椂闂撮厤缃�
+ */
+screen.screenManagerRefresh = function () {
+    screenManager.configure({
+        screenSaverDelay: config.get("base.screensaver") * 60 * 1000,  // 灞忎繚
+        screenOffDelay: config.get("base.screenOff") * 60 * 1000     // 鐔勫睆
+    });
+    screenManager.resetTimers();
+}
+
+/**
+ * 杩涘叆灞忎繚瀹氭椂鍣�
+ */
+let enterIdleTimer
+
+/**
+ * 杩涘叆灞忎繚
+ * 鏄剧ず灞忎繚鐣岄潰
+ */
+screen.enterIdle = function () {
+    // 寤惰繜1绉掞紝闃叉杩涘叆灞忎繚鍜岄��鍑哄睆淇濆悓鏃惰Е鍙戯紝1绉掑唴娌℃湁瑙﹀彂閫�鍑哄睆淇濓紝鍒欒涓鸿繘鍏ュ睆淇�
+    enterIdleTimer = std.setTimeout(() => {
+        if (idleView.screenMain.isHide()) {
+            viewUtils.confirmClose()
+            dxui.loadMain(mainView.screenMain)
+            idleView.screenMain.show()
+            topView.changeTheme(false)
+        }
+    }, 1000)
+}
+
+/**
+ * 閫�鍑哄睆淇�
+ * 闅愯棌灞忎繚鐣岄潰
+ * @param {boolean} isSelf - 鏄惁鐢辩郴缁熻嚜韬Е鍙�
+ */
+screen.exitIdle = function (isSelf) {
+    if (enterIdleTimer) {
+        std.clearTimeout(enterIdleTimer)
+        enterIdleTimer = null
+    }
+    if (!isSelf) {
+        screenManager.resetTimers();
+    }
+    if (!idleView.screenMain.isHide()) {
+        idleView.screenMain.hide()
+    }
+}
+
+/**
+ * 灞忓箷寰幆澶勭悊
+ * 澶勭悊UI浜嬩欢
+ * @returns {boolean} 澶勭悊缁撴灉
+ */
+screen.loop = function () {
+    return dxui.handler()
+}
+
+/**
+ * 浜戣瘉婵�娲�
+ * 婵�娲荤數瀛愯韩浠借瘉
+ * @param {string} code - 婵�娲荤爜
+ * @returns {number} 婵�娲荤粨鏋滐紝0琛ㄧず鎴愬姛锛岄潪0琛ㄧず澶辫触
+ */
+screen.nfcIdentityCardActivation = function (code) {
+    return driver.eid.active(config.get("sys.sn"), config.get("sys.appVersion"), config.get("sys.mac"), code);
+
+}
+
+/**
+ * 鍒犻櫎浜哄憳
+ * 鍒犻櫎鐢ㄦ埛淇℃伅銆佹潈闄愩�佸嚟璇佸拰浜鸿劯鏁版嵁
+ * @param {object} user - 鐢ㄦ埛瀵硅薄
+ * @returns {boolean} 鍒犻櫎缁撴灉
+ */
+screen.deleteUser = function (user) {
+    // 鍒犻櫎浜哄憳淇℃伅
+    sqliteService.d1_person.deleteByUserId(user.userId)
+    // 鍒犻櫎鏉冮檺淇℃伅
+    sqliteService.d1_permission.deleteByUserId(user.userId)
+    // 鍒犻櫎鍑瘉淇℃伅
+    sqliteService.d1_voucher.deleteByUserId(user.userId)
+    // 鍒犻櫎浜鸿劯鏁版嵁
+    let res = driver.face.delete(user.userId)
+
+    return true
+}
+
+/**
+ * 鏇存柊浜哄憳淇℃伅
+ * 鏇存柊鐢ㄦ埛淇℃伅銆佸瘑鐮併�佸崱鐗囧拰浜鸿劯鏁版嵁
+ * @param {object} user - 鐢ㄦ埛瀵硅薄
+ * @returns {boolean|string} 鏇存柊缁撴灉锛屾垚鍔熻繑鍥瀟rue锛屽け璐ヨ繑鍥為敊璇俊鎭�
+ */
+screen.updateUser = function (user) {
+    //淇敼浜哄憳淇℃伅
+    let res = sqliteService.d1_person.updatenameAndExtraByUserId(user.userId, user.name, JSON.stringify({ type: user.type, idCard: user.idCard }))
+    if (res != 0) {
+        return false
+    }
+    
+    //澶勭悊鍑瘉
+    let ret
+    
+    //澶勭悊瀵嗙爜鍑瘉
+    if (user.pwd) {
+        //鍒ゆ柇搴撹〃鏄惁瀛樺湪杩欎釜鍑瘉
+        let pwdData = sqliteService.d1_voucher.findByCodeAndType(user.pwd, "400");
+        if (pwdData.length > 0 && pwdData[0].userId != user.userId) {
+            //瀛樺湪涓嶈兘娣诲姞杩斿洖澶辫触
+            log.info("瀵嗙爜閲嶅");
+            return "localUserAddView.failPwdRepeat"
+        }
+        //鏌ヨ鏄惁鏈夊瘑鐮佸嚟璇佹湁鏇存柊娌℃湁鏂板
+        let countByuserIdAndType = sqliteService.d1_voucher.findByuserIdAndType(user.userId, "400");
+        if (countByuserIdAndType.length > 0) {
+            ret = sqliteService.d1_voucher.updatecodeByuserIdAndtype(user.userId, "400", user.pwd)
+            if (ret != 0) {
+                return false
+            }
+        } else {
+            //鏂板涓�涓�
+            ret = sqliteService.d1_voucher.save({ keyId: std.genRandomStr(32), type: "400", code: user.pwd, userId: user.userId })
+            if (ret != 0) {
+                return false
+            }
+        }
+    } else {
+        //娌℃湁鍐呭鍘绘暟鎹簱琛ㄥ垹闄や竴涓�
+        sqliteService.d1_voucher.deleteByuserIdAndtype(user.userId, "400")
+    }
+    
+    //澶勭悊鍗$墖鍑瘉
+    if (user.card) {
+        //鍒ゆ柇搴撹〃鏄惁瀛樺湪杩欎釜鍑瘉
+        let cardData = sqliteService.d1_voucher.findByCodeAndType(user.card, "200");
+        if (cardData.length > 0 && cardData[0].userId != user.userId) {
+            //瀛樺湪涓嶈兘娣诲姞杩斿洖澶辫触
+            log.info("鍗¢噸澶�");
+            return "localUserAddView.failCardRepeat"
+        }
+        //鏌ヨ鏄惁鏈夊瘑鐮佸嚟璇佹湁鏇存柊娌℃湁鏂板
+        let countByuserIdAndType = sqliteService.d1_voucher.countByuserIdAndType(user.userId, "200");
+        if (countByuserIdAndType > 0) {
+            ret = sqliteService.d1_voucher.updatecodeByuserIdAndtype(user.userId, "200", user.card)
+            if (ret != 0) {
+                return false
+            }
+        } else {
+            //鏂板涓�涓�
+            ret = sqliteService.d1_voucher.save({ keyId: std.genRandomStr(32), type: "200", code: user.card, userId: user.userId })
+
+            if (ret != 0) {
+                return false
+            }
+        }
+    } else {
+        //娌℃湁鍐呭鍘绘暟鎹簱琛ㄥ垹闄や竴涓�
+        sqliteService.d1_voucher.deleteByuserIdAndtype(user.userId, "200")
+    }
+    
+    //澶勭悊浜鸿劯鍑瘉
+    if (user.face) {
+        let findByuserIdAndType = sqliteService.d1_voucher.findByuserIdAndType(user.userId, "300");
+        if (findByuserIdAndType.length <= 0) {
+            let ret = driver.face.registerFaceByPicFile(user.userId, user.face)
+            log.info("2娉ㄥ唽浜鸿劯,ret:", ret)
+            if (ret != 0) {
+                return faceService.regErrorEnum.picture[ret + '']
+            }
+            //娉ㄥ唽鎴愬姛鍚庨渶瑕佸惂鍘熸潵鍥剧墖绉诲姩鍒� user 瀵瑰簲鐩綍涓�
+            let src = "/app/data/user/" + user.userId + "/register.jpg"
+            std.ensurePathExists(src)
+            common.systemBrief('mv ' + user.face + " " + src)
+
+            //鏂板涓�涓�
+            ret = sqliteService.d1_voucher.save({ keyId: std.genRandomStr(32), type: "300", code: src, userId: user.userId })
+            if (ret != 0) {
+                return false
+            }
+        } else {
+            //鍘熸潵鏈夊張浼犲叆 鍏堝垹闄ゅ悗鏂板
+            if (findByuserIdAndType[0].code != user.face) {
+                //鍒犻櫎鑰佷汉鑴�
+                driver.face.delete(user.userId)
+                //娉ㄥ唽鏂颁汉鑴�
+                let res = driver.face.registerFaceByPicFile(user.userId, user.face)
+                log.info("3娉ㄥ唽浜鸿劯,res:", res)
+                if (res != 0) {
+                    return faceService.regErrorEnum.picture[res + '']
+                }
+                let src = "/app/data/user/" + user.userId + "/register.jpg"
+                std.ensurePathExists(src)
+                //鎶婁复鏃剁洰褰曚汉鑴哥Щ鍔ㄥ埌 user 瀵瑰簲鐨勬枃浠跺す涓�
+                common.systemBrief('mv ' + user.face + " " + src)
+                ret = sqliteService.d1_voucher.updatecodeAndExtraByuserIdAndtype(user.userId, "300", src, JSON.stringify({ faceType: 0 }))
+
+            }
+        }
+    } else {
+        //娌℃湁鍐呭鍘绘暟鎹簱琛ㄥ垹闄や竴涓�
+        sqliteService.d1_voucher.deleteByuserIdAndtype(user.userId, "300")
+        driver.face.delete(user.userId)
+        common.systemBrief("rm -rf /app/data/user/" + user.userId)
+    }
+
+    return true
+}
+
+/**
+ * 鏂板浜哄憳
+ * 娣诲姞鏂扮敤鎴蜂俊鎭�佸瘑鐮併�佸崱鐗囧拰浜鸿劯鏁版嵁
+ * @param {object} user - 鐢ㄦ埛瀵硅薄
+ * @returns {boolean|string} 娣诲姞缁撴灉锛屾垚鍔熻繑鍥瀟rue锛屽け璐ヨ繑鍥為敊璇俊鎭�
+ */
+screen.insertUser = async function (user) {
+    /**
+     * 淇濆瓨鍑瘉
+     * @param {string} type - 鍑瘉绫诲瀷
+     * @param {string} code - 鍑瘉浠g爜
+     * @returns {boolean|string} 淇濆瓨缁撴灉
+     */
+    const saveVoucher = async (type, code) => {
+        // 妫�鏌ュ崱鐗囧嚟璇佹槸鍚﹂噸澶�
+        if (type == "200") {
+            let cardData = sqliteService.d1_voucher.findByCodeAndType(code, "200");
+            if (cardData.length > 0 && cardData[0].userId != user.userId) {
+                //瀛樺湪涓嶈兘娣诲姞杩斿洖澶辫触
+                log.info("鍗¢噸澶�");
+                return "localUserAddView.failCardRepeat"
+            }
+        }
+        
+        // 褰� type 涓� "300" 鏃讹紝棣栧厛璋冪敤鐗瑰畾鏂规硶妫�鏌ユ槸鍚﹀彲浠ョ户缁繚瀛樺嚟璇�
+        if (type === "300") {
+            let preCheckResult = await preSaveCheck(code); // 鍋囪杩欐槸鎮ㄦ彁鍒扮殑闇�瑕佽皟鐢ㄧ殑鏂规硶
+            if (preCheckResult !== true) { // 濡傛灉棰勬鏌ヤ笉閫氳繃锛屽垯鐩存帴杩斿洖 false
+                return preCheckResult;
+            }
+            code = "/app/data/user/" + user.userId + "/register.jpg"
+        }
+
+        // 妫�鏌ュ瘑鐮佸嚟璇佹槸鍚﹂噸澶�
+        if (type == "400") {
+            let pwdData = sqliteService.d1_voucher.findByCodeAndType(code, "400");
+            if (pwdData.length > 0 && pwdData[0].userId != user.userId) {
+                //瀛樺湪涓嶈兘娣诲姞杩斿洖澶辫触
+                log.info("瀵嗙爜閲嶅");
+                return "localUserAddView.failPwdRepeat"
+            }
+        }
+
+        let keyId = std.genRandomStr(32);
+
+        let extra = type == 300 ? JSON.stringify({ faceType: 0 }) : JSON.stringify({})
+        let voucherRet = await sqliteService.d1_voucher.save({
+            keyId: keyId,
+            type: type,
+            code: code,
+            userId: user.userId,
+            extra: extra
+        });
+
+        if (voucherRet != 0) {
+            // 濡傛灉鍑瘉淇濆瓨澶辫触锛屽垯鍒犻櫎宸蹭繚瀛樼殑鐢ㄦ埛淇℃伅鍙婂彲鑳藉凡淇濆瓨鐨勫叾浠栧嚟璇�
+            await sqliteService.d1_person.deleteByUserId(user.userId);
+            await sqliteService.d1_voucher.deleteByUserId(user.userId);
+            return false;
+        }
+        return true;
+    };
+    
+    /**
+     * 淇濆瓨鍓嶆鏌�
+     * @param {string} code - 浜鸿劯鍥剧墖璺緞
+     * @returns {boolean|string} 妫�鏌ョ粨鏋�
+     */
+    async function preSaveCheck(code) {
+        let ret = driver.face.registerFaceByPicFile(user.userId, code)
+        log.info("1娉ㄥ唽浜鸿劯,ret:", ret)
+        if (ret != 0) {
+            return faceService.regErrorEnum.picture[ret + '']
+        }
+        //娉ㄥ唽鎴愬姛鍚庨渶瑕佸惂鍘熸潵鍥剧墖绉诲姩鍒� user 瀵瑰簲鐩綍涓�
+        let src = "/app/data/user/" + user.userId + "/register.jpg"
+        std.ensurePathExists(src)
+        common.systemBrief('mv ' + code + " " + src)
+        return true;
+    }
+
+    let success = true;
+    // 淇濆瓨浜鸿劯鍑瘉
+    if (success === true && user.face && !(success = await saveVoucher("300", user.face)));
+    // 淇濆瓨瀵嗙爜鍑瘉
+    if (success === true && user.pwd && !(success = await saveVoucher("400", user.pwd)));
+    // 淇濆瓨鍗$墖鍑瘉
+    if (success === true && user.card && !(success = await saveVoucher("200", user.card)));
+
+    if (success === true) {
+        //{"id":"423","userId":"423","name":"寰厜浜掕仈","idCard":"123","pwd":"251574","card":"123"}
+        //淇濆瓨浜哄憳淇℃伅
+        let personRet = await sqliteService.d1_person.save({
+            userId: user.userId,
+            name: user.name,
+            extra: JSON.stringify({ type: user.type == 1 ? 1 : 0, idCard: user.idCard })
+        });
+        if (personRet != 0) {
+            sqliteService.d1_voucher.deleteByUserId(user.userId);
+            return "localUserAddView.failRepeat"
+        }
+        //鏂板涓�鏉℃案涔呮潈闄�
+        sqliteService.d1_permission.save({ permissionId: user.userId, userId: user.userId, timeType: 0 })
+    } else {
+        await sqliteService.d1_voucher.deleteByUserId(user.userId);
+    }
+
+    return success;
+
+}
+
+/**
+ * 鑾峰彇鏈湴浜哄憳淇℃伅
+ * 鑾峰彇鐢ㄦ埛鐨勫嚟璇佷俊鎭紝鍖呮嫭韬唤璇併�佸崱鐗囥�佸瘑鐮佸拰浜鸿劯鏁版嵁
+ * @param {string} userId - 鐢ㄦ埛ID
+ * @returns {object} 鐢ㄦ埛鍑瘉淇℃伅
+ */
+screen.getVoucher = function (userId) {
+    // 鑾峰彇鐢ㄦ埛淇℃伅
+    let person = sqliteService.d1_person.find({ userId: userId });
+
+    if (person.length < 0) {
+        return
+    }
+    
+    // 鑾峰彇瀵嗙爜鍑瘉
+    let pwd_voucher = sqliteService.d1_voucher.find({ userId: userId, type: "400" })[0] || undefined
+    
+    // 鑾峰彇鍗$墖鍑瘉
+    let card_voucher = sqliteService.d1_voucher.find({ userId: userId, type: "200" })[0] || undefined
+    
+    // 鑾峰彇浜鸿劯鍑瘉
+    let face_voucher = sqliteService.d1_voucher.find({ userId: userId, type: "300" })[0] || undefined
+    
+    // 鑾峰彇韬唤璇佷俊鎭�
+    let idCard_voucher
+    try {
+        idCard_voucher = JSON.parse(person[0].extra).idCard
+    } catch (error) {
+    }
+
+    return {
+        id: userId,
+        idCard: idCard_voucher ? idCard_voucher : undefined,
+        card: card_voucher ? card_voucher.code : undefined,
+        pwd: pwd_voucher ? pwd_voucher.code : undefined,
+        face: face_voucher ? face_voucher.code : undefined,
+        type: JSON.parse(person[0].extra).type || 0
+    }
+
+}
+
+/**
+ * 鑾峰彇鐢ㄦ埛鍒楄〃
+ * 鏍规嵁鏉′欢鏌ヨ鐢ㄦ埛鍒楄〃锛屾敮鎸佸垎椤靛拰鎼滅储
+ * @param {number} page - 椤电爜锛岄粯璁�0
+ * @param {number} size - 姣忛〉澶у皬锛岄粯璁�6
+ * @param {string} userId - 鐢ㄦ埛ID锛岀敤浜庣簿纭悳绱�
+ * @param {string} name - 鐢ㄦ埛濮撳悕锛岀敤浜庢ā绯婃悳绱�
+ * @returns {object} 鐢ㄦ埛鍒楄〃鏁版嵁锛屽寘鍚垎椤典俊鎭�
+ */
+screen.getUsers = function (page = 0, size = 6, userId, name) {
+    // 鎸夌敤鎴稩D鎴栧鍚嶆悳绱�
+    if (userId || name) {
+        // 鎸夌敤鎴稩D鎼滅储
+        let user = sqliteService.d1_person.findByUserId(userId)[0]
+        if (user) {
+            user.id = user.userId
+            return { data: [user], totalPage: 1, totalSize: 1, currentPage: 1 }
+        }
+        // 鎸夌敤鎴峰鍚嶆悳绱�
+        let users = sqliteService.d1_person.findByName(name)
+        if (users && users.length > 0) {
+            users.map(v => {
+                v.id = v.userId
+            })
+            
+            /**
+             * 鏁扮粍鍒嗗潡
+             * @param {array} arr - 婧愭暟缁�
+             * @param {number} size - 鍧楀ぇ灏�
+             * @returns {array} 鍒嗗潡鍚庣殑鏁扮粍
+             */
+            function chunkArray(arr, size) {
+                // 濡傛灉鏁扮粍涓虹┖鎴栬�呭ぇ灏忎负闆讹紝杩斿洖绌烘暟缁�
+                if (arr.length === 0 || size <= 0) {
+                    return [];
+                }
+                const result = [];
+                // 浣跨敤寰幆閬嶅巻鏁扮粍锛屽苟鎸夌収澶у皬鍒囧壊
+                for (let i = 0; i < arr.length; i += size) {
+                    result.push(arr.slice(i, i + size));  // slice 鎴彇鎸囧畾鑼冨洿鐨勫厓绱�
+                }
+                return result;
+            }
+            
+            const chunkedArray = chunkArray(users, size);
+            return { data: chunkedArray[page], totalPage: Math.ceil(users.length / size), totalSize: users.length, currentPage: page + 1 }
+        }
+        return { data: [], totalPage: 0, totalSize: 0, currentPage: 1 }
+    }
+    
+    // 鑾峰彇鎵�鏈夌敤鎴�
+    let userCount = sqliteService.d1_person.count()
+    let users = sqliteService.d1_person.findOrderByUserIdAsc({ page, size })
+    if (users.length > 0) {
+        users.forEach(element => { element.id = element.userId });
+    }
+    // 鎬婚〉鏁�
+    let totalPage = Math.ceil(userCount / size)
+    return { data: users, totalPage: totalPage, totalSize: userCount, currentPage: page + 1 }
+}
+
+/**
+ * 鑾峰彇閫氳璁板綍
+ * 鑾峰彇鐢ㄦ埛閫氳璁板綍锛屾敮鎸佸垎椤�
+ * @param {number} page - 椤电爜锛岄粯璁�0
+ * @param {number} size - 姣忛〉澶у皬锛岄粯璁�6
+ * @returns {object} 閫氳璁板綍鏁版嵁锛屽寘鍚垎椤典俊鎭�
+ */
+screen.getPassRecord = function (page = 0, size = 6) {
+    let passCount = sqliteService.d1_pass_record.count()
+    let datas = sqliteService.d1_pass_record.findOrderByTimeDesc({ page, size })
+    // 鎬婚〉鏁�
+    let totalPage = Math.ceil(passCount / size)
+    return { data: datas, totalPage: totalPage, totalSize: passCount, currentPage: page + 1 }
+}
+
+/**
+ * 浜鸿劯褰曞叆寮�濮�
+ * 寮�濮嬩汉鑴稿綍鍏ワ紝UI鎺у埗
+ * @param {string} userId - 鐢ㄦ埛ID
+ */
+screen.faceEnterStart = function (userId) {
+    dxMap.get("UI").put("faceEnterStart", userId)
+    driver.face.status(1)
+    driver.face.mode(1)
+}
+
+/**
+ * 浜鸿劯褰曞叆缁撴潫
+ * 缁撴潫浜鸿劯褰曞叆锛孶I鎺у埗
+ */
+screen.faceEnterEnd = function () {
+    dxMap.get("UI").del("faceEnterStart")
+    driver.face.status(0)
+    // driver.face.mode(0)
+}
+
+/**
+ * 鑾峰彇鍗″彿寮�濮�
+ * 寮�濮嬭幏鍙栧崱鍙凤紝UI鎺у埗
+ */
+screen.getCardStart = function () {
+    dxMap.get("UI").put("getCardStart", true)
+}
+
+/**
+ * 鑾峰彇鍗″彿缁撴潫
+ * 缁撴潫鑾峰彇鍗″彿锛孶I鎺у埗
+ */
+screen.endCardEnd = function () {
+    dxMap.get("UI").del("getCardStart")
+}
+
+/**
+ * 寮�鍚汉鑴歌瘑鍒�
+ * 寮�濮嬩汉鑴歌瘑鍒姛鑳�
+ */
+screen.faceRecgStart = function () {
+    driver.face.status(1)
+    driver.face.mode(0)
+}
+
+/**
+ * 浜鸿劯璇嗗埆鏆傚仠
+ * 鏆傚仠浜鸿劯璇嗗埆鍔熻兘
+ */
+screen.faceRecgPause = function () {
+    driver.face.status(0)
+}
+
+/**
+ * 浜鸿劯褰曞叆缁撴灉
+ * 澶勭悊浜鸿劯褰曞叆缁撴灉
+ * @param {string} facePic - 浜鸿劯鍥剧墖璺緞
+ */
+screen.faceEnterResult = function (facePic) {
+    if (facePic) {
+        faceEnterView.successFlag = true
+        // 鎴愬姛锛屾樉绀轰汉鑴哥収鐗�
+        localUserAddView.addFace(facePic)
+        dxui.loadMain(localUserAddView.screenMain)
+        faceEnterView.backCb()
+    } else {
+        // 澶辫触锛屾姤閿�
+        faceEnterView.timeout()
+    }
+}
+
+/**
+ * 闈炶瘑鍒〉闈汉鑴歌璇佸紑濮�
+ * 寮�濮嬩汉鑴歌璇侊紝UI鎺у埗
+ */
+screen.faceAuthStart = function () {
+    dxMap.get("UI").put("faceAuthStart", "Y")
+    driver.face.status(1)
+    driver.face.mode(0)
+}
+
+/**
+ * 闈炶瘑鍒〉闈汉鑴歌璇佺粨鏉�
+ * 缁撴潫浜鸿劯璁よ瘉锛孶I鎺у埗
+ */
+screen.faceAuthEnd = function () {
+    dxMap.get("UI").del("faceAuthStart")
+    driver.face.status(0)
+}
+
+/**
+ * 闈炶瘑鍒〉闈汉鑴歌璇佺粨鏋�
+ * 澶勭悊浜鸿劯璁よ瘉缁撴灉
+ * @param {boolean} bool - 璁よ瘉缁撴灉锛宼rue琛ㄧず鎴愬姛锛宖alse琛ㄧず澶辫触
+ */
+screen.faceAuthResult = function (bool) {
+    if (bool) {
+        // 鎴愬姛锛岃繘鍏ヨ缃彍鍗�
+        driver.alsa.play(`/app/code/resource/${config.get("base.language") == "CN" ? "CN" : "EN"}/wav/recg_s.wav`)
+        dxui.loadMain(configView.screenMain)
+    } else {
+        // 澶辫触锛屾姤閿�
+        driver.alsa.play(`/app/code/resource/${config.get("base.language") == "CN" ? "CN" : "EN"}/wav/recg_f.wav`)
+        identityVerificationView.statusPanel.fail()
+    }
+}
+
+/**
+ * 淇濆瓨閰嶇疆
+ * 淇濆瓨绯荤粺閰嶇疆
+ * @param {object} configAll - 閰嶇疆瀵硅薄
+ * @returns {boolean} 淇濆瓨缁撴灉
+ */
+screen.saveConfig = function (configAll) {
+    // 鐩存帴璋冪敤閰嶇疆楠岃瘉鍜屼繚瀛樺嚱鏁�
+    return configService.configVerifyAndSave(configAll)
+}
+
+/**
+ * 鑾峰彇閰嶇疆
+ * 鑾峰彇绯荤粺閰嶇疆
+ * @returns {object} 閰嶇疆瀵硅薄
+ */
+screen.getConfig = function () {
+    let config1 = config.getAll()
+    return config1
+}
+
+/**
+ * 瀵嗙爜閫氳
+ * 浣跨敤瀵嗙爜杩涜閫氳楠岃瘉
+ * @param {string} pwd - 瀵嗙爜
+ * @returns {boolean} 楠岃瘉缁撴灉锛宼rue琛ㄧず鎴愬姛锛宖alse琛ㄧず澶辫触
+ */
+screen.pwdAccess = function (pwd) {
+    // 妫�鏌ユ暟鎹簱涓殑搴旀�ュ紑浠撳瘑鐮�
+    try {
+        const passwords = sqliteService.d1_emergency_password.findAll({ status: 1 })
+        for (let i = 0; i < passwords.length; i++) {
+            if (passwords[i].password === pwd) {
+                return true
+            }
+        }
+    } catch (error) {
+        logger.error('妫�鏌ュ簲鎬ュ紑浠撳瘑鐮佸け璐�:', error)
+    }
+    
+    // 鍏朵粬瀵嗙爜楠岃瘉閫昏緫
+    bus.fire("access", { data: { type: "400", code: pwd } })
+    return false
+}
+
+/**
+ * 鍒囨崲缃戠粶绫诲瀷
+ * 鍒囨崲缃戠粶杩炴帴绫诲瀷
+ * @param {object} data - 缃戠粶绫诲瀷鏁版嵁
+ */
+screen.switchNetworkType = function (data) {
+    bus.fire("switchNetworkType", data)
+}
+
+/**
+ * 鑾峰彇WiFi鍒楄〃
+ * 鑾峰彇鍙敤鐨刉iFi缃戠粶鍒楄〃
+ */
+screen.netGetWifiSsidList = function () {
+    bus.fire("netGetWifiSsidList")
+}
+
+/**
+ * WiFi鍒楄〃鏁版嵁
+ * 澶勭悊WiFi鍒楄〃鏁版嵁
+ * @param {array} data - WiFi鍒楄〃鏁版嵁
+ */
+screen.netWifiSsidList = function (data) {
+    if (data.length == 0 && config.get("net.type") == 2) {
+        //鏃犵嚎缃�
+        std.setTimeout(() => {
+            screen.netGetWifiSsidList()
+        }, 1000)
+        return
+    }
+    networkSettingView.wifiListData = data
+    networkSettingView.wifiList.refresh()
+}
+
+/**
+ * 杩炴帴WiFi
+ * 杩炴帴鍒版寚瀹氱殑WiFi缃戠粶
+ * @param {string} ssid - WiFi鍚嶇О
+ * @param {string} psk - WiFi瀵嗙爜
+ * @returns {boolean} 杩炴帴缁撴灉
+ */
+screen.netConnectWifiSsid = function (ssid, psk) {
+    return driver.net.netConnectWifiSsid(ssid, psk)
+}
+
+/**
+ * 鑾峰彇鍗″彿
+ * 澶勭悊鑾峰彇鍒扮殑鍗″彿
+ * @param {string} card - 鍗″彿
+ */
+screen.getCard = function (card) {
+    localUserAddView.cardBoxInput.text(card)
+}
+
+/**
+ * 浜嬩欢鎬荤嚎浜嬩欢澶勭悊
+ * 娉ㄥ唽鍜屽鐞嗙郴缁熶簨浠�
+ */
+function busEvents() {
+    // 缃戠粶鐘舵��
+    bus.on('netStatus', (data) => {
+        console.log(JSON.stringify(data));
+        let type = config.get("net.type")
+        if (data.connected) {
+            let ip = net.getModeByCard(type).param.ip
+            mainView.overlayIpLbl.text("IP:" + ip)
+            config.setAndSave("net.ip", ip)
+            config.setAndSave("net.mac", net.getMacaddr(type))
+            topView.ethConnectState(true, type)
+            networkSettingView.netInfo[10].label.dataI18n = "networkSettingView.networkConnected"
+        } else {
+            topView.ethConnectState(false, type)
+            networkSettingView.netInfo[10].label.dataI18n = "networkSettingView.networkUnconnected"
+        }
+        i18n.refreshObj(networkSettingView.netInfo[10].label)
+    })
+    
+    // mqtt杩炴帴鐘舵��
+    bus.on('mqttStatus', (data) => {
+        if (data == "connected") {
+            topView.mqttConnectState(true)
+        } else {
+            topView.mqttConnectState(false)
+        }
+    })
+    
+    // 浜鸿劯褰曞叆寮�濮�
+    bus.on("beginAddFace", screen.beginAddFace)
+    
+    // 浜鸿劯褰曞叆缁撴灉
+    bus.on("faceEnterResult", screen.faceEnterResult)
+    
+    // 閫�鍑哄睆淇�
+    bus.on("exitIdle", screen.exitIdle)
+    
+    // 鑾峰彇WiFi鍒楄〃 - 绉婚櫎浜嬩欢鐩戝惉鍣紝閬垮厤鏃犻檺寰幆
+    
+    // 鑾峰彇鍗″彿
+    bus.on("getCard", screen.getCard)
+    
+    // 浜鸿劯璁よ瘉缁撴灉
+    bus.on("faceAuthResult", screen.faceAuthResult)
+    
+    // 閫氳缁撴灉
+    bus.on("accessRes", screen.accessRes)
+    
+    // 璺熻釜鏇存柊
+    // bus.on("trackUpdate", screen.trackUpdate)
+    
+    // 闅愯棌SN
+    bus.on("hideSn", screen.hideSn)
+    
+    // 鍒囨崲璇█
+    bus.on("changeLanguage", screen.changeLanguage)
+    
+    // 闅愯棌IP
+    bus.on("hideIp", screen.hideIp)
+    
+    // 鍒锋柊灞忓箷绠$悊鍣�
+    bus.on("screenManagerRefresh", screen.screenManagerRefresh)
+    
+    // WiFi鍒楄〃鏁版嵁
+    bus.on("netWifiSsidList", screen.netWifiSsidList)
+    
+    // APP妯″紡
+    bus.on("appMode", screen.appMode)
+    
+    // 鍗囩骇
+    bus.on("upgrade", screen.upgrade)
+    
+    // 鍗$墖閲嶇疆
+    // bus.on("cardReset", screen.cardReset)
+    
+    // 璺熻釜缁撴灉
+    bus.on("trackResult", screen.trackResult)
+    bus.on("showAccessResult", screen.showAccessResult)
+}
+
+/**
+ * 鍗$墖閲嶇疆瀹氭椂鍣�
+ */
+let setTimeout
+
+/**
+ * 鍗$墖閲嶇疆
+ * 澶勭悊鍗$墖閲嶇疆閫昏緫
+ * @param {object} msg - 娑堟伅瀵硅薄
+ */
+screen.cardReset = function (msg) {
+    if (msg.type == 2 && msg.status == 3) {
+        setTimeout = std.setTimeout(() => {
+            driver.net.cardReset()
+        }, 30 * 1000);
+    } else {
+        if (setTimeout) {
+            std.clearTimeout(setTimeout)
+        }
+    }
+}
+
+/**
+ * 寮�濮嬫敞鍐屼汉鑴�
+ * 澶勭悊浜鸿劯娉ㄥ唽寮�濮嬮�昏緫
+ * @param {object} data - 浜鸿劯鏁版嵁瀵硅薄
+ */
+screen.beginAddFace = function (data) {
+    log.info('screen.beginAddFace', JSON.stringify(data));
+
+    if (!data.fileName) {
+        return screen.faceEnterResult()
+    }
+
+    driver.alsa.play(`/app/code/resource/${config.get("base.language") == "CN" ? "CN" : "EN"}/wav/recognition_s.wav`)
+    faceEnterView.statusPanel.success("faceEnterView.recogSuccess")
+    // 淇濆瓨鍥剧墖鍒版湰鍦�   
+    let src = `/app/data/user/register.jpg`
+    common.systemBrief(`mv ${data.fileName} ${src}`)
+    common.systemBrief(`rm -rf /app/data/user/temp/*`)
+
+    screen.faceEnterResult(src)
+}
+
+/**
+ * 閫氳缁撴灉
+ * 澶勭悊閫氳鎴愬姛鎴栧け璐ョ殑缁撴灉
+ * @param {boolean} bool - 閫氳缁撴灉锛宼rue琛ㄧず鎴愬姛锛宖alse琛ㄧず澶辫触
+ */
+screen.accessRes = function (bool) {
+    if (bool) {
+        if (mainView.smallStatusPanel && mainView.smallStatusPanel.success) {
+            mainView.smallStatusPanel.success()
+        }
+    } else {
+        if (mainView.smallStatusPanel && mainView.smallStatusPanel.fail) {
+            mainView.smallStatusPanel.fail()
+        }
+    }
+}
+
+/**
+ * 鍒囨崲APP妯″紡
+ * 鍒囨崲搴旂敤绋嬪簭鏄剧ず妯″紡锛堟爣鍑嗘ā寮忔垨绠�娲佹ā寮忥級
+ * @param {number} mode - 妯″紡鍊硷紝0琛ㄧず鏍囧噯妯″紡锛�1琛ㄧず绠�娲佹ā寮�
+ */
+screen.appMode = function (mode) {
+    if (mode == 0) {
+        // 鍒囨崲鍒版爣鍑嗘ā寮�
+    } else if (mode == 1) {
+        // 鍒囨崲鍒扮畝娲佹ā寮�
+    }
+}
+
+/**
+ * 鏇存柊浜鸿劯璺熻釜妗�
+ * 鏇存柊浜鸿劯璺熻釜妗嗙殑浣嶇疆鍜岀姸鎬�
+ * @param {object} data - 鍧愭爣淇℃伅
+ * @param {number} id - face_id锛岀敤浜庡叧鑱旇瘑鍒鍚嶇敤
+ * @param {boolean} isLiving - 鏄惁娲讳綋
+ */
+screen.trackUpdate = function (data, id, isLiving) {
+    let item = mainView.trackFaces[0]
+    for (let i = 0; i < 10; i++) {
+        let ele = mainView.trackFaces[i]
+        if (ele.face_id == id) {
+            item = ele
+            break
+        }
+    }
+    item.face_id = id
+
+    if (item && item.timer) {
+        std.clearTimeout(item.timer)
+        item.timer = null
+    }
+
+    item.timer = std.setTimeout(() => {
+        item.trackFace.hide()
+        // item.trackFaceName.hide()
+        if (item.timer) {
+            std.clearTimeout(item.timer)
+            item.timer = null
+        }
+    }, 300)
+
+    let edge = data.w > data.h ? data.w : data.h
+    let offset = Math.abs(data.w - data.h) / 2
+    item.trackFace.show()
+    item.trackFace.setSize(edge, edge)
+    item.trackFace.radius(edge / 2)
+    if (data.w > data.h) {
+        item.trackFace.setPos(data.x, data.y - offset)
+    } else {
+        item.trackFace.setPos(data.x - offset, data.y)
+    }
+
+    item.trackFaceName.text(" ")
+
+    if (item.result && item.result.result === true && item.result.id == id) {
+        item.trackFace.setBorderColor(viewUtils.color.success)
+        let user = sqliteService.d1_person.findByUserId(item.result.userId)[0]
+        item.trackFaceName.text(user ? user.name : "")
+    } else if (item.result && item.result.result === false && item.result.id == id) {
+        item.trackFace.setBorderColor(viewUtils.color.fail)
+    } else if (isLiving) {
+        item.trackFace.setBorderColor(0xf3e139)
+    } else {
+        item.trackFace.setBorderColor(0xffffff)
+    }
+}
+
+/**
+ * 璁よ瘉缁撴灉
+ * 澶勭悊浜鸿劯璇嗗埆璁よ瘉缁撴灉
+ * @param {object} data - 璁よ瘉缁撴灉鏁版嵁
+ */
+screen.trackResult = function (data) {
+    for (let i = 0; i < 10; i++) {
+        let ele = mainView.trackFaces[i]
+        if (ele.face_id == data.id) {
+            ele.result = data
+            return
+        }
+    }
+}
+
+/**
+ * 闅愯棌SN鎸夐挳
+ * 鎺у埗SN鎸夐挳鐨勬樉绀哄拰闅愯棌
+ * @param {boolean} bool - 鏄惁鏄剧ず锛宼rue琛ㄧず鏄剧ず锛宖alse琛ㄧず闅愯棌
+ */
+screen.hideSn = function (bool) {
+    if (bool) {
+        mainView.bottomSnBtn.show()
+    } else {
+        mainView.bottomSnBtn.hide()
+    }
+}
+
+/**
+ * 闅愯棌IP鏍囩
+ * 鎺у埗IP鏍囩鐨勬樉绀哄拰闅愯棌
+ * @param {boolean} bool - 鏄惁鏄剧ず锛宼rue琛ㄧず鏄剧ず锛宖alse琛ㄧず闅愯棌
+ */
+screen.hideIp = function (bool) {
+    // 涓嶅啀闇�瑕佹鍑芥暟锛屽洜涓篒P淇℃伅鐜板湪鏄剧ず鍦ㄥ崐閫忔槑瑕嗙洊鍥惧眰涓�
+}
+
+/**
+ * 闅愯棌搴曢儴妗�
+ * 鎺у埗搴曢儴妗嗙殑鏄剧ず鍜岄殣钘�
+ * @param {boolean} bool - 鏄惁鏄剧ず锛宼rue琛ㄧず鏄剧ず锛宖alse琛ㄧず闅愯棌
+ */
+screen.hideBottomBox = function (bool) {
+    if (bool) {
+        mainView.bottomBox.hide()
+    } else {
+        mainView.bottomBox.show()
+    }
+}
+
+/**
+ * 鍒囨崲璇█
+ * 鍒囨崲绯荤粺璇█璁剧疆
+ */
+screen.changeLanguage = function () {
+    i18n.setLanguage(screen.getConfig()['base.language'])
+}
+
+/**
+ * 鍗囩骇鎻愮ず
+ * 鏄剧ず绯荤粺鍗囩骇鎻愮ず淇℃伅
+ * @param {object} data - 鍗囩骇淇℃伅瀵硅薄锛屽寘鍚玹itle鍜宑ontent
+ */
+screen.upgrade = function (data) {
+    const { title, content } = data
+    viewUtils.confirmOpen(title, content)
+}
+
+/**
+ * 鏄剧ず閫氳缁撴灉寮圭獥
+ * @param {object} data - 閫氳缁撴灉鏁版嵁
+ * @param {boolean} data.faceAuth - 浜鸿劯璇嗗埆鏄惁閫氳繃
+ * @param {boolean} data.gasConcentration - 姘斾綋娴撳害鏄惁鍚堟牸
+ * @param {boolean} data.accessAllowed - 鏄惁鍏佽閫氳
+ * @param {string} data.message - 寮圭獥娑堟伅
+ */
+screen.showAccessResult = function (data) {
+    // // 鏄剧ず鐘舵�侀潰鏉匡紝3绉掑悗鑷姩鍏抽棴
+    // if (data.accessAllowed) {
+    //     mainView.statusPanel.success(data.message)
+    // } else {
+    //     mainView.statusPanel.fail(data.message)
+    // }
+
+    
+    // 鏄剧ず灏忓瀷鐘舵�侀潰鏉匡紝3绉掑悗鑷姩鍏抽棴
+    if (data.accessAllowed) {
+        mainView.smallStatusPanel.success(data.message)
+    } else {
+        mainView.smallStatusPanel.fail(data.message)
+    }
+}
+
+export default screen

--
Gitblit v1.9.3