weimingfei
2 天以前 81e258e6aa59dafce998b4f41b1271a9f5c9aff5
钥匙柜
已添加1个文件
已修改26个文件
767 ■■■■ 文件已修改
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/FaceUserBean.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenErrEvent.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenGridEvent.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/GetMemberIdByCodeParam.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/AddFaceVM.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/adapter/FaceUserAdapter.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java 341 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateUtil.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/face_activity.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/layout_download.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/ui_update_dialog.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/values/strings.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/base/BaseViewModel.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/bean/event/ActionEventData.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/lib_coremodel/src/main/res/values/colors.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/FaceUserBean.java
@@ -8,7 +8,7 @@
    private Integer memberId;
    private String memberName;
    //0:管理员,1:用户
    //0:管理员,1:司机
    private String groupId;
    private boolean checked;
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenErrEvent.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.doumee.keyCabinet.event;
public class OpenErrEvent {
    private String key;
    public OpenErrEvent(String key) {
        this.key = key;
    }
    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenGridEvent.java
@@ -5,12 +5,25 @@
    private String channelCode;
    //板号
    private String boardCode;
    private String key;
    public OpenGridEvent(String channelCode, String boardCode) {
        this.channelCode = channelCode;
        this.boardCode = boardCode;
    }
    public OpenGridEvent(String key) {
        this.key = key;
    }
    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
    public String getChannelCode() {
        return channelCode;
    }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java
@@ -61,7 +61,7 @@
     * èŽ·å–IC卡用户主键 - å¸æœº
     */
    @POST("visitsAdmin/cloudService/web/cabinet/getMemberIdByCode")
    Observable<BaseResponse<Integer>> getMemberIdByCode(@Query("code")String code);
    Observable<BaseResponse<Integer>> getMemberIdByCode(@Body RequestBody requestBody);
    /**
     * é…’精检测告警
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java
@@ -1,6 +1,8 @@
package com.doumee.keyCabinet.http.param;
public class AlcoholTestAlarmParam {
    //柜子id
    private Integer cabinetId;
    //会员id
    private Integer memberId;
    private String alcoholNum;
@@ -20,4 +22,12 @@
    public void setAlcoholNum(String alcoholNum) {
        this.alcoholNum = alcoholNum;
    }
    public Integer getCabinetId() {
        return cabinetId;
    }
    public void setCabinetId(Integer cabinetId) {
        this.cabinetId = cabinetId;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/GetMemberIdByCodeParam.java
@@ -1,11 +1,9 @@
package com.doumee.keyCabinet.http.param;
public class GetMemberIdByCodeParam {
    //关联人员类型:0=司机;1=校验人员
    private Integer userType;
    private String code;
    public GetMemberIdByCodeParam(String code) {
        this.code = code;
    }
    public String getCode() {
        return code;
@@ -14,4 +12,12 @@
    public void setCode(String code) {
        this.code = code;
    }
    public Integer getUserType() {
        return userType;
    }
    public void setUserType(Integer userType) {
        this.userType = userType;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/AddFaceVM.java
@@ -51,13 +51,13 @@
                                List<FaceUserBean> datas = new ArrayList<>();
                                if(faceBean!=null&&faceBean.getAutoFaceList()!=null){
                                    for(FaceUserBean bean:faceBean.getAutoFaceList()){
                                        bean.setGroupId("1");
                                        bean.setGroupId("0");
                                    }
                                    datas.addAll(faceBean.getAutoFaceList());
                                }
                                if(faceBean!=null&&faceBean.getDriverFaceList()!=null){
                                    for(FaceUserBean bean:faceBean.getDriverFaceList()){
                                        bean.setGroupId("0");
                                        bean.setGroupId("1");
                                    }
                                    datas.addAll(faceBean.getDriverFaceList());
                                }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
@@ -27,6 +27,7 @@
import com.doumee.keyCabinet.base.MyBaseActivity;
import com.doumee.keyCabinet.databinding.FaceActivityBinding;
import com.doumee.keyCabinet.event.FaceStatusChangeEvent;
import com.doumee.keyCabinet.event.HttpEvent;
import com.doumee.keyCabinet.event.JiujinBeginEvent;
import com.doumee.keyCabinet.event.JiujinResultEvent;
import com.doumee.keyCabinet.event.TimeClockEvent;
@@ -130,6 +131,7 @@
    private void statusFsm(int toStatus){
        status = toStatus;
        isToChose = false;
        getDB().etEwm.requestFocus();
        switch (toStatus){
            case 0:
                //取-管理员人脸验证
@@ -141,7 +143,6 @@
            case 1:
                //取-管理员刷卡验证
                getDB().etEwm.setText("");
                getDB().etEwm.requestFocus();
                getDB().tvTitle.setText("管理员身份验证");
                getDB().clFace.setVisibility(View.GONE);
                getDB().clCard.setVisibility(View.VISIBLE);
@@ -198,7 +199,7 @@
                //取-司机酒精检测失败
                //Toast.makeText(mContext, "司机酒精检测失败", Toast.LENGTH_SHORT).show();
                getDB().clJiu.setVisibility(View.GONE);
                getDB().tvJg1.setText("酒精检测异常,请重新检测");
                getDB().tvJg1.setText("酒精检测操作不当,请重新检测");
                getDB().clTip1.setVisibility(View.VISIBLE);
                break;
            case 7:
@@ -297,6 +298,14 @@
                    finish();
                }
                break;
            case 8:
                getDB().message.setText(data.getData().get("obj").toString());
                getDB().message.setVisibility(View.VISIBLE);
                handler.sendEmptyMessageDelayed(6,2000);
                getDB().message.invalidate();
                getDB().message.requestLayout();
                EventBus.getDefault().post(new HttpEvent("ic卡+++++++"+data.getData().get("type").toString()));
                break;
            default:
                break;
        }
@@ -328,7 +337,7 @@
        //ic卡读取
        getDB().etEwm.requestFocus();
        getDB().etEwm.setFocusable(true);
        getDB().etEwm.setShowSoftInputOnFocus(true);
        getDB().etEwm.setShowSoftInputOnFocus(false);
        hideSoftKeyboard(getDB().etEwm);
        getDB().etEwm.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
@@ -336,6 +345,7 @@
                hideSoftKeyboard(getDB().etEwm);
            }
        });
        getDB().etEwm.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -354,6 +364,8 @@
                    return;
                }
                if(status!=1&&status!=3&&status!=8){
                    getDB().etEwm.setText("");
                    getDB().etEwm.requestFocus();
                    return;
                }
                if(handler.hasMessages(5)){
@@ -498,6 +510,8 @@
                        getVM().alcoholTestAlarm(resultEvent.getConcentration().toString());
                        //Toast.makeText(mContext, "酒精检测超标", Toast.LENGTH_SHORT).show();
                        statusFsm(9);
                        //再检测,将声音关闭
                        EventBus.getDefault().post(new JiujinBeginEvent());
                    }
                    break;
                case 4:
@@ -515,6 +529,9 @@
                    }
                    getDB().etEwm.setText("");
                    getDB().etEwm.requestFocus();
                    break;
                case 6:
                    getDB().message.setVisibility(View.GONE);
                    break;
                default:
                    break;
@@ -593,6 +610,7 @@
                    User user = livenessModel.getUser();
                    if (user == null) {
                        mUser = null;
                        //EventBus.getDefault().post(new HttpEvent("人脸用户检测失败------->"+(status==0?"管理员人脸检测:":"司机人脸检测:")));
                        if (isCompareCheck) {
                            /*getDB().clFail.setVisibility(View.VISIBLE);
                            getDB().tv4.setText(getString(R.string.face_tip2));
@@ -601,6 +619,8 @@
                    } else {
                        mUser = user;
                        /*EventBus.getDefault().post(new HttpEvent("人脸用户------->"+(status==0?"管理员人脸检测:":"司机人脸检测:")
                                +(user.getGroupId().equals("0")?"管理员":"司机")));*/
                        if (isCompareCheck) {
                            getDB().clFail.setVisibility(View.GONE);
                            if(handler.hasMessages(0)) {
@@ -665,6 +685,9 @@
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void JiujinResultEvent(JiujinResultEvent e){
        if(!isFinishing()){
            if(status!=4&&status!=6){
                return;
            }
            //Toast.makeText(mContext, "酒精检测返回:"+e.isOk(), Toast.LENGTH_SHORT).show();
            if(!e.isOk()){
                getDB().clJiujinProgress.setVisibility(View.GONE);
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java
@@ -49,8 +49,10 @@
     * @param type //0:管理员,1:司机
     */
    public void getMemberIdByCode(String code,String type){
        //showLoading(true);
        getRetrofitService(Apis.class).getMemberIdByCode(code)
        GetMemberIdByCodeParam param = new GetMemberIdByCodeParam();
        param.setUserType("0".equals(type)?1:0);
        param.setCode(code);
        getRetrofitService(Apis.class).getMemberIdByCode(ParamsUtil.encodeRequestBody(param))
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new SimpleObserver<BaseResponse<Integer>>(rxJavaGcManager) {
                    @Override
@@ -70,7 +72,7 @@
                                }
                            }
                        }else {
                            //toast(response.getMessage());
                            doAction(8,response.getMessage());
                        }
                    }
@@ -92,6 +94,7 @@
     */
    public void alcoholTestAlarm(String data){
        AlcoholTestAlarmParam param = new AlcoholTestAlarmParam();
        param.setCabinetId(MApplication.getConfigBean().getId());
        param.setMemberId(MApplication.getLoginBean().getMemberId());
        param.setAlcoholNum(data);
        showLoading(true);
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/adapter/FaceUserAdapter.java
@@ -69,7 +69,7 @@
        // æ·»åŠ æ•°æ®
        holder.text_user_ctime.setText(mList.get(position).getId()+"");
        holder.textUserName.setText(mList.get(position).getUserName());
        holder.textSf.setText(mList.get(position).getGroupId().equals("0")?
        holder.textSf.setText(mList.get(position).getGroupId().equals("1")?
                MApplication.mContext.getString(R.string.face_hy) :MApplication.mContext.getString(R.string.face_xy));
        FrescoUtils.displayImageFresco(mList.get(position).getImageName(),holder.circleUserHead);
    }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java
@@ -45,7 +45,7 @@
    @Override
    public void initData(@Nullable Bundle savedInstanceState) {
        getDB().etUrl.setText(SpUtil.getString("base_url", Apis.HTTP));
        getDB().etTime.setText(SpUtil.getInt("loop_time",30)+"");
        getDB().etTime.setText(SpUtil.getInt("loop_time",60)+"");
    }
    @Override
@@ -57,7 +57,9 @@
                    ToastView.show(MApplication.mContext,"接口地址不能为空");
                    return;
                }
                if(!url.startsWith("http://")||!url.startsWith("https://")||!url.endsWith("/")){
                if((url.startsWith("http://")||url.startsWith("https://"))&&url.endsWith("/")){
                    //正确
                }else {
                    ToastView.show(MApplication.mContext,"接口地址错误");
                    return;
                }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java
@@ -25,6 +25,7 @@
import com.doumee.keyCabinet.event.CloseGridOneResultEvent;
import com.doumee.keyCabinet.event.KeyResultEvent;
import com.doumee.keyCabinet.event.GetKeyStatusEvent;
import com.doumee.keyCabinet.event.OpenErrEvent;
import com.doumee.keyCabinet.event.OpenGridEvent;
import com.doumee.keyCabinet.event.OpenGridListEvent;
import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
@@ -58,6 +59,7 @@
    private int status;
    private int ysDownCount = 10;
    private boolean isChose;
    @Override
    public int getLayoutId() {
@@ -73,6 +75,9 @@
        adapter = new CabinetRcvAdapter(this, R.layout.cabinet_rcv_item, new CabinetRcvAdapter.OnItemClick() {
            @Override
            public void onItemClick(KeyCabinetBean item) {
                if(isChose){
                    return;
                }
                selectBean = item;
            }
        });
@@ -151,6 +156,10 @@
                    Toast.makeText(mContext, "请选择柜门", Toast.LENGTH_SHORT).show();
                    return;
                }
                if(isChose){
                    return;
                }
                isChose = true;
                if(isOpening){
                    return;
                }
@@ -183,7 +192,7 @@
                isOpening = false;
                //开启成功
                status=1;
                if("0".equals(flag)) {
                if(flag==0) {
                    getDB().imgTip2.setImageResource(R.mipmap.ic_notclose_key);
                    getDB().tvTip22.setText("请领取钥匙后关闭柜门");
                }else {
@@ -193,7 +202,6 @@
                getDB().tvTip21.setText(getTipText(selectBean.getCode(),"柜门打开成功"), TextView.BufferType.SPANNABLE);
                getDB().clTip1.setVisibility(View.GONE);
                getDB().clTip2.setVisibility(View.VISIBLE);
                EventBus.getDefault().post(new GetKeyStatusEvent());
                ysDownCount = 8;
                break;
            case 7:
@@ -291,6 +299,8 @@
    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);
        handler = null;
    }
    private String openTime = "";
@@ -300,6 +310,10 @@
            if(selectBean!=null){
                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                        +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                //开门成功,移除开门
                if(handler.hasMessages(1)){
                    handler.removeMessages(1);
                }
                if(key.equals(e.getKey())) {
                    if (e.getIsOpen()==1) {
                        //开门成功
@@ -333,13 +347,23 @@
        }
    }
    private Long keyTime;
    private boolean isOpened = false;
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()){
            //关门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
            }
            //获取卡号
            EventBus.getDefault().post(new GetKeyStatusEvent());
            if(selectBean!=null){
            keyTime = new Date().getTime()+500;
            if(handler.hasMessages(0)){
                handler.removeMessages(0);
            }
            handler.sendEmptyMessageDelayed(0,1200);
            /*if(selectBean!=null){
                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                        +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                if(key.equals(e.getKey())) {
@@ -419,7 +443,20 @@
                        }
                    }
                }
            }*/
            }
    }
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void OpenErrEvent(OpenErrEvent e){
        //开门失败
        if(!isFinishing()){
            //开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
            }
            EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
            handler.sendEmptyMessageDelayed(1,1000);
        }
    }
@@ -427,6 +464,17 @@
    public void KeyResultEvent(KeyResultEvent e){
        if(!isFinishing()){
            if(selectBean!=null){
                //校验时间
                if(keyTime==null){
                    return;
                }
                if(keyTime!=null&&keyTime>System.currentTimeMillis()){
                    //校验返回时间<命令时间
                    return;
                }
                if(handler.hasMessages(0)){
                    handler.removeMessages(0);
                }
                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                        +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                if(flag==0) {
@@ -501,4 +549,24 @@
            }
        }
    }
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what){
                case 0:
                    //重新发送钥匙查询
                    //发送查询钥匙号
                    EventBus.getDefault().post(new GetKeyStatusEvent());
                    handler.sendEmptyMessageDelayed(0,1200);
                    break;
                case 1:
                    EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                    handler.sendEmptyMessageDelayed(1,1000);
                    break;
                default:
                    break;
            }
        }
    };
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
@@ -1,10 +1,13 @@
package com.doumee.keyCabinet.ui.keyCabinet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
@@ -14,6 +17,7 @@
import android.widget.TextView;
import android.widget.Toast;
import com.doumee.keyCabinet.MApplication;
import com.doumee.keyCabinet.R;
import com.doumee.keyCabinet.base.MyBaseActivity;
import com.doumee.keyCabinet.bean.ManageKeyCabinetBean;
@@ -27,6 +31,7 @@
import com.doumee.keyCabinet.event.KeyResultEvent;
import com.doumee.keyCabinet.event.ManageOpenGridResultEvent;
import com.doumee.keyCabinet.event.OpenAllGridEvent;
import com.doumee.keyCabinet.event.OpenErrEvent;
import com.doumee.keyCabinet.event.OpenGridEvent;
import com.doumee.keyCabinet.event.OpenGridListEvent;
import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
@@ -37,6 +42,7 @@
import com.doumee.lib_coremodel.util.RecyclerHelp;
import com.doumee.lib_coremodel.util.StringUtil;
import com.example.datalibrary.db.DBManager;
import com.innohi.YNHAPI;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -100,6 +106,15 @@
            }
        });
        getVM().getCabinetDetail();
        getDB().tvTitle.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                //可以下拉
                YNHAPI mAPI = YNHAPI.getInstance();
                mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
                return true;
            }
        });
    }
    private void updateBtnStatus(){
@@ -526,15 +541,14 @@
        }
    }
    private String sygKey;
    @Subscribe
    public void OpenGridOneResultEvent(OpenGridOneResultEvent e){
        if(!isFinishing()){
            if(e.getIsOpen()==0){
                if(e.getKey().equals(sygKey)){
                    return;
            //开门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
                }
                sygKey = e.getKey();
            if(e.getIsOpen()==0){
                //开门失败,重新开门
                EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                        Integer.parseInt(e.getKey().substring(0,2), 16)+""));
@@ -542,6 +556,8 @@
        }
    }
    private Long keyTime;
    private HashMap<String,String> closeMap = new HashMap<>();
    /**
     * å…³é—¨
     * @param e
@@ -549,12 +565,23 @@
    @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); 
            }
            //关门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
            }
            //发送查询钥匙号
            EventBus.getDefault().post(new GetKeyStatusEvent());
            keyTime = new Date().getTime()+500;
            if(handler.hasMessages(0)){
                handler.removeMessages(0);
            }
            handler.sendEmptyMessageDelayed(0,1200);
            closeMap.put(e.getKey(),"");
            /*111
            //校验卡号
            CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(e.getKey());
            if(gridDo!=null){
@@ -580,20 +607,51 @@
                        }
                    }
                }
                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"门关闭成功==>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"门关闭成功***************************>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                getVM().closeGrid(gridDo);
            }*/
            }
    }
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void OpenErrEvent(OpenErrEvent e){
        //开门失败
        if(!isFinishing()){
            //开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
            }
            EventBus.getDefault().post(new OpenGridEvent(e.getKey()));
            Message msg = Message.obtain();
            msg.what=1;
            msg.obj = e.getKey();
            handler.sendMessageDelayed(msg,1000);
        }
    }
    @Subscribe
    public void KeyResultEvent(KeyResultEvent e){
        if(!isFinishing()){
            //校验时间
            if(keyTime==null){
                return;
            }
            if(keyTime!=null&&keyTime>System.currentTimeMillis()){
                //校验返回时间<命令时间
                return;
            }
            if(handler.hasMessages(0)){
                handler.removeMessages(0);
            }
            HashMap<String,String> copyMap = new HashMap<>();
            copyMap.putAll(closeMap);
            closeMap.clear();
            //校验卡号不对的,直接弹出
            List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
            List<String> keys = new ArrayList<>();
            StringBuilder sb = new StringBuilder();
            for(CabinetGridDo gridDo:gridDos){
                boolean isFail = false;
                if(TextUtils.isEmpty(gridDo.getGridKey())){
                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())&&gridDo.getIsOpen()==0){
                        //未绑定的存放了钥匙
@@ -602,6 +660,7 @@
                            sb.append("、");
                        }
                        sb.append(gridDo.getCabinetName());
                        isFail = true;
                    }
                }else {
                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
@@ -612,7 +671,15 @@
                                sb.append("、");
                            }
                            sb.append(gridDo.getCabinetName());
                            isFail = true;
                        }
                    }
                }
                if(!isFail){
                    if(copyMap.containsKey(gridDo.getGridKey())){
                        //关门成功
                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"门关闭成功***************************>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                        getVM().closeGrid(gridDo);
                    }
                }
            }
@@ -625,4 +692,31 @@
            }
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);
        handler = null;
    }
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what){
                case 0:
                    //重新发送钥匙查询
                    //发送查询钥匙号
                    EventBus.getDefault().post(new GetKeyStatusEvent());
                    handler.sendEmptyMessageDelayed(0,1200);
                    break;
                case 1:
                    EventBus.getDefault().post(new OpenGridEvent((String) msg.obj));
                    handler.sendEmptyMessageDelayed(1,1000);
                    break;
                default:
                    break;
            }
        }
    };
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java
@@ -296,7 +296,7 @@
                    @Override
                    public void onNext(@NonNull BaseResponse response) {
                        if(response.getCode()==200){
                            EventBus.getDefault().post(new HttpEvent("关闭柜格接口成功"));
                            EventBus.getDefault().post(new HttpEvent("关闭柜格接口成功:"+gridDo.getCurKeyCode()));
                            getCabinetDetail();
                            doAction(11);
                        }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java
@@ -11,12 +11,14 @@
import android.widget.Toast;
import com.doumee.keyCabinet.BuildConfig;
import com.doumee.keyCabinet.MApplication;
import com.doumee.keyCabinet.R;
import com.doumee.keyCabinet.base.MyBaseActivity;
import com.doumee.keyCabinet.databinding.ManageLoginActivityBinding;
import com.doumee.keyCabinet.event.TimeClockEvent;
import com.doumee.keyCabinet.utils.LMobileInfo;
import com.doumee.lib_coremodel.bean.event.ActionEventData;
import com.innohi.YNHAPI;
import org.greenrobot.eventbus.Subscribe;
@@ -44,7 +46,18 @@
        getDB().tvNo.setText("NO:"+ LMobileInfo.getDeviceUniqueId());
        getDB().tvV.setText("V"+ BuildConfig.VERSION_NAME);
        getDB().tv1.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if(MApplication.getConfigBean().getId()==null){
                    //可以下拉
                    YNHAPI mAPI = YNHAPI.getInstance();
                    mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
                    return true;
                }
                return false;
            }
        });
    }
    @Override
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -6,6 +6,7 @@
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.hardware.Camera;
import android.opengl.Visibility;
@@ -20,6 +21,7 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
@@ -60,6 +62,7 @@
import com.doumee.keyCabinet.event.KeyResultEvent;
import com.doumee.keyCabinet.event.ManageOpenGridResultEvent;
import com.doumee.keyCabinet.event.OpenAllGridEvent;
import com.doumee.keyCabinet.event.OpenErrEvent;
import com.doumee.keyCabinet.event.OpenGridEvent;
import com.doumee.keyCabinet.event.OpenGridListEvent;
import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
@@ -109,6 +112,7 @@
import com.example.datalibrary.model.User;
import com.example.datalibrary.utils.ToastUtils;
import com.example.datalibrary.view.PreviewTexture;
import com.innohi.YNHAPI;
import com.yanzhenjie.permission.runtime.Permission;
import org.greenrobot.eventbus.EventBus;
@@ -171,8 +175,21 @@
                        getVM().getFaceLD();
                    }
                    getVM().upBraceletLog();*/
                    case 1:
                        if(isShowing) {
                            EventBus.getDefault().post(new OpenGridEvent((String) msg.obj));
                            handler.sendEmptyMessageDelayed(1, 1000);
                        }
                        break;
                    case 2:
                        if(isShowing){
                            //重新发送钥匙查询
                            //发送查询钥匙号
                            EventBus.getDefault().post(new GetKeyStatusEvent());
                            handler.sendEmptyMessageDelayed(2,1200);
                        }
                        break;
                    default:
                        break;
                }
            }
@@ -270,7 +287,7 @@
                lastDownTime1 = System.currentTimeMillis();
                downCount1++;
                System.out.println();
                Timber.tag("==>").d(""+downCount1);
                //Timber.tag("==>").d(""+downCount1);
                if(downCount1>4) {
                    downCount1=0;
                    lastDownTime1=null;
@@ -296,14 +313,7 @@
                }
            }
        });
        getDB().tvVersion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //todo ä¸´æ—¶ä»£ç 
                //setJiuConfig();
                SpUtil.saveString("rbgCameraId","0");
            }
        });
        getDB().imgLeft.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
@@ -458,6 +468,8 @@
    protected void onResume() {
        super.onResume();
        isShowing = true;
        YNHAPI mAPI = YNHAPI.getInstance();
        mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.ALWAYS_INVISIBLE);
        showTime = System.currentTimeMillis();
        if(!isFaceOk) {
            initLicense();
@@ -773,7 +785,63 @@
            waitBeans.clear();
            selectBeans.addAll(userBeans);
            finishCount=0;
            /*//删除全部
            FaceApi.getInstance().userClean();
            faceHandler.sendEmptyMessage(0);*/
            HashMap<String,String> uMap = new HashMap<>();
            for(FaceUserBean d:selectBeans){
                String key = d.getMemberId().toString()+"_"+d.getGroupId();
                uMap.put(key,"");
            }
            //删除不存在用户
            List<User> users = FaceApi.getInstance().getAllUserList();
            List<User> dels = new ArrayList<>();
            for(User u:users){
                String key = u.getUserId()+"_"+u.getGroupId();
                if(!uMap.containsKey(key)){
                    dels.add(u);
                }
            }
            if(dels.size()>0){
                UserInfoManager.getInstance().deleteUserListInfo(dels,
                        "", new UserInfoManager.UserInfoListener() {
                            @Override
                            public void userListDeleteSuccess() {
                                // ç”¨æˆ·åˆ—表删除成功
            faceHandler.sendEmptyMessage(0);
                            }
                            @Override
                            public void userListDeleteFailure(String message) {
                                // ç”¨æˆ·åˆ—表删除失败
                                faceHandler.sendEmptyMessage(0);
                            }
                        },
                        new DBLoadListener() {
                            @Override
                            public void onStart(int successCount) {
                            }
                            @Override
                            public void onLoad(int finishCount, int successCount, float progress) {
                            }
                            @Override
                            public void onComplete(List<User> features, int successCount) {
                            }
                            @Override
                            public void onFail(int finishCount, int successCount, List<User> features) {
                            }
                        });
            }else {
                faceHandler.sendEmptyMessage(0);
            }
        }
    }
@@ -1041,14 +1109,21 @@
        }
    }
    private UpdateUtil updateUtil;
    private void checkUpdate(){
        //版本更新
        new UpdateUtil(this).setShowToast(false).getServerVerCode(new UpdateUtil.VersionCallBack() {
        if(updateUtil==null){
            updateUtil = new UpdateUtil(this);
            updateUtil.setShowToast(false);
        }
        if(!updateUtil.isShowing()){
            updateUtil.getServerVerCode(new UpdateUtil.VersionCallBack() {
            @Override
            public void isNeedUpdate(boolean isUpdate) {
                isUpdateVersion = isUpdate;
            }
        });
        }
    }
    private PermissiondDialog permissiondDialog;
@@ -1080,7 +1155,7 @@
    }
    private int tipDownCount = 10;
    private int loopDownCount = 30;
    private int loopDownCount = 60;
    private boolean isShowTip;
    @Subscribe
    public void TimeClockEvent(TimeClockEvent e){
@@ -1095,9 +1170,10 @@
                }
            }
            if(loopDownCount==0){
                loopDownCount = SpUtil.getInt("loop_time",30);
                loopDownCount = SpUtil.getInt("loop_time",60);
                //定时拉取基本信息
                getVM().devLogin();
                getPermission();
            }else {
                loopDownCount--;
            }
@@ -1112,8 +1188,12 @@
    public void OpenGridEvent(OpenGridEvent e){
        if(!isFinishing()){
            //开启柜门
            String code = "8A"+SportUtils.intToHex(Integer.parseInt(e.getBoardCode()))
                    +SportUtils.intToHex(Integer.parseInt(e.getChannelCode()))+"11";
            String key = e.getKey();
            if(TextUtils.isEmpty(key)) {
                key = SportUtils.intToHex(Integer.parseInt(e.getBoardCode()))
                        + SportUtils.intToHex(Integer.parseInt(e.getChannelCode()));
            }
            String code = "8A" + key + "11";
            code += SportUtils.getBCC(code);
            send485(0,code);
        }
@@ -1176,38 +1256,6 @@
        }
    }
    @Subscribe
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()&&isShowing){
            //在首页,校验关门的钥匙是否匹配
            if (e.getIsOpen() == 0) {
                //关门成功
                //查询钥匙号
                CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(e.getKey());
                if (gridDo != null) {
                    getVM().addInfo("比较钥匙:当前:"+gridDo.getCurKeyCode()+", å…³è”钥匙:"+gridDo.getKeyCode());
                    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(e.getKey().substring(2,4), 16)+"",
                                Integer.parseInt(e.getKey().substring(0,2), 16)+""));
                    }else {
                        if(isShowTip){
                            doRegister(5,null);
                        }
                        if(isShowing){
                            //在首页关门成功,需调用关门方法
                            getVM().closeGrid(gridDo);
                        }
                    }
                }
            }
        }
    }
    private SerialPortModel gridPort;
    private SerialPortReadObserver gridReadObserver = new SerialPortReadObserver() {
        @Override
@@ -1267,30 +1315,18 @@
                    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) + ""));
                                }
                            }
                            EventBus.getDefault().post(new OpenErrEvent(key));
                        }else {
                            //开门成功
                        }
                    }
                    //开门返回
                    EventBus.getDefault().post(new OpenGridOneResultEvent(key,"00".equals(open)?1:0));
                        }
                    }
                }else if(data.length()==16){
                    //批量
                    //8A 02 00 00 00 00 11 99
@@ -1314,14 +1350,6 @@
                                updateList.add(gridDo);
                            }
                        }
                        runOnUiThread(() -> {
                            getVM().addInfo("批量开门更新库数据:版号:" +bh+","+updateList.size());
                        });
                        //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());
@@ -1341,9 +1369,6 @@
                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);
                }
                //关门返回
@@ -1393,12 +1418,6 @@
                        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){
@@ -1451,7 +1470,7 @@
                keyPreviousData = data;
            }else if(data.startsWith("CC02")){
                runOnUiThread(() -> {
                    getVM().addInfo("获取到钥匙数据:" + data);
                    //getVM().addInfo("获取到钥匙数据:" + data);
                    jxKey(data);
                });
                keyPreviousData = null;
@@ -1459,7 +1478,7 @@
                if(!TextUtils.isEmpty(keyPreviousData)){
                    String data2 = keyPreviousData+data;
                    runOnUiThread(() -> {
                        getVM().addInfo("获取到钥匙数据:" + data2);
                        //getVM().addInfo("获取到钥匙数据:" + data2);
                        if(data2.contains("CC01")&&data2.contains("CC02")){
                            String[] sp = data2.split("CC02");
                            if(sp.length==2){
@@ -1552,12 +1571,9 @@
            }
            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")));
                });
                if(data.contains("blow fail")){
                    //检测失败
                    EventBus.getDefault().post(new JiujinResultEvent(false,null));
@@ -1691,18 +1707,35 @@
        sendPortHandlerMsg(2,"A002010000000003",time+400);
    }
    private String jiu_blow;
    private String jiu_mic_ad;
    private String jiu_alarm;
    private String jiu_unit;
    private void setJiuConfig(long time){
        CabinetConfigDataBean config = MApplication.getConfigBean().getCabinetConfigDataVO();
        if(!config.getBlowTime().equals(jiu_blow)) {
        //设置吹气时间
        sendPortHandlerMsg(3,"blow:"+config.getBlowTime(),time+100);
            jiu_blow = config.getBlowTime();
            sendPortHandlerMsg(3, "blow:" + config.getBlowTime(), time += 100);
        }
        if(!config.getPressure().equals(jiu_mic_ad)) {
        //压力值
        sendPortHandlerMsg(3,"mic_ad:"+config.getPressure(),time+300);
            jiu_mic_ad = config.getPressure();
            sendPortHandlerMsg(3, "mic_ad:" + config.getPressure(), time += 300);
        }
        if(!config.getConcentration().equals(jiu_alarm)) {
        //浓度阈值
        sendPortHandlerMsg(3,"alarm:"+config.getConcentration(),time+600);
            jiu_alarm = config.getConcentration();
            sendPortHandlerMsg(3, "alarm:" + config.getConcentration(), time += 300);
        }
        if("3".equals(config.getThreshold())){
            config.setThreshold("0");
        }
        if(!config.getThreshold().equals(jiu_unit)) {
        //浓度阈值单位 (1=mg/100ml;2=mg/L;3=%BAC)
        sendPortHandlerMsg(3,"unit:"+config.getThreshold(),time+900);
        sendPortHandlerMsg(3,"read"+config.getThreshold(),time+1200);
            jiu_unit = config.getThreshold();
            sendPortHandlerMsg(3, "unit:" + config.getThreshold(), time += 300);
        }
    }
    private void sendPortHandlerMsg(int what,String obj,long time){
@@ -1867,10 +1900,6 @@
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //todo åŽ»æŽ‰
                if(type==2){
                    return;
                }
                getVM().addInfo("发送指令:"+StringUtil.DateToStrSS(new Date())+"==>"+code);
            }
        });
@@ -1937,4 +1966,124 @@
        getVM().addInfo("串口全部链接成功:");
        return true;
    }
    //开门
    @Subscribe
    public void OpenGridOneResultEvent(OpenGridOneResultEvent e){
        if(!isFinishing()&&isShowing){
            //开门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
                getVM().addInfo("==移除开门任务");
            }
        }
    }
    private Long keyTime;
    private HashMap<String,String> closeMap = new HashMap<>();
    /**
     * å…³é—¨
     * @param e
     */
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()&&isShowing){
            //关门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
                getVM().addInfo("==移除开门任务");
            }
            closeMap.put(e.getKey(),"");
            //发送查询钥匙号
            EventBus.getDefault().post(new GetKeyStatusEvent());
            keyTime = new Date().getTime()+500;
            if(handler.hasMessages(2)){
                handler.removeMessages(2);
            }
            handler.sendEmptyMessageDelayed(2,1200);
        }
    }
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void OpenErrEvent(OpenErrEvent e){
        //开门失败
        if(!isFinishing()&&isShowing){
            //开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
                getVM().addInfo("==移除开门任务");
            }
            EventBus.getDefault().post(new OpenGridEvent(e.getKey()));
            Message msg = Message.obtain();
            msg.what=1;
            msg.obj = e.getKey();
            handler.sendMessageDelayed(msg,1000);
        }
    }
    @Subscribe
    public void KeyResultEvent(KeyResultEvent e){
        if(!isFinishing()&&isShowing){
            //校验时间
            if(keyTime==null){
                return;
            }
            if(keyTime!=null&&keyTime>System.currentTimeMillis()){
                //校验返回时间<命令时间
                return;
            }
            if(handler.hasMessages(2)){
                handler.removeMessages(2);
            }
            HashMap<String,String> copyMap = new HashMap<>();
            copyMap.putAll(closeMap);
            closeMap.clear();
            //校验卡号不对的,直接弹出
            List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
            List<String> keys = new ArrayList<>();
            StringBuilder sb = new StringBuilder();
            for(CabinetGridDo gridDo:gridDos){
                //要在范围内
                if(copyMap.containsKey(gridDo.getGridKey())){
                    boolean isFail = false;
                    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());
                            isFail = true;
                        }
                    }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());
                                isFail = true;
                            }
                        }
                    }
                    if(!isFail){
                        //关门成功
                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"门关闭成功***************************>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                        getVM().closeGrid(gridDo);
                    }
                }
            }
            if(sb.length()>0){
                ToastView.show(MApplication.mContext, sb.toString() + "钥匙存放位置错误");
            }
            if(keys.size()>0){
                //开门
                EventBus.getDefault().post(new OpenGridListEvent(keys));
            }
        }
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java
@@ -215,13 +215,13 @@
                                List<FaceUserBean> datas = new ArrayList<>();
                                if(faceBean!=null&&faceBean.getAutoFaceList()!=null){
                                    for(FaceUserBean bean:faceBean.getAutoFaceList()){
                                        bean.setGroupId("1");
                                        bean.setGroupId("0");
                                    }
                                    datas.addAll(faceBean.getAutoFaceList());
                                }
                                if(faceBean!=null&&faceBean.getDriverFaceList()!=null){
                                    for(FaceUserBean bean:faceBean.getDriverFaceList()){
                                        bean.setGroupId("0");
                                        bean.setGroupId("1");
                                    }
                                    datas.addAll(faceBean.getDriverFaceList());
                                }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateUtil.java
@@ -57,6 +57,17 @@
        // thread.interrupt();
        // }
    }
    public boolean isShowing() {
        if(updateDialog!=null&&updateDialog.isShowing()){
            return true;
        }
        if(downloadDialog!=null&&downloadDialog.isShowing()){
            return true;
        }
        return false;
    }
    public static interface VersionCallBack{
        void isNeedUpdate(boolean isUpdate);
    }
@@ -81,8 +92,8 @@
                                    versionCallBack.isNeedUpdate(true);
                                    upgradeurl=data.getFullFileUrl();
                                    updatelog=data.getContent();
                                    newVerName = response.getData().getVersionInfo();
                                    doNewVersionUpdate(true);
                                    newVerName = data.getVersionInfo();
                                    doNewVersionUpdate(data.getIsForce()==1);
                                }else {
                                    versionCallBack.isNeedUpdate(false);
                                }
@@ -117,6 +128,7 @@
        }
    }
    private UpdateDialog updateDialog;
    // æ›´æ–°æ–°ç‰ˆæœ¬
    public void doNewVersionUpdate(boolean type) {
        StringBuffer sb = new StringBuffer();
@@ -132,14 +144,17 @@
        }
        // sb.append(updatelog+"\n\n\r");
        // new UpdateDialog(activity).show();
        final UpdateDialog updateDialog = new UpdateDialog(activity);
        if(updateDialog!=null&&updateDialog.isShowing()){
            updateDialog.dismiss();
        }
        updateDialog = new UpdateDialog(activity);
        updateDialog.setText(sb.toString(),newVerName);
        updateDialog.setOnOtemListener(new UpdateDialog.UpdialogListener() {
            @Override
            public void setOnclickUpdate() {
                updateDialog.hide();
                downloadDialog = new DownloadDialog(activity, upgradeurl);
                //updateDialog.hide();
                /*downloadDialog = new DownloadDialog(activity, upgradeurl);
                downloadDialog.show();
                downloadDialog.setCanceledOnTouchOutside(false);
                downloadDialog.setUpdateDialog(updateDialog);
@@ -156,7 +171,7 @@
                                }
                                return false;
                            }
                        });
                        });*/
            }
            @Override
keyCabinet-android/app/src/main/res/layout/face_activity.xml
@@ -17,6 +17,18 @@
        android:background="@color/white"
        >
        <EditText
            android:id="@+id/et_ewm"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text=""
            android:inputType="number"
            app:layout_constraintTop_toTopOf="@+id/viewBack"
            app:layout_constraintBottom_toBottomOf="@+id/viewBack"
            app:layout_constraintStart_toStartOf="parent"
            android:background="@null"
            />
        <View
            android:id="@+id/viewBack"
            android:layout_width="0dp"
@@ -482,20 +494,7 @@
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:background="@color/white"
            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"
                />
            android:visibility="gone">
            <View
                android:id="@+id/v_c_sl"
@@ -736,5 +735,23 @@
        </androidx.constraintlayout.widget.ConstraintLayout>
        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/activity_vertical_margin"
            android:layout_marginRight="@dimen/activity_vertical_margin"
            android:text=""
            android:textColor="@color/white"
            android:textSize="24sp"
            android:padding="@dimen/activity_horizontal_margin"
            android:background="@drawable/toast_view_bg"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:gravity="center"
            android:visibility="gone"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
keyCabinet-android/app/src/main/res/layout/layout_download.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_width="450dp"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_gravity="center"
keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml
@@ -37,18 +37,6 @@
            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/ui_update_dialog.xml
@@ -2,7 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/rl_root"
    android:layout_width="match_parent"
    android:layout_width="450dp"
    android:layout_height="wrap_content">
    <androidx.constraintlayout.widget.ConstraintLayout
keyCabinet-android/app/src/main/res/values/strings.xml
@@ -114,8 +114,8 @@
    <string name="main_tip3">人脸库加载失败,共%1$d条数据, å·²åŠ è½½%2$d条数据</string>
    <string name="main_tip4">模型加载成功,欢迎使用</string>
    <string name="main_tip5">模型加载失败,请尝试重启应用</string>
    <string name="face_hy">会员</string>
    <string name="face_xy">管理员</string>
    <string name="face_hy">司机</string>
    <string name="face_xy">验证人</string>
    <string name="guide_2">设备未登录</string>
    <string name="face_login">人脸识别中</string>
    <string name="face_tip1">请正视前方,不要遮挡脸部</string>
keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
@@ -309,15 +309,14 @@
    private static BDFaceImageInstance rgbInstance =null;
    private LivenessModel livenessModel;
    private String groupId;
    /**
     * 0:管理员,1:用户
     * @param groupId
     */
    public void setGroupId(String groupId){
        if(livenessModel!=null){
            livenessModel.setGroupId(groupId);
        }
        this.groupId = groupId;
    }
    /**
     * æ£€æµ‹-活体-特征-人脸检索流程
@@ -1215,7 +1214,7 @@
                    //System.out.println("==isOk==>匹配到数量"+featureResult.size());
                    User user = null;
                    Feature topFeature = null;
                    if(TextUtils.isEmpty(livenessModel.getGroupId())){
                    if(TextUtils.isEmpty(groupId)){
                        //为空,需要排序,优先取会员
                        for(Feature feat:featureResult) {
                            threholdScore = bdFaceCheckConfig.scoreThreshold;
@@ -1242,7 +1241,7 @@
                                //System.out.println("==isOk==>50");
                                // å½“前featureEntity åªæœ‰id+feature ç´¢å¼•,在数据库中查到完整信息
                                User userOld = FaceApi.getInstance().getUserListById(feat.getId());
                                if(livenessModel.getGroupId().equals(userOld.getGroupId())){
                                if(groupId.equals(userOld.getGroupId())){
                                    user = userOld;
                                    topFeature = feat;
                                    break;
keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/base/BaseViewModel.java
@@ -228,6 +228,10 @@
        actionEvent.setValue(new ActionEventData(type));
    }
    public void doAction(int type,String obj){
        actionEvent.setValue(new ActionEventData(type,obj));
    }
    public LifecycleOwner getLifecycleOwner() {
        return lifecycleOwner;
    }
keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/bean/event/ActionEventData.java
@@ -28,6 +28,13 @@
        this.data.put("type",type);
    }
    public ActionEventData(int type,String obj){
        this.action = ActionEvent.Action.DO;
        this.data = new HashMap<>();
        this.data.put("type",type);
        this.data.put("obj",obj);
    }
    public ActionEventData(int action,Object value) {
        this.action = action;
        this.data = new HashMap<>();
keyCabinet-android/lib_coremodel/src/main/res/values/colors.xml
@@ -8,4 +8,5 @@
    <color name="line">#E5E5E5</color>
    <color name="bg">#fff4f6f9</color>
    <color name="f7">#F7F7F7</color>
    <color name="dialog_bg">#80000000</color>
</resources>