weimingfei
13 小时以前 8d459194e620a691994fb8226fb08c51a3dd8065
钥匙柜
已添加2个文件
已修改17个文件
785 ■■■■ 文件已修改
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/CheckGridStatusEvent.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlVM.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java 125 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CircularQueue.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/face/FaceSDKManager.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/face_activity.xml 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/main_activity.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/utils/ToastUtils.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/lib_coremodel/src/main/res/layout/toast_view.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/CheckGridStatusEvent.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
package com.doumee.keyCabinet.event;
//查询所有门状态
public class CheckGridStatusEvent {
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java
@@ -3,6 +3,7 @@
public class AlcoholTestAlarmParam {
    //会员id
    private Integer memberId;
    private String alcoholNum;
    public Integer getMemberId() {
        return memberId;
@@ -11,4 +12,12 @@
    public void setMemberId(Integer memberId) {
        this.memberId = memberId;
    }
    public String getAlcoholNum() {
        return alcoholNum;
    }
    public void setAlcoholNum(String alcoholNum) {
        this.alcoholNum = alcoholNum;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
@@ -9,9 +9,11 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.TextAppearanceSpan;
import android.view.View;
import android.view.ViewTreeObserver;
@@ -35,6 +37,7 @@
import com.doumee.lib_coremodel.bean.event.ActionEventData;
import com.doumee.lib_coremodel.util.SpUtil;
import com.doumee.lib_coremodel.util.StringUtil;
import com.doumee.lib_coremodel.view.ToastView;
import com.example.datalibrary.callback.CameraDataCallback;
import com.example.datalibrary.callback.FaceDetectCallBack;
import com.example.datalibrary.gatecamera.CameraPreviewManager;
@@ -137,6 +140,8 @@
                break;
            case 1:
                //取-管理员刷卡验证
                getDB().etEwm.setText("");
                getDB().etEwm.requestFocus();
                getDB().tvTitle.setText("管理员身份验证");
                getDB().clFace.setVisibility(View.GONE);
                getDB().clCard.setVisibility(View.VISIBLE);
@@ -162,6 +167,8 @@
                break;
            case 3:
                //取-司机刷卡验证
                getDB().etEwm.setText("");
                getDB().etEwm.requestFocus();
                getDB().tvTitle.setText("司机身份验证");
                getDB().clFace.setVisibility(View.GONE);
                getDB().clSjXuan.setVisibility(View.GONE);
@@ -183,14 +190,15 @@
                    //开始检测
                    EventBus.getDefault().post(new JiujinBeginEvent());
                }else {
                    ToastUtils.toast(this,"未获取到酒精浓度报警值");
                    ToastView.show(this,"未获取到酒精浓度报警值");
                    statusFsm(6);
                }
                break;
            case 6:
                //取-司机酒精检测失败
                Toast.makeText(mContext, "司机酒精检测失败", Toast.LENGTH_SHORT).show();
                //Toast.makeText(mContext, "司机酒精检测失败", Toast.LENGTH_SHORT).show();
                getDB().clJiu.setVisibility(View.GONE);
                getDB().tvJg1.setText("酒精检测异常,请重新检测");
                getDB().clTip1.setVisibility(View.VISIBLE);
                break;
            case 7:
@@ -202,10 +210,18 @@
                break;
            case 8:
                //还-司机刷卡验证
                getDB().etEwm.setText("");
                getDB().etEwm.requestFocus();
                getDB().tvTitle.setText("司机身份验证");
                getDB().clFace.setVisibility(View.GONE);
                getDB().clCard.setVisibility(View.VISIBLE);
                setFaceModel(2);
                break;
            case 9:
                //取-司机酒精检测失败
                getDB().clJiu.setVisibility(View.GONE);
                getDB().tvJg1.setText("酒精检测超标");
                getDB().clTip1.setVisibility(View.VISIBLE);
                break;
            default:
                break;
@@ -266,6 +282,21 @@
            case 5:
                statusFsm(4);
                break;
            case 6:
                //管理员ic卡成功
                statusFsm(5);
                break;
            case 7:
                //司机ic卡成功
                if(flag==0) {
                    //取
                    statusFsm(4);
                }else {
                    //还
                    startActivity(KeyCabinetActivity.class);
                    finish();
                }
                break;
            default:
                break;
        }
@@ -296,12 +327,39 @@
        //ic卡读取
        getDB().etEwm.requestFocus();
        getDB().etEwm.setShowSoftInputOnFocus(false);
        getDB().etEwm.setFocusable(true);
        getDB().etEwm.setShowSoftInputOnFocus(true);
        hideSoftKeyboard(getDB().etEwm);
        getDB().etEwm.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                hideSoftKeyboard(getDB().etEwm);
            }
        });
        getDB().etEwm.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }
            @Override
            public void afterTextChanged(Editable s) {
                String m = s.toString();
                if(TextUtils.isEmpty(m)){
                    return;
                }
                if(status!=1&&status!=3&&status!=8){
                    return;
                }
                if(handler.hasMessages(5)){
                    handler.removeMessages(5);
                }
                handler.sendEmptyMessageDelayed(5,500);
            }
        });
    }
@@ -428,7 +486,8 @@
                    //isCheckFace = false;
                    break;
                case 3:
                    Toast.makeText(mContext, "酒精检查返回", Toast.LENGTH_SHORT).show();
                    getDB().clJiujinProgress.setVisibility(View.GONE);
                    //Toast.makeText(mContext, "酒精检查返回", Toast.LENGTH_SHORT).show();
                    if(new BigDecimal(MApplication.getConfigBean().getCabinetConfigDataVO().getConcentration())
                            .compareTo(resultEvent.getConcentration())>=0){
                        //酒精通过
@@ -436,14 +495,26 @@
                        handler.sendEmptyMessageDelayed(4,1000);
                    }else {
                        //酒精不通过
                        getVM().alcoholTestAlarm("");
                        Toast.makeText(mContext, "酒精检测不通过", Toast.LENGTH_SHORT).show();
                        statusFsm(6);
                        getVM().alcoholTestAlarm(resultEvent.getConcentration().toString());
                        //Toast.makeText(mContext, "酒精检测超标", Toast.LENGTH_SHORT).show();
                        statusFsm(9);
                    }
                    break;
                case 4:
                    startActivity(KeyCabinetActivity.class);
                    finish();
                    break;
                case 5:
                    String m = getDB().etEwm.getText().toString();
                    int index = m.indexOf("\r");
                    if(index!=-1){
                        m = m.substring(0,index);
                    }
                    if(!TextUtils.isEmpty(m)){
                        getVM().getMemberIdByCode(m,status==1?"0":"1");
                    }
                    getDB().etEwm.setText("");
                    getDB().etEwm.requestFocus();
                    break;
                default:
                    break;
@@ -596,8 +667,10 @@
        if(!isFinishing()){
            //Toast.makeText(mContext, "酒精检测返回:"+e.isOk(), Toast.LENGTH_SHORT).show();
            if(!e.isOk()){
                getDB().clJiujinProgress.setVisibility(View.GONE);
                statusFsm(6);
            }else {
                getDB().clJiujinProgress.setVisibility(View.VISIBLE);
                if(resultEvent==null){
                    resultEvent = e;
                }else if(resultEvent.getConcentration().compareTo(e.getConcentration())<0){
@@ -611,4 +684,5 @@
            }
        }
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java
@@ -9,6 +9,7 @@
import com.doumee.keyCabinet.bean.CabinetFaceBean;
import com.doumee.keyCabinet.bean.FaceUserBean;
import com.doumee.keyCabinet.bean.KeyCabinetBean;
import com.doumee.keyCabinet.event.HttpEvent;
import com.doumee.keyCabinet.http.Apis;
import com.doumee.keyCabinet.http.param.AlcoholTestAlarmParam;
import com.doumee.keyCabinet.http.param.BaseResponse;
@@ -21,9 +22,14 @@
import com.doumee.lib_coremodel.base.BaseModel;
import com.doumee.lib_coremodel.base.DataViewModel;
import com.doumee.lib_coremodel.http.rxJava.SimpleObserver;
import com.doumee.lib_coremodel.http.utils.GsonTools;
import com.doumee.lib_coremodel.http.utils.RxUtils;
import com.doumee.lib_coremodel.util.StringUtil;
import org.greenrobot.eventbus.EventBus;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class FaceVM extends DataViewModel {
@@ -43,26 +49,28 @@
     * @param type //0:管理员,1:司机
     */
    public void getMemberIdByCode(String code,String type){
        showLoading(true);
        //showLoading(true);
        getRetrofitService(Apis.class).getMemberIdByCode(code)
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new SimpleObserver<BaseResponse<Integer>>(rxJavaGcManager) {
                    @Override
                    public void onNext(@NonNull BaseResponse<Integer> response) {
                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+
                                "获取IC卡用户主键 - å¸æœº:"+code+", è¿”回:"+ GsonTools.changeGsonToJson(response)));
                        if(200==response.getCode()){
                            //查询数据
                            if(response.getData()!=null){
                                if("0".equals(type)){
                                    MApplication.getLoginBean().setAutoMemberId(response.getData());
                                    //doAction();
                                    doAction(6);
                                }else {
                                    MApplication.getLoginBean().setMemberId(response.getData());
                                    MApplication.getLoginBean().setAuthType(1);
                                    //doAction();
                                    doAction(7);
                                }
                            }
                        }else {
                            toast(response.getMessage());
                            //toast(response.getMessage());
                        }
                    }
@@ -73,7 +81,7 @@
                    @Override
                    public void onComplete() {
                        hideLoading();
                        //hideLoading();
                    }
                });
    }
@@ -85,6 +93,7 @@
    public void alcoholTestAlarm(String data){
        AlcoholTestAlarmParam param = new AlcoholTestAlarmParam();
        param.setMemberId(MApplication.getLoginBean().getMemberId());
        param.setAlcoholNum(data);
        showLoading(true);
        getRetrofitService(Apis.class).alcoholTestAlarm(ParamsUtil.encodeRequestBody(param))
                .compose(RxUtils.schedulersTransformer())
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java
@@ -3,11 +3,25 @@
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import com.doumee.keyCabinet.MApplication;
import com.doumee.keyCabinet.R;
import com.doumee.keyCabinet.base.MyBaseActivity;
import com.doumee.keyCabinet.databinding.ChangeUrlActivityBinding;
import com.doumee.keyCabinet.http.Apis;
import com.doumee.keyCabinet.ui.main.MainActivity;
import com.doumee.keyCabinet.utils.LMobileInfo;
import com.doumee.keyCabinet.utils.i485.SportUtils;
import com.doumee.lib_coremodel.bean.event.ActionEventData;
import com.doumee.lib_coremodel.util.SpUtil;
import com.doumee.lib_coremodel.view.ToastView;
import com.example.datalibrary.utils.ToastUtils;
import dagger.hilt.android.AndroidEntryPoint;
@@ -24,11 +38,63 @@
        isAddCountTimer = false;
        normalConfig();
        getDB().setModel(getVM());
        getDB().etNo.setText(LMobileInfo.getDeviceUniqueId());
        getDB().etNo.setEnabled(false);
    }
    @Override
    public void initData(@Nullable Bundle savedInstanceState) {
        getDB().etUrl.setText(SpUtil.getString("base_url", Apis.HTTP));
        getDB().etTime.setText(SpUtil.getInt("loop_time",30)+"");
    }
    @Override
    protected void doRegister(int type, ActionEventData data) {
        switch (type){
            case 2:
                String url = getDB().etUrl.getText().toString();
                if(TextUtils.isEmpty(url)){
                    ToastView.show(MApplication.mContext,"接口地址不能为空");
                    return;
                }
                if(!url.startsWith("http://")||!url.startsWith("https://")||!url.endsWith("/")){
                    ToastView.show(MApplication.mContext,"接口地址错误");
                    return;
                }
                if(TextUtils.isEmpty(getDB().etTime.getText().toString())){
                    ToastView.show(MApplication.mContext,"接口调用间隔不能为空");
                    return;
                }
                int time = Integer.parseInt(getDB().etTime.getText().toString());
                if(time<=0){
                    ToastView.show(MApplication.mContext,"接口调用间隔错误");
                    return;
                }
                String oldUrl = SpUtil.getString("base_url", Apis.HTTP);
                SpUtil.saveString("base_url",url);
                SpUtil.saveInt("loop_time",time);
                ToastView.show(MApplication.mContext,"保存成功");
                if(!oldUrl.equals(url)){
                    //接口不同,重新启动
                    restartApp();
                }
                break;
        }
    }
    private void restartApp(){
        // åˆ›å»ºä¸€ä¸ªæ–°çš„启动意图
        Intent intent = new Intent(mContext, MainActivity.class);
        // è®¾ç½®FLAG_ACTIVITY_CLEAR_TASK标志位
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        // ä½¿ç”¨PendingIntent包装启动意图
        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
        // èŽ·å–AlarmManager实例
        AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        // åœ¨500毫秒后触发重启操作
        alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 10, pendingIntent);
        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(1);
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlVM.java
@@ -13,4 +13,9 @@
    public ChangeUrlVM(@NonNull Application application, BaseModel model) {
        super(application, model);
    }
    @Override
    protected void clickByTypeCommand(int type) {
        doAction(type);
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java
@@ -26,12 +26,15 @@
import com.doumee.keyCabinet.event.KeyResultEvent;
import com.doumee.keyCabinet.event.GetKeyStatusEvent;
import com.doumee.keyCabinet.event.OpenGridEvent;
import com.doumee.keyCabinet.event.OpenGridListEvent;
import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
import com.doumee.keyCabinet.ui.keyCabinet.adapter.CabinetRcvAdapter;
import com.doumee.keyCabinet.utils.i485.SportUtils;
import com.doumee.lib_coremodel.bean.event.ActionEventData;
import com.doumee.lib_coremodel.util.RecyclerHelp;
import com.doumee.lib_coremodel.util.StringUtil;
import com.doumee.lib_coremodel.view.ToastView;
import com.example.datalibrary.utils.ToastUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -106,7 +109,6 @@
        for(CabinetGridDo d:gridDos){
            oldMap.put(d.getGridKey(),d);
        }
        List<CabinetGridDo> addList = new ArrayList<>();
        List<CabinetGridDo> updateList = new ArrayList<>();
        for(KeyCabinetBean bean:beans){
            String key = SportUtils.intToHex(Integer.parseInt(bean.getBoardCode()))+SportUtils.intToHex(Integer.parseInt(bean.getChannelCode()));
@@ -122,23 +124,7 @@
                gridDo.setKeyStatus(bean.getKeyStatus());
                gridDo.setWorkingStatus(bean.getWorkingStatus());
                updateList.add(gridDo);
            }else {
                //新增
                CabinetGridDo gridDo = new CabinetGridDo();
                gridDo.setGridId(bean.getId());
                gridDo.setCabinetName(bean.getCode());
                gridDo.setGridKey(key);
                gridDo.setKeyCode(bean.getKeyCode());
                gridDo.setBindStatus(bean.getBindStatus());
                gridDo.setGridStatus(bean.getStatus());
                gridDo.setKeyStatus(bean.getKeyStatus());
                gridDo.setWorkingStatus(bean.getWorkingStatus());
                gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                addList.add(gridDo);
            }
        }
        if(addList.size()>0){
            DaoManager.getCabinetGridDao().insert(addList);
        }
        if(updateList.size()>0){
            CabinetGridDo[] upList = new CabinetGridDo[updateList.size()];
@@ -302,34 +288,6 @@
        }
    }
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void KeyResultEvent(KeyResultEvent e){
        if(!isFinishing()){
            //钥匙变更了
            if(selectBean!=null) {
                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                        + SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                //查询柜格
                CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
                if (gridDo != null) {
                    if(flag==0){
                        //取
                        if(TextUtils.isEmpty(gridDo.getCurKeyCode())){
                            //空了
                            doRegister(7,null);
                        }
                    }else {
                        //还
                        if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                            //有钥匙了
                            doRegister(7,null);
                        }
                    }
                }
            }
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
@@ -379,6 +337,8 @@
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()){
            //获取卡号
            EventBus.getDefault().post(new GetKeyStatusEvent());
            if(selectBean!=null){
                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                        +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
@@ -405,7 +365,7 @@
                                        getVM().closeGrid(gridDo);
                                    }else {
                                        //钥匙不匹配
                                        Toast.makeText(mContext, "操作10", Toast.LENGTH_LONG).show();
                                        //Toast.makeText(mContext, "操作10", Toast.LENGTH_LONG).show();
                                        doRegister(10,null);
                                        EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                    }
@@ -416,7 +376,7 @@
                                    getVM().closeGrid(gridDo);
                                }
                            }else {
                                Toast.makeText(mContext, "未查询到", Toast.LENGTH_LONG).show();
                                ToastView.show(MApplication.mContext, "未查询到规格信息");
                            }
                        } else {
                            //关门失败
@@ -452,7 +412,7 @@
                                    getVM().closeGrid(gridDo);
                                }
                            }else {
                                Toast.makeText(mContext, "未查询到", Toast.LENGTH_LONG).show();
                                ToastView.show(MApplication.mContext, "未查询到规格信息");
                            }
                        } else {
                            //关门失败
@@ -462,4 +422,83 @@
            }
        }
    }
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void KeyResultEvent(KeyResultEvent e){
        if(!isFinishing()){
            if(selectBean!=null){
                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                        +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                if(flag==0) {
                    //领取
                    //查询钥匙号
                    CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
                    if (gridDo != null) {
                        if (gridDo.getIsOpen() == 0) {
                            //关门成功
                            if (!TextUtils.isEmpty(gridDo.getCurKeyCode())) {
                                if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                    //领取失败
                                    isOpened = false;
                                    doRegister(6, null);
                                    getVM().closeGrid(gridDo);
                                }else {
                                    //钥匙不匹配
                                    //Toast.makeText(mContext, "操作10", Toast.LENGTH_LONG).show();
                                    doRegister(10,null);
                                    EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                }
                            } else {
                                //钥匙拿走了
                                isOpened = false;
                                doRegister(5, null);
                                getVM().closeGrid(gridDo);
                            }
                        }else {
                            //没关门
                            if(TextUtils.isEmpty(gridDo.getCurKeyCode())){
                                //空了
                                doRegister(7,null);
                            }
                        }
                    }else {
                        ToastView.show(MApplication.mContext, "未查询到规格信息");
                    }
                }else {
                    //归还
                    CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
                    if (gridDo != null) {
                        if (gridDo.getIsOpen() == 0) {
                            //关门成功
                            if (!TextUtils.isEmpty(gridDo.getCurKeyCode())) {
                                if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                    //相同归还成功
                                    isOpened = false;
                                    doRegister(8, null);
                                    getVM().closeGrid(gridDo);
                                }else {
                                    //钥匙不匹配
                                    doRegister(10,null);
                                    EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                }
                            } else {
                                //钥匙未归还
                                isOpened = false;
                                doRegister(9, null);
                                getVM().closeGrid(gridDo);
                            }
                        }else {
                            //没关门
                            if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                                //有钥匙了
                                doRegister(7,null);
                            }
                        }
                    } else {
                        ToastView.show(MApplication.mContext, "未查询到规格信息");
                    }
                }
            }
        }
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
@@ -20,18 +20,23 @@
import com.doumee.keyCabinet.dao.CabinetGridDo;
import com.doumee.keyCabinet.dao.DaoManager;
import com.doumee.keyCabinet.databinding.ManageCabinetActivityBinding;
import com.doumee.keyCabinet.event.CheckGridStatusEvent;
import com.doumee.keyCabinet.event.CloseGridOneResultEvent;
import com.doumee.keyCabinet.event.GetKeyStatusEvent;
import com.doumee.keyCabinet.event.HttpEvent;
import com.doumee.keyCabinet.event.KeyResultEvent;
import com.doumee.keyCabinet.event.ManageOpenGridResultEvent;
import com.doumee.keyCabinet.event.OpenAllGridEvent;
import com.doumee.keyCabinet.event.OpenGridEvent;
import com.doumee.keyCabinet.event.OpenGridListEvent;
import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
import com.doumee.keyCabinet.event.TimeClockEvent;
import com.doumee.keyCabinet.ui.keyCabinet.adapter.ManageCabinetRcvAdapter;
import com.doumee.keyCabinet.utils.i485.SportUtils;
import com.doumee.lib_coremodel.bean.event.ActionEventData;
import com.doumee.lib_coremodel.util.RecyclerHelp;
import com.doumee.lib_coremodel.util.StringUtil;
import com.example.datalibrary.db.DBManager;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -105,6 +110,7 @@
        for(ManageKeyCabinetBean d:datas){
            if(d.getIsSelected().get()){
                isCanPL = true;
                isCanBJ = true;
                if(keyStatus==-1){
                    keyStatus = getGridStatus(d);
                }else {
@@ -120,8 +126,7 @@
        }else {
            getDB().tvPlOpen.setBackgroundResource(R.drawable.shape_mb_bt_faile);
        }
        if(keyStatus==2||keyStatus==4){
            isCanBJ = true;
        if(isCanBJ){
            getDB().tvBj.setBackgroundResource(R.drawable.shape_mb_bt_ok);
        }else {
            getDB().tvBj.setBackgroundResource(R.drawable.shape_mb_bt_faile);
@@ -142,7 +147,6 @@
        for(CabinetGridDo d:gridDos){
            oldMap.put(d.getGridKey(),d);
        }
        List<CabinetGridDo> addList = new ArrayList<>();
        List<CabinetGridDo> updateList = new ArrayList<>();
        for(ManageKeyCabinetBean bean:beans){
            String key = SportUtils.intToHex(Integer.parseInt(bean.getBoardCode()))+SportUtils.intToHex(Integer.parseInt(bean.getChannelCode()));
@@ -158,29 +162,19 @@
                gridDo.setKeyStatus(bean.getKeyStatus());
                gridDo.setWorkingStatus(bean.getWorkingStatus());
                updateList.add(gridDo);
            }else {
                //新增
                CabinetGridDo gridDo = new CabinetGridDo();
                gridDo.setGridId(bean.getId());
                gridDo.setCabinetName(bean.getCode());
                gridDo.setGridKey(key);
                gridDo.setKeyCode(bean.getKeyCode());
                gridDo.setBindStatus(bean.getBindStatus());
                gridDo.setGridStatus(bean.getStatus());
                gridDo.setKeyStatus(bean.getKeyStatus());
                gridDo.setWorkingStatus(bean.getWorkingStatus());
                gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                addList.add(gridDo);
            }
        }
        if(addList.size()>0){
            DaoManager.getCabinetGridDao().insert(addList);
        }
        if(updateList.size()>0){
            CabinetGridDo[] upList = new CabinetGridDo[updateList.size()];
            for(int i=0;i<updateList.size();i++){
                upList[i] = updateList.get(i);
            }
            //todo åŽ»æŽ‰
            CabinetGridDo gridDo = oldMap.get("0101");
            if(gridDo!=null){
                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>更新数据当前钥匙2:"+gridDo.getCurKeyCode()));
            }
            DaoManager.getCabinetGridDao().update(upList);
        }
    }
@@ -240,6 +234,7 @@
                            SportUtils.intToHex(Integer.parseInt(bean.getChannelCode()));
                    waitOpenMap.put(key,bean.getCode());
                }
                waitResultCount = 2;
                EventBus.getDefault().post(new OpenAllGridEvent());
                }break;
            case 10: {
@@ -255,11 +250,12 @@
                        keys.add(key);
                    }
                }
                waitResultCount = keys.size();
                EventBus.getDefault().post(new OpenGridListEvent(keys));
                }break;
            case 4: {
                //标记
                if(!isCanPL){
                if(!isCanBJ){
                    return;
                }
                bjIds.clear();
@@ -285,7 +281,12 @@
                    getDB().tvBjgz.setText("标记为故障");
                    getDB().tvBjgz.setTextColor(0xffFF3600);
                    getDB().tvBjgz.setBackgroundResource(R.drawable.shape_mb_cz_1_bg);
                    if(keyStatus==2) {
                        //0未绑定 1在位 2借出 3维修保养
                    getDB().tvBy.setVisibility(View.VISIBLE);
                    }else {
                        getDB().tvBy.setVisibility(View.GONE);
                    }
                }
                getDB().clCz.setVisibility(View.VISIBLE);
                }break;
@@ -336,7 +337,6 @@
            if(tipDownCount==0){
                isShowTip = false;
                getDB().clTip.setVisibility(View.GONE);
                finish();
            }else {
                tipDownCount--;
                getDB().tvDjs.setText(tipDownCount+"s");
@@ -404,10 +404,10 @@
        return styledText;
    }
    private void showKeyErrTip(CabinetGridDo gridDo){
    private void showKeyErrTip(String name){
        getDB().imgClKm1.setImageResource(R.mipmap.ic_jjfail);
        getDB().tvClKm1.setText("识别失败");
        getDB().tvClKm2.setText(getTipText2("钥匙柜",gridDo.getCabinetName(),"识别失败"), TextView.BufferType.SPANNABLE);
        getDB().tvClKm2.setText(getTipText2("钥匙柜",name,"识别失败"), TextView.BufferType.SPANNABLE);
        getDB().tvClKmClose.setText("重新存放");
        getDB().tvClKmClose.setTextColor(0xffffffff);
        getDB().tvClKmClose.setBackgroundResource(R.drawable.shape_mb_bt_ok);
@@ -425,6 +425,7 @@
        return super.onKeyDown(keyCode, event);
    }
    private int waitResultCount = 0;
    /**
     * å¼€é—¨è¿”回
     * @param e
@@ -432,6 +433,13 @@
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void ManageOpenGridResultEvent(ManageOpenGridResultEvent e){
        if(!isFinishing()){
            if(waitResultCount>0){
                waitResultCount--;
            }
            if(waitResultCount>0){
                return;
            }
            EventBus.getDefault().post(new CheckGridStatusEvent());
            //校验是否已全开
            List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
            List<String> msgList = new ArrayList<>();
@@ -518,6 +526,22 @@
        }
    }
    private String sygKey;
    @Subscribe
    public void OpenGridOneResultEvent(OpenGridOneResultEvent e){
        if(!isFinishing()){
            if(e.getIsOpen()==0){
                if(e.getKey().equals(sygKey)){
                    return;
                }
                sygKey = e.getKey();
                //开门失败,重新开门
                EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                        Integer.parseInt(e.getKey().substring(0,2), 16)+""));
            }
        }
    }
    /**
     * å…³é—¨
     * @param e
@@ -525,14 +549,19 @@
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()){
            //获取卡号
            EventBus.getDefault().post(new GetKeyStatusEvent());
            if(isShowTip){
                isShowTip = false;
                getDB().clTip.setVisibility(View.GONE);
            }
            //校验卡号
            CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(e.getKey());
            if(gridDo!=null){
                //校验钥匙是否匹配
                if(gridDo.getGridKey()==null){
                if(TextUtils.isEmpty(gridDo.getGridKey())){
                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                        //未绑定的存放了钥匙
                        showKeyErrTip(gridDo);
                        showKeyErrTip(gridDo.getCabinetName()+"-"+gridDo.getCurKeyCode());
                        //开门
                        EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                                Integer.parseInt(e.getKey().substring(0,2), 16)+""));
@@ -542,7 +571,8 @@
                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                        if(!gridDo.getCurKeyCode().equals(gridDo.getKeyCode())){
                            //钥匙不匹配
                            showKeyErrTip(gridDo);
                            showKeyErrTip(gridDo.getCabinetName()+"-"+gridDo.getCurKeyCode());
                            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"钥匙不匹配==>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                            //开门
                            EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                                    Integer.parseInt(e.getKey().substring(0,2), 16)+""));
@@ -550,8 +580,49 @@
                        }
                    }
                }
                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"门关闭成功==>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                getVM().closeGrid(gridDo);
            }
        }
    }
    @Subscribe
    public void KeyResultEvent(KeyResultEvent e){
        if(!isFinishing()){
            //校验卡号不对的,直接弹出
            List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
            List<String> keys = new ArrayList<>();
            StringBuilder sb = new StringBuilder();
            for(CabinetGridDo gridDo:gridDos){
                if(TextUtils.isEmpty(gridDo.getGridKey())){
                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())&&gridDo.getIsOpen()==0){
                        //未绑定的存放了钥匙
                        keys.add(gridDo.getGridKey());
                        if(sb.length()>0){
                            sb.append("、");
                        }
                        sb.append(gridDo.getCabinetName());
                    }
                }else {
                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                        if(!gridDo.getCurKeyCode().equals(gridDo.getKeyCode())&&gridDo.getIsOpen()==0){
                            //钥匙不匹配
                            keys.add(gridDo.getGridKey());
                            if(sb.length()>0){
                                sb.append("、");
                            }
                            sb.append(gridDo.getCabinetName());
                        }
                    }
                }
            }
            if(sb.length()>0){
                showKeyErrTip(sb.toString());
            }
            if(keys.size()>0){
                //开门
                EventBus.getDefault().post(new OpenGridListEvent(keys));
            }
        }
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -49,6 +49,7 @@
import com.doumee.keyCabinet.databinding.MainActivityBinding;
import com.doumee.keyCabinet.event.CLGridEvent;
import com.doumee.keyCabinet.event.CLKeyEvent;
import com.doumee.keyCabinet.event.CheckGridStatusEvent;
import com.doumee.keyCabinet.event.CloseGridOneResultEvent;
import com.doumee.keyCabinet.event.GetFacesEvent;
import com.doumee.keyCabinet.event.GetKeyStatusEvent;
@@ -76,6 +77,7 @@
import com.doumee.keyCabinet.ui.face.UserManagerActivity;
import com.doumee.keyCabinet.ui.view.BannerViewImageHolder;
import com.doumee.keyCabinet.utils.BraceletLogUtils;
import com.doumee.keyCabinet.utils.CircularQueue;
import com.doumee.keyCabinet.utils.CrashHandler;
import com.doumee.keyCabinet.utils.LMobileInfo;
import com.doumee.keyCabinet.utils.TimeUtils;
@@ -99,11 +101,13 @@
import com.doumee.lib_coremodel.http.utils.GsonTools;
import com.doumee.lib_coremodel.util.SpUtil;
import com.doumee.lib_coremodel.util.StringUtil;
import com.doumee.lib_coremodel.view.ToastView;
import com.example.datalibrary.api.FaceApi;
import com.example.datalibrary.listener.DBLoadListener;
import com.example.datalibrary.listener.SdkInitListener;
import com.example.datalibrary.model.ImportFeatureResult;
import com.example.datalibrary.model.User;
import com.example.datalibrary.utils.ToastUtils;
import com.example.datalibrary.view.PreviewTexture;
import com.yanzhenjie.permission.runtime.Permission;
@@ -277,7 +281,6 @@
        getDB().tvId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(ManageLoginActivity.class);
                //更改url
                if(lastDownTime2!=null){
                    if(System.currentTimeMillis()-lastDownTime2>1000){
@@ -469,7 +472,9 @@
        }else {
            getDB().banner.stopTurning();
        }
        unCloseGrid();
        //检查所有柜格门、钥匙状态
        checkKeyStatus(0);
        checkGridStatus(900);
    }
    private void unCloseGrid(){
@@ -951,10 +956,7 @@
    }
    private void initRGBCheck(){
        String index = SpUtil.getString("rbgCameraId");
        if(!"1".equals(index)){
            index = "0";
        }
        String index = SpUtil.getString("rbgCameraId","0");
        setRgbCameraId(Integer.parseInt(index));
        /*if (isSetCameraId()){
            setRgbCameraId(SingleBaseConfig.getBaseConfig().getRBGCameraId());
@@ -1078,9 +1080,11 @@
    }
    private int tipDownCount = 10;
    private int loopDownCount = 30;
    private boolean isShowTip;
    @Subscribe
    public void TimeClockEvent(TimeClockEvent e){
        if(!isFinishing()) {
        if(isShowTip){
            if(tipDownCount==0){
                isShowTip = false;
@@ -1088,6 +1092,14 @@
            }else {
                tipDownCount--;
                getDB().tvDjs.setText(tipDownCount+"s");
                }
            }
            if(loopDownCount==0){
                loopDownCount = SpUtil.getInt("loop_time",30);
                //定时拉取基本信息
                getVM().devLogin();
            }else {
                loopDownCount--;
            }
        }
    }
@@ -1179,7 +1191,7 @@
                            !TextUtils.isEmpty(gridDo.getKeyCode())&&
                            !gridDo.getCurKeyCode().equals(gridDo.getKeyCode())){
                        //钥匙不一样,开门
                        Toast.makeText(mContext, "钥匙存放位置错误", Toast.LENGTH_SHORT).show();
                        ToastView.show(MApplication.mContext,gridDo.getCabinetName()+"钥匙存放位置错误");
                        EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                                Integer.parseInt(e.getKey().substring(0,2), 16)+""));
                    }else {
@@ -1252,23 +1264,33 @@
                    });*/
                    String key = bh+tdh;
                    CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
                    if(gridDo==null){
                        //新增
                        gridDo = new CabinetGridDo();
                        gridDo.setIsOpen("00".equals(open)?1:0);
                        gridDo.setGridKey(key);
                        gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                        DaoManager.getCabinetGridDao().insert(gridDo);
                    }else {
                    if(gridDo!=null){
                        gridDo.setIsOpen("00".equals(open)?1:0);
                        gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                        //todo åŽ»æŽ‰
                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>更新数据当前钥匙3:"+gridDo.getCurKeyCode()));
                        DaoManager.getCabinetGridDao().update(gridDo);
                        EventBus.getDefault().post(new ManageOpenGridResultEvent());
                        if(gridDo.getIsOpen()==0) {
                            //开门失败
                            if (isShowing) {
                                //首页开门失败,钥匙不对
                                if (!TextUtils.isEmpty(gridDo.getCurKeyCode()) &&
                                        !TextUtils.isEmpty(gridDo.getKeyCode()) &&
                                        !gridDo.getCurKeyCode().equals(gridDo.getKeyCode())) {
                                    //钥匙不一样,开门
                                    ToastView.show(MApplication.mContext, gridDo.getCabinetName() + "钥匙存放位置错误");
                                    EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(gridDo.getGridKey().substring(2, 4), 16) + "",
                                            Integer.parseInt(gridDo.getGridKey().substring(0, 2), 16) + ""));
                                }
                            }
                        }else {
                            //开门成功
                        }
                    }
                    //开门返回
                    EventBus.getDefault().post(new OpenGridOneResultEvent(key,gridDo.getIsOpen()));
                    if(!portHandler.hasMessages(1)){
                        EventBus.getDefault().post(new ManageOpenGridResultEvent());
                    }
                    EventBus.getDefault().post(new OpenGridOneResultEvent(key,"00".equals(open)?1:0));
                }else if(data.length()==16){
                    //批量
                    //8A 02 00 00 00 00 11 99
@@ -1281,12 +1303,7 @@
                    for(CabinetGridDo d:gridDos){
                        oldMap.put(d.getGridKey(),d);
                    }
                    List<CabinetGridDo> addList = new ArrayList<>();
                    List<CabinetGridDo> updateList = new ArrayList<>();
                    String finalDm = dm;
                    /*runOnUiThread(() -> {
                        getVM().addInfo("批量查询返回:" +bh+","+ finalDm+",总数据:"+oldMap.size());
                    });*/
                    try {
                        for(int i=1;i<=dm.length();i++){
                            String key = bh+SportUtils.intToHex(i);
@@ -1295,22 +1312,19 @@
                                gridDo.setIsOpen("1".equals(dm.substring(i-1,i))?0:1);
                                gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                                updateList.add(gridDo);
                            }/*else {
                                getVM().addInfo("新增key:" +key);
                                CabinetGridDo gridDo = new CabinetGridDo();
                                gridDo.setGridKey(key);
                                gridDo.setIsOpen("1".equals(dm.substring(i-1,i))?0:1);
                                gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                                addList.add(gridDo);
                            }*/
                            }
                        }
                        runOnUiThread(() -> {
                            getVM().addInfo("批量开门更新库数据:版号:" +bh+","+ addList.size()+","+updateList.size());
                            getVM().addInfo("批量开门更新库数据:版号:" +bh+","+updateList.size());
                        });
                        getVM().updateGrids(updateList);
                        if(!portHandler.hasMessages(1)){
                            EventBus.getDefault().post(new ManageOpenGridResultEvent());
                        //todo åŽ»æŽ‰
                        CabinetGridDo gridDo = oldMap.get("0101");
                        if(gridDo!=null) {
                            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>更新数据当前钥匙6:" + gridDo.getCurKeyCode()));
                        }
                        getVM().updateGrids(updateList);
                        EventBus.getDefault().post(new ManageOpenGridResultEvent());
                    }catch (Exception exception){
                        runOnUiThread(() -> {
                            getVM().addInfo("批量开门报错:" +exception.getMessage());
@@ -1324,20 +1338,16 @@
                String open = data.substring(6,8);
                String key = bh+tdh;
                CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
                if(gridDo==null){
                    //新增
                    gridDo = new CabinetGridDo();
                    gridDo.setIsOpen("00".equals(open)?1:0);
                    gridDo.setGridKey(key);
                    gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                    DaoManager.getCabinetGridDao().insert(gridDo);
                }else {
                if(gridDo!=null){
                    gridDo.setIsOpen("00".equals(open)?1:0);
                    gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                    //todo åŽ»æŽ‰
                    EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>更新数据当前钥匙3:"+gridDo.getCurKeyCode()));
                    DaoManager.getCabinetGridDao().update(gridDo);
                }
                //关门返回
                EventBus.getDefault().post(new CloseGridOneResultEvent(key,gridDo.getIsOpen()));
                EventBus.getDefault().post(new CloseGridOneResultEvent(key,"00".equals(open)?1:0));
                if(isShowing&&isShowTip){
                    //修改显示提醒
                    doRegister(5,null);
@@ -1383,7 +1393,17 @@
                        runOnUiThread(() -> {
                            getVM().addInfo("更新库数据:版号:" +bh+","+ addList.size()+","+updateList.size());
                        });
                        //todo åŽ»æŽ‰
                        CabinetGridDo gridDo = oldMap.get("0101");
                        if(gridDo!=null){
                            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+
                                    "=================>更新数据当前钥匙5:"+gridDo.getCurKeyCode()));
                        }
                        getVM().updateGrids(updateList);
                        if(isShowing){
                            unCloseGrid();
                        }
                    }catch (Exception exception){
                        runOnUiThread(() -> {
                            getVM().addInfo("报错:" +exception.getMessage());
@@ -1440,7 +1460,15 @@
                    String data2 = keyPreviousData+data;
                    runOnUiThread(() -> {
                        getVM().addInfo("获取到钥匙数据:" + data2);
                        if(data2.contains("CC01")&&data2.contains("CC02")){
                            String[] sp = data2.split("CC02");
                            if(sp.length==2){
                                jxKey(sp[0]);
                                jxKey("CC02"+sp[1]);
                            }
                        }else {
                        jxKey(data2);
                        }
                    });
                    keyPreviousData = null;
                }
@@ -1483,11 +1511,22 @@
                    }else {
                        gridDo.setCurKeyCode("");
                    }
                    if("0101".equals(key)) {
                        getVM().addInfo(key+" , "+isHaveKey+"  "+keyCode);
                        getVM().addInfo(key + "设置钥匙:" + gridDo.getCurKeyCode());
                    }
                    gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                    updateList.add(gridDo);
                }
            }
        }
        //todo åŽ»æŽ‰
        CabinetGridDo gridDo = oldMap.get("0101");
        if(gridDo!=null) {
            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+
                    "=================>更新数据当前钥匙7:" + gridDo.getCurKeyCode()));
        }
        getVM().updateGrids(updateList);
        EventBus.getDefault().post(new KeyResultEvent());
    }
@@ -1513,11 +1552,11 @@
            }
            try {
                runOnUiThread(() -> {
                    getVM().addInfo("获取到酒精检测数据:"+StringUtil.DateToStrSS(new Date())+" " + new String(bytes));
                    //getVM().addInfo("获取到酒精检测数据:"+StringUtil.DateToStrSS(new Date())+" " + new String(bytes));
                });
                String data = new String(bytes);
                runOnUiThread(() -> {
                    getVM().addInfo("获取到酒精检测是否检测失败:" + (data.contains("blow fail")));
                    //getVM().addInfo("获取到酒精检测是否检测失败:" + (data.contains("blow fail")));
                });
                if(data.contains("blow fail")){
                    //检测失败
@@ -1633,6 +1672,13 @@
        }
    };
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void CheckGridStatusEvent(CheckGridStatusEvent e){
        if(!isFinishing()){
            checkGridStatus(0);
        }
    }
    //检查所有门状态
    private void checkGridStatus(long time){
        sendPortHandlerMsg(1,"80010033B2",time+100);
@@ -1666,20 +1712,24 @@
        portHandler.sendMessageDelayed(mc,time);
    }
    private boolean isInitPort;
    //初始化串口
    private void initPort(){
        SpUtil.setString("port_grid","/dev/ttyS7");
        SpUtil.setString("port_key","/dev/ttyS1");
        SpUtil.setString("port_jiu","/dev/ttyS2");
        gridPath = SpUtil.getString("port_grid");
        getVM().addInfo("门串口链接:"+gridPath);
        //getVM().addInfo("门串口链接:"+gridPath);
        keyPath = SpUtil.getString("port_key");
        getVM().addInfo("钥匙串口链接:"+keyPath);
        //getVM().addInfo("钥匙串口链接:"+keyPath);
        jiuPath = SpUtil.getString("port_jiu");
        getVM().addInfo("酒精串口链接:"+jiuPath);
        //getVM().addInfo("酒精串口链接:"+jiuPath);
        if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))&&
                !TextUtils.isEmpty(SpUtil.getString("port_key"))&&
                !TextUtils.isEmpty(SpUtil.getString("port_jiu"))){
            if(isInitPort){
                return;
            }
            xhCount=0;
            closePort(chosePort);
            if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))){
@@ -1690,6 +1740,7 @@
                        ,1 , 0,gridReadObserver);
                boolean isSucc = gridPort.open();
                if(isSucc) {
                    isInitPort = true;
                    getVM().addInfo("门串口链接成功:"+path);
                    String msg = isSucc ? "成功" : "失败";
                    //getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
@@ -1707,6 +1758,7 @@
                        ,1 , 0,keyReadObserver);
                boolean isSucc = keyPort.open();
                if(isSucc) {
                    isInitPort = true;
                    getVM().addInfo("钥匙串口链接成功:"+path);
                    String msg = isSucc ? "成功" : "失败";
                    //getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
@@ -1723,6 +1775,7 @@
                        ,1 , 0,jiuReadObserver);
                boolean isSucc = jiuPort.open();
                if(isSucc) {
                    isInitPort = true;
                    getVM().addInfo("酒精串口链接成功:"+path);
                    String msg = isSucc ? "成功" : "失败";
                    //getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
@@ -1809,15 +1862,23 @@
        portHandler.sendEmptyMessageDelayed(0,0);
    }
    private CircularQueue openGridQueue = new CircularQueue();
    private void send485(int type,String code){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //todo åŽ»æŽ‰
                if(type==2){
                    return;
                }
                getVM().addInfo("发送指令:"+StringUtil.DateToStrSS(new Date())+"==>"+code);
            }
        });
        if(type==0){
            if(gridPort!=null){
                if(code.startsWith("8A")){
                    openGridQueue.enqueue(code);
                }
                byte[] sendByte = SportUtils.hexToByteArray(code);
                gridPort.write(sendByte);
            }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java
@@ -128,6 +128,7 @@
                gridDo.setKeyStatus(bean.getKeyStatus());
                gridDo.setWorkingStatus(bean.getWorkingStatus());
                updateList.add(gridDo);
                oldMap.remove(key);
            }else {
                //新增
                CabinetGridDo gridDo = new CabinetGridDo();
@@ -143,9 +144,26 @@
                addList.add(gridDo);
            }
        }
        if(oldMap.size()>0) {
            CabinetGridDo[] dels = new CabinetGridDo[oldMap.size()];
            int i=0;
            for (String key : oldMap.keySet()) {
                dels[i] = oldMap.get(key);
                i++;
            }
            //删除多的
            DaoManager.getCabinetGridDao().delete(dels);
        }
        if(addList.size()>0){
            DaoManager.getCabinetGridDao().insert(addList);
        }
        //todo åŽ»æŽ‰
        CabinetGridDo gridDo = oldMap.get("0101");
        if(gridDo!=null){
            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>更新数据当前钥匙1:"+gridDo.getCurKeyCode()));
        }
        if(updateList.size()>0){
            CabinetGridDo[] upList = new CabinetGridDo[updateList.size()];
            for(int i=0;i<updateList.size();i++){
@@ -262,13 +280,6 @@
        return DaoManager.getCabinetGridDao().getOpenGrids();
    }
    public void insertGrids(List<CabinetGridDo> addList){
        if(addList.size()>0){
            DaoManager.getCabinetGridDao().insert(addList);
        }
        addInfo("更新库数据:新增" + addList.size());
    }
    public void updateGrids(List<CabinetGridDo> updateList){
        if(updateList.size()>0){
            CabinetGridDo[] upList = new CabinetGridDo[updateList.size()];
@@ -340,7 +351,7 @@
    public void addInfo(String info){
        String s = infoObs.get();
        s+=info+"\n";
        s=info+"\n"+s;
        infoObs.set(s);
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CircularQueue.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.doumee.keyCabinet.utils;
import java.util.ArrayList;
import java.util.List;
// é¡ºåºé˜Ÿåˆ—示例(循环队列,先进后出)
public class CircularQueue {
    List<String> list = new ArrayList<>(10);
    public void enqueue(String element){
        if(list.size()==10){
            list.remove(0);
        }
        list.add(element);
    }
    public String dequeue(){
        //从最后取
        if(list.size()==0){
            return null;
        }
        String element = list.get(list.size()-1);
        list.remove(list.size()-1);
        return element;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/face/FaceSDKManager.java
@@ -8,6 +8,7 @@
import com.baidu.idl.main.facesdk.license.BDFaceLicenseAuthInfo;
import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
import com.baidu.idl.main.facesdk.utils.PreferencesUtil;
import com.doumee.lib_coremodel.view.ToastView;
import com.example.datalibrary.listener.SdkInitListener;
import com.example.datalibrary.utils.ToastUtils;
@@ -59,7 +60,7 @@
        // å¦‚æžœlicenseKey ä¸å­˜åœ¨æç¤ºæŽˆæƒç ä¸ºç©ºï¼Œå¹¶è·³è½¬æŽˆæƒé¡µé¢æŽˆæƒ
        if (TextUtils.isEmpty(licenseOfflineKey) && TextUtils.isEmpty(licenseOnlineKey)
                && TextUtils.isEmpty(licenseBatchlineKey)) {
            ToastUtils.toast(context, "未授权设备,请完成授权激活");
            ToastView.show(context, "未授权设备,请完成授权激活");
            if (listener != null) {
                listener.initLicenseFail(-1, "授权码不存在,请重新输入!");
            }
keyCabinet-android/app/src/main/res/layout/face_activity.xml
@@ -482,7 +482,20 @@
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:background="@color/white"
            android:visibility="gone">
            android:visibility="visible">
            <EditText
                android:id="@+id/et_ewm"
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:text=""
                android:inputType="number"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                android:background="@null"
                android:layout_marginTop="20dp"
                />
            <View
                android:id="@+id/v_c_sl"
@@ -685,17 +698,43 @@
        </androidx.constraintlayout.widget.ConstraintLayout>
        <EditText
            android:id="@+id/et_ewm"
            android:layout_width="100dp"
        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/cl_jiujin_progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:background="@drawable/shape_jiujin_ok"
            android:paddingLeft="80dp"
            android:paddingRight="80dp"
            android:paddingTop="50dp"
            android:paddingBottom="50dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:background="@null"
            />
            android:visibility="gone">
            <pl.droidsonroids.gif.GifImageView
                android:id="@+id/img_progress"
                android:layout_width="150dp"
                android:layout_height="150dp"
                android:src="@mipmap/zhuanquan"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                android:layout_marginBottom="30dp"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="检测中"
                android:textColor="#ffffffff"
                android:textSize="33sp"
                app:layout_constraintTop_toBottomOf="@+id/img_progress"
                android:layout_marginTop="10dp"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"/>
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
keyCabinet-android/app/src/main/res/layout/main_activity.xml
@@ -365,7 +365,7 @@
        <androidx.core.widget.NestedScrollView
            android:id="@+id/nsv"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_height="700dp"
            app:layout_constraintTop_toTopOf="parent"
            android:background="@color/white"
            android:visibility="gone">
@@ -384,6 +384,12 @@
                </TextView>
            </androidx.constraintlayout.widget.ConstraintLayout>
        </androidx.core.widget.NestedScrollView>
                <TextView
                    android:id="@+id/tv11"
                    android:layout_width="wrap_content"
@@ -392,14 +398,11 @@
                    android:textColor="#ff279baa"
                    android:textSize="20sp"
                    android:textStyle="bold"
                    app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:commandType="@{55}"
                    app:onClickCommand="@{model.myTypeCommand}"/>
            </androidx.constraintlayout.widget.ConstraintLayout>
        </androidx.core.widget.NestedScrollView>
        <ImageView
            android:id="@+id/img"
keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml
@@ -37,6 +37,18 @@
            android:layout_marginLeft="15dp"
            android:layout_marginTop="10dp"
            android:paddingBottom="9dp"/>
        <TextView
            android:id="@+id/tv3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{data.keyCode}"
            android:textColor="#ff279baa"
            android:textSize="14sp"
            app:layout_constraintTop_toBottomOf="@+id/tv2"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="15dp"
            android:layout_marginTop="10dp"
            android:paddingBottom="9dp"/>
        <ImageView
            android:layout_width="45dp"
keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml
@@ -32,7 +32,7 @@
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="30s"
            android:textColor="#ff279baa"
            android:textColor="@color/white"
            android:textSize="24sp"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="33dp"
@@ -88,7 +88,7 @@
                android:layout_width="0dp"
                android:layout_height="75dp"
                android:background="@null"
                android:text="15055153182"
                android:text="18656077929"
                android:textColor="#111111"
                android:hint="请输入登录账号"
                android:textColorHint="#999999"
@@ -138,7 +138,7 @@
                android:layout_width="0dp"
                android:layout_height="75dp"
                android:background="@null"
                android:text="123456a"
                android:text="Whyc2025"
                android:hint="请输入账号密码"
                android:textColorHint="#999999"
                android:textSize="24sp"
@@ -186,7 +186,7 @@
            android:id="@+id/tv_no"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="NO:28228293837"
            android:text="NO:"
            android:textColor="#b3ffffff"
            android:textSize="18sp"
            app:layout_constraintBottom_toBottomOf="parent"
keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java
@@ -1,6 +1,9 @@
package com.doumee.ticketmachine;
import com.doumee.keyCabinet.MApplication;
import com.doumee.keyCabinet.utils.CircularQueue;
import com.doumee.keyCabinet.utils.i485.SportUtils;
import com.example.datalibrary.utils.ToastUtils;
import org.junit.Test;
@@ -12,12 +15,14 @@
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() {
        String s = "Result:12.00mg/100ml";
        Pattern pattern = Pattern.compile("([0-9]+\\.[0-9]+)");
        Matcher matcher = pattern.matcher(s);
        if (matcher.find()) {
            System.out.println(matcher.group(1)); // è¾“出: 12.00
        CircularQueue queue = new CircularQueue();
        for(int i=0;i<3;i++){
            queue.enqueue(i+"");
        }
        System.out.println(queue.dequeue());
        System.out.println(queue.dequeue());
        System.out.println(queue.dequeue());
        System.out.println(queue.dequeue());
    }
keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/utils/ToastUtils.java
@@ -13,7 +13,7 @@
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
                Toast.makeText(context, text, Toast.LENGTH_LONG).show();
            }
        });
    }
@@ -22,7 +22,7 @@
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, resId, Toast.LENGTH_SHORT).show();
                Toast.makeText(context, resId, Toast.LENGTH_LONG).show();
            }
        });
    }
keyCabinet-android/lib_coremodel/src/main/res/layout/toast_view.xml
@@ -3,7 +3,9 @@
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent">
    android:layout_height="match_parent"
    android:focusable="false"
    android:focusableInTouchMode="false">
    <TextView
        android:layout_width="wrap_content"