Browse Source

1.新增开锁方式上报

JaycePC 1 month ago
parent
commit
487fa034a0

+ 2 - 2
app/build.gradle

@@ -19,7 +19,7 @@ android {
         minSdk 31
         targetSdk 35
         versionCode 2
-        versionName "2.6"
+        versionName "2.11"
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         room {
@@ -27,7 +27,7 @@ android {
         }
         ndk {
             //noinspection ChromeOsAbiSupport
-            abiFilters 'arm64-v8a', 'armeabi-v7a'
+            abiFilters 'armeabi-v7a'
         }
     }
 

+ 15 - 14
app/src/main/java/core/ui/activity/BaseSignActivity.kt

@@ -13,6 +13,7 @@ import http.vo.response.SignFaceVo
 import http.vo.response.SignInCheckResp
 import org.greenrobot.eventbus.EventBus
 import xn.xxp.app.LabApp
+import xn.xxp.home.auth.AuthType
 import xn.xxp.home.auth.PickSignTypeDialog
 import xn.xxp.home.auth.ResultEnum
 import xn.xxp.home.auth.SafetyCheckResultDialog
@@ -39,25 +40,25 @@ abstract class BaseSignActivity<VB : ViewBinding> : BaseCountDownActivity<VB>()
         deviceConfig = RoomTool.getInstance().deviceConfigDao().deviceConfig
     }
 
-    protected fun dispatchSignIn() {
+    protected fun dispatchSignIn(authType: AuthType) {
         LabApp.userVo ?: return
 
         if ("1" == LabApp.userVo?.pageType) {
             // 一类人员:巡查签到
-            dispatchPatrolSign()
+            dispatchPatrolSign(authType)
         } else {
             if ("1" == LabApp.userVo?.isDutyUser) {
                 // 值班人员:选择巡查签到/准入签到
                 PickSignTypeDialog(this) { type ->
                     if (SignType.PATROL.code == type) {
-                        dispatchPatrolSign()
+                        dispatchPatrolSign(authType)
                     } else {
-                        dispatchAccessSign()
+                        dispatchAccessSign(authType)
                     }
                 }.show()
             } else {
                 // 其它人员:准入签到
-                dispatchAccessSign()
+                dispatchAccessSign(authType)
             }
         }
     }
@@ -82,27 +83,27 @@ abstract class BaseSignActivity<VB : ViewBinding> : BaseCountDownActivity<VB>()
         }
     }
 
-    protected open fun onSignInFinish(completed: Boolean) {
+    protected open fun onSignInFinish(completed: Boolean, authType: AuthType) {
     }
 
     protected open fun onSignOutFinish(completed: Boolean) {
     }
 
-    private fun dispatchAccessSign() {
+    private fun dispatchAccessSign(authType: AuthType) {
         val param = CommonSignInReq().apply {
             labId = labConfig.labId.toString()
             userId = LabApp.userVo.userId
         }
         if (false == mustAccessInCheck()) {
             // 直接签到
-            callSignApi(SignType.ACCESS, param)
+            callSignApi(SignType.ACCESS, param, authType)
         } else {
             accessSignCheck(param) { result ->
                 val intent = Intent(this, SignInActivity::class.java)
                 intent.putExtra("sign_type", SignType.ACCESS.code)
                 intent.putExtra("sign_face", result)
                 startActivity(intent)
-                onSignInFinish(false)
+                onSignInFinish(false, authType)
             }
         }
     }
@@ -124,7 +125,7 @@ abstract class BaseSignActivity<VB : ViewBinding> : BaseCountDownActivity<VB>()
         addDisposable(disposable)
     }
 
-    private fun dispatchPatrolSign() {
+    private fun dispatchPatrolSign(authType: AuthType) {
         val param = CommonSignInReq().apply {
             num = deviceConfig.devId
             labId = labConfig.labId.toString()
@@ -132,13 +133,13 @@ abstract class BaseSignActivity<VB : ViewBinding> : BaseCountDownActivity<VB>()
         }
         if (false == mustPatrolAiCheck()) {
             // 直接签到
-            callSignApi(SignType.PATROL, param)
+            callSignApi(SignType.PATROL, param, authType)
         } else {
             patrolSignCheck(param) {
                 val intent = Intent(this, SignInActivity::class.java)
                 intent.putExtra("sign_type", SignType.PATROL.code)
                 startActivity(intent)
-                onSignInFinish(false)
+                onSignInFinish(false, authType)
             }
         }
     }
@@ -160,7 +161,7 @@ abstract class BaseSignActivity<VB : ViewBinding> : BaseCountDownActivity<VB>()
         addDisposable(disposable)
     }
 
-    private fun callSignApi(signType: SignType, param: CommonSignInReq) {
+    private fun callSignApi(signType: SignType, param: CommonSignInReq, authType: AuthType) {
         showLoading("签到中...")
         val disposable = ApiRepository.commonSignIn(signType.code, param)
             .subscribe({
@@ -173,7 +174,7 @@ abstract class BaseSignActivity<VB : ViewBinding> : BaseCountDownActivity<VB>()
                     1500
                 ).apply {
                     setCancelable(false)
-                    setOnDismissListener { onSignInFinish(true) }
+                    setOnDismissListener { onSignInFinish(true, authType) }
                     show()
                 }
             }, { throwable ->

+ 72 - 0
app/src/main/java/http/client/HttpTool.java

@@ -3,20 +3,33 @@ package http.client;
 import android.net.Uri;
 import android.util.Log;
 
+import com.blankj.utilcode.util.AppUtils;
 import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.ShellUtils;
+import com.hikvision.dmb.EthernetConfig;
+import com.hikvision.dmb.network.InfoNetworkApi;
+import com.hikvision.dmb.system.InfoSystemApi;
+import com.hikvision.dmb.util.InfoUtilApi;
 
 import http.OkHttpUtils;
 import http.vo.request.TerminalAuthReq;
 
+import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
 
 import okhttp3.Response;
+import xn.xxp.app.LabApp;
+import xn.xxp.home.auth.AuthType;
 import xn.xxp.room.RoomTool;
 import xn.xxp.room.bean.DeviceConfig;
 import xn.xxp.room.bean.LabConfig;
+import xn.xxp.utils.Tool;
 
 public final class HttpTool {
 
@@ -111,6 +124,29 @@ public final class HttpTool {
     }
 
     /**
+     * 进出记录和授权记录配置
+     *
+     * @param openType 开门类型
+     * @return
+     */
+    public static Response updateRecord(String userId, AuthType openType) {
+        try {
+            JSONObject jsonObject = new JSONObject();
+            LabConfig labConfig = RoomTool.getInstance().labConfigDao().getLabConfig();
+            jsonObject.put("subId", labConfig.getLabId());
+            jsonObject.put("userId", userId);
+            jsonObject.put("openType", openType.getType());
+            DeviceConfig deviceConfig = RoomTool.getInstance().deviceConfigDao().getDeviceConfig();
+            String json = jsonObject.toString();
+            LogUtils.d("updateRecord", json);
+            return OkHttpUtils.postSync(deviceConfig.getBaseUrl() + "laboratory/app/board/updateRecord", jsonObject.toString());
+        } catch (Exception e) {
+            LogUtils.e("updateRecord", Log.getStackTraceString(e));
+        }
+        return null;
+    }
+
+    /**
      * 查询二维码登录状态
      *
      * @param code 时间
@@ -119,4 +155,40 @@ public final class HttpTool {
         DeviceConfig deviceConfig = RoomTool.getInstance().deviceConfigDao().getDeviceConfig();
         return OkHttpUtils.getSync(deviceConfig.getBaseUrl() + "terminal/lab/infobordLogin?macId=" + devId + "&code=" + code);
     }
+
+    public static Response heartbeat() throws JSONException, IOException {
+        DeviceConfig deviceConfig = RoomTool.getInstance().deviceConfigDao().getDeviceConfig();
+        JSONObject jsonObject = new JSONObject();
+        ShellUtils.CommandResult commandResult = ShellUtils.execCmd("dumpsys activity activities", true);
+        BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(commandResult.successMsg.getBytes())));
+        String line;
+        boolean isShow = false;
+        while ((line = reader.readLine()) != null) {
+            if (line.contains("mResumedActivity") || line.contains("mCurrentFocus")) {
+                String[] itemArray = line.split(" ", -1);
+                for (String item : itemArray) {
+                    if (item.contains("/")) {
+                        String packageName = item.substring(0, item.indexOf("/"));
+                        isShow = AppUtils.getAppPackageName().equals(packageName);
+                        break;
+                    }
+                }
+                break;
+            }
+        }
+
+        boolean adbEnabled = (1 == InfoSystemApi.getAdbStatus());
+        EthernetConfig ethernetConfig = InfoNetworkApi.getEthernetConfig();
+        // Ip
+        String ip = ethernetConfig.getIpAddress();
+        jsonObject.put("deviceNo", "EBOARD_" + InfoSystemApi.getSerialNumber());
+        jsonObject.put("versionName", AppUtils.getAppVersionName());
+        jsonObject.put("packageName", AppUtils.getAppPackageName());
+        jsonObject.put("isShow", isShow);
+        jsonObject.put("adbEnabled", adbEnabled);
+        jsonObject.put("ip", ip);
+        String json = jsonObject.toString();
+        LogUtils.d(json);
+        return OkHttpUtils.postSync(deviceConfig.getBaseUrl() + "terminal/machine/heartbeat", json);
+    }
 }

+ 19 - 8
app/src/main/java/xn/xxp/HomeActivity.java

@@ -3,9 +3,11 @@ package xn.xxp;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.CountDownTimer;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.View;
 
 import androidx.core.content.ContextCompat;
@@ -32,6 +34,7 @@ import java.util.Objects;
 import core.ui.activity.BaseCountDownActivity;
 import core.ui.widget.decoration.NoLastLineItemDecoration;
 import core.util.FastClickDelegate;
+import http.client.HttpTool;
 import http.vo.response.LabPersonVo;
 import http.vo.response.LabWarnVo;
 import kotlin.Unit;
@@ -70,7 +73,6 @@ import xn.xxp.widget.WaringDialog;
 public class HomeActivity extends BaseCountDownActivity<ActivityHomeBinding> implements HomeFragmentCallback {
     private final int MAX_UI_DEFAULT = 60;// 中间UI恢复时间
     private int defaultCdCount = 0;// 用户操作时间倒计时
-    //    private int loadWarnCdCount = 0;// 预案查询倒计时
     private DeviceConfigDao deviceConfigDao;
     private LabConfigDao labConfigDao;
     protected DeviceConfig deviceConfig;
@@ -80,6 +82,7 @@ public class HomeActivity extends BaseCountDownActivity<ActivityHomeBinding> imp
     private HomeActivityHelp help;
     private FragmentManager fragmentManager;
     private CountDownTimer defaultCd;
+    private int heartbeat = 0;// 心跳间隔
     protected PeopleFlipperAdapter personFlipperAdapter;
     protected PeopleFlipperAdapter experimentAdapter;
     protected PeopleFlipperAdapter accessAdapter;
@@ -160,13 +163,21 @@ public class HomeActivity extends BaseCountDownActivity<ActivityHomeBinding> imp
                 } else {
                     defaultCdCount++;
                 }
-//                // 预案间隔
-//                if (loadWarnCdCount >= 10) {
-//                    loadWarnCdCount = 0;
-//                    help.queryWarnList();
-//                } else {
-//                    loadWarnCdCount++;
-//                }
+                // 心跳间隔
+                if (heartbeat >= 20) {
+                    heartbeat = 0;
+                    AsyncTask.execute(() -> {
+                        try {
+                            HttpTool.heartbeat();
+                        } catch (Exception e) {
+                            LogUtils.e(Log.getStackTraceString(e));
+                        }
+
+                    });
+                } else {
+                    heartbeat++;
+                }
+
                 defaultCd.start();
             }
         };

+ 1 - 1
app/src/main/java/xn/xxp/HomeActivityHelp.java

@@ -63,7 +63,7 @@ public class HomeActivityHelp {
         activity.addDisposable(ApiRepository.INSTANCE.getCardIsOpen(String.valueOf(activity.labConfig.getLabId()), s).subscribe(userVo -> {
             activity.dismissLoading();
             LabApp.userVo = userVo;
-            Tool.INSTANCE.openDoor();
+//            Tool.INSTANCE.openDoor();
         }, onError));
     }
 

+ 7 - 14
app/src/main/java/xn/xxp/app/LabApp.java

@@ -11,13 +11,11 @@ import com.blankj.utilcode.util.CrashUtils;
 import com.blankj.utilcode.util.FileUtils;
 import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.SPUtils;
 import com.blankj.utilcode.util.ThreadUtils;
-import com.blankj.utilcode.util.Utils;
 import com.bumptech.glide.Glide;
 import com.github.anrwatchdog.ANRWatchDog;
 import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
+import com.hikvision.dmb.util.InfoUtilApi;
 import com.hikvision.hatomplayer.HatomPlayerSDK;
 import com.kongzue.dialogx.DialogX;
 import com.tencent.smtt.export.external.TbsCoreSettings;
@@ -55,6 +53,10 @@ public class LabApp extends Application {
     @Override
     public void onCreate() {
         super.onCreate();
+        InfoUtilApi.getRoot();
+        // 卸载老旧app
+        Tool.INSTANCE.cmd("pm uninstall com.dlc.xn.eboard");
+
         HatomPlayerSDK.init(this, "", true);
         Tool.INSTANCE.openAdb();
         gson = GsonUtils.getGson().newBuilder().serializeNulls().registerTypeAdapter(String.class, new StringNullAdapter()).create();
@@ -132,17 +134,8 @@ public class LabApp extends Application {
         new ANRWatchDog().setIgnoreDebugger(false).setANRListener(anrError -> {
             LogUtils.e(anrError, anrError.getMessage());
             ThreadUtils.runOnUiThread(() -> {
-                Toast.makeText(ActivityUtils.getTopActivity(), "检测到应用卡顿,即将重启应用恢复!", Toast.LENGTH_LONG).show();
-                ThreadUtils.runOnUiThreadDelayed(() -> {
-                    int anrSize = SPUtils.getInstance().getInt("ANR_size", 0);
-                    if (anrSize > 5) {
-                        SPUtils.getInstance().put("ANR_size", 0);
-                        Tool.INSTANCE.reboot();
-                    } else {
-                        SPUtils.getInstance().put("ANR_size", ++anrSize);
-                        Tool.INSTANCE.reStartApp("ANR 重启应用");
-                    }
-                }, 3000);
+                Toast.makeText(ActivityUtils.getTopActivity(), "检测到应用卡顿,即将重启恢复!", Toast.LENGTH_LONG).show();
+                ThreadUtils.runOnUiThreadDelayed(Tool.INSTANCE::reboot, 3000);
             });
         }).setReportAllThreads().start();
     }

+ 11 - 6
app/src/main/java/xn/xxp/home/auth/ChoiceAuthActivity.java

@@ -1,8 +1,10 @@
 package xn.xxp.home.auth;
 
+import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
 
+import androidx.annotation.NonNull;
 import androidx.fragment.app.FragmentManager;
 
 import com.blankj.utilcode.util.ActivityUtils;
@@ -111,24 +113,27 @@ public class ChoiceAuthActivity extends BaseSignActivity<ActivityAuthChoiceBindi
     public void authSuccess(AuthType authType, UserVo user) {
         LabApp.userVo = user;
         if (accessVerify.equals(AccessVerify.NORMAL.getType())) {
-            ActivityUtils.startActivity(MainActivity.class);
+            Intent getIntent = new Intent(ChoiceAuthActivity.this, MainActivity.class);
+            getIntent.putExtra("authType", authType);
+            startActivity(getIntent);
+
             finish();
         } else if (accessVerify.equals(AccessVerify.SIGN_IN.getType())) {
-            dispatchSignIn();
+            dispatchSignIn(authType);
         } else if (accessVerify.equals(AccessVerify.SIGN_OUT.getType())) {
             dispatchSignOut();
         } else if (accessVerify.equals(AccessVerify.JUST_OPEN_DOOR.getType())) {
-            Tool.INSTANCE.openDoor();
+            Tool.INSTANCE.openDoor(LabApp.userVo.userId, authType);
             ActivityUtils.finishToActivity(HomeActivity.class, false);
         }
     }
 
     @Override
-    protected void onSignInFinish(boolean completed) {
-        super.onSignInFinish(completed);
+    protected void onSignInFinish(boolean completed, @NonNull AuthType authType) {
+        super.onSignInFinish(completed, authType);
         if (completed) {
+            Tool.INSTANCE.openDoor(LabApp.userVo.userId, authType);
             LabApp.userVo = null;
-            Tool.INSTANCE.openDoor();
         }
         finish();
     }

+ 4 - 2
app/src/main/java/xn/xxp/home/auth/OnAuthResultListener.kt

@@ -1,6 +1,7 @@
 package xn.xxp.home.auth
 
 import http.vo.response.UserVo
+import java.io.Serializable
 
 
 /**
@@ -17,10 +18,11 @@ interface OnAuthResultListener {
 
 }
 
-enum class AuthType(val type: Int, val desc: String) {
+enum class AuthType(val type: Int, val desc: String) : Serializable {
     CARD(1, "card"),
     FACE(2, "face"),
     FINGER(3, "finger"),
     PASSWORD(4, "password"),
-    QR(5, "qr")
+    QR(5, "qr"),
+    REMOTE(6, "remote")
 }

+ 9 - 7
app/src/main/java/xn/xxp/home/auth/fragment/LzFaceAuthFragment.java

@@ -141,13 +141,15 @@ public class LzFaceAuthFragment extends RcBaseFragment<FragmentAuthLzFaceBinding
         ThreadPoolUtil.getInstance().exe(new Runnable() {
             @Override
             public void run() {
-                int ret = FaceUtils.getInstance().startPreview(binding.faceSV);
-                if (ret != 0) {
-                    ToastUtils.showLong("打开相机失败,错误码 = " + ret);
-                } else {
-                    int operateRet = FaceUtils.getInstance().startFaceRecog();
-                    if (operateRet != 0) {
-                        ToastUtils.showLong("开启人脸识别失败,错误码 :" + operateRet);
+                if (!isDetached()) {
+                    int ret = FaceUtils.getInstance().startPreview(binding.faceSV);
+                    if (ret != 0) {
+                        ToastUtils.showLong("打开相机失败,错误码 = " + ret);
+                    } else {
+                        int operateRet = FaceUtils.getInstance().startFaceRecog();
+                        if (operateRet != 0) {
+                            ToastUtils.showLong("开启人脸识别失败,错误码 :" + operateRet);
+                        }
                     }
                 }
             }

+ 4 - 2
app/src/main/java/xn/xxp/home/sign/SafetyCheckFragment.kt

@@ -30,6 +30,7 @@ import org.greenrobot.eventbus.EventBus
 import xn.xxp.R
 import xn.xxp.app.LabApp
 import xn.xxp.databinding.FragmentSafetyCheckBinding
+import xn.xxp.home.auth.AuthType
 import xn.xxp.home.auth.SignType
 import xn.xxp.home.auth.fragment.CardAuthFragment
 import xn.xxp.mqtt.event.OnlineUserEvent
@@ -40,7 +41,8 @@ import xn.xxp.utils.AudioPlayer
 import xn.xxp.utils.Tool
 import java.io.File
 import java.text.SimpleDateFormat
-import java.util.*
+import java.util.Calendar
+import java.util.Locale
 import java.util.concurrent.TimeUnit
 
 /**
@@ -380,7 +382,7 @@ class SafetyCheckFragment :
                     ).apply {
                         setCancelable(false)
                         setOnDismissListener {
-                            Tool.INSTANCE.openDoor()
+                            Tool.INSTANCE.openDoor(LabApp.userVo.userId, AuthType.FACE)
                             requireActivity().finish()
                         }
                         show()

+ 9 - 12
app/src/main/java/xn/xxp/main/MainActivity.kt

@@ -9,9 +9,7 @@ import android.os.Bundle
 import android.os.Message
 import android.view.View
 import androidx.core.content.ContextCompat
-import androidx.recyclerview.widget.DividerItemDecoration
 import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
 import com.blankj.utilcode.util.ActivityUtils
 import com.blankj.utilcode.util.AppUtils
 import com.bumptech.glide.Glide
@@ -19,13 +17,11 @@ import com.bumptech.glide.load.DataSource
 import com.bumptech.glide.load.engine.GlideException
 import com.bumptech.glide.request.RequestListener
 import com.bumptech.glide.request.target.Target
-import xn.xxp.main.msds.InstructionActivity
 import com.kongzue.dialogx.dialogs.InputDialog
 import com.kongzue.dialogx.dialogs.MessageDialog
 import core.ui.activity.BaseSignActivity
 import core.ui.widget.SwipeAction
 import core.ui.widget.SwipeTouchListener
-import core.ui.widget.decoration.NoLastLineItemDecoration
 import core.util.FastClickDelegate
 import core.util.OnWeakListener
 import core.util.WeakHandler
@@ -44,13 +40,14 @@ import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import xn.xxp.R
 import xn.xxp.app.LabApp
-import xn.xxp.home.setting.SettingActivity
 import xn.xxp.databinding.ActivityMainBinding
+import xn.xxp.home.auth.AuthType
+import xn.xxp.home.setting.SettingActivity
 import xn.xxp.main.monitor.MonitorActivity
+import xn.xxp.main.msds.InstructionActivity
 import xn.xxp.main.person.LaboratoryPersonActivity
 import xn.xxp.main.risk.RiskListActivity
 import xn.xxp.main.rule.RuleActivity
-import xn.xxp.main.things.ThingsActivity
 import xn.xxp.main.things.ThingsListActivity
 import xn.xxp.mqtt.event.BannerEvent
 import xn.xxp.mqtt.event.BulletinBoardEvent
@@ -112,7 +109,7 @@ class MainActivity :
 
     private var mNoticeList: List<NoticeSummary>? = null
 
-//    private val mSerialPortHelper by lazy {
+    //    private val mSerialPortHelper by lazy {
 //        SerialPortHelper(this, object : OnSerialScanListener {
 //            override fun onServiceConnected() {
 //                RcLog.info("MainActivity# isRelationGuard=${LabApp.sLabConfig?.isRelationGuard}")
@@ -124,11 +121,11 @@ class MainActivity :
 //            }
 //        })
 //    }
-
+    private var authType: AuthType = AuthType.FACE
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 //        mSerialPortHelper.bindService()
-
+        authType = (intent.getSerializableExtra("authType") as AuthType?)!!
         // 实验室文化图 > 文化图
         val message = mBannerHandler.obtainMessage(WHAT_WORKBENCH)
         mBannerHandler.sendMessageDelayed(message, BANNER_TIME_WORKBENCH)
@@ -373,7 +370,7 @@ class MainActivity :
         })
         // 签到
         binding.signIn.setOnClickListener(FastClickDelegate {
-            dispatchSignIn()
+            dispatchSignIn(authType)
         })
         // 离开
         binding.leave.setOnClickListener(FastClickDelegate {
@@ -381,7 +378,7 @@ class MainActivity :
         })
         // 开门
         binding.openDoor.setOnClickListener(FastClickDelegate {
-            Tool.INSTANCE.openDoor()
+            Tool.INSTANCE.openDoor(LabApp.userVo.userId,authType)
         })
         // 返回
         binding.back.setOnClickListener(FastClickDelegate {
@@ -427,7 +424,7 @@ class MainActivity :
 
     lateinit var labConfig: LabConfig
     override fun initData() {
-        Tool.INSTANCE.openDoor()
+        Tool.INSTANCE.openDoor(LabApp.userVo.userId,authType)
         labConfig = RoomTool.getInstance().labConfigDao().labConfig
         val laboratoryVo = LabApp.laboratory
         if (null == laboratoryVo || null == labConfig) {

+ 8 - 3
app/src/main/java/xn/xxp/mqtt/MqttManager.kt

@@ -14,6 +14,7 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable
 import org.eclipse.paho.client.mqttv3.MqttMessage
 import org.greenrobot.eventbus.EventBus
 import org.json.JSONObject
+import xn.xxp.home.auth.AuthType
 import xn.xxp.mqtt.entity.BulletinBoardEntity
 import xn.xxp.mqtt.event.BulletinBoardEvent
 import xn.xxp.mqtt.event.LabInfoEvent
@@ -142,9 +143,13 @@ class MqttManager private constructor() {
                     val messageId: Long = jsonObject.getLong("messageId")
                     val deviceNo: String = jsonObject.getString("deviceNo")
                     if (deviceNo == deviceConfig.devId) {
-                        Tool.INSTANCE.openDoor()
-                        AsyncTask.execute { HttpTool.remoteUnlock(messageId) }
-                        ThreadUtils.runOnUiThread { ToastUtils.showLong("远程开锁!") }
+                        val status = Tool.INSTANCE.openDoor(null, null)
+                        if (2 != status) {
+                            LogUtils.d("开锁中")
+                        } else {
+                            AsyncTask.execute { HttpTool.remoteUnlock(messageId) }
+                            ThreadUtils.runOnUiThread { ToastUtils.showLong("远程开锁!") }
+                        }
                     }
                 }
 

+ 26 - 4
app/src/main/java/xn/xxp/utils/Tool.java

@@ -1,5 +1,8 @@
 package xn.xxp.utils;
 
+import android.os.AsyncTask;
+import android.text.TextUtils;
+
 import com.blankj.utilcode.util.AppUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ShellUtils;
@@ -13,6 +16,10 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import http.client.HttpTool;
+import xn.xxp.app.LabApp;
+import xn.xxp.home.auth.AuthType;
+
 public enum Tool {
     INSTANCE;
 
@@ -67,14 +74,28 @@ public enum Tool {
 
     private volatile boolean isLocking = false;
 
-    public void openDoor() {
+    /**
+     * @param openType 开门类型
+     * @return 0 开锁失败
+     * 1 开锁成功
+     * 2 开锁中不响应
+     */
+    public int openDoor(String userId, AuthType openType) {
+        int status = 2;
         if (isLocking) {
             ToastUtils.showLong("门已开");
-            return;
+            return status;
         }
-        isLocking = true;
         if (!DeviceUtils.getElectricLock(1)) {
-            DeviceUtils.setElectricLock(1, true);
+            isLocking = true;
+            if (0 == DeviceUtils.setElectricLock(1, true)) {
+                status = 1;
+            } else {
+                status = 0;
+            }
+            if (!TextUtils.isEmpty(userId) && null != openType) {
+                AsyncTask.execute(() -> HttpTool.updateRecord(userId, openType));
+            }
             ThreadUtils.executeByCachedWithDelay(new ThreadUtils.SimpleTask<Object>() {
                 @Override
                 public Object doInBackground() throws Throwable {
@@ -88,6 +109,7 @@ public enum Tool {
                 }
             }, 5, TimeUnit.SECONDS);
         }
+        return status;
     }
 
     public int dip2px(float dp) {