From c7376f8d1091b70597ba4430a281496b585b386e Mon Sep 17 00:00:00 2001
From: weimingfei <fei_gaming@sina.com>
Date: 星期四, 23 十月 2025 21:58:26 +0800
Subject: [PATCH] 钥匙柜

---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java |  352 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 341 insertions(+), 11 deletions(-)

diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
index 8055157..ef9eb5a 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
@@ -1,22 +1,43 @@
 package com.doumee.keyCabinet.ui.keyCabinet;
 
 import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
 import androidx.lifecycle.Observer;
 
+import android.os.Build;
 import android.os.Bundle;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.style.TextAppearanceSpan;
+import android.view.KeyEvent;
 import android.view.View;
+import android.widget.TextView;
 import android.widget.Toast;
 
 import com.doumee.keyCabinet.R;
 import com.doumee.keyCabinet.base.MyBaseActivity;
-import com.doumee.keyCabinet.bean.CabinetDetailBean;
 import com.doumee.keyCabinet.bean.ManageKeyCabinetBean;
+import com.doumee.keyCabinet.dao.CabinetGridDo;
+import com.doumee.keyCabinet.dao.DaoManager;
 import com.doumee.keyCabinet.databinding.ManageCabinetActivityBinding;
+import com.doumee.keyCabinet.event.HttpEvent;
+import com.doumee.keyCabinet.event.ManageOpenGridResultEvent;
+import com.doumee.keyCabinet.event.OpenAllGridEvent;
+import com.doumee.keyCabinet.event.OpenGridListEvent;
+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 org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
 
 import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 
 import dagger.hilt.android.AndroidEntryPoint;
@@ -26,18 +47,42 @@
     private ManageCabinetRcvAdapter adapter;
     //1寰呭叏寮�锛�2寰呮壒閲忓紑
     private int status;
+    private boolean isCanCZ = false;
 
     @Override
     public int getLayoutId() {
         return R.layout.manage_cabinet_activity;
     }
 
+    private HashMap<String,String> waitOpenMap = new HashMap<>();
+
     @Override
     public void initView(@Nullable Bundle savedInstanceState) {
         isAddCountTimer = false;
         normalConfig();
         getDB().setModel(getVM());
-
+        adapter = new ManageCabinetRcvAdapter(this, R.layout.manage_cabinet_rcv_item, new ManageCabinetRcvAdapter.OnItemClick() {
+            @Override
+            public void onItemClick(ManageKeyCabinetBean item) {
+                List<ManageKeyCabinetBean> datas = adapter.getListData();
+                isCanCZ = false;
+                for(ManageKeyCabinetBean d:datas){
+                    if(d.getIsSelected().get()){
+                        isCanCZ = true;
+                        break;
+                    }
+                }
+                if(isCanCZ){
+                    getDB().tvPlOpen.setBackgroundResource(R.drawable.shape_mb_bt_ok);
+                    getDB().tvBj.setBackgroundResource(R.drawable.shape_mb_bt_ok);
+                }else {
+                    getDB().tvPlOpen.setBackgroundResource(R.drawable.shape_mb_bt_faile);
+                    getDB().tvBj.setBackgroundResource(R.drawable.shape_mb_bt_faile);
+                }
+            }
+        });
+        RecyclerHelp.bindVG(this,getDB().rcvKm,3,30);
+        getDB().rcvKm.setAdapter(adapter);
     }
 
     @Override
@@ -45,27 +90,102 @@
         getVM().getDatasLD().observe(this, new Observer<List<ManageKeyCabinetBean>>() {
             @Override
             public void onChanged(List<ManageKeyCabinetBean> gridInfoBeans) {
-
+                if(gridInfoBeans.size()>0){
+                    adapter.refreshData(gridInfoBeans);
+                    getVM().emptyVisibility.set(View.GONE);
+                    //鏇存柊淇℃伅
+                    updateDao(gridInfoBeans);
+                }else {
+                    getVM().emptyVisibility.set(View.VISIBLE);
+                }
             }
         });
         getVM().getCabinetDetail();
     }
 
+    private void updateDao(List<ManageKeyCabinetBean> beans){
+        List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
+        HashMap<String,CabinetGridDo> oldMap = new HashMap<>();
+        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()));
+            if(oldMap.containsKey(key)){
+                //淇敼
+                CabinetGridDo gridDo = oldMap.get(key);
+                gridDo.setGridId(bean.getId());
+                gridDo.setCabinetName(bean.getCode());
+                gridDo.setKeyCode(bean.getKeyCode());
+                gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
+                gridDo.setBindStatus(bean.getBindStatus());
+                gridDo.setGridStatus(bean.getStatus());
+                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);
+            }
+            DaoManager.getCabinetGridDao().update(upList);
+        }
+    }
+
     private List<Integer> bjIds = new ArrayList<>();
     private boolean isGz = true;
+    private boolean isAllOpen = false;
     @Override
     protected void doRegister(int type, ActionEventData data) {
         switch (type){
             case 1:
-                //todo wmf 鏍¢獙鏌滃瓙鏄惁閮藉凡鍏抽棴
+                //鏍¢獙鏌滃瓙鏄惁閮藉凡鍏抽棴
+                if(checkOpen()){
+                    return;
+                }
                 finish();
                 break;
             case 2:
+            {
                 //鍏ㄥ紑
                 status = 1;
-                //todo 鍏ㄥ紑
+                //鎵归噺寮�闂紝鏍¢獙鏄惁鍙墦寮�
+                List<Integer> ids = new ArrayList<>();
+                List<ManageKeyCabinetBean> datas = adapter.getListData();
+                for (ManageKeyCabinetBean bean : datas) {
+                    ids.add(bean.getId());
+                }
+                if (ids.size() == 0) {
+                    Toast.makeText(mContext, "璇烽�夋嫨鏌滄牸", Toast.LENGTH_SHORT).show();
+                    return;
+                }
+                getVM().batchOpenGridAdmin(ids,true);
+            }
                 break;
             case 3: {
+                if(!isCanCZ){
+                    return;
+                }
                 //鎵归噺寮�闂紝鏍¢獙鏄惁鍙墦寮�
                 List<Integer> ids = new ArrayList<>();
                 List<ManageKeyCabinetBean> datas = adapter.getListData();
@@ -78,14 +198,39 @@
                     Toast.makeText(mContext, "璇烽�夋嫨鏌滄牸", Toast.LENGTH_SHORT).show();
                     return;
                 }
-                getVM().batchOpenGridAdmin(ids);
+                getVM().batchOpenGridAdmin(ids,false);
                 }break;
-            case 8:
-                status = 2;
-                //todo 鎵归噺寮�
-                break;
+            case 8: {
+                //鍏ㄥ紑
+                isAllOpen = true;
+                List<ManageKeyCabinetBean> datas = adapter.getListData();
+                for (ManageKeyCabinetBean bean : datas) {
+                    String key = SportUtils.intToHex(Integer.parseInt(bean.getBoardCode()))+
+                            SportUtils.intToHex(Integer.parseInt(bean.getChannelCode()));
+                    waitOpenMap.put(key,bean.getCode());
+                }
+                EventBus.getDefault().post(new OpenAllGridEvent());
+                }break;
+            case 10: {
+                //鎵归噺寮�
+                isAllOpen = false;
+                List<ManageKeyCabinetBean> datas = adapter.getListData();
+                List<String> keys = new ArrayList<>();
+                for (ManageKeyCabinetBean bean : datas) {
+                    if(bean.getIsSelected().get()) {
+                        String key = SportUtils.intToHex(Integer.parseInt(bean.getBoardCode())) +
+                                SportUtils.intToHex(Integer.parseInt(bean.getChannelCode()));
+                        waitOpenMap.put(key, bean.getCode());
+                        keys.add(key);
+                    }
+                }
+                EventBus.getDefault().post(new OpenGridListEvent(keys));
+                }break;
             case 4: {
                 //鏍囪
+                if(!isCanCZ){
+                    return;
+                }
                 bjIds.clear();
                 isGz = true;
                 List<ManageKeyCabinetBean> datas = adapter.getListData();
@@ -130,8 +275,193 @@
                     getVM().markFault(bjIds);
                 }
                 break;
+            case 9: {
+                if(isShowOpenTip==true) {
+                    //娓呯┖寮�闂ㄦ彁閱�
+                    isShowOpenTip = false;
+                    getDB().clKmTip.setVisibility(View.GONE);
+                }else {
+                    getDB().clKmTip.setVisibility(View.GONE);
+                }
+                }break;
             default:
                 break;
         }
     }
+
+    //閫�鍑哄叧闂ㄦ彁閱�
+    private int tipDownCount = 10;
+    private boolean isShowTip;
+
+    //寮�闂ㄦ彁閱�
+    private int openTipDownCount = 60;
+    private boolean isShowOpenTip;
+    @Subscribe
+    public void TimeClockEvent(TimeClockEvent e){
+        if(isShowTip){
+            if(tipDownCount==0){
+                isShowTip = false;
+                getDB().clTip.setVisibility(View.GONE);
+                finish();
+            }else {
+                tipDownCount--;
+                getDB().tvDjs.setText(tipDownCount+"s");
+            }
+        }
+        if(isShowOpenTip){
+            if(openTipDownCount==0){
+                doRegister(9,null);
+            }else {
+                openTipDownCount--;
+                getDB().tvClKmClose.setText(openTipDownCount+"s 鑷姩鍏抽棴");
+            }
+        }
+    }
+
+
+    /**
+     * 鏍¢獙鏄惁鏈夋病鍏抽棬鐨�
+     * @return
+     */
+    private boolean checkOpen(){
+        List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().getOpenGrids();
+        if (gridDos.size() > 0) {
+            tipDownCount = 10;
+            isShowTip = true;
+            getDB().tvDjs.setText(tipDownCount + "s");
+            StringBuilder sb = new StringBuilder();
+            for(CabinetGridDo d:gridDos){
+                if (sb.length()>0) {
+                    sb.append("銆�");
+                }
+                String name = d.getCabinetName();
+                if (TextUtils.isEmpty(name)) {
+                    name = gridDos.get(0).getGridKey();
+                }
+                sb.append(name);
+            }
+            getDB().tvTip22.setText(getTipText(sb.toString()), TextView.BufferType.SPANNABLE);
+            getDB().clTip.setVisibility(View.VISIBLE);
+            return true;
+        }else {
+            isShowTip = false;
+            getDB().clTip.setVisibility(View.GONE);
+            return false;
+        }
+    }
+
+    private SpannableString getTipText(String name){
+        String text = "璇峰叧闂�"+name+"鏌滈棬";
+        SpannableString styledText = new SpannableString(text);
+        styledText.setSpan(new TextAppearanceSpan(this,R.style.style_tip2), 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip1),
+                3, 3+name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        styledText.setSpan(new TextAppearanceSpan(this,R.style.style_tip2), name.length()+3, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        return styledText;
+    }
+
+    private SpannableString getTipText2(String begin,String name,String end){
+        String text = begin+name+end;
+        SpannableString styledText = new SpannableString(text);
+        styledText.setSpan(new TextAppearanceSpan(this,R.style.style_tip2), 0, begin.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip1),
+                begin.length(), begin.length()+name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        styledText.setSpan(new TextAppearanceSpan(this,R.style.style_tip2), begin.length()+name.length(), text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        return styledText;
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if(keyCode == KeyEvent.KEYCODE_BACK){
+            if(checkOpen()){
+                return true;
+            }
+        }
+        return super.onKeyDown(keyCode, event);
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void ManageOpenGridResultEvent(ManageOpenGridResultEvent e){
+        if(!isFinishing()){
+            //鏍¢獙鏄惁宸插叏寮�
+            List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
+            List<String> msgList = new ArrayList<>();
+            for(String key:waitOpenMap.keySet()){
+                msgList.add(waitOpenMap.get(key));
+            }
+            EventBus.getDefault().post(new HttpEvent("鎬诲叡瑕佹墦寮�鏁�:"+waitOpenMap.size()));
+            for(CabinetGridDo d:gridDos){
+                if(d.getIsOpen()==1) {
+                    EventBus.getDefault().post(new HttpEvent("鎵撳紑浜�:"+d.getGridKey()));
+                    waitOpenMap.remove(d.getGridKey());
+                }
+            }
+            if(waitOpenMap.size()==0){
+                EventBus.getDefault().post(new HttpEvent("鍏ㄩ儴鎵撳紑浜�:"+waitOpenMap.size()));
+                //鎵撳紑鎴愬姛
+                if(isAllOpen){
+                    getDB().tvClKm2.setText("涓�閿叏寮�鎴愬姛锛岄杩樺悗璇峰叧闂�");
+                }else {
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                        msgList.sort((a,b)->{
+                            return a.compareTo(b);
+                        });
+                    }
+                    StringBuilder sb = new StringBuilder();
+                    for(String key:msgList){
+                        if(sb.length()>0){
+                            sb.append("銆�");
+                        }
+                        sb.append(key);
+                    }
+                    getDB().tvClKm2.setText(getTipText2("閽ュ寵鏌�",sb.toString(),"寮�闂ㄦ垚鍔燂紝棰嗚繕鍚庤鍏抽棬"), TextView.BufferType.SPANNABLE);
+                }
+                getDB().imgClKm1.setImageResource(R.mipmap.ic_success);
+                getDB().tvClKm1.setText("鏌滈棬鎵撳紑鎴愬姛");
+            }else {
+                //閮ㄥ垎寮�闂ㄥけ璐�
+                EventBus.getDefault().post(new HttpEvent("閮ㄥ垎鎵撳紑浜�:"+waitOpenMap.size()));
+                msgList.clear();
+                for (String key : waitOpenMap.keySet()) {
+                    msgList.add(waitOpenMap.get(key));
+                }
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                    msgList.sort((a, b) -> {
+                        return a.compareTo(b);
+                    });
+                }
+                StringBuilder sb = new StringBuilder();
+                for (String key : msgList) {
+                    if (sb.length() > 0) {
+                        sb.append("銆�");
+                    }
+                    sb.append(key);
+                }
+                getDB().imgClKm1.setImageResource(R.mipmap.ic_jjfail);
+                getDB().tvClKm1.setText("鏌滈棬鎵撳紑澶辫触");
+                getDB().tvClKm2.setText(getTipText2("閽ュ寵鏌�",sb.toString(),"寮�闂ㄥけ璐�"), TextView.BufferType.SPANNABLE);
+            }
+            getDB().tvClKmClose.setText("60s 鑷姩鍏抽棴");
+            getDB().tvClKmClose.setTextColor(0xff279baa);
+            getDB().tvClKmClose.setBackgroundResource(R.drawable.shape_mb_bg01);
+            openTipDownCount = 60;
+            isShowOpenTip = true;
+            getDB().clKmTip.setVisibility(View.VISIBLE);
+
+            if(!isAllOpen) {
+                //娓呴櫎宸查�夋嫨鐨�
+                List<ManageKeyCabinetBean> datas = adapter.getListData();
+                for (ManageKeyCabinetBean bean : datas) {
+                    if (bean.getIsSelected().get()) {
+                        String key = SportUtils.intToHex(Integer.parseInt(bean.getBoardCode())) +
+                                SportUtils.intToHex(Integer.parseInt(bean.getChannelCode()));
+                        if (!waitOpenMap.containsKey(key)) {
+                            bean.getIsSelected().set(false);
+                        }
+                    }
+                }
+            }
+            waitOpenMap.clear();
+        }
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3