Преглед на файлове

1.完成项太多了,懒得写 总之是为了重构待入库

JaycePC преди 7 месеца
родител
ревизия
d257b2a811
променени са 35 файла, в които са добавени 1332 реда и са изтрити 802 реда
  1. 0 42
      HttpCoreLibrary/src/main/java/com/rc/httpcore/bean/AddChemicalBean.java
  2. 73 10
      HttpCoreLibrary/src/main/java/com/rc/httpcore/bean/HxpChemicalVo.java
  3. 10 1
      HttpCoreLibrary/src/main/java/com/rc/httpcore/bean/TopicDataBean.kt
  4. 19 3
      HttpCoreLibrary/src/main/java/com/rc/httpcore/client/HttpTool.java
  5. 0 1
      HttpCoreLibrary/src/main/java/com/rc/httpcore/client/retrofit/ApiService.java
  6. 59 26
      app/src/main/java/com/example/chemical/receiver/ScanKeyEventHelper.kt
  7. 0 4
      app/src/main/java/com/example/chemical/ui/MainActivity.kt
  8. 0 4
      app/src/main/java/com/example/chemical/ui/login/FacialLoginActivity.kt
  9. 0 5
      app/src/main/java/com/example/chemical/ui/login/SwipeActivity.kt
  10. 1 2
      app/src/main/java/com/example/chemical/ui/plan/PlanAdapter.java
  11. 115 26
      app/src/main/java/com/example/chemical/ui/plan/PlanAddActivity.java
  12. 125 6
      app/src/main/java/com/example/chemical/ui/plan/PlanAddActivityHelp.java
  13. 28 0
      app/src/main/java/com/example/chemical/ui/plan/PlanAddData.java
  14. 64 41
      app/src/main/java/com/example/chemical/ui/plan/add/AddActivity.java
  15. 313 161
      app/src/main/java/com/example/chemical/ui/plan/add/AddActivityHelp.java
  16. 2 1
      app/src/main/java/com/example/chemical/ui/plan/locker/LockerFragment.java
  17. 3 0
      app/src/main/java/com/example/chemical/ui/plan/room/dao/HxpLabDirectorDAO.java
  18. 2 0
      app/src/main/java/com/example/chemical/ui/plan/room/dao/HxpLabSafeDAO.java
  19. 0 12
      app/src/main/java/com/example/chemical/ui/plan/save_list/SaveListActivity.java
  20. 1 1
      app/src/main/java/com/example/chemical/ui/plan/save_list/SaveListAdapter.java
  21. 32 223
      app/src/main/java/com/example/chemical/ui/plan/unlock/UnlockActivity.java
  22. 311 95
      app/src/main/java/com/example/chemical/ui/plan/unlock/UnlockActivityHelp.java
  23. 7 4
      app/src/main/java/com/example/chemical/ui/plan/unlock/UnlockAdapter.java
  24. 58 68
      app/src/main/java/com/example/chemical/ui/verify/DoubleVerifyActivity.java
  25. 6 6
      app/src/main/java/com/example/chemical/ui/verify/DoubleVerifyActivityHelp.java
  26. 6 8
      app/src/main/java/com/example/chemical/ui/verify/include/FaceDetectView.java
  27. 43 12
      app/src/main/java/com/example/chemical/weidith/BluetoothWeighDialog.java
  28. 23 23
      app/src/main/java/com/example/chemical/weidith/LabelDialog.kt
  29. 5 5
      app/src/main/java/com/example/chemical/weidith/prin_label_dialog/PrintLabelDialog.java
  30. 6 0
      app/src/main/res/drawable/selector_input_bt.xml
  31. 5 7
      app/src/main/res/layout/activity_add.xml
  32. 2 2
      app/src/main/res/layout/activity_plan_add.xml
  33. 13 3
      app/src/main/res/layout/dialog_bluetooth_weigh.xml
  34. BIN
      app/src/main/res/mipmap-xhdpi/icon_gzxx_zh.png
  35. BIN
      app/src/main/res/mipmap-xhdpi/img_gh_smsb.webp

+ 0 - 42
HttpCoreLibrary/src/main/java/com/rc/httpcore/bean/AddChemicalBean.java

@@ -1,42 +0,0 @@
-package com.rc.httpcore.bean;
-
-public class AddChemicalBean {
-    // ("化学平id")
-    private long chemicalId;
-    // ("化学品类别(参考字典表)")
-    private String chemicalCategory;
-    // ("化学品级别:1是管控,2是非管控")
-    private int chemicalLevel;
-    // ("创建时间")
-    private String createTime;
-    // ("化学品名称")
-    private String chemicalName;
-    // ("化学品类别")
-    private String chemicalCategoryName;
-    // ("化学品级别:1是管控,2是非管控")
-    private String chemicalLevelName;
-    // ("cas编号")
-    private String casNum;
-    // ("纯度")
-    private String chemicalPurity;
-    // ("密度")
-    private double chemicalDensity;
-    // ("化学品别名")
-    private String anotherName;
-    // ("存放规定单位")
-    private String depositUnit;
-    // ("规格值")
-    private double specNum;
-    // ("规格单位")
-    private String specUnit;
-    // ("包装值")
-    private double packNum;
-    // ("包装单位")
-    private String packUnit;
-    // 厂家
-    private String factory;
-    // 净含量
-    private double netWt;
-    // 重量
-    private String weight;
-}

+ 73 - 10
HttpCoreLibrary/src/main/java/com/rc/httpcore/bean/HxpChemicalVo.java

@@ -40,24 +40,87 @@ public class HxpChemicalVo implements Serializable {
     // 厂家
     private String factory;
     // 净含量
-    private double netWt;
+    private double netContent;
     // 重量
-    private String weight;
+    private String weigh;
 
-    public String getWeight() {
-        return weight;
+    // 归属人id
+    private long belongId;
+    // 归属人名字
+    private String belongName;
+    // 归属人归属类型,1课题组 2人员
+    private int belongType;
+    // 归属人工号
+    private String belongAccount;
+
+    // "马克思2:15222222220,熊学生:15200000001"
+    private String safeUser;
+    // "高安全:18700001202"
+    private String adminUser;
+
+
+    public String getBelongAccount() {
+        return belongAccount;
+    }
+
+    public void setBelongAccount(String belongAccount) {
+        this.belongAccount = belongAccount;
+    }
+
+    public long getBelongId() {
+        return belongId;
+    }
+
+    public void setBelongId(long belongId) {
+        this.belongId = belongId;
+    }
+
+    public String getBelongName() {
+        return belongName;
+    }
+
+    public void setBelongName(String belongName) {
+        this.belongName = belongName;
+    }
+
+    public int getBelongType() {
+        return belongType;
+    }
+
+    public void setBelongType(int belongType) {
+        this.belongType = belongType;
+    }
+
+    public String getSafeUser() {
+        return safeUser;
+    }
+
+    public void setSafeUser(String safeUser) {
+        this.safeUser = safeUser;
+    }
+
+    public String getAdminUser() {
+        return adminUser;
+    }
+
+    public void setAdminUser(String adminUser) {
+        this.adminUser = adminUser;
+    }
+
+    public String getWeigh() {
+        return weigh;
     }
 
-    public void setWeight(String weight) {
-        this.weight = weight;
+    public void setWeigh(String weigh) {
+        this.weigh = weigh;
     }
 
-    public double getNetWt() {
-        return netWt;
+    public double getNetContent() {
+        return netContent;
     }
 
-    public void setNetWt(double netWt) {
-        this.netWt = netWt;
+    public void setNetContent(double netContent) {
+        this.netContent = netContent;
     }
 
     public long getChemicalId() {

+ 10 - 1
HttpCoreLibrary/src/main/java/com/rc/httpcore/bean/TopicDataBean.kt

@@ -21,4 +21,13 @@ data class TopicDataBean(
     val userId: String,
     val userName: String,
     val userPhone: String
-) : Serializable
+) : Serializable {
+    constructor() : this(
+        "", 0L, "", "", "", "", "", false, 0, Any(), 0, "", "", 0L, "", "", "", ""
+    )
+
+    constructor(topicId: String, topicName: String) : this(
+        "", 0L, "", "", "", "", "", false, 0, Any(), 0, topicName, topicId, 0L, "", "", "", ""
+    )
+}
+

+ 19 - 3
HttpCoreLibrary/src/main/java/com/rc/httpcore/client/HttpTool.java

@@ -7,12 +7,12 @@ import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.rc.httpcore.HttpConfig;
 import com.rc.httpcore.OkHttpUtils;
-import com.rc.httpcore.bean.AddChemicalBean;
 import com.rc.httpcore.bean.HxpChemicalVo;
 import com.rc.httpcore.vo.request.FaceCompare1Req;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.List;
 
 import okhttp3.Response;
 
@@ -46,10 +46,26 @@ public final class HttpTool {
     }
 
     /**
+     * 待入库前校验待入库的化学品是否合法
+     */
+    public static Response addStockCheck(HxpChemicalVo hxpChemicalVo) throws IOException {
+        String json = GsonUtils.toJson(hxpChemicalVo);
+        LogUtils.d(json);
+        return OkHttpUtils.postSync(HttpConfig.Companion.getAPI_BASE_URL() + "chemical/aio/addStockCheck", json);
+    }
+
+    /**
+     * 根据化学品code查询化学品信息
+     */
+    public static Response scanCodeChemical(String code, String subId) throws IOException {
+        return OkHttpUtils.getSync(HttpConfig.Companion.getAPI_BASE_URL() + "chemical/stockWait/scanCodeChemical?" + "label=" + code + "&subId=" + subId);
+    }
+
+    /**
      * 入库
      */
-    public static Response addChemical(AddChemicalBean addChemicalBean) throws IOException {
-        return OkHttpUtils.postSync(HttpConfig.Companion.getAPI_BASE_URL() + "chemical/aio/addStock", GsonUtils.toJson(addChemicalBean));
+    public static Response addChemical(List<HxpChemicalVo> hxpChemicalList) throws IOException {
+        return OkHttpUtils.postSync(HttpConfig.Companion.getAPI_BASE_URL() + "chemical/aio/addStock", GsonUtils.toJson(hxpChemicalList));
     }
 
     /**

+ 0 - 1
HttpCoreLibrary/src/main/java/com/rc/httpcore/client/retrofit/ApiService.java

@@ -187,7 +187,6 @@ public interface ApiService {
     @GET("chemical/aio/backDetail")
     Observable<CommonDataResponse<ReturnDetailsBean>> backDetail(@Query("rfidCode") String rfidCode);
 
-    //归还化学品信息详情
     @GET("chemical/stockWait/scanCodeChemical")
     Observable<CommonDataResponse<ChemicalSearchBean>> scanCodeChemical(@Query("label") String label, @Query("subId") String subId);
 

+ 59 - 26
app/src/main/java/com/example/chemical/receiver/ScanKeyEventHelper.kt

@@ -2,10 +2,11 @@ package com.example.chemical.receiver
 
 import android.os.Handler
 import android.os.Looper
+import android.util.Log
 import android.view.KeyEvent
 import com.rc.core.log.RcLog
 
-class ScanKeyEventHelper (private val callback: ((content: String) -> Unit)? = null) {
+class ScanKeyEventHelper(private val callback: ((content: String) -> Unit)? = null) {
 
     private var mCaps = false
     private var mKeyContent = StringBuilder()
@@ -24,7 +25,7 @@ class ScanKeyEventHelper (private val callback: ((content: String) -> Unit)? = n
             if (mKeyContent.isNotEmpty()) callback?.invoke(mKeyContent.toString())
             mKeyContent.clear()
         } else {
-            decodeKeyCode(keyCode,event)?.let { keyChar ->
+            decodeKeyCode(keyCode, event)?.let { keyChar ->
                 mKeyContent.append(keyChar)
                 if (mKeyContent.toString().length == 1) {
                     Handler(Looper.getMainLooper()).postDelayed({
@@ -63,35 +64,67 @@ class ScanKeyEventHelper (private val callback: ((content: String) -> Unit)? = n
 //        }
 //    }
 
+//
+//    private fun decodeKeyCode(keyCode: Int,event: KeyEvent): Char? {
+//        val isShiftPressed = event.isShiftPressed
+//        RcLog.info("=======shifou $isShiftPressed  ${KeyEvent.KEYCODE_7}")
+//        return when (keyCode) {
+//            in KeyEvent.KEYCODE_0..KeyEvent.KEYCODE_9 -> {
+//                return if(14==KeyEvent.KEYCODE_7 &&isShiftPressed){
+//                    '&'
+//                }else{
+//                    // 0:48=0x30
+//                    (keyCode - KeyEvent.KEYCODE_0 + 0x30).toChar()
+//                }
+//            }
+//
+//            in KeyEvent.KEYCODE_A..KeyEvent.KEYCODE_Z -> {
+//                // a:97=0x61 A:65=0x41
+//                return (keyCode - KeyEvent.KEYCODE_A + if (isShiftPressed) 0x41 else 0x61).toChar()
+//            }
+//            KeyEvent.KEYCODE_PERIOD -> '.'
+//            KeyEvent.KEYCODE_MINUS -> if (isShiftPressed) '_' else '-'
+//            KeyEvent.KEYCODE_SLASH -> '/'
+//            KeyEvent.KEYCODE_BACKSLASH -> if (isShiftPressed) '|' else '\\'
+//            KeyEvent.KEYCODE_EQUALS -> '=' // 等号
+//
+//
+//            else -> {
+//                null
+//            }
+//        }
+//    }
 
-    private fun decodeKeyCode(keyCode: Int,event: KeyEvent): Char? {
+    /**
+     * 不知道乱写一通写的啥,总之处理了 但是结果是错的 勉强能用
+     * @author 前同事之作
+     */
+    private fun decodeKeyCode(keyCode: Int, event: KeyEvent): Char? {
         val isShiftPressed = event.isShiftPressed
         RcLog.info("=======shifou $isShiftPressed  ${KeyEvent.KEYCODE_7}")
-        return when (keyCode) {
-            in KeyEvent.KEYCODE_0..KeyEvent.KEYCODE_9 -> {
-                return if(14==KeyEvent.KEYCODE_7 &&isShiftPressed){
-                    '&'
-                }else{
-                    // 0:48=0x30
-                    (keyCode - KeyEvent.KEYCODE_0 + 0x30).toChar()
-                }
-            }
-
-            in KeyEvent.KEYCODE_A..KeyEvent.KEYCODE_Z -> {
-                // a:97=0x61 A:65=0x41
-                return (keyCode - KeyEvent.KEYCODE_A + if (isShiftPressed) 0x41 else 0x61).toChar()
-            }
-            KeyEvent.KEYCODE_PERIOD -> '.'
-            KeyEvent.KEYCODE_MINUS -> if (isShiftPressed) '_' else '-'
-            KeyEvent.KEYCODE_SLASH -> '/'
-            KeyEvent.KEYCODE_BACKSLASH -> if (isShiftPressed) '|' else '\\'
-            KeyEvent.KEYCODE_EQUALS -> '=' // 等号
 
-
-            else -> {
-                null
+        if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {
+            return if (KeyEvent.KEYCODE_7 == 14 && isShiftPressed) {
+                '&'
+            } else {
+                // 0:48=0x30
+                (keyCode - KeyEvent.KEYCODE_0 + 0x30).toChar()
             }
+        } else if (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {
+            // a:97=0x61 A:65=0x41
+            return (keyCode - KeyEvent.KEYCODE_A + if (isShiftPressed) 0x41 else 0x61).toChar()
+        } else if (keyCode == KeyEvent.KEYCODE_PERIOD) {
+            return '.'
+        } else if (keyCode == KeyEvent.KEYCODE_MINUS) {
+            return if (isShiftPressed) '_' else '-'
+        } else if (keyCode == KeyEvent.KEYCODE_SLASH) {
+            return '/'
+        } else if (keyCode == KeyEvent.KEYCODE_BACKSLASH) {
+            return if (isShiftPressed) '|' else '\\'
+        } else if (keyCode == KeyEvent.KEYCODE_EQUALS) {
+            return '=' // 等号
+        } else {
+            return null
         }
     }
-
 }

+ 0 - 4
app/src/main/java/com/example/chemical/ui/MainActivity.kt

@@ -358,10 +358,6 @@ class MainActivity : RcBaseActivity<ActivityMainBinding>() {
             UiManager.switcherCashier(this, SplashActivity::class.java)
         }
         getCabinetIn()
-        // TODO 测试通道
-        if (AppUtils.isAppDebug()) {
-            viewBinding.addChemicals.performClick()
-        }
     }
 
     /**

+ 0 - 4
app/src/main/java/com/example/chemical/ui/login/FacialLoginActivity.kt

@@ -112,10 +112,6 @@ class FacialLoginActivity : BaseCountDownActivity<ActivityFacialLoginBinding>()
             UiManager.switcher(this, map, SwipeActivity::class.java)
             finish()
         }
-        // TODO 测试通道
-        if (AppUtils.isAppDebug()) {
-            viewBinding.tvSwipe.performClick()
-        }
         //跳转扫码登录
         viewBinding.tvScan.setOnClickListener {
             UiManager.switcher(this, map, ScanLoginActivity::class.java)

+ 0 - 5
app/src/main/java/com/example/chemical/ui/login/SwipeActivity.kt

@@ -102,11 +102,6 @@ class SwipeActivity : BaseCountDownActivity<ActivitySwipeBinding>() {
             UiManager.switcher(this, map, ScanLoginActivity::class.java)
             finish()
         }
-
-        //TODO 测试通道
-        if (AppUtils.isAppDebug()) {
-            handleScanEvent("0459035363")
-        }
     }
 
 

+ 1 - 2
app/src/main/java/com/example/chemical/ui/plan/PlanAdapter.java

@@ -9,7 +9,6 @@ import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 
 import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.ToastUtils;
 import com.example.chemical.databinding.ItemInStorageBinding;
 import com.example.chemical.ui.plan.room.RoomTool;
 import com.example.chemical.ui.plan.room.dao.HxpInventoryDAO;
@@ -93,7 +92,7 @@ public class PlanAdapter extends BaseAdapter {
             String specUnit = hxpChemicalVo.getSpecUnit();
             binding.itemNormsTV.setText(specNum + (TextUtils.isEmpty(specUnit) ? "" : specUnit));
             // 净含量
-            double netWt = hxpChemicalVo.getNetWt();
+            double netWt = hxpChemicalVo.getNetContent();
             binding.itemNetWtTV.setText(netWt + (TextUtils.isEmpty(specUnit) ? "" : specUnit));
             // 数量
             int packNum = inventoryItemBean.getSize();

+ 115 - 26
app/src/main/java/com/example/chemical/ui/plan/PlanAddActivity.java

@@ -18,13 +18,15 @@ import androidx.fragment.app.Fragment;
 import androidx.viewpager2.widget.ViewPager2;
 
 import com.blankj.utilcode.util.ActivityUtils;
+import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ThreadUtils;
 import com.blankj.utilcode.util.TimeUtils;
-import com.blankj.utilcode.util.ToastUtils;
 import com.bumptech.glide.Glide;
 import com.example.chemical.ChemicalApp;
 import com.example.chemical.databinding.ActivityPlanAddBinding;
+import com.example.chemical.receiver.OnSerialScanListener;
+import com.example.chemical.receiver.PortScanHelper;
 import com.example.chemical.ui.SplashActivity;
 import com.example.chemical.ui.common.BaseCountDownActivity;
 import com.example.chemical.ui.plan.add.AddActivity;
@@ -32,25 +34,39 @@ import com.example.chemical.ui.plan.locker.LockerAdapter;
 import com.example.chemical.ui.plan.room.RoomTool;
 import com.example.chemical.ui.plan.room.bean.input_add.InventoryItemBean;
 import com.example.chemical.ui.plan.room.bean.locker.CabinetLayerSelect;
+import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetDoorVo;
+import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetLockVo;
 import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetVo;
 import com.example.chemical.ui.plan.room.dao.HxpCabinetDAO;
 import com.example.chemical.ui.plan.room.dao.HxpDoorDAO;
 import com.example.chemical.ui.plan.room.dao.HxpInventoryDAO;
+import com.example.chemical.ui.plan.room.dao.HxpLabDirectorDAO;
+import com.example.chemical.ui.plan.room.dao.HxpLabSafeDAO;
 import com.example.chemical.ui.plan.room.dao.HxpLayerDAO;
 import com.example.chemical.ui.plan.unlock.UnlockActivity;
 import com.example.chemical.utils.UiManager;
+import com.kongzue.dialogx.dialogs.PopTip;
 import com.rc.httpcore.HttpConfig;
-import com.rc.httpcore.bean.AddChemicalBean;
 import com.rc.httpcore.bean.ChemicalInfoBean;
-import com.rc.httpcore.client.HttpTool;
+import com.rc.httpcore.client.ApiRepository;
 
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
-
-import okhttp3.Response;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 待录入页面
@@ -74,6 +90,10 @@ public class PlanAddActivity extends BaseCountDownActivity<ActivityPlanAddBindin
     protected HxpDoorDAO hxpDoorDAO;
     // 柜层DAO
     protected HxpLayerDAO hxpLayerDAO;
+    // 实验室负责人DAO
+    protected HxpLabDirectorDAO labDirectorDAO;
+    // 实验室安全员DAO
+    protected HxpLabSafeDAO labSafeDAO;
     // 待入库清单item
     protected HxpInventoryDAO hxpInventoryDAO;
     // 柜子fragments
@@ -81,7 +101,8 @@ public class PlanAddActivity extends BaseCountDownActivity<ActivityPlanAddBindin
 
     private PlanAddActivityHelp planAddActivityHelp;
 
-    private ActivityResultLauncher<Intent> intentActivityResultLauncher;
+    protected ActivityResultLauncher<Intent> intentActivityResultLauncher;
+    protected PortScanHelper portScanHelper;
 
     @NonNull
     @Override
@@ -93,9 +114,18 @@ public class PlanAddActivity extends BaseCountDownActivity<ActivityPlanAddBindin
     protected void initViews(@Nullable Bundle savedInstanceState) {
         super.initViews(savedInstanceState);
         hxpCabinetDAO = RoomTool.getInstance().hxpCabinetDAO();
+        hxpCabinetDAO.deleteAll();
         hxpDoorDAO = RoomTool.getInstance().hxpDoorDAO();
+        hxpDoorDAO.deleteAll();
         hxpLayerDAO = RoomTool.getInstance().hxpLayerDAO();
+        hxpLayerDAO.deleteAll();
         hxpInventoryDAO = RoomTool.getInstance().hxpInventoryDAO();
+        hxpInventoryDAO.deleteAll();
+        labDirectorDAO = RoomTool.getInstance().hxpLabDirectorDAO();
+        labDirectorDAO.deleteAll();
+        labSafeDAO = RoomTool.getInstance().hxpLabSafeDAO();
+        labSafeDAO.deleteAll();
+
         planAddActivityHelp = new PlanAddActivityHelp(this);
         binding.lockerVP2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
             @Override
@@ -128,39 +158,90 @@ public class PlanAddActivity extends BaseCountDownActivity<ActivityPlanAddBindin
         binding.subAdd.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-
-                ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Object>() {
+                List<InventoryItemBean> inventoryItemBeans = hxpInventoryDAO.getAll();
+                if (null == inventoryItemBeans || inventoryItemBeans.isEmpty()) {
+                    PopTip.show("请录入化学品!");
+                    return;
+                }
+                showLoading("加载中...", false);
+                ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<String>() {
                     @Override
-                    public Object doInBackground() throws Throwable {
-
-
-
-                        Response response = HttpTool.addChemical(new AddChemicalBean());
-                        LogUtils.json(response);
-                        LogUtils.d(response.body().string());
-                        return null;
+                    public String doInBackground() throws Throwable {
+                        List<InventoryItemBean> inventoryItemBeanList = hxpInventoryDAO.getAll();
+                        List<HxpCabinetVo> cabinetList = hxpCabinetDAO.getAll();
+                        List<HxpCabinetDoorVo> doorList = hxpDoorDAO.getAll();
+                        // 删除清单外的柜门
+                        for (int i = 0; i < doorList.size(); i++) {
+                            HxpCabinetDoorVo doorVo = doorList.get(i);
+                            boolean hasDoorId = false;
+                            for (int j = 0; j < inventoryItemBeanList.size(); j++) {
+                                InventoryItemBean inventoryItemBean = inventoryItemBeanList.get(j);
+                                if (inventoryItemBean.getDoorId() == doorVo.getDoorId()) {
+                                    hasDoorId = true;
+                                    break;
+                                }
+                            }
+                            if (!hasDoorId) {
+                                doorList.remove(i);
+                                i--;
+                            }
+
+                        }
+                        // 删除没有智能锁的柜门
+                        Iterator<HxpCabinetDoorVo> doorVoIterator = doorList.iterator();
+                        while (doorVoIterator.hasNext()) {
+                            HxpCabinetDoorVo doorVo = doorVoIterator.next();
+                            List<HxpCabinetLockVo> hxpCabinetLockVoList = doorVo.getCabinetLockVoList();
+                            if (null == hxpCabinetLockVoList || hxpCabinetLockVoList.isEmpty()) {
+                                doorVoIterator.remove();
+                            } else {
+                                HxpCabinetLockVo cabinetLockVo = hxpCabinetLockVoList.get(0);
+                                if (2 != cabinetLockVo.getUnlockingMethod()) {
+                                    doorVoIterator.remove();
+                                }
+                            }
+                        }
+                        // 删除不需要开门的柜子
+                        Iterator<HxpCabinetVo> cabinetVoIterator = cabinetList.iterator();
+                        while (cabinetVoIterator.hasNext()) {
+                            HxpCabinetVo cabinetVo = cabinetVoIterator.next();
+                            boolean hasDoor = false;
+                            for (int i = 0; i < doorList.size(); i++) {
+                                HxpCabinetDoorVo doorVo = doorList.get(i);
+                                if (cabinetVo.getCabinetId() == doorVo.getCabinetId()) {
+                                    hasDoor = true;
+                                    break;
+                                }
+                            }
+                            if (!hasDoor) {
+                                cabinetVoIterator.remove();
+                            }
+                        }
+                        PlanAddData planAddData = new PlanAddData();
+                        planAddData.setCabinetList(cabinetList);
+                        planAddData.setDoorList(doorList);
+                        String json = GsonUtils.toJson(planAddData);
+                        LogUtils.d(json);
+                        return json;
                     }
 
                     @Override
-                    public void onSuccess(Object result) {
-
+                    public void onSuccess(String result) {
+                        dismissLoading();
+                        Intent intent = new Intent(PlanAddActivity.this, UnlockActivity.class);
+                        intent.putExtra("data", result);
+                        startActivity(intent);
+                        finish();
                     }
                 });
-
-//                List<InventoryItemBean> inventoryItemBeans = hxpInventoryDAO.getAll();
-//                if (null == inventoryItemBeans || inventoryItemBeans.isEmpty()) {
-//                    ToastUtils.showLong("请录入化学品!");
-//                    return;
-//                }
-//                ActivityUtils.startActivity(UnlockActivity.class);
             }
         });
+        planAddActivityHelp.updateInventoryUi();
     }
 
     @Override
     protected void initData() {
         super.initData();
-
         try {
             // 日期
             binding.nowTime.setText(TimeUtils.getNowString(new SimpleDateFormat("MM月dd日 EEEE ", Locale.getDefault())));
@@ -192,6 +273,7 @@ public class PlanAddActivity extends BaseCountDownActivity<ActivityPlanAddBindin
         }
     }
 
+
     /**
      * 获取实验室基本信息
      */
@@ -202,6 +284,9 @@ public class PlanAddActivity extends BaseCountDownActivity<ActivityPlanAddBindin
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
         // https://labcontrol.nwafu.edu.cn/api/?code=5020641&type=9
+        if (null != portScanHelper) {
+            portScanHelper.dispatchKeyEvent(event);
+        }
         return super.dispatchKeyEvent(event);
     }
 
@@ -209,6 +294,7 @@ public class PlanAddActivity extends BaseCountDownActivity<ActivityPlanAddBindin
     protected FragmentCallBack fragmentCallBack = new FragmentCallBack() {
         @Override
         public void onSelected(CabinetLayerSelect lastSelectInfo) {
+            planAddActivityHelp.startScanEventListener();
             planAddActivityHelp.selectCabinetLayer(lastSelectInfo);
         }
     };
@@ -219,6 +305,9 @@ public class PlanAddActivity extends BaseCountDownActivity<ActivityPlanAddBindin
         super.onDestroy();
         planAdapter.unregisterDataSetObserver(dataSetObserver);
         intentActivityResultLauncher.unregister();
+        if (null != portScanHelper) {
+            portScanHelper = null;
+        }
     }
 
     DataSetObserver dataSetObserver = new DataSetObserver() {

+ 125 - 6
app/src/main/java/com/example/chemical/ui/plan/PlanAddActivityHelp.java

@@ -1,13 +1,19 @@
 package com.example.chemical.ui.plan;
 
+import android.content.Intent;
+import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
 
+import androidx.annotation.NonNull;
+
 import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ThreadUtils;
-import com.blankj.utilcode.util.ToastUtils;
 import com.example.chemical.ChemicalApp;
+import com.example.chemical.receiver.OnSerialScanListener;
+import com.example.chemical.receiver.PortScanHelper;
+import com.example.chemical.ui.plan.add.AddActivity;
 import com.example.chemical.ui.plan.locker.LockerAdapter;
 import com.example.chemical.ui.plan.locker.LockerFragment;
 import com.example.chemical.ui.plan.room.RoomTool;
@@ -17,14 +23,23 @@ import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetDoorVo;
 import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetVo;
 import com.example.chemical.ui.plan.room.bean.locker.HxpLabCabinetListVo;
 import com.example.chemical.ui.plan.room.bean.locker.HxpLabCabinetVo;
-import com.example.chemical.ui.plan.room.bean.locker.HxpLabDirector;
-import com.example.chemical.ui.plan.room.bean.locker.HxpLabSafe;
+import com.kongzue.dialogx.dialogs.PopTip;
 import com.rc.httpcore.bean.ChemicalInfoBean;
+import com.rc.httpcore.bean.HxpChemicalVo;
 import com.rc.httpcore.client.ApiRepository;
 import com.rc.httpcore.client.HttpTool;
 import com.rc.httpcore.exception.NetException;
 
+import org.json.JSONObject;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import io.reactivex.functions.Consumer;
 import okhttp3.Response;
@@ -49,7 +64,7 @@ public class PlanAddActivityHelp {
         }, throwable -> {
             LogUtils.e(Log.getStackTraceString(throwable));
             activity.dismissLoading();
-            ToastUtils.showLong("实验室基本信息获取失败,请重试!");
+            PopTip.show("实验室基本信息获取失败,请重试!");
             activity.finish();
         }));
     }
@@ -117,7 +132,7 @@ public class PlanAddActivityHelp {
             @Override
             public void onFail(Throwable t) {
                 super.onFail(t);
-                ToastUtils.showLong("化学品柜获取失败,请重试!");
+                PopTip.show("化学品柜获取失败,请重试!");
                 activity.dismissLoading();
                 activity.finish();
             }
@@ -131,6 +146,7 @@ public class PlanAddActivityHelp {
         // 选择柜层数据库更新
         activity.hxpLayerDAO.insert(lastSelectInfo);
         activity.hxpLayerDAO.change(lastSelectInfo.getCabinetId(), lastSelectInfo.getDoorId(), lastSelectInfo.getLayer());
+        LogUtils.json(activity.hxpLayerDAO.getAll());
         // 更新待存储列表
         updateInventoryUi();
     }
@@ -140,6 +156,9 @@ public class PlanAddActivityHelp {
      * 更新待存储列表
      */
     public void updateInventoryUi() {
+        if (activity.binding.addIndexTV.getVisibility() == View.VISIBLE) {
+            activity.binding.addIndexTV.setVisibility(View.GONE);
+        }
         // 待存储列表更新
         CabinetLayerSelect cabinetLayerSelect = activity.hxpLayerDAO.getChanged();
         if (null != cabinetLayerSelect) {
@@ -148,7 +167,6 @@ public class PlanAddActivityHelp {
             // 展示待存储UI
             activity.binding.inputRL.setVisibility(View.VISIBLE);
             if (null != inventoryItemBeanList && !inventoryItemBeanList.isEmpty()) {
-                activity.binding.addIndexTV.setVisibility(View.GONE);
                 activity.binding.scanLL.setVisibility(View.GONE);
                 activity.binding.planLV.setVisibility(View.VISIBLE);
                 activity.inventoryItemBeanList.addAll(inventoryItemBeanList);
@@ -159,4 +177,105 @@ public class PlanAddActivityHelp {
             }
         }
     }
+
+    public void chemicalSearchByCode(String code) {
+        activity.showLoading("查询中...", false);
+        ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<HxpChemicalVo>() {
+            @Override
+            public HxpChemicalVo doInBackground() throws Throwable {
+                String message = "";
+                Response response = HttpTool.scanCodeChemical(code, ChemicalApp.subjectId);
+                if (response.isSuccessful()) {
+                    String json = response.body().string();
+                    JSONObject jsonObject = new JSONObject(json);
+                    if (200 == jsonObject.getInt("code")) {
+                        return GsonUtils.fromJson(jsonObject.getJSONObject("data").toString(), HxpChemicalVo.class);
+                    } else {
+                        message = jsonObject.getString("message");
+                    }
+                } else {
+                    message = response.message();
+                }
+                PopTip.show(message);
+                return null;
+            }
+
+            @Override
+            public void onSuccess(HxpChemicalVo result) {
+                if (result == null) {
+                    PopTip.show("未找到该化学品!");
+                } else {
+                    Intent intent = new Intent(activity, AddActivity.class);
+                    intent.putExtra("data", "qr");
+                    intent.putExtra("Chemical", GsonUtils.toJson(result));
+                    activity.intentActivityResultLauncher.launch(intent);
+                }
+                activity.dismissLoading();
+            }
+        });
+    }
+
+    public void startScanEventListener() {
+        if (activity.portScanHelper == null) {
+            activity.portScanHelper = new PortScanHelper(activity, (type, content) -> {
+                // https://labcontrol.nwafu.edu.cn/api/?code=5020641&type=9
+                Log.d("扫码", content);
+                boolean isGR = isValidDateTimeString(content);
+                Map<String, String> params = extractParameters(content);
+                // 是否国瑞的码
+                if (isGR) {
+                    chemicalSearchByCode(content);
+                    return;
+                }
+                // 是否忠江的码
+                else if (params != null) {
+                    String code = params.get("code");
+                    String qrType = params.get("type");
+                    if (!TextUtils.isEmpty(code) && !TextUtils.isEmpty(qrType)) {
+                        chemicalSearchByCode(code);
+                        return;
+                    }
+                }
+                // 无法识别码
+                PopTip.show("无效二维码/条形码,请手动录入或重试。");
+            });
+        }
+    }
+
+    private boolean isValidDateTimeString(String dateTimeString) {
+        try {
+            if (dateTimeString == null || dateTimeString.length() != 18) {
+                return false;
+            }
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmssSSSS", Locale.getDefault());
+            formatter.setLenient(false); // This is crucial for strict validation
+
+            formatter.parse(dateTimeString);
+            return true;
+        } catch (ParseException e) {
+            return false;
+        }
+    }
+
+    private Map<String, String> extractParameters(String inputString) {
+        try {
+            Map<String, String> parameters = new HashMap<>();
+            // Regular expression to match the parameters, ignoring the URL part
+            String regex = "code=([a-zA-Z0-9]+)&type=(\\d+)";
+            Pattern pattern = Pattern.compile(regex);
+            Matcher matcher = pattern.matcher(inputString);
+            if (matcher.find()) {
+                // Extract the values of code and type from the matched groups
+                String codeValue = matcher.group(1); // Group 1 is the value of code
+                String typeValue = matcher.group(2); // Group 2 is the value of type
+                parameters.put("code", codeValue);
+                parameters.put("type", typeValue);
+            }
+            return parameters;
+        } catch (Exception e) {
+            LogUtils.e(Log.getStackTraceString(e));
+        }
+        return null;
+    }
+
 }

+ 28 - 0
app/src/main/java/com/example/chemical/ui/plan/PlanAddData.java

@@ -0,0 +1,28 @@
+package com.example.chemical.ui.plan;
+
+import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetDoorVo;
+import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetVo;
+
+import java.util.List;
+
+public class PlanAddData {
+    private List<HxpCabinetVo> cabinetList;
+    private List<HxpCabinetDoorVo> doorList;
+
+    public List<HxpCabinetVo> getCabinetList() {
+        return cabinetList;
+    }
+
+    public void setCabinetList(List<HxpCabinetVo> cabinetList) {
+        this.cabinetList = cabinetList;
+    }
+
+    public List<HxpCabinetDoorVo> getDoorList() {
+        return doorList;
+    }
+
+    public void setDoorList(List<HxpCabinetDoorVo> doorList) {
+        this.doorList = doorList;
+    }
+
+}

+ 64 - 41
app/src/main/java/com/example/chemical/ui/plan/add/AddActivity.java

@@ -14,9 +14,10 @@ import androidx.activity.result.contract.ActivityResultContracts;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
+import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.ThreadUtils;
 import com.blankj.utilcode.util.TimeUtils;
-import com.blankj.utilcode.util.ToastUtils;
 import com.bumptech.glide.Glide;
 import com.example.chemical.ChemicalApp;
 import com.example.chemical.databinding.ActivityAddBinding;
@@ -34,6 +35,7 @@ import com.example.chemical.ui.plan.room.dao.HxpInventoryDAO;
 import com.example.chemical.ui.plan.room.dao.HxpLayerDAO;
 import com.example.chemical.utils.UiManager;
 import com.example.chemical.weidith.ChemicalTypeDialog;
+import com.kongzue.dialogx.dialogs.PopTip;
 import com.rc.httpcore.HttpConfig;
 import com.rc.httpcore.bean.BelongingPersonBean;
 import com.rc.httpcore.bean.ChemicalTypeBean;
@@ -46,6 +48,8 @@ import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.Locale;
 
+import io.reactivex.functions.Consumer;
+
 public class AddActivity extends BaseCountDownActivity<ActivityAddBinding> {
     protected ActivityAddBinding binding;
 
@@ -81,32 +85,6 @@ public class AddActivity extends BaseCountDownActivity<ActivityAddBinding> {
     @Override
     protected void initViews(@Nullable Bundle savedInstanceState) {
         super.initViews(savedInstanceState);
-        try {
-            // 日期
-            binding.nowTime.setText(TimeUtils.getNowString(new SimpleDateFormat("MM月dd日 EEEE ", Locale.getDefault())));
-            // 用户
-            Glide.with(this).load(HttpConfig.Companion.getAPI_BASE_IMG_URL() + ChemicalApp.userData.getAvatar()).into(binding.imageName);
-            String userName = ChemicalApp.userData.getUserName();
-            binding.tvName.setText(TextUtils.isEmpty(userName) ? "" : userName);
-            // 实验室logo
-            Glide.with(this).load(HttpConfig.Companion.getAPI_BASE_IMG_URL() + ChemicalApp.confs.getCircularLogo()).into(binding.image);
-            // 实验室名称
-            String subName = ChemicalApp.subjectName;
-            subName = TextUtils.isEmpty(subName) ? "" : subName;
-            // 房间号
-            String roomNum = ChemicalApp.subRoom;
-            roomNum = TextUtils.isEmpty(roomNum) ? "" : roomNum;
-            binding.deptName.setText(subName + "-" + roomNum);
-            // 退出
-            binding.tvOutLogin.setOnClickListener(v -> callLogoutApi(aBoolean -> {
-                ChemicalApp.userData = null;
-                ChemicalApp.subjectId = null;
-                UiManager.INSTANCE.switcherCashier(AddActivity.this, SplashActivity.class);
-                return null;
-            }));
-        } catch (Exception e) {
-            LogUtils.e(Log.getStackTraceString(e));
-        }
         // 化学品搜索
         binding.chemicalSearchBT.setOnClickListener(v -> {
             Editable chemicalSearchETText = binding.chemicalSearchET.getText();
@@ -166,20 +144,16 @@ public class AddActivity extends BaseCountDownActivity<ActivityAddBinding> {
             return true;
         });
         //  存储
-        binding.saveBT.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-            }
-        });
+        binding.saveBT.setOnClickListener(v -> addActivityHelp.save(false));
         //  称重存储
-        binding.weighSaveBT.setOnClickListener(v -> addActivityHelp.weighSave());
+        binding.weighSaveBT.setOnClickListener(v -> addActivityHelp.save(true));
         // ml选择
         binding.chemicalSpecMlRB.setOnClickListener(v -> {
             String ml = binding.chemicalSpecMlRB.getText().toString();
             hxpChemicalVo.setSpecUnit(ml);
             binding.netWtTV.setText(ml);
         });
-        // g选择
+        // 选择
         binding.chemicalSpecGRB.setOnClickListener(v -> {
             String g = binding.chemicalSpecGRB.getText().toString();
             hxpChemicalVo.setSpecUnit(g);
@@ -219,11 +193,67 @@ public class AddActivity extends BaseCountDownActivity<ActivityAddBinding> {
             }
         });
         binding.changeCabinetBT.setOnClickListener(v -> intentActivityResultLauncher.launch(new Intent(AddActivity.this, ChangeCabinetActivity.class)));
+
+        // 返回
+        binding.tvReturn.setOnClickListener(v -> finish());
     }
 
     @Override
     protected void initData() {
         super.initData();
+        showLoading("请稍等...", false);
+        // 化学品类别列表获取
+        addDisposable(ApiRepository.INSTANCE.getOptions("chemicals_category").subscribe(new Consumer<List<ChemicalTypeBean>>() {
+            @Override
+            public void accept(List<ChemicalTypeBean> chemicalTypeBeans) throws Exception {
+                initUi();
+                chemicalTypeList = chemicalTypeBeans;
+                Intent getIntent = getIntent();
+                if (null != getIntent && getIntent.hasExtra("data")) {
+                    String data = getIntent.getStringExtra("data");
+                    if ("qr".equals(data) && getIntent.hasExtra("Chemical")) {
+                        String json = getIntent.getStringExtra("Chemical");
+                        hxpChemicalVo = GsonUtils.fromJson(json, HxpChemicalVo.class);
+                        addActivityHelp.qrInit();
+                    }
+                }
+                dismissLoading();
+            }
+        }, throwable -> {
+            dismissLoading();
+            LogUtils.e(Log.getStackTraceString(throwable));
+            PopTip.show("化学品类别获取失败!");
+        }));
+        addActivityHelp = new AddActivityHelp(AddActivity.this);
+    }
+
+    private void initUi() {
+        try {
+            // 日期
+            binding.nowTime.setText(TimeUtils.getNowString(new SimpleDateFormat("MM月dd日 EEEE ", Locale.getDefault())));
+            // 用户
+            Glide.with(this).load(HttpConfig.Companion.getAPI_BASE_IMG_URL() + ChemicalApp.userData.getAvatar()).into(binding.imageName);
+            String userName = ChemicalApp.userData.getUserName();
+            binding.tvName.setText(TextUtils.isEmpty(userName) ? "" : userName);
+            // 实验室logo
+            Glide.with(this).load(HttpConfig.Companion.getAPI_BASE_IMG_URL() + ChemicalApp.confs.getCircularLogo()).into(binding.image);
+            // 实验室名称
+            String subName = ChemicalApp.subjectName;
+            subName = TextUtils.isEmpty(subName) ? "" : subName;
+            // 房间号
+            String roomNum = ChemicalApp.subRoom;
+            roomNum = TextUtils.isEmpty(roomNum) ? "" : roomNum;
+            binding.deptName.setText(subName + "-" + roomNum);
+            // 退出
+            binding.tvOutLogin.setOnClickListener(v -> callLogoutApi(aBoolean -> {
+                ChemicalApp.userData = null;
+                ChemicalApp.subjectId = null;
+                UiManager.INSTANCE.switcherCashier(AddActivity.this, SplashActivity.class);
+                return null;
+            }));
+        } catch (Exception e) {
+            LogUtils.e(Log.getStackTraceString(e));
+        }
         hxpCabinetDAO = RoomTool.getInstance().hxpCabinetDAO();
         hxpDoorDAO = RoomTool.getInstance().hxpDoorDAO();
         hxpLayerDAO = RoomTool.getInstance().hxpLayerDAO();
@@ -241,13 +271,6 @@ public class AddActivity extends BaseCountDownActivity<ActivityAddBinding> {
         int layer = cabinetLayerSelect.getLayer();
         binding.cabinetLayerSelectTV.setText(cabinetName + "-" + doorName + "-" + layer + "层");
         binding.cabinetLayerSelectTV.setSelected(true);
-        // 化学品类别列表获取
-        addDisposable(ApiRepository.INSTANCE.getOptions("chemicals_category").subscribe(chemicalTypeBeans -> chemicalTypeList = chemicalTypeBeans, throwable -> {
-            LogUtils.e(Log.getStackTraceString(throwable));
-            ToastUtils.showLong("化学品类别获取失败!");
-        }));
-
-        addActivityHelp = new AddActivityHelp(AddActivity.this);
     }
 
     @Override

+ 313 - 161
app/src/main/java/com/example/chemical/ui/plan/add/AddActivityHelp.java

@@ -2,20 +2,25 @@ package com.example.chemical.ui.plan.add;
 
 import android.app.Activity;
 import android.text.Editable;
+import android.text.InputType;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.View;
 
 import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ThreadUtils;
-import com.blankj.utilcode.util.ToastUtils;
 import com.example.chemical.ui.plan.room.bean.input_add.HxpChemical;
 import com.example.chemical.weidith.BelongingPersonDialog;
 import com.example.chemical.weidith.BluetoothWeighDialog;
 import com.example.chemical.weidith.SelectChemicalDialog;
 import com.example.chemical.weidith.SelectTopicDialog;
 import com.example.chemical.weidith.prin_label_dialog.PrintLabelDialog;
+import com.kongzue.dialogx.dialogs.PopTip;
+import com.rc.httpcore.bean.BelongingPersonBean;
+import com.rc.httpcore.bean.ChemicalTypeBean;
 import com.rc.httpcore.bean.HxpChemicalVo;
+import com.rc.httpcore.bean.TopicDataBean;
 import com.rc.httpcore.client.ApiRepository;
 import com.rc.httpcore.client.HttpTool;
 import com.rc.httpcore.exception.NetException;
@@ -29,11 +34,11 @@ import okhttp3.Response;
  * activity帮助类 不得占用上下文
  */
 public class AddActivityHelp {
-    private AddActivity addActivity;
+    private AddActivity activity;
 
     public AddActivityHelp(AddActivity addActivity) {
         super();
-        this.addActivity = addActivity;
+        this.activity = addActivity;
     }
 
     /**
@@ -42,19 +47,19 @@ public class AddActivityHelp {
      * @param userId 归属人ID
      */
     public void topicSearch(String userId) {
-        addActivity.showLoading("查询中...", false);
-        addActivity.addDisposable(ApiRepository.INSTANCE.getTopicList(userId).subscribe(topicDataBeans -> {
-            addActivity.dismissLoading();
-            new SelectTopicDialog(addActivity, topicDataBeans, topicDataBean -> {
-                addActivity.topicDataBean = topicDataBean;
+        activity.showLoading("查询中...", false);
+        activity.addDisposable(ApiRepository.INSTANCE.getTopicList(userId).subscribe(topicDataBeans -> {
+            activity.dismissLoading();
+            new SelectTopicDialog(activity, topicDataBeans, topicDataBean -> {
+                activity.topicDataBean = topicDataBean;
                 String topicName = topicDataBean.getTopicName();
-                addActivity.binding.topicET.setText(TextUtils.isEmpty(topicName) ? "" : topicName);
-                addActivity.binding.topicET.setTag(topicDataBean.getTopicId());
+                activity.binding.topicET.setText(TextUtils.isEmpty(topicName) ? "" : topicName);
+                activity.binding.topicET.setTag(topicDataBean.getTopicId());
             }).show();
         }, throwable -> {
             LogUtils.e(Log.getStackTraceString(throwable));
-            addActivity.dismissLoading();
-            addActivity.showNetError(throwable);
+            activity.dismissLoading();
+            activity.showNetError(throwable);
         }));
     }
 
@@ -62,24 +67,24 @@ public class AddActivityHelp {
      * 归属人搜索
      */
     public void belongSearch(Editable belongETText) {
-        addActivity.showLoading("查询中...", false);
-        addActivity.addDisposable(ApiRepository.INSTANCE.getSelects(belongETText.toString()).subscribe(belongingPersonBeans -> {
-            addActivity.dismissLoading();
-            new BelongingPersonDialog(addActivity, belongingPersonBeans, data -> {
-                addActivity.belongingPerson = data;
+        activity.showLoading("查询中...", false);
+        activity.addDisposable(ApiRepository.INSTANCE.getSelects(belongETText.toString()).subscribe(belongingPersonBeans -> {
+            activity.dismissLoading();
+            new BelongingPersonDialog(activity, belongingPersonBeans, data -> {
+                activity.belongingPerson = data;
                 String userName = data.getUserName();
                 userName = TextUtils.isEmpty(userName) ? "" : userName;
                 String account = data.getAccount();
                 account = TextUtils.isEmpty(account) ? "" : account;
-                addActivity.binding.belongET.setText(userName + "-" + account);
-                addActivity.binding.belongET.setTag(data.getUserId());
+                activity.binding.belongET.setText(userName + "-" + account);
+                activity.binding.belongET.setTag(data.getUserId());
             }).show();
         }, new Consumer<Throwable>() {
             @Override
             public void accept(Throwable throwable) throws Exception {
                 LogUtils.e(Log.getStackTraceString(throwable));
-                addActivity.dismissLoading();
-                addActivity.showNetError(throwable);
+                activity.dismissLoading();
+                activity.showNetError(throwable);
             }
         }));
     }
@@ -88,7 +93,7 @@ public class AddActivityHelp {
      * 化学品搜索
      */
     public void hxpSearch(Editable chemicalSearchETText) {
-        addActivity.showLoading("查询中...", false);
+        activity.showLoading("查询中...", false);
         ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<List<HxpChemicalVo>>() {
             @Override
             public List<HxpChemicalVo> doInBackground() throws Throwable {
@@ -112,8 +117,8 @@ public class AddActivityHelp {
 
             @Override
             public void onSuccess(List<HxpChemicalVo> hxpChemicalVoList) {
-                addActivity.dismissLoading();
-                new SelectChemicalDialog(addActivity, hxpChemicalVoList, new SelectChemicalDialog.SelectedListener() {
+                activity.dismissLoading();
+                new SelectChemicalDialog(activity, hxpChemicalVoList, new SelectChemicalDialog.SelectedListener() {
                     @Override
                     public void selected(HxpChemicalVo hxpChemicalVo) {
                         chemicalSearchResult(hxpChemicalVo);
@@ -125,8 +130,8 @@ public class AddActivityHelp {
             public void onFail(Throwable t) {
                 super.onFail(t);
                 LogUtils.e(Log.getStackTraceString(t));
-                addActivity.showNetError(t);
-                addActivity.dismissLoading();
+                activity.showNetError(t);
+                activity.dismissLoading();
             }
         });
     }
@@ -137,275 +142,422 @@ public class AddActivityHelp {
     private void chemicalSearchResult(HxpChemicalVo hxpChemicalVo) {
         // 化学品名
         String chemicalName = hxpChemicalVo.getChemicalName();
-        addActivity.binding.chemicalSearchET.setText(TextUtils.isEmpty(chemicalName) ? "" : chemicalName);
-        addActivity.hxpChemicalVo.setChemicalName(chemicalName);
+        activity.binding.chemicalSearchET.setText(TextUtils.isEmpty(chemicalName) ? "" : chemicalName);
+        activity.hxpChemicalVo.setChemicalName(chemicalName);
         // CAS
         String casNum = hxpChemicalVo.getCasNum();
-        addActivity.binding.casET.setText(TextUtils.isEmpty(casNum) ? "" : casNum);
-        addActivity.hxpChemicalVo.setCasNum(casNum);
+        activity.binding.casET.setText(TextUtils.isEmpty(casNum) ? "" : casNum);
+        activity.hxpChemicalVo.setCasNum(casNum);
         // 密度
         double chemicalDensity = hxpChemicalVo.getChemicalDensity();
-        addActivity.binding.chemicalDensityET.setText("" + chemicalDensity);
-        addActivity.hxpChemicalVo.setChemicalDensity(chemicalDensity);
+        activity.binding.chemicalDensityET.setText("" + chemicalDensity);
+        activity.hxpChemicalVo.setChemicalDensity(chemicalDensity);
         // 规格值
         double specNum = hxpChemicalVo.getSpecNum();
-        addActivity.binding.chemicalSpecET.setText("" + specNum);
-        addActivity.hxpChemicalVo.setSpecNum(specNum);
+        activity.binding.chemicalSpecET.setText("" + specNum);
+        activity.hxpChemicalVo.setSpecNum(specNum);
         // 规格单位 ml/g
         String specUnit = hxpChemicalVo.getSpecUnit();
         if ("ml".equals(specUnit)) {
-            addActivity.binding.chemicalSpecRG.check(addActivity.binding.chemicalSpecMlRB.getId());
-            addActivity.binding.netWtTV.setText("ml");
+            activity.binding.chemicalSpecRG.check(activity.binding.chemicalSpecMlRB.getId());
+            activity.binding.netWtTV.setText("ml");
         } else {
-            addActivity.binding.chemicalSpecRG.check(addActivity.binding.chemicalSpecGRB.getId());
-            addActivity.binding.netWtTV.setText("g");
+            activity.binding.chemicalSpecRG.check(activity.binding.chemicalSpecGRB.getId());
+            activity.binding.netWtTV.setText("g");
         }
-        addActivity.hxpChemicalVo.setSpecUnit(specUnit);
+        activity.hxpChemicalVo.setSpecUnit(specUnit);
         // 化学品类别
         String chemicalCategory = hxpChemicalVo.getChemicalCategory();
         String chemicalCategoryName = hxpChemicalVo.getChemicalCategoryName();
-        addActivity.binding.chemicalCategoryTV.setText(TextUtils.isEmpty(chemicalCategoryName) ? "" : chemicalCategoryName);
-        addActivity.binding.chemicalCategoryTV.setTag(chemicalCategory);
-        addActivity.hxpChemicalVo.setChemicalCategory(chemicalCategory);
+        activity.binding.chemicalCategoryTV.setText(TextUtils.isEmpty(chemicalCategoryName) ? "" : chemicalCategoryName);
+        activity.binding.chemicalCategoryTV.setTag(chemicalCategory);
+        activity.hxpChemicalVo.setChemicalCategory(chemicalCategory);
 
         // 管控
         if (hxpChemicalVo.getChemicalLevel() == 1) {
-            addActivity.binding.cmRG.check(addActivity.binding.controlledRB.getId());
+            activity.binding.cmRG.check(activity.binding.controlledRB.getId());
         }
         // 非管控
         else {
-            addActivity.binding.cmRG.check(addActivity.binding.uncontrolledRB.getId());
+            activity.binding.cmRG.check(activity.binding.uncontrolledRB.getId());
         }
-        addActivity.hxpChemicalVo.setChemicalLevel(hxpChemicalVo.getChemicalLevel());
+        activity.hxpChemicalVo.setChemicalLevel(hxpChemicalVo.getChemicalLevel());
         // 化学品id
-        addActivity.hxpChemicalVo.setChemicalId(hxpChemicalVo.getChemicalId());
+        activity.hxpChemicalVo.setChemicalId(hxpChemicalVo.getChemicalId());
     }
 
-    // 存储
-    public void weighSave() {
+    /**
+     * 添加待入库
+     *
+     * @param isWeigh 是否需要称重
+     */
+    public void save(boolean isWeigh) {
         // 化学品名
-        Editable chemicalSearchETText = addActivity.binding.chemicalSearchET.getText();
+        Editable chemicalSearchETText = activity.binding.chemicalSearchET.getText();
         if (null == chemicalSearchETText || TextUtils.isEmpty(chemicalSearchETText)) {
-            addActivity.binding.chemicalSearchET.setError("请输入化学品名称");
-            addActivity.binding.chemicalSearchET.requestFocus();
+            activity.binding.chemicalSearchET.setError("请输入化学品名称");
+            activity.binding.chemicalSearchET.requestFocus();
             return;
         }
-        addActivity.hxpChemicalVo.setChemicalName(chemicalSearchETText.toString());
+        activity.hxpChemicalVo.setChemicalName(chemicalSearchETText.toString());
 
         // CAS
-        Editable casETText = addActivity.binding.casET.getText();
+        Editable casETText = activity.binding.casET.getText();
         if (null == casETText || TextUtils.isEmpty(casETText)) {
-            addActivity.binding.casET.setError("请输入CAS码");
-            addActivity.binding.casET.requestFocus();
+            activity.binding.casET.setError("请输入CAS码");
+            activity.binding.casET.requestFocus();
             return;
         }
-        addActivity.hxpChemicalVo.setCasNum(casETText.toString());
+        activity.hxpChemicalVo.setCasNum(casETText.toString());
 
         // 类别
-        String categoryTVTag = (String) addActivity.binding.chemicalCategoryTV.getTag();
+        String categoryTVTag = (String) activity.binding.chemicalCategoryTV.getTag();
         if (null == categoryTVTag || TextUtils.isEmpty(categoryTVTag)) {
-            addActivity.binding.chemicalCategoryTV.setError("请选择化学品类别");
-            addActivity.binding.chemicalCategoryTV.requestFocus();
+            activity.binding.chemicalCategoryTV.setError("请选择化学品类别");
+            activity.binding.chemicalCategoryTV.requestFocus();
             return;
         }
-        addActivity.hxpChemicalVo.setChemicalCategory(categoryTVTag);
+        activity.hxpChemicalVo.setChemicalCategory(categoryTVTag);
 
-        CharSequence chemicalCategoryTVText = addActivity.binding.chemicalCategoryTV.getText();
+        CharSequence chemicalCategoryTVText = activity.binding.chemicalCategoryTV.getText();
         if (null == chemicalCategoryTVText || TextUtils.isEmpty(chemicalCategoryTVText)) {
-            addActivity.binding.chemicalCategoryTV.setError("请选择化学品类别");
-            addActivity.binding.chemicalCategoryTV.requestFocus();
+            activity.binding.chemicalCategoryTV.setError("请选择化学品类别");
+            activity.binding.chemicalCategoryTV.requestFocus();
             return;
         }
-        addActivity.hxpChemicalVo.setChemicalCategoryName(chemicalCategoryTVText.toString());
+        activity.hxpChemicalVo.setChemicalCategoryName(chemicalCategoryTVText.toString());
 
         // 规格
-        Editable chemicalSpecETText = addActivity.binding.chemicalSpecET.getText();
+        Editable chemicalSpecETText = activity.binding.chemicalSpecET.getText();
         if (null == chemicalSpecETText || TextUtils.isEmpty(chemicalSpecETText)) {
-            addActivity.binding.chemicalSpecET.setError("请输入规格");
-            addActivity.binding.chemicalSpecET.requestFocus();
+            activity.binding.chemicalSpecET.setError("请输入规格");
+            activity.binding.chemicalSpecET.requestFocus();
             return;
         }
         double specNum = -1.0;
         try {
             specNum = Double.parseDouble(chemicalSpecETText.toString());
         } catch (Exception e) {
-            addActivity.binding.chemicalSpecET.setError("请检查规格内容正确");
-            addActivity.binding.chemicalSpecET.requestFocus();
+            activity.binding.chemicalSpecET.setError("请检查规格内容正确");
+            activity.binding.chemicalSpecET.requestFocus();
             return;
         }
         if (specNum < 0) {
-            addActivity.binding.chemicalSpecET.setError("请检查规格内容正确");
-            addActivity.binding.chemicalSpecET.requestFocus();
+            activity.binding.chemicalSpecET.setError("请检查规格内容正确");
+            activity.binding.chemicalSpecET.requestFocus();
             return;
         }
-        addActivity.hxpChemicalVo.setSpecNum(specNum);
+        activity.hxpChemicalVo.setSpecNum(specNum);
 
         // 规格单位
-        if (addActivity.binding.chemicalSpecMlRB.getId() == addActivity.binding.chemicalSpecRG.getCheckedRadioButtonId()) {
-            addActivity.hxpChemicalVo.setSpecUnit("ml");
+        if (activity.binding.chemicalSpecMlRB.getId() == activity.binding.chemicalSpecRG.getCheckedRadioButtonId()) {
+            activity.hxpChemicalVo.setSpecUnit("ml");
         } else {
-            addActivity.hxpChemicalVo.setSpecUnit("g");
+            activity.hxpChemicalVo.setSpecUnit("g");
         }
 
         // 密度
-        Editable chemicalDensityETText = addActivity.binding.chemicalDensityET.getText();
+        Editable chemicalDensityETText = activity.binding.chemicalDensityET.getText();
         if (null == chemicalDensityETText || TextUtils.isEmpty(chemicalDensityETText)) {
-            addActivity.binding.chemicalDensityET.setError("请输入密度");
-            addActivity.binding.chemicalDensityET.requestFocus();
+            activity.binding.chemicalDensityET.setError("请输入密度");
+            activity.binding.chemicalDensityET.requestFocus();
             return;
         }
         double density = -1.0;
         try {
             density = Double.parseDouble(chemicalDensityETText.toString());
         } catch (Exception e) {
-            addActivity.binding.chemicalDensityET.setError("请检查密度内容正确");
-            addActivity.binding.chemicalDensityET.requestFocus();
+            activity.binding.chemicalDensityET.setError("请检查密度内容正确");
+            activity.binding.chemicalDensityET.requestFocus();
             return;
         }
         if (density <= 0) {
-            addActivity.binding.chemicalDensityET.setError("请检查密度内容正确");
-            addActivity.binding.chemicalDensityET.requestFocus();
+            activity.binding.chemicalDensityET.setError("请检查密度内容正确");
+            activity.binding.chemicalDensityET.requestFocus();
             return;
         }
-        addActivity.hxpChemicalVo.setChemicalDensity(density);
+        activity.hxpChemicalVo.setChemicalDensity(density);
 
         // 净含量
-        Editable netWtETText = addActivity.binding.netWtET.getText();
+        Editable netWtETText = activity.binding.netWtET.getText();
         if (null == netWtETText || TextUtils.isEmpty(netWtETText)) {
-            addActivity.binding.netWtET.setError("请输入净含量");
-            addActivity.binding.netWtET.requestFocus();
+            activity.binding.netWtET.setError("请输入净含量");
+            activity.binding.netWtET.requestFocus();
             return;
         }
         double netWt = -1.0;
         try {
             netWt = Double.parseDouble(netWtETText.toString());
         } catch (Exception e) {
-            addActivity.binding.netWtET.setError("请检查净含量内容正确");
-            addActivity.binding.netWtET.requestFocus();
+            activity.binding.netWtET.setError("请检查净含量内容正确");
+            activity.binding.netWtET.requestFocus();
             return;
         }
         if (netWt <= 0) {
-            addActivity.binding.netWtET.setError("请检查净含量内容正确");
-            addActivity.binding.netWtET.requestFocus();
+            activity.binding.netWtET.setError("请检查净含量内容正确");
+            activity.binding.netWtET.requestFocus();
             return;
         }
-        addActivity.hxpChemicalVo.setNetWt(netWt);
+        activity.hxpChemicalVo.setNetContent(netWt);
 
         // 数量
-        Editable sizeETText = addActivity.binding.sizeET.getText();
+        Editable sizeETText = activity.binding.sizeET.getText();
         if (null == sizeETText || TextUtils.isEmpty(sizeETText)) {
-            addActivity.binding.sizeET.setError("请输入数量");
-            addActivity.binding.sizeET.requestFocus();
+            activity.binding.sizeET.setError("请输入数量");
+            activity.binding.sizeET.requestFocus();
             return;
         }
         int size = -1;
         try {
             size = Integer.parseInt(sizeETText.toString());
         } catch (Exception e) {
-            addActivity.binding.sizeET.setError("请检查数量内容正确");
-            addActivity.binding.sizeET.requestFocus();
+            activity.binding.sizeET.setError("请检查数量内容正确");
+            activity.binding.sizeET.requestFocus();
             return;
         }
         if (size <= 0) {
-            addActivity.binding.sizeET.setError("请检查数量内容正确");
-            addActivity.binding.sizeET.requestFocus();
+            activity.binding.sizeET.setError("请检查数量内容正确");
+            activity.binding.sizeET.requestFocus();
             return;
         }
-        addActivity.inventoryItemBean.setSize(size);
+        activity.inventoryItemBean.setSize(size);
 
         // 归属人
-        String userId = (String) addActivity.binding.belongET.getTag();
-        if (addActivity.belongingPerson == null || addActivity.belongingPerson.getUserId().isEmpty() || null == userId || TextUtils.isEmpty(userId) || !addActivity.belongingPerson.getUserId().equals(userId)) {
-            addActivity.binding.belongET.setError("请先搜索并选择归属人");
-            addActivity.binding.belongET.requestFocus();
+        String userId = (String) activity.binding.belongET.getTag();
+        if (activity.belongingPerson == null || activity.belongingPerson.getUserId().isEmpty() || null == userId || TextUtils.isEmpty(userId) || !activity.belongingPerson.getUserId().equals(userId)) {
+            activity.binding.belongET.setError("请先搜索并选择归属人");
+            activity.binding.belongET.requestFocus();
             return;
         }
 
         /*-- 非必填 --*/
         // 纯度
-        Editable purityETText = addActivity.binding.purityET.getText();
+        Editable purityETText = activity.binding.purityET.getText();
         if (null != purityETText && !TextUtils.isEmpty(purityETText)) {
-            addActivity.hxpChemicalVo.setChemicalPurity(purityETText.toString());
+            activity.hxpChemicalVo.setChemicalPurity(purityETText.toString());
         }
         // 厂家
-        Editable factoryETText = addActivity.binding.factoryET.getText();
+        Editable factoryETText = activity.binding.factoryET.getText();
         if (null != factoryETText && !TextUtils.isEmpty(factoryETText)) {
-            addActivity.hxpChemicalVo.setFactory(factoryETText.toString());
+            activity.hxpChemicalVo.setFactory(factoryETText.toString());
         }
         // 课题组
-        Editable topicETText = addActivity.binding.topicET.getText();
+        Editable topicETText = activity.binding.topicET.getText();
         if (null != topicETText && !TextUtils.isEmpty(topicETText)) {
             // SQL课题组
-            addActivity.inventoryItemBean.setTopicDataBean(addActivity.topicDataBean);
+            activity.inventoryItemBean.setTopicDataBean(activity.topicDataBean);
         }
 
         // SQL化学品信息
-        addActivity.inventoryItemBean.setHxpChemicalVo(addActivity.hxpChemicalVo);
+        activity.inventoryItemBean.setHxpChemicalVo(activity.hxpChemicalVo);
         // SQL归属人信息
-        addActivity.inventoryItemBean.setBelongingPersonBean(addActivity.belongingPerson);
+        activity.inventoryItemBean.setBelongingPersonBean(activity.belongingPerson);
 
         // 化学品基础信息配置
-        addActivity.addDisposable(ApiRepository.INSTANCE.getControlConfigs(addActivity.hxpChemicalVo.getChemicalLevel()).subscribe(hxpControlConfig -> {
-            addActivity.hxpControlConfig = hxpControlConfig;
+        activity.addDisposable(ApiRepository.INSTANCE.getControlConfigs(activity.hxpChemicalVo.getChemicalLevel()).subscribe(hxpControlConfig -> {
+            activity.hxpControlConfig = hxpControlConfig;
             // 化学品新增确定
-            addActivity.addDisposable(ApiRepository.INSTANCE.certitude(addActivity.hxpChemicalVo).subscribe(hxpChemicalVo -> {
-                addActivity.hxpChemicalVo.setChemicalId(hxpChemicalVo.getChemicalId());
-                CharSequence charSequence = addActivity.binding.cabinetLayerSelectTV.getText();
-                new PrintLabelDialog(addActivity, addActivity.inventoryItemBean,
-                        TextUtils.isEmpty(charSequence) ? "" : charSequence.toString(),
-                        addActivity.hxpControlConfig.isQrCodePrint(),
-                        new PrintLabelDialog.PrintLabelCallBack() {
-                            @Override
-                            public void confirm() {
-                                BluetoothWeighDialog bluetoothWeighDialog = new BluetoothWeighDialog(addActivity, addActivity.hxpChemicalVo);
-                                bluetoothWeighDialog.setOnDismissListener(dialog -> {
-                                    addActivity.hxpInventoryDAO.insert(addActivity.inventoryItemBean);
-                                    addActivity.setResult(Activity.RESULT_OK);
-                                    addActivity.finish();
-                                });
-                                bluetoothWeighDialog.show();
-                            }
+            activity.addDisposable(ApiRepository.INSTANCE.certitude(activity.hxpChemicalVo).subscribe(hxpChemicalVo -> {
+                activity.hxpChemicalVo.setChemicalId(hxpChemicalVo.getChemicalId());
+                CharSequence charSequence = activity.binding.cabinetLayerSelectTV.getText();
+                // 是否是扫码添加化学品
+                if (isQR) {
+                    // 是否需要称重
+                    if (isWeigh) {
+                        startBluetoothWeigh();
+                    } else {
+                        saveEnd();
+                    }
+                } else {
+                    new PrintLabelDialog(activity, activity.inventoryItemBean,
+                            TextUtils.isEmpty(charSequence) ? "" : charSequence.toString(),
+                            activity.hxpControlConfig.isQrCodePrint(),
+                            new PrintLabelDialog.PrintLabelCallBack() {
+                                @Override
+                                public void confirm() {
+                                    startBluetoothWeigh();
+                                }
 
-                            @Override
-                            public void close() {
-                                ToastUtils.showLong("取消存储");
+                                @Override
+                                public void close() {
+                                    PopTip.show("取消存储");
+                                }
                             }
-                        }
-                ).show();
+                    ).show();
+                }
             }, throwable -> {
                 LogUtils.e(Log.getStackTraceString(throwable));
-                addActivity.showNetError(throwable);
+                activity.showNetError(throwable);
             }));
         }, throwable -> {
             LogUtils.e(Log.getStackTraceString(throwable));
-            addActivity.showNetError(throwable);
+            activity.showNetError(throwable);
         }));
     }
 
+    /**
+     * 启动称重
+     */
+    private void startBluetoothWeigh() {
+        BluetoothWeighDialog bluetoothWeighDialog = new BluetoothWeighDialog(activity, activity.hxpChemicalVo);
+        bluetoothWeighDialog.setOnDismissListener(dialog -> {
+            saveEnd();
+        });
+        bluetoothWeighDialog.show();
+    }
+
+    private void saveEnd() {
+        activity.hxpInventoryDAO.insert(activity.inventoryItemBean);
+        activity.setResult(Activity.RESULT_OK);
+        activity.finish();
+    }
+
+    private boolean isQR = false;
+
     public void reset() {
-        addActivity.hxpChemicalVo = null;
-        addActivity.hxpChemicalVo = new HxpChemicalVo();
-        addActivity.binding.chemicalSearchET.setText("");
-        addActivity.binding.chemicalSearchET.setTag(null);
-        addActivity.binding.chemicalSpecET.setText("");
-        addActivity.binding.chemicalSpecET.setTag(null);
-        addActivity.binding.casET.setText("");
-        addActivity.binding.casET.setTag(null);
-        addActivity.binding.chemicalSpecET.setText("");
-        addActivity.binding.chemicalSpecET.setTag(null);
-        addActivity.binding.chemicalDensityET.setText("");
-        addActivity.binding.chemicalDensityET.setTag(null);
-        addActivity.binding.netWtET.setText("");
-        addActivity.binding.netWtET.setTag(null);
-        addActivity.binding.sizeET.setText("");
-        addActivity.binding.sizeET.setTag(null);
-        addActivity.binding.purityET.setText("");
-        addActivity.binding.purityET.setTag(null);
-        addActivity.binding.belongET.setText("");
-        addActivity.binding.belongET.setTag(null);
-        addActivity.binding.topicET.setText("");
-        addActivity.binding.topicET.setTag(null);
-        addActivity.binding.factoryET.setText("");
-        addActivity.binding.factoryET.setTag(null);
+        activity.hxpChemicalVo = null;
+        activity.hxpChemicalVo = new HxpChemicalVo();
+        activity.binding.chemicalSearchET.setText("");
+        activity.binding.chemicalSearchET.setTag(null);
+        activity.binding.chemicalSpecET.setText("");
+        activity.binding.chemicalSpecET.setTag(null);
+        activity.binding.casET.setText("");
+        activity.binding.casET.setTag(null);
+        activity.binding.chemicalDensityET.setText("");
+        activity.binding.chemicalDensityET.setTag(null);
+        activity.binding.netWtET.setText("");
+        activity.binding.netWtET.setTag(null);
+        activity.binding.sizeET.setText("");
+        activity.binding.sizeET.setTag(null);
+        activity.binding.purityET.setText("");
+        activity.binding.purityET.setTag(null);
+        activity.binding.belongET.setText("");
+        activity.binding.belongET.setTag(null);
+        activity.binding.topicET.setText("");
+        activity.binding.topicET.setTag(null);
+        activity.binding.factoryET.setText("");
+        activity.binding.factoryET.setTag(null);
+    }
+
+    /**
+     * 扫码进入
+     */
+    public void qrInit() {
+        isQR = true;
+        HxpChemicalVo chemicalVo = activity.hxpChemicalVo;
+        // 化学品名
+        String chemicalName = chemicalVo.getChemicalName();
+        chemicalName = TextUtils.isEmpty(chemicalName) ? "" : chemicalName;
+        activity.binding.chemicalSearchET.setText(chemicalName);
+        // 规格
+        double specNum = chemicalVo.getSpecNum();
+        specNum = specNum < 0 ? 0 : specNum;
+        activity.binding.chemicalSpecET.setText("" + specNum);
+        String specUnit = chemicalVo.getSpecUnit();
+        if ("ml".equals(specUnit)) {
+            activity.binding.chemicalSpecRG.check(activity.binding.chemicalSpecMlRB.getId());
+            activity.binding.netWtTV.setText("ml");
+        } else if ("g".equals(specUnit)) {
+            activity.binding.chemicalSpecRG.check(activity.binding.chemicalSpecGRB.getId());
+            activity.binding.netWtTV.setText("g");
+        }
+        // cas
+        String casNum = chemicalVo.getCasNum();
+        casNum = TextUtils.isEmpty(casNum) ? "" : casNum;
+        activity.binding.casET.setText(casNum);
+        // 密度
+        double density = chemicalVo.getChemicalDensity();
+        density = density <= 0 ? 1 : density;
+        activity.binding.chemicalDensityET.setText("" + density);
+        // 净含量
+        double netWt = chemicalVo.getNetContent();
+        activity.binding.netWtET.setText("" + netWt);
+        // 数量
+        activity.binding.sizeET.setText("1");
+        // 纯度
+        String purity = chemicalVo.getChemicalPurity();
+        purity = TextUtils.isEmpty(purity) ? "" : purity;
+        activity.binding.purityET.setText(purity);
+        // 管控
+        if (chemicalVo.getChemicalLevel() == 1) {
+            activity.binding.cmRG.check(activity.binding.controlledRB.getId());
+        }
+        // 非管控
+        else {
+            activity.binding.cmRG.check(activity.binding.uncontrolledRB.getId());
+        }
+
+        // 归属人
+        if (2 == chemicalVo.getBelongType()) {
+            activity.belongingPerson = new BelongingPersonBean(String.valueOf(chemicalVo.getBelongId()), chemicalVo.getBelongName(), chemicalVo.getBelongAccount(), null, null);
+            String belongName = activity.belongingPerson.getUserName();
+            String belongAccount = activity.belongingPerson.getAccount();
+            belongName = TextUtils.isEmpty(belongName) ? "" : belongName;
+            belongAccount = TextUtils.isEmpty(belongAccount) ? "" : belongAccount;
+            activity.binding.belongET.setText(belongName + "-" + belongAccount);
+            activity.binding.belongET.setEnabled(false);
+            activity.binding.belongET.setInputType(InputType.TYPE_NULL);
+            activity.binding.belongBT.setEnabled(false);
+        }
+        // 课题组
+        else {
+            activity.topicDataBean = new TopicDataBean(String.valueOf(chemicalVo.getBelongId()), chemicalVo.getBelongName());
+            String topicName = activity.topicDataBean.getTopicName();
+            topicName = TextUtils.isEmpty(topicName) ? "" : topicName;
+            activity.binding.topicET.setText(topicName);
+            activity.binding.topicET.setEnabled(false);
+            activity.binding.topicET.setInputType(InputType.TYPE_NULL);
+            activity.binding.topicBT.setEnabled(false);
+        }
+        // 厂家
+        String factory = chemicalVo.getFactory();
+        factory = TextUtils.isEmpty(factory) ? "" : factory;
+        activity.binding.factoryET.setText(factory);
+        // 类别
+        String chemicalCategory = chemicalVo.getChemicalCategory();
+        activity.binding.chemicalCategoryTV.setTag(chemicalCategory);
+        if (null != activity.chemicalTypeList && !activity.chemicalTypeList.isEmpty()) {
+            for (int i = 0; i < activity.chemicalTypeList.size(); i++) {
+                ChemicalTypeBean chemicalTypeBean = activity.chemicalTypeList.get(i);
+                if (chemicalTypeBean.getValue().equals(chemicalCategory)) {
+                    chemicalVo.setChemicalCategoryName(chemicalTypeBean.getLabel());
+                    String chemicalCategoryName = chemicalVo.getChemicalCategoryName();
+                    activity.binding.chemicalCategoryTV.setText(TextUtils.isEmpty(chemicalCategoryName) ? "" : chemicalCategoryName);
+                    break;
+                }
+            }
+        }
+        {
+            activity.binding.chemicalSearchET.setEnabled(false);
+            activity.binding.chemicalSearchET.setInputType(InputType.TYPE_NULL);
+            activity.binding.chemicalSpecET.setEnabled(false);
+            activity.binding.chemicalSpecET.setInputType(InputType.TYPE_NULL);
+            activity.binding.casET.setEnabled(false);
+            activity.binding.casET.setInputType(InputType.TYPE_NULL);
+            activity.binding.chemicalSpecET.setEnabled(false);
+            activity.binding.chemicalSpecET.setInputType(InputType.TYPE_NULL);
+            activity.binding.chemicalDensityET.setEnabled(false);
+            activity.binding.chemicalDensityET.setInputType(InputType.TYPE_NULL);
+            activity.binding.netWtET.setEnabled(false);
+            activity.binding.netWtET.setInputType(InputType.TYPE_NULL);
+            activity.binding.sizeET.setEnabled(false);
+            activity.binding.sizeET.setInputType(InputType.TYPE_NULL);
+            activity.binding.purityET.setEnabled(false);
+            activity.binding.purityET.setInputType(InputType.TYPE_NULL);
+            activity.binding.factoryET.setEnabled(false);
+            activity.binding.factoryET.setInputType(InputType.TYPE_NULL);
+            activity.binding.chemicalCategoryTV.setClickable(false);
+            activity.binding.chemicalCategoryTV.setEnabled(false);
+
+            activity.binding.chemicalSearchBT.setEnabled(false);
+            activity.binding.casBT.setEnabled(false);
+            activity.binding.resetBT.setVisibility(View.GONE);
+            activity.binding.saveBT.setVisibility(View.VISIBLE);
+            activity.binding.uncontrolledRB.setEnabled(false);
+            activity.binding.controlledRB.setEnabled(false);
+            activity.binding.chemicalSpecMlRB.setEnabled(false);
+            activity.binding.chemicalSpecGRB.setEnabled(false);
+        }
+
     }
 }

+ 2 - 1
app/src/main/java/com/example/chemical/ui/plan/locker/LockerFragment.java

@@ -208,6 +208,7 @@ public class LockerFragment extends Fragment {
     private final View.OnClickListener onClickDoorUpListener = new View.OnClickListener() {
         @Override
         public void onClick(View v) {
+            binding.lockerDownDrawerRG.clearCheck();
             int layer = 0;
             if (binding.lockerUpDrawer1RB.getId() == v.getId()) {
                 layer = 1;
@@ -232,6 +233,7 @@ public class LockerFragment extends Fragment {
     private final View.OnClickListener onClickDoorDownListener = new View.OnClickListener() {
         @Override
         public void onClick(View v) {
+            binding.lockerUpDrawerRG.clearCheck();
             int layer = 0;
             if (binding.lockerDownDrawer1RB.getId() == v.getId()) {
                 layer = 1;
@@ -242,7 +244,6 @@ public class LockerFragment extends Fragment {
             } else if (binding.lockerDownDrawer4RB.getId() == v.getId()) {
                 layer = 4;
             }
-            LogUtils.d("下柜", layer + "层");
             fragmentCallBack.onSelected(new CabinetLayerSelect(hxpCabinetVo.getCabinetId(), doorVoList.get(1).getDoorId(), layer));
         }
     };

+ 3 - 0
app/src/main/java/com/example/chemical/ui/plan/room/dao/HxpLabDirectorDAO.java

@@ -22,4 +22,7 @@ public interface HxpLabDirectorDAO {
     @Query("SELECT * FROM hxplabdirector")
     List<HxpLabDirector> getAll();
 
+    @Query("DELETE FROM hxplabdirector")
+    void deleteAll();
+
 }

+ 2 - 0
app/src/main/java/com/example/chemical/ui/plan/room/dao/HxpLabSafeDAO.java

@@ -19,4 +19,6 @@ public interface HxpLabSafeDAO {
     @Query("SELECT * FROM hxplabsafe")
     List<HxpLabSafe> getAll();
 
+    @Query("DELETE FROM hxplabsafe")
+    void deleteAll();
 }

+ 0 - 12
app/src/main/java/com/example/chemical/ui/plan/save_list/SaveListActivity.java

@@ -1,37 +1,25 @@
 package com.example.chemical.ui.plan.save_list;
 
 import android.os.Bundle;
-import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
-import com.blankj.utilcode.util.GsonUtils;
-import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.ThreadUtils;
 import com.example.chemical.databinding.ActivitySaveListBinding;
 import com.example.chemical.ui.common.BaseCountDownActivity;
 import com.example.chemical.ui.plan.room.RoomTool;
 import com.example.chemical.ui.plan.room.bean.input_add.InventoryItemBean;
 import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetDoorVo;
-import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetLockVo;
 import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetVo;
 import com.example.chemical.ui.plan.room.dao.HxpCabinetDAO;
 import com.example.chemical.ui.plan.room.dao.HxpDoorDAO;
 import com.example.chemical.ui.plan.room.dao.HxpInventoryDAO;
-import com.rc.httpcore.bean.AddChemicalBean;
-import com.rc.httpcore.bean.StockModel;
-import com.rc.httpcore.client.ApiRepository;
-import com.rc.httpcore.client.HttpTool;
 
 import java.util.ArrayList;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
-import okhttp3.Response;
-
 public class SaveListActivity extends BaseCountDownActivity<ActivitySaveListBinding> {
 
     protected ActivitySaveListBinding binding;

+ 1 - 1
app/src/main/java/com/example/chemical/ui/plan/save_list/SaveListAdapter.java

@@ -110,7 +110,7 @@ public class SaveListAdapter extends BaseAdapter {
                     specUnit = TextUtils.isEmpty(specUnit) ? "" : specUnit;
                     viewHolder.binding.specs.setText(specNum + "/" + specUnit);
                     // 净含量
-                    double netWt = chemicalVo.getNetWt();
+                    double netWt = chemicalVo.getNetContent();
                     viewHolder.binding.netWT.setText(netWt + specUnit);
                     // 数量
                     int size = inventoryItemBean.getSize();

+ 32 - 223
app/src/main/java/com/example/chemical/ui/plan/unlock/UnlockActivity.java

@@ -10,37 +10,13 @@ import androidx.activity.result.contract.ActivityResultContracts;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
-import com.blankj.utilcode.util.ActivityUtils;
 import com.blankj.utilcode.util.GsonUtils;
-import com.blankj.utilcode.util.ThreadUtils;
 import com.example.chemical.databinding.ActivityUnlockBinding;
 import com.example.chemical.ui.common.BaseCountDownActivity;
-import com.example.chemical.ui.plan.room.RoomTool;
-import com.example.chemical.ui.plan.room.bean.input_add.InventoryItemBean;
-import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetAdminVo;
-import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetDoorVo;
-import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetLockVo;
-import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetVo;
-import com.example.chemical.ui.plan.room.bean.locker.HxpLabDirector;
-import com.example.chemical.ui.plan.room.bean.locker.HxpLabSafe;
-import com.example.chemical.ui.plan.room.dao.HxpCabinetDAO;
-import com.example.chemical.ui.plan.room.dao.HxpDoorDAO;
-import com.example.chemical.ui.plan.room.dao.HxpInventoryDAO;
-import com.example.chemical.ui.plan.save_list.SaveListActivity;
+import com.example.chemical.ui.plan.PlanAddData;
 import com.example.chemical.ui.verify.DoubleVerifyActivity;
-import com.rc.httpcore.bean.HxpChemicalVo;
 import com.rc.httpcore.bean.UserValidationBean;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import kotlin.Triple;
-
 public class UnlockActivity extends BaseCountDownActivity<ActivityUnlockBinding> {
     protected ActivityUnlockBinding binding;
     private ActivityResultLauncher<Intent> intentActivityResultLauncher;
@@ -66,214 +42,47 @@ public class UnlockActivity extends BaseCountDownActivity<ActivityUnlockBinding>
     @Override
     protected void initViews(@Nullable Bundle savedInstanceState) {
         super.initViews(savedInstanceState);
-        activityHelp = new UnlockActivityHelp(this);
-        HxpCabinetDAO hxpCabinetDAO = RoomTool.getInstance().hxpCabinetDAO();
-        HxpDoorDAO hxpDoorDAO = RoomTool.getInstance().hxpDoorDAO();
-        HxpInventoryDAO hxpInventoryDAO = RoomTool.getInstance().hxpInventoryDAO();
-
-        List<InventoryItemBean> inventoryItemBeanList = hxpInventoryDAO.getAll();
-        for (int i = 0; i < inventoryItemBeanList.size(); i++) {
-            InventoryItemBean inventoryItemBean = inventoryItemBeanList.get(i);
-            HxpChemicalVo hxpChemicalVo = inventoryItemBean.getHxpChemicalVo();
-            if (1 == hxpChemicalVo.getChemicalLevel()) {
-                isControl = true;
-                break;
-            }
-        }
-
-        // 柜门信息理应需要从柜门表中遍历塞到柜子中  观察数据是否异常
-        List<HxpCabinetVo> cabinetList = hxpCabinetDAO.getAll();
-        List<HxpCabinetDoorVo> doorList = hxpDoorDAO.getAll();
-        List<HxpCabinetLockVo> unlockList = new ArrayList<>();
-        Iterator<HxpCabinetDoorVo> doorVoIterator = doorList.iterator();
-
-        // 删除不需要开门的柜门
-        while (doorVoIterator.hasNext()) {
-            HxpCabinetDoorVo doorVo = doorVoIterator.next();
-            List<HxpCabinetLockVo> lockVoList = doorVo.getCabinetLockVoList();
-            if (null == lockVoList || lockVoList.isEmpty()) {
-                doorVoIterator.remove();
-            } else {
-                Iterator<HxpCabinetLockVo> lockVoIterator = lockVoList.iterator();
-                while (lockVoIterator.hasNext()) {
-                    HxpCabinetLockVo lockVo = lockVoIterator.next();
-                    if (lockVo.getUnlockingMethod() != 2) {
-                        lockVoIterator.remove();
-                    }
-                }
-                if (lockVoList.isEmpty()) {
-                    doorVoIterator.remove();
-                }
-            }
-        }
-        // 删除不需要开门的柜子
-        Iterator<HxpCabinetVo> cabinetVoIterator = cabinetList.iterator();
-        while (cabinetVoIterator.hasNext()) {
-            HxpCabinetVo cabinetVo = cabinetVoIterator.next();
-            boolean hasDoor = false;
-            for (int i = 0; i < doorList.size(); i++) {
-                HxpCabinetDoorVo doorVo = doorList.get(i);
-                if (cabinetVo.getCabinetId() == doorVo.getCabinetId()) {
-                    hasDoor = true;
-                    break;
-                }
-            }
-            if (!hasDoor) {
-                cabinetVoIterator.remove();
-            }
-        }
-
-        // 需要开锁的柜子
-        for (int i = 0; i < doorList.size(); i++) {
-            HxpCabinetDoorVo doorVo = doorList.get(i);
-            List<HxpCabinetLockVo> lockVoList = doorVo.getCabinetLockVoList();
-            unlockList.addAll(lockVoList);
-        }
-
-        if (!unlockList.isEmpty()) {
-            ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Triple<String, String, String>>() {
-                @Override
-                public Triple<String, String, String> doInBackground() throws Throwable {
-                    // 公共柜门管理员
-                    String adminInfo = "", directorInfo = "", safeInfo = "";
-                    List<HxpCabinetAdminVo> cabinetAdminVoList = getCommonAdminUserIds(doorList);
-                    if (null != cabinetAdminVoList && !cabinetAdminVoList.isEmpty()) {
-                        HxpCabinetAdminVo admin = cabinetAdminVoList.get(0);
-                        adminInfo = admin.getUserName() + " " + admin.getPhone();
-                        if (cabinetAdminVoList.size() > 1) {
-                            StringBuilder sb = new StringBuilder();
-                            for (int i = 0; i < cabinetAdminVoList.size(); i++) {
-                                HxpCabinetAdminVo adminVo = cabinetAdminVoList.get(i);
-                                sb.append(adminVo.getUserName());
-                                sb.append(" ");
-                                sb.append(adminVo.getPhone());
-                                sb.append("\n");
-                            }
-                            sb.delete(sb.length() - 1, sb.length());
-                            adminInfo = sb.toString();
+        Intent getIntent = getIntent();
+        if (null != getIntent && getIntent.hasExtra("data")) {
+            String json = getIntent.getStringExtra("data");
+            if (null != json && !TextUtils.isEmpty(json)) {
+                PlanAddData planAddData = GsonUtils.fromJson(json, PlanAddData.class);
+                activityHelp = new UnlockActivityHelp(this, planAddData);
+
+                intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
+                    if (result.getResultCode() == RESULT_OK) {
+                        Intent intent = result.getData();
+                        if (null != intent && intent.hasExtra("userValidation1") && intent.hasExtra("userValidation2")) {
+                            userValidation1 = GsonUtils.fromJson(intent.getStringExtra("userValidation1"), UserValidationBean.class);
+                            userValidation2 = GsonUtils.fromJson(intent.getStringExtra("userValidation2"), UserValidationBean.class);
                         }
+                        binding.validateBT.setVisibility(View.GONE);
+                        binding.unlockLL.setVisibility(View.VISIBLE);
+                        activityHelp.unlock(userValidation1, userValidation2);
                     }
-                    // 实验室负责人
-                    List<HxpLabDirector> hxpLabDirectorList = RoomTool.getInstance().hxpLabDirectorDAO().getAll();
-                    if (null != hxpLabDirectorList && !hxpLabDirectorList.isEmpty()) {
-                        HxpLabDirector labDirector = hxpLabDirectorList.get(0);
-                        directorInfo = labDirector.getUserName() + " " + labDirector.getMobile();
-                        if (hxpLabDirectorList.size() > 1) {
-                            StringBuilder sb = new StringBuilder();
-                            for (int i = 0; i < hxpLabDirectorList.size(); i++) {
-                                HxpLabDirector director = hxpLabDirectorList.get(i);
-                                sb.append(director.getUserName());
-                                sb.append(" ");
-                                sb.append(director.getMobile());
-                                sb.append("\n");
-                            }
-                            sb.delete(sb.length() - 1, sb.length());
-                            directorInfo = sb.toString();
-                        }
-                    }
-                    // 实验室安全员
-                    List<HxpLabSafe> labSafeList = RoomTool.getInstance().hxpLabSafeDAO().getAll();
-                    if (null != labSafeList && !labSafeList.isEmpty()) {
-                        HxpLabSafe safe = labSafeList.get(0);
-                        safeInfo = safe.getUserName() + " " + safe.getMobile();
-                        if (labSafeList.size() > 1) {
-                            StringBuilder sb = new StringBuilder();
-                            for (int i = 0; i < labSafeList.size(); i++) {
-                                HxpLabSafe labSafe = labSafeList.get(i);
-                                sb.append(labSafe.getUserName());
-                                sb.append(" ");
-                                sb.append(labSafe.getMobile());
-                                sb.append("\n");
-                            }
-                            sb.delete(sb.length() - 1, sb.length());
-                            safeInfo = sb.toString();
-                        }
+                });
+                binding.validateBT.setOnClickListener(v -> intentActivityResultLauncher.launch(new Intent(UnlockActivity.this, DoubleVerifyActivity.class)));
+
+                binding.retryBT.setOnClickListener(v -> activityHelp.reTryUnlock());
+                binding.saveBT.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        activityHelp.save();
                     }
-
-                    return new Triple<>(adminInfo, directorInfo, safeInfo);
-                }
-
-                @Override
-                public void onSuccess(Triple<String, String, String> result) {
-                    String adminInfo = result.getFirst();
-                    String directorInfo = result.getSecond();
-                    String safeInfo = result.getThird();
-                    binding.adminTV.setText(TextUtils.isEmpty(adminInfo) ? "" : adminInfo);
-                    binding.directorTV.setText(TextUtils.isEmpty(directorInfo) ? "" : directorInfo);
-                    binding.safetyTV.setText(TextUtils.isEmpty(safeInfo) ? "" : safeInfo);
-                }
-            });
-        }
-
-        binding.cabinetTV.setText(cabinetList.size() + "个");
-        binding.doorTV.setText(doorList.size() + "个");
-        unlockAdapter = new UnlockAdapter(this, cabinetList, doorList);
-        binding.unlockGV.setAdapter(unlockAdapter);
-
-        intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
-            if (result.getResultCode() == RESULT_OK) {
-                Intent intent = result.getData();
-                if (null != intent && intent.hasExtra("userValidation1") && intent.hasExtra("userValidation2")) {
-                    userValidation1 = GsonUtils.fromJson(intent.getStringExtra("userValidation1"), UserValidationBean.class);
-                    userValidation2 = GsonUtils.fromJson(intent.getStringExtra("userValidation2"), UserValidationBean.class);
-                }
-                binding.validateBT.setVisibility(View.GONE);
-                binding.unlockLL.setVisibility(View.VISIBLE);
-                activityHelp.unlock(unlockList, cabinetList, doorList, userValidation1, userValidation2);
+                });
             }
-        });
-        binding.validateBT.setOnClickListener(v -> intentActivityResultLauncher.launch(new Intent(UnlockActivity.this, DoubleVerifyActivity.class)));
-
-        binding.retryBT.setOnClickListener(v -> activityHelp.reTryUnlock());
-        binding.saveBT.setOnClickListener(v -> ActivityUtils.startActivity(SaveListActivity.class));
+        }
     }
 
     @Override
     protected void onDestroy() {
         super.onDestroy();
-        intentActivityResultLauncher.unregister();
-    }
-
-    public static List<HxpCabinetAdminVo> getCommonAdminUserIds(List<HxpCabinetDoorVo> doorList) {
-        if (doorList == null || doorList.isEmpty()) {
-            return null;
+        if (null != intentActivityResultLauncher) {
+            intentActivityResultLauncher.unregister();
         }
-        Map<Long, Integer> userIdCount = new HashMap<Long, Integer>();
-        int totalDoors = doorList.size();
-
-        // 统计所有 UserId 的出现次数
-        for (HxpCabinetDoorVo door : doorList) {
-            Set<Long> uniqueIds = new HashSet<Long>(); // 记录当前 Door 的唯一 UserId,防止重复计数
-            for (HxpCabinetAdminVo admin : door.getCabinetAdminVoList()) {
-                uniqueIds.add(admin.getUserId());
-            }
-            for (Long userId : uniqueIds) {
-                userIdCount.put(userId, userIdCount.containsKey(userId) ? userIdCount.get(userId) + 1 : 1);
-            }
+        if (null != activityHelp) {
+            activityHelp.onDestroy();
+            activityHelp = null;
         }
-
-        // 过滤出出现在所有 Door 中的 UserId
-        Set<Long> commonUserIds = new HashSet<Long>();
-        for (Map.Entry<Long, Integer> entry : userIdCount.entrySet()) {
-            if (entry.getValue() == totalDoors) {
-                commonUserIds.add(entry.getKey());
-            }
-        }
-
-        if (commonUserIds.isEmpty()) {
-            return null;
-        }
-
-        // 仅返回第一个 Door 中符合的 Admin
-        List<HxpCabinetAdminVo> commonAdmins = new ArrayList<HxpCabinetAdminVo>();
-        for (HxpCabinetAdminVo admin : doorList.get(0).getCabinetAdminVoList()) {
-            if (commonUserIds.contains(admin.getUserId())) {
-                commonAdmins.add(admin);
-            }
-        }
-
-        return commonAdmins;
     }
-
-
 }

+ 311 - 95
app/src/main/java/com/example/chemical/ui/plan/unlock/UnlockActivityHelp.java

@@ -1,24 +1,41 @@
 package com.example.chemical.ui.plan.unlock;
 
 import android.os.CountDownTimer;
+import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
 
+import com.blankj.utilcode.util.ActivityUtils;
 import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.ToastUtils;
+import com.blankj.utilcode.util.ThreadUtils;
 import com.example.chemical.ChemicalApp;
+import com.example.chemical.ui.plan.PlanAddData;
+import com.example.chemical.ui.plan.room.RoomTool;
+import com.example.chemical.ui.plan.room.bean.input_add.InventoryItemBean;
+import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetAdminVo;
 import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetDoorVo;
 import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetLockVo;
 import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetVo;
+import com.example.chemical.ui.plan.room.bean.locker.HxpLabDirector;
+import com.example.chemical.ui.plan.room.bean.locker.HxpLabSafe;
+import com.example.chemical.ui.plan.room.dao.HxpInventoryDAO;
+import com.example.chemical.ui.plan.save_list.SaveListActivity;
+import com.kongzue.dialogx.dialogs.PopTip;
+import com.rc.httpcore.bean.HxpChemicalVo;
 import com.rc.httpcore.bean.UserValidationBean;
 import com.rc.httpcore.client.ApiRepository;
+import com.rc.httpcore.client.HttpTool;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import io.reactivex.disposables.Disposable;
+import kotlin.Triple;
+import okhttp3.Response;
 
 public class UnlockActivityHelp {
     private UnlockActivity activity;
@@ -28,7 +45,7 @@ public class UnlockActivityHelp {
     // 柜门集合
     List<HxpCabinetDoorVo> doorList;
     // 智能锁集合
-    List<HxpCabinetLockVo> unlockList;
+    List<HxpCabinetLockVo> unlockList = new ArrayList<>();
 
     private UserValidationBean userValidation1, userValidation2;
     private Disposable unlockDisposable, unlockStatusDisposable;
@@ -38,40 +55,239 @@ public class UnlockActivityHelp {
      */
     private HxpCabinetLockVo nowLockVo;
 
+    public void onDestroy() {
+        if (null != unlockStatusCDTimer) {
+            unlockStatusCDTimer.cancel();
+        }
+    }
 
-    public UnlockActivityHelp(UnlockActivity activity) {
+
+    public UnlockActivityHelp(UnlockActivity activity, PlanAddData planAddData) {
         this.activity = activity;
+        this.cabinetList = planAddData.getCabinetList();
+        this.doorList = planAddData.getDoorList();
+        // 需要开锁的智能锁
+        for (int i = 0; i < doorList.size(); i++) {
+            HxpCabinetDoorVo doorVo = doorList.get(i);
+            unlockList.add(doorVo.getCabinetLockVoList().get(0));
+        }
+        init();
     }
 
+    private void init() {
+        if (!unlockList.isEmpty()) {
+            ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Triple<String, String, String>>() {
+                @Override
+                public Triple<String, String, String> doInBackground() throws Throwable {
+                    // 公共柜门管理员
+                    String adminInfo = "", directorInfo = "", safeInfo = "";
+                    List<HxpCabinetAdminVo> cabinetAdminVoList = getCommonAdminUserIds(doorList);
+                    if (null != cabinetAdminVoList && !cabinetAdminVoList.isEmpty()) {
+                        HxpCabinetAdminVo admin = cabinetAdminVoList.get(0);
+                        adminInfo = admin.getUserName() + " " + admin.getPhone();
+                        if (cabinetAdminVoList.size() > 1) {
+                            StringBuilder sb = new StringBuilder();
+                            for (int i = 0; i < cabinetAdminVoList.size(); i++) {
+                                HxpCabinetAdminVo adminVo = cabinetAdminVoList.get(i);
+                                sb.append(adminVo.getUserName());
+                                sb.append(" ");
+                                sb.append(adminVo.getPhone());
+                                sb.append("\n");
+                            }
+                            sb.delete(sb.length() - 1, sb.length());
+                            adminInfo = sb.toString();
+                        }
+                    }
+                    // 实验室负责人
+                    List<HxpLabDirector> hxpLabDirectorList = RoomTool.getInstance().hxpLabDirectorDAO().getAll();
+                    if (null != hxpLabDirectorList && !hxpLabDirectorList.isEmpty()) {
+                        HxpLabDirector labDirector = hxpLabDirectorList.get(0);
+                        directorInfo = labDirector.getUserName() + " " + labDirector.getMobile();
+                        if (hxpLabDirectorList.size() > 1) {
+                            StringBuilder sb = new StringBuilder();
+                            for (int i = 0; i < hxpLabDirectorList.size(); i++) {
+                                HxpLabDirector director = hxpLabDirectorList.get(i);
+                                sb.append(director.getUserName());
+                                sb.append(" ");
+                                sb.append(director.getMobile());
+                                sb.append("\n");
+                            }
+                            sb.delete(sb.length() - 1, sb.length());
+                            directorInfo = sb.toString();
+                        }
+                    }
+                    // 实验室安全员
+                    List<HxpLabSafe> labSafeList = RoomTool.getInstance().hxpLabSafeDAO().getAll();
+                    if (null != labSafeList && !labSafeList.isEmpty()) {
+                        HxpLabSafe safe = labSafeList.get(0);
+                        safeInfo = safe.getUserName() + " " + safe.getMobile();
+                        if (labSafeList.size() > 1) {
+                            StringBuilder sb = new StringBuilder();
+                            for (int i = 0; i < labSafeList.size(); i++) {
+                                HxpLabSafe labSafe = labSafeList.get(i);
+                                sb.append(labSafe.getUserName());
+                                sb.append(" ");
+                                sb.append(labSafe.getMobile());
+                                sb.append("\n");
+                            }
+                            sb.delete(sb.length() - 1, sb.length());
+                            safeInfo = sb.toString();
+                        }
+                    }
+
+                    return new Triple<>(adminInfo, directorInfo, safeInfo);
+                }
+
+                @Override
+                public void onSuccess(Triple<String, String, String> result) {
+                    String adminInfo = result.getFirst();
+                    String directorInfo = result.getSecond();
+                    String safeInfo = result.getThird();
+                    activity.binding.adminTV.setText(TextUtils.isEmpty(adminInfo) ? "" : adminInfo);
+                    activity.binding.directorTV.setText(TextUtils.isEmpty(directorInfo) ? "" : directorInfo);
+                    activity.binding.safetyTV.setText(TextUtils.isEmpty(safeInfo) ? "" : safeInfo);
+                }
+            });
+        }
+
+        activity.binding.cabinetTV.setText(cabinetList.size() + "个");
+        activity.binding.doorTV.setText(doorList.size() + "个");
+        activity.unlockAdapter = new UnlockAdapter(activity, cabinetList, doorList);
+        activity.binding.unlockGV.setAdapter(activity.unlockAdapter);
+    }
 
+    /**
+     * 批量重试
+     */
     public void reTryUnlock() {
+        boolean hasFailed = false;
         for (int i = 0; i < unlockList.size(); i++) {
             HxpCabinetLockVo hxpCabinetLockVo = unlockList.get(i);
             if (2 == hxpCabinetLockVo.getUnlockType()) {
                 hxpCabinetLockVo.setUnlockType(0);
+                hasFailed = true;
             }
         }
-        nowLockVo = getNextNotUnlocked();
+        if (!hasFailed) {
+            PopTip.show("没有开锁失败的柜门!");
+            return;
+        }
+        activity.binding.retryBT.setVisibility(View.GONE);
+        activity.binding.unlockLL.setVisibility(View.VISIBLE);
         unlockTask();
     }
 
     /**
      * 批量开锁
      *
-     * @param cabinetList     柜子集合
-     * @param doorList        柜门集合
      * @param userValidation1 验证通过的人1
      * @param userValidation2 验证通过的人2
      */
-    public void unlock(List<HxpCabinetLockVo> unlockList, List<HxpCabinetVo> cabinetList, List<HxpCabinetDoorVo> doorList, UserValidationBean userValidation1, UserValidationBean userValidation2) {
-        this.unlockList = unlockList;
+    public void unlock(UserValidationBean userValidation1, UserValidationBean userValidation2) {
         this.userValidation1 = userValidation1;
         this.userValidation2 = userValidation2;
-        this.cabinetList = cabinetList;
-        this.doorList = doorList;
         unlockTask();
     }
 
+    private CountDownTimer unlockStatusCDTimer;
+
+    /**
+     * 批量开锁
+     */
+    private void unlockTask() {
+        if (null != unlockStatusCDTimer) {
+            unlockStatusCDTimer.cancel();
+            unlockStatusCDTimer = null;
+        }
+        if (null != unlockDisposable) {
+            activity.delDisposable(unlockDisposable);
+        }
+        nowLockVo = getNextNotUnlocked();
+        if (null == nowLockVo) {
+            activity.binding.retryBT.setVisibility(View.VISIBLE);
+            activity.binding.saveBT.setVisibility(View.VISIBLE);
+            activity.binding.unlockLL.setVisibility(View.GONE);
+            activity.unlockAdapter.setUnlockEnd(true);
+            unlockEnd();
+            activity.unlockAdapter.notifyDataSetChanged();
+            PopTip.show("批量开锁结束!");
+            return;
+        } else {
+            activity.unlockAdapter.notifyDataSetChanged();
+            activity.unlockAdapter.setUnlockEnd(false);
+        }
+
+        map.clear();
+        map.put("subId", ChemicalApp.subjectId);
+        map.put("subName", ChemicalApp.subjectName);
+
+        HxpCabinetVo hxpCabinetVo = findCabinetByDoorId(nowLockVo.getDoorId());
+        if (null != hxpCabinetVo) {
+            map.put("cabinetId", hxpCabinetVo.getCabinetId());
+            map.put("cabinetName", hxpCabinetVo.getCabinetName());
+        }
+
+        HxpCabinetDoorVo hxpDoorVo = findDoorByDoorId(nowLockVo.getDoorId());
+        if (null != hxpDoorVo) {
+            map.put("doorId", hxpDoorVo.getDoorId());
+            map.put("doorName", hxpDoorVo.getDoorName());
+        }
+        List<String> lockNumList = new ArrayList<>();
+        lockNumList.add(nowLockVo.getLockNum());
+        map.put("lockNumList", lockNumList);
+        map.put("operationType", 3);
+        if (ChemicalApp.subRoom != null) {
+            map.put("subRoom", ChemicalApp.subRoom);
+        }
+        map.put("type", true);
+        if (userValidation1 != null) {
+            map.put("oneUserId", userValidation1.getUserId());
+            map.put("oneUserName", userValidation1.getUserName());
+        }
+        if (null != userValidation2) {
+            map.put("twoUserId", userValidation2.getUserId());
+            map.put("twoUserName", userValidation2.getUserName());
+        }
+
+        unlockDisposable = ApiRepository.INSTANCE.lockOperate(map).subscribe(aBoolean -> {
+            if (aBoolean) {
+                nowLockVo.setUnlockType(3);
+                activity.unlockAdapter.notifyDataSetChanged();
+
+                unlockStatusCDTimer = new CountDownTimer(30 * 1000, 3000) {
+                    @Override
+                    public void onTick(long millisUntilFinished) {
+                        if (null != unlockStatusDisposable) {
+                            activity.delDisposable(unlockStatusDisposable);
+                        }
+                        unlockStatusDisposable = ApiRepository.INSTANCE.getLocks(ChemicalApp.subjectId, nowLockVo.getLockNum()).subscribe(aBoolean -> {
+                            if (aBoolean) {
+                                nowLockVo.setUnlockType(1);
+                                unlockTask();
+                            }
+                        }, throwable -> LogUtils.e(Log.getStackTraceString(throwable)));
+                        activity.addDisposable(unlockStatusDisposable);
+                    }
+
+                    @Override
+                    public void onFinish() {
+                        nowLockVo.setUnlockType(2);
+                        unlockTask();
+                    }
+                };
+                unlockStatusCDTimer.start();
+            } else {
+                nowLockVo.setUnlockType(2);
+                unlockTask();
+            }
+        }, throwable -> LogUtils.e(Log.getStackTraceString(throwable)));
+        activity.addDisposable(unlockDisposable);
+    }
+
+
+    /**
+     * 单独开锁
+     */
     public void unlock(HxpCabinetLockVo nowLockVo) {
         activity.showLoading("开锁中...", false);
         map.clear();
@@ -112,7 +328,7 @@ public class UnlockActivityHelp {
                 nowLockVo.setUnlockType(3);
                 activity.unlockAdapter.notifyDataSetChanged();
 
-                unlockStatusCDTimer = new CountDownTimer(6 * 1000, 3000) {
+                unlockStatusCDTimer = new CountDownTimer(30 * 1000, 3000) {
                     @Override
                     public void onTick(long millisUntilFinished) {
                         if (null != unlockStatusDisposable) {
@@ -122,7 +338,7 @@ public class UnlockActivityHelp {
                             LogUtils.d("手动开锁查询状态", nowLockVo.getLockNum(), nowLockVo.getLockName(), aBoolean);
                             if (aBoolean) {
                                 unlockStatusCDTimer.cancel();
-                                ToastUtils.showLong("开门成功!");
+                                PopTip.show("开门成功!");
                                 nowLockVo.setUnlockType(1);
                                 activity.unlockAdapter.notifyDataSetChanged();
                                 activity.dismissLoading();
@@ -134,14 +350,15 @@ public class UnlockActivityHelp {
                     @Override
                     public void onFinish() {
                         LogUtils.d("手动开锁失败", nowLockVo.getLockNum(), nowLockVo.getLockName());
+                        nowLockVo.setUnlockType(2);
+                        unlockEnd();
                         activity.unlockAdapter.notifyDataSetChanged();
                         activity.dismissLoading();
-                        nowLockVo.setUnlockType(2);
                         HxpCabinetDoorVo doorVo = findDoorByLockId(nowLockVo.getLockId());
                         if (null != doorVo) {
-                            ToastUtils.showLong(doorVo.getDoorName() + "开门失败!");
+                            PopTip.show(doorVo.getDoorName() + "开门失败!");
                         } else {
-                            ToastUtils.showLong("开门失败!");
+                            PopTip.show("开门失败!");
                         }
                     }
                 };
@@ -206,94 +423,93 @@ public class UnlockActivityHelp {
         return null;
     }
 
-    private CountDownTimer unlockStatusCDTimer;
-
-    private void unlockTask() {
-        if (null != unlockStatusCDTimer) {
-            unlockStatusCDTimer.cancel();
-            unlockStatusCDTimer = null;
-        }
-        if (null != unlockDisposable) {
-            activity.delDisposable(unlockDisposable);
+    private void unlockEnd() {
+        int successful = 0;
+        int failures = 0;
+        for (int i = 0; i < unlockList.size(); i++) {
+            HxpCabinetLockVo cabinetLockVo = unlockList.get(i);
+            int unlockType = cabinetLockVo.getUnlockType();
+            if (1 == unlockType) {
+                successful++;
+            } else {
+                failures++;
+            }
+            if (null != nowLockVo) {
+                cabinetLockVo.setUnlockType(nowLockVo.getUnlockType());
+            }
         }
-        nowLockVo = getNextNotUnlocked();
-        activity.unlockAdapter.notifyDataSetChanged();
+        activity.binding.unlockedTV.setText(successful + "个");
+        activity.binding.unlockFailedTV.setText(failures + "个");
+    }
 
-        if (null == nowLockVo) {
-            activity.binding.retryBT.setVisibility(View.VISIBLE);
-            activity.binding.saveBT.setVisibility(View.VISIBLE);
-            activity.binding.unlockLL.setVisibility(View.GONE);
-            activity.unlockAdapter.setUnlockEnd(true);
-            activity.unlockAdapter.notifyDataSetChanged();
-            LogUtils.json("开锁结束", unlockList);
-            return;
-        }
+    /**
+     * 找出所有柜门的共同管理员,没有共同管理员则返回Null
+     */
+    private List<HxpCabinetAdminVo> getCommonAdminUserIds(List<HxpCabinetDoorVo> doorList) {
+        try {
+            Map<Long, Integer> userIdCount = new HashMap<>();
+            int totalDoors = doorList.size();
 
-        map.clear();
-        map.put("subId", ChemicalApp.subjectId);
-        map.put("subName", ChemicalApp.subjectName);
+            // 统计所有 UserId 的出现次数
+            for (HxpCabinetDoorVo door : doorList) {
+                Set<Long> uniqueIds = new HashSet<>(); // 记录当前 Door 的唯一 UserId,防止重复计数
+                for (HxpCabinetAdminVo admin : door.getCabinetAdminVoList()) {
+                    uniqueIds.add(admin.getUserId());
+                }
+                for (Long userId : uniqueIds) {
+                    userIdCount.put(userId, userIdCount.containsKey(userId) ? userIdCount.get(userId) + 1 : 1);
+                }
+            }
 
-        HxpCabinetVo hxpCabinetVo = findCabinetByDoorId(nowLockVo.getDoorId());
-        if (null != hxpCabinetVo) {
-            map.put("cabinetId", hxpCabinetVo.getCabinetId());
-            map.put("cabinetName", hxpCabinetVo.getCabinetName());
-        }
+            // 过滤出出现在所有 Door 中的 UserId
+            Set<Long> commonUserIds = new HashSet<Long>();
+            for (Map.Entry<Long, Integer> entry : userIdCount.entrySet()) {
+                if (entry.getValue() == totalDoors) {
+                    commonUserIds.add(entry.getKey());
+                }
+            }
 
-        HxpCabinetDoorVo hxpDoorVo = findDoorByDoorId(nowLockVo.getDoorId());
-        if (null != hxpDoorVo) {
-            map.put("doorId", hxpDoorVo.getDoorId());
-            map.put("doorName", hxpDoorVo.getDoorName());
-        }
-        List<String> lockNumList = new ArrayList<>();
-        lockNumList.add(nowLockVo.getLockNum());
-        map.put("lockNumList", lockNumList);
-        map.put("operationType", 3);
-        if (ChemicalApp.subRoom != null) {
-            map.put("subRoom", ChemicalApp.subRoom);
-        }
-        map.put("type", true);
-        if (userValidation1 != null) {
-            map.put("oneUserId", userValidation1.getUserId());
-            map.put("oneUserName", userValidation1.getUserName());
-        }
-        if (null != userValidation2) {
-            map.put("twoUserId", userValidation2.getUserId());
-            map.put("twoUserName", userValidation2.getUserName());
-        }
+            if (commonUserIds.isEmpty()) {
+                return null;
+            }
 
-        unlockDisposable = ApiRepository.INSTANCE.lockOperate(map).subscribe(aBoolean -> {
-            if (aBoolean) {
-                nowLockVo.setUnlockType(3);
-                activity.unlockAdapter.notifyDataSetChanged();
+            // 仅返回第一个 Door 中符合的 Admin
+            List<HxpCabinetAdminVo> commonAdmins = new ArrayList<>();
+            for (HxpCabinetAdminVo admin : doorList.get(0).getCabinetAdminVoList()) {
+                if (commonUserIds.contains(admin.getUserId())) {
+                    commonAdmins.add(admin);
+                }
+            }
+            return commonAdmins;
+        } catch (Exception e) {
+            LogUtils.e(Log.getStackTraceString(e));
+        }
+        return null;
+    }
 
-                unlockStatusCDTimer = new CountDownTimer(6 * 1000, 3000) {
-                    @Override
-                    public void onTick(long millisUntilFinished) {
-                        if (null != unlockStatusDisposable) {
-                            activity.delDisposable(unlockStatusDisposable);
-                        }
-                        unlockStatusDisposable = ApiRepository.INSTANCE.getLocks(ChemicalApp.subjectId, nowLockVo.getLockNum()).subscribe(aBoolean -> {
-                            LogUtils.d("查询结果", nowLockVo.getLockNum(), nowLockVo.getLockName(), aBoolean);
-                            if (aBoolean) {
-                                nowLockVo.setUnlockType(1);
-                                unlockTask();
-                            }
-                        }, throwable -> LogUtils.e(Log.getStackTraceString(throwable)));
-                        activity.addDisposable(unlockStatusDisposable);
-                    }
+    public void save() {
+        activity.showLoading("入库中...", false);
+        ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Object>() {
+            @Override
+            public Object doInBackground() throws Throwable {
+                HxpInventoryDAO hxpInventoryDAO = RoomTool.getInstance().hxpInventoryDAO();
+                List<InventoryItemBean> inventoryItemBeanList = hxpInventoryDAO.getAll();
+                List<HxpChemicalVo> hxpChemicalVoList = new ArrayList<>();
+                for (int i = 0; i < inventoryItemBeanList.size(); i++) {
+                    InventoryItemBean inventoryItemBean = inventoryItemBeanList.get(i);
+                    HxpChemicalVo hxpChemicalVo = inventoryItemBean.getHxpChemicalVo();
+                    hxpChemicalVoList.add(hxpChemicalVo);
+                }
+                Response response = HttpTool.addChemical(hxpChemicalVoList);
+                LogUtils.json(response);
+                LogUtils.d(response.body().string());
+                return null;
+            }
 
-                    @Override
-                    public void onFinish() {
-                        nowLockVo.setUnlockType(2);
-                        unlockTask();
-                    }
-                };
-                unlockStatusCDTimer.start();
-            } else {
-                nowLockVo.setUnlockType(2);
-                unlockTask();
+            @Override
+            public void onSuccess(Object result) {
+                activity.dismissLoading();
             }
-        }, throwable -> LogUtils.e(Log.getStackTraceString(throwable)));
-        activity.addDisposable(unlockDisposable);
+        });
     }
 }

+ 7 - 4
app/src/main/java/com/example/chemical/ui/plan/unlock/UnlockAdapter.java

@@ -1,6 +1,5 @@
 package com.example.chemical.ui.plan.unlock;
 
-import android.content.Context;
 import android.graphics.Color;
 import android.text.TextUtils;
 import android.util.Log;
@@ -10,12 +9,12 @@ import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 
 import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.ToastUtils;
 import com.example.chemical.R;
 import com.example.chemical.databinding.ItemDoorUnlockBinding;
 import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetDoorVo;
 import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetLockVo;
 import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetVo;
+import com.kongzue.dialogx.dialogs.PopTip;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -70,7 +69,7 @@ public class UnlockAdapter extends BaseAdapter {
                                 return;
                             }
                         }
-                        ToastUtils.showLong("开锁失败!");
+                        PopTip.show("开门失败!");
                     }
                 }
             });
@@ -88,7 +87,7 @@ public class UnlockAdapter extends BaseAdapter {
                                 return;
                             }
                         }
-                        ToastUtils.showLong("开锁失败!");
+                        PopTip.show("开门失败!");
                     }
                 }
             });
@@ -144,6 +143,8 @@ public class UnlockAdapter extends BaseAdapter {
                 }
                 if (isUnlockEnd) {
                     viewHolder.binding.upDoorUnlockBT.setVisibility(View.VISIBLE);
+                } else {
+                    viewHolder.binding.upDoorUnlockBT.setVisibility(View.GONE);
                 }
 
                 if (hxpCabinetDoorVoList.size() > 1) {
@@ -183,6 +184,8 @@ public class UnlockAdapter extends BaseAdapter {
 
                     if (isUnlockEnd) {
                         viewHolder.binding.downDoorUnlockBT.setVisibility(View.VISIBLE);
+                    } else {
+                        viewHolder.binding.downDoorUnlockBT.setVisibility(View.GONE);
                     }
                 }
 

+ 58 - 68
app/src/main/java/com/example/chemical/ui/verify/DoubleVerifyActivity.java

@@ -1,6 +1,5 @@
 package com.example.chemical.ui.verify;
 
-import android.content.Intent;
 import android.graphics.Bitmap;
 import android.os.Bundle;
 import android.view.KeyEvent;
@@ -10,7 +9,6 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.core.util.Pair;
 
-import com.blankj.utilcode.util.GsonUtils;
 import com.example.chemical.databinding.ActivityDoubleVerifyBinding;
 import com.example.chemical.receiver.OnSerialScanListener;
 import com.example.chemical.receiver.PortScanHelper;
@@ -50,81 +48,73 @@ public class DoubleVerifyActivity extends BaseCountDownActivity<ActivityDoubleVe
     @Override
     protected void initViews(@Nullable Bundle savedInstanceState) {
         super.initViews(savedInstanceState);
-        // TODO
-        Intent intent = new Intent();
-        String json = "{\"adminUser\":true,\"belongUser\":true,\"cabinetAdmin\":false,\"collegeAdmin\":false,\"faceImg\":\"/statics/2025/01/24/57f23440-c40d-44b8-a381-318ad664165c.jpeg\",\"safeUser\":false,\"schoolLevelAdmin\":false,\"toipcUser\":false,\"userId\":\"1856238383039664129\",\"userName\":\"高实验\"}\n";
-        intent.putExtra("userValidation1", json);
-        intent.putExtra("userValidation2", json);
-        setResult(TwoPersonActivity.RESULT_OK, intent);
-        finish();
-        return;
-//        activityHelp = new DoubleVerifyActivityHelp(this);
+        activityHelp = new DoubleVerifyActivityHelp(this);
     }
 
     @Override
     protected void initData() {
         super.initData();
-//        binding.card1IB.setOnClickListener(new View.OnClickListener() {
-//            @Override
-//            public void onClick(View v) {
-//                activityHelp.switchShowDetect(detectType = DetectType.CARD_DETECT, true, true);
-//            }
-//        });
-//        binding.face1IB.setOnClickListener(new View.OnClickListener() {
-//            @Override
-//            public void onClick(View v) {
-//                activityHelp.switchShowDetect(detectType = DetectType.FACE_DETECT, true, true);
-//            }
-//        });
-//        binding.scan1IB.setOnClickListener(new View.OnClickListener() {
-//            @Override
-//            public void onClick(View v) {
-//                activityHelp.switchShowDetect(detectType = DetectType.SCAN_DETECT, true, true);
-//            }
-//        });
-//        binding.card2IB.setOnClickListener(new View.OnClickListener() {
-//            @Override
-//            public void onClick(View v) {
-//                activityHelp.switchShowDetect(detectType = DetectType.CARD_DETECT, false, true);
-//            }
-//        });
-//        binding.face2IB.setOnClickListener(new View.OnClickListener() {
-//            @Override
-//            public void onClick(View v) {
-//                activityHelp.switchShowDetect(detectType = DetectType.FACE_DETECT, false, true);
-//            }
-//        });
-//
-//        binding.scan2IB.setOnClickListener(new View.OnClickListener() {
-//            @Override
-//            public void onClick(View v) {
-//                activityHelp.switchShowDetect(detectType = DetectType.SCAN_DETECT, false, true);
-//            }
-//        });
-//        activityHelp.switchShowDetect(detectType = DetectType.FACE_DETECT, true, true);
-//
-//        portScanHelper = new PortScanHelper(this, new OnSerialScanListener() {
-//            @Override
-//            public void dispatchScanEvent(@NonNull ScanType type, @NonNull String content) {
-//                Pair<Boolean, Boolean> first = doubleVerifyList.get(0);
-//                Pair<Boolean, Boolean> second = doubleVerifyList.get(1);
-//                // 第一位
-//                if (!first.first) {
-//
-//                }
-//                // 第二位
-//                else if (!second.first) {
-//
-//                }
-//            }
-//        });
+        binding.card1IB.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                activityHelp.switchShowDetect(detectType = DetectType.CARD_DETECT, true, true);
+            }
+        });
+        binding.face1IB.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                activityHelp.switchShowDetect(detectType = DetectType.FACE_DETECT, true, true);
+            }
+        });
+        binding.scan1IB.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                activityHelp.switchShowDetect(detectType = DetectType.SCAN_DETECT, true, true);
+            }
+        });
+        binding.card2IB.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                activityHelp.switchShowDetect(detectType = DetectType.CARD_DETECT, false, true);
+            }
+        });
+        binding.face2IB.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                activityHelp.switchShowDetect(detectType = DetectType.FACE_DETECT, false, true);
+            }
+        });
+
+        binding.scan2IB.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                activityHelp.switchShowDetect(detectType = DetectType.SCAN_DETECT, false, true);
+            }
+        });
+        activityHelp.switchShowDetect(detectType = DetectType.FACE_DETECT, true, true);
+
+        portScanHelper = new PortScanHelper(this, new OnSerialScanListener() {
+            @Override
+            public void dispatchScanEvent(@NonNull ScanType type, @NonNull String content) {
+                Pair<Boolean, Boolean> first = doubleVerifyList.get(0);
+                Pair<Boolean, Boolean> second = doubleVerifyList.get(1);
+                // 第一位
+                if (!first.first) {
+
+                }
+                // 第二位
+                else if (!second.first) {
+
+                }
+            }
+        });
     }
 
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
-//        if (detectType == DetectType.CARD_DETECT) {
-//            portScanHelper.dispatchKeyEvent(event);
-//        }
+        if (detectType == DetectType.CARD_DETECT) {
+            portScanHelper.dispatchKeyEvent(event);
+        }
         return super.dispatchKeyEvent(event);
     }
 

+ 6 - 6
app/src/main/java/com/example/chemical/ui/verify/DoubleVerifyActivityHelp.java

@@ -14,7 +14,6 @@ import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ResourceUtils;
 import com.blankj.utilcode.util.ThreadUtils;
-import com.blankj.utilcode.util.ToastUtils;
 import com.example.chemical.R;
 import com.example.chemical.databinding.ActivityDoubleVerifyBinding;
 import com.example.chemical.ui.verify.include.DetectType;
@@ -24,6 +23,7 @@ import com.google.zxing.BarcodeFormat;
 import com.google.zxing.MultiFormatWriter;
 import com.google.zxing.WriterException;
 import com.google.zxing.common.BitMatrix;
+import com.kongzue.dialogx.dialogs.PopTip;
 import com.rc.httpcore.HttpConfig;
 import com.rc.httpcore.bean.UserValidationBean;
 
@@ -51,7 +51,7 @@ public class DoubleVerifyActivityHelp {
         Pair<Boolean, Boolean> first = activity.doubleVerifyList.get(0);
         Pair<Boolean, Boolean> second = activity.doubleVerifyList.get(1);
         if (first.first && second.first) {
-            ToastUtils.showLong("双人认证已通过!");
+            PopTip.show("双人认证已通过!");
             return;
         }
         // 切换UI
@@ -59,7 +59,7 @@ public class DoubleVerifyActivityHelp {
         // 是否第一位
         if (isFirst) {
             if (first.first) {
-                ToastUtils.showLong("第一位验证已通过!");
+                PopTip.show("第一位验证已通过!");
                 return;
             }
             binding.include1LL.removeAllViewsInLayout();
@@ -74,7 +74,7 @@ public class DoubleVerifyActivityHelp {
                                 imageView.setImageBitmap(faceBitmap);
                                 binding.include1LL.addView(imageView);
                                 binding.hint1IV.setText("第一位验证已通过");
-                                ToastUtils.showLong("第一位验证已通过");
+                                PopTip.show("第一位验证已通过!");
                                 userValidation1 = userValidationBean;
                                 switchShowDetect(DetectType.FACE_DETECT, false, true);
                             }
@@ -117,7 +117,7 @@ public class DoubleVerifyActivityHelp {
             }
         } else {
             if (!first.first) {
-                ToastUtils.showLong("第一位验证未通过!");
+                PopTip.show("第一位验证未通过!");
                 return;
             }
             binding.include2LL.removeAllViewsInLayout();
@@ -133,7 +133,7 @@ public class DoubleVerifyActivityHelp {
                                 binding.include2LL.addView(imageView);
                                 binding.hint2IV.setText("第二位验证已通过");
                                 userValidation2 = userValidationBean;
-                                ToastUtils.showLong("双人认证成功");
+                                PopTip.show("双人认证成功");
                                 AudioPlayer.getInstance().play(R.raw.shuangren_tongguo);
                                 Intent intent = new Intent();
                                 intent.putExtra("userValidation1", GsonUtils.toJson(userValidation1));

+ 6 - 8
app/src/main/java/com/example/chemical/ui/verify/include/FaceDetectView.java

@@ -23,7 +23,6 @@ import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.ImageUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ThreadUtils;
-import com.blankj.utilcode.util.ToastUtils;
 import com.example.chemical.ChemicalApp;
 import com.example.chemical.databinding.FragmentFaceDetectBinding;
 import com.example.chemical.ui.verify.DoubleVerifyActivity;
@@ -31,6 +30,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 import com.google.mlkit.vision.face.FaceDetection;
 import com.google.mlkit.vision.face.FaceDetector;
 import com.google.mlkit.vision.face.FaceDetectorOptions;
+import com.kongzue.dialogx.dialogs.PopTip;
 import com.rc.httpcore.bean.UserValidationBean;
 import com.rc.httpcore.client.HttpTool;
 import com.rc.httpcore.vo.request.FaceCompare1Req;
@@ -58,7 +58,6 @@ public class FaceDetectView extends RelativeLayout {
     private ImageCapture imageCapture;
     private ImageCapture.OutputFileOptions outputFileOptions;
     private File photoFile;
-    private File testFaceFile;
     private DoubleVerifyActivity.DoubleVerifyListener doubleVerifyListener;
     private List<Pair<Boolean, Boolean>> doubleVerifyList;
 
@@ -161,7 +160,6 @@ public class FaceDetectView extends RelativeLayout {
     ThreadUtils.SimpleTask<Object> simpleTask = new ThreadUtils.SimpleTask<Object>() {
         @Override
         public Object doInBackground() throws Throwable {
-            testFaceFile = new File("/sdcard/Jayce.jpg");
             imageCapture.takePicture(outputFileOptions, ContextCompat.getMainExecutor(context), new ImageCapture.OnImageSavedCallback() {
                 @Override
                 public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
@@ -171,7 +169,7 @@ public class FaceDetectView extends RelativeLayout {
                             FaceCompare1Req faceCompare1Req = new FaceCompare1Req();
                             faceCompare1Req.getDoorIds().add("1877265538691350529");
                             try {
-                                Response response = HttpTool.checkUserFaceByPic1(testFaceFile, ChemicalApp.subjectId, faceCompare1Req);
+                                Response response = HttpTool.checkUserFaceByPic1(photoFile, ChemicalApp.subjectId, faceCompare1Req);
                                 if (response.isSuccessful()) {
                                     String json = response.body().string();
                                     JSONObject jsonObject = new JSONObject(json);
@@ -179,10 +177,10 @@ public class FaceDetectView extends RelativeLayout {
                                     if (200 == code) {
                                         return GsonUtils.fromJson(jsonObject.getJSONObject("data").toString(), UserValidationBean.class);
                                     } else {
-                                        ToastUtils.showLong(jsonObject.getString("message"));
+                                        PopTip.show(jsonObject.getString("message"));
                                     }
                                 } else {
-                                    ToastUtils.showLong(response.message());
+                                    PopTip.show(response.message());
                                 }
                             } catch (IOException e) {
                                 LogUtils.e(Log.getStackTraceString(e));
@@ -203,13 +201,13 @@ public class FaceDetectView extends RelativeLayout {
                                     doubleVerifyList.set(0, Pair.create(true, isAdmin));
                                 } else if (first.first && second.first) {
                                     if (!first.second && !isAdmin) {
-                                        ToastUtils.showLong("请联系柜门管理员、安全员、实验室负责人进行验证");
+                                        PopTip.show("请联系柜门管理员、安全员、实验室负责人进行验证");
                                         return;
                                     }
                                     doubleVerifyList.set(1, Pair.create(true, isAdmin));
                                 }
                                 ThreadUtils.cancel(simpleTask);
-                                doubleVerifyListener.detect(DetectType.FACE_DETECT, ImageUtils.getBitmap(testFaceFile), result);
+                                doubleVerifyListener.detect(DetectType.FACE_DETECT, ImageUtils.getBitmap(photoFile), result);
                             }
                         }
                     });

+ 43 - 12
app/src/main/java/com/example/chemical/weidith/BluetoothWeighDialog.java

@@ -1,6 +1,5 @@
 package com.example.chemical.weidith;
 
-import android.content.Context;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.os.Bundle;
@@ -13,6 +12,7 @@ import android.view.WindowManager;
 
 import androidx.appcompat.app.AppCompatDialog;
 
+import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ThreadUtils;
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.load.engine.DiskCacheStrategy;
@@ -20,18 +20,23 @@ import com.bumptech.glide.request.RequestOptions;
 import com.example.chemical.ChemicalApp;
 import com.example.chemical.R;
 import com.example.chemical.databinding.DialogBluetoothWeighBinding;
+import com.example.chemical.ui.plan.add.AddActivity;
 import com.example.chemical.utils.bluetooth.BluetoothTool;
+import com.kongzue.dialogx.dialogs.WaitDialog;
 import com.rc.httpcore.HttpConfig;
 import com.rc.httpcore.bean.HxpChemicalVo;
+import com.rc.httpcore.client.HttpTool;
+
+import okhttp3.Response;
 
 public class BluetoothWeighDialog extends AppCompatDialog {
     private DialogBluetoothWeighBinding binding;
-    private final Context context;
+    private final AddActivity addActivity;
     private final HxpChemicalVo hxpChemicalVo;
 
-    public BluetoothWeighDialog(Context context, HxpChemicalVo hxpChemicalVo) {
-        super(context);
-        this.context = context;
+    public BluetoothWeighDialog(AddActivity addActivity, HxpChemicalVo hxpChemicalVo) {
+        super(addActivity);
+        this.addActivity = addActivity;
         this.hxpChemicalVo = hxpChemicalVo;
     }
 
@@ -50,14 +55,14 @@ public class BluetoothWeighDialog extends AppCompatDialog {
 
         // 提示图片加载
         if (null != ChemicalApp.confs && ChemicalApp.confs.getWeighHintPicture() != null && !ChemicalApp.confs.getWeighHintPicture().isEmpty()) {
-            Glide.with(context)
+            Glide.with(addActivity)
                     .load(HttpConfig.Companion.getAPI_BASE_IMG_URL() + ChemicalApp.confs.getWeighHintPicture())
                     .placeholder(R.mipmap.img_syt_cz)
                     .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.AUTOMATIC))
                     .into(binding.hintIV);
         }
         // 净含量
-        binding.netWtET.setText(String.valueOf(hxpChemicalVo.getNetWt()));
+        binding.netWtET.setText(String.valueOf(hxpChemicalVo.getNetContent()));
         // 规格
         binding.specsTV.setText(hxpChemicalVo.getSpecNum() + hxpChemicalVo.getSpecUnit());
         // 蓝牙称
@@ -80,10 +85,27 @@ public class BluetoothWeighDialog extends AppCompatDialog {
                 binding.netWtET.setError("请检查净含量内容正确");
                 return;
             }
-            hxpChemicalVo.setNetWt(netWt);
-            dismiss();
-        });
+            hxpChemicalVo.setNetContent(netWt);
+            WaitDialog.show("校验中...");
+            // TODO 待入库前检查
+            ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Object>() {
+                @Override
+                public Object doInBackground() throws Throwable {
+                    Response response = HttpTool.addStockCheck(hxpChemicalVo);
+                    LogUtils.json(response);
+                    LogUtils.json(response.body().string());
+                    return null;
+                }
 
+                @Override
+                public void onSuccess(Object result) {
+                    WaitDialog.dismiss();
+                    dismiss();
+                }
+            });
+        });
+        setCancelable(false);
+        setCanceledOnTouchOutside(false);
     }
 
     @Override
@@ -97,8 +119,17 @@ public class BluetoothWeighDialog extends AppCompatDialog {
         @Override
         public Object doInBackground() throws Throwable {
             BluetoothTool.INSTANCE.connect(weight -> {
-                hxpChemicalVo.setWeight(weight);
-                ThreadUtils.runOnUiThread(() -> binding.weighTV.setText(weight + "g"));
+                hxpChemicalVo.setWeigh(weight);
+                ThreadUtils.runOnUiThread(() -> {
+                    binding.weighTV.setText(weight + "g");
+                    if (binding.weightRL.getVisibility() != View.VISIBLE) {
+                        binding.weightRL.setVisibility(View.VISIBLE);
+                    }
+                    if (binding.loadingLAV.getVisibility() == View.VISIBLE) {
+                        binding.loadingLAV.cancelAnimation();
+                        binding.loadingLAV.setVisibility(View.GONE);
+                    }
+                });
             });
             return null;
         }

+ 23 - 23
app/src/main/java/com/example/chemical/weidith/LabelDialog.kt

@@ -222,33 +222,31 @@ class LabelDialog(
 //        customDialogView(0, "请扫描标签")
         butClos = findViewById<Button>(R.id.butClos)
 
-        //TODO
-//        mCountDownHandler.removeMessages(Constants.WHAT_COUNT_DOWN_TWO)
-//        mCountDownHandler.sendEmptyMessage(Constants.WHAT_COUNT_DOWN_TWO)
+        mCountDownHandler.removeMessages(Constants.WHAT_COUNT_DOWN_TWO)
+        mCountDownHandler.sendEmptyMessage(Constants.WHAT_COUNT_DOWN_TWO)
     }
 
     private fun closHandle() {
-        //TODO
-//        mCountDownHandler.removeMessages(Constants.WHAT_COUNT_DOWN_TWO)
-//        mCountDownHandler.removeCallbacksAndMessages(null)
+        mCountDownHandler.removeMessages(Constants.WHAT_COUNT_DOWN_TWO)
+        mCountDownHandler.removeCallbacksAndMessages(null)
+    }
+
+    private val mCountDownHandler = object : Handler(Looper.getMainLooper()) {
+
+        override fun handleMessage(msg: Message) {
+            if (Constants.WHAT_COUNT_DOWN_TWO == msg.what) {
+
+                val countDown = Constants.OFFTIME_TIME - mCounter
+
+                if (countDown <= 0) {
+                    dismiss()
+                } else {
+                    sendEmptyMessageDelayed(Constants.WHAT_COUNT_DOWN_TWO, 1000)
+                }
+                mCounter++
+            }
+        }
     }
-//TODO
-//    private val mCountDownHandler = object : Handler(Looper.getMainLooper()) {
-//
-//        override fun handleMessage(msg: Message) {
-//            if (Constants.WHAT_COUNT_DOWN_TWO == msg.what) {
-//
-//                val countDown = Constants.OFFTIME_TIME - mCounter
-//
-//                if (countDown <= 0) {
-//                    dismiss()
-//                } else {
-//                    sendEmptyMessageDelayed(Constants.WHAT_COUNT_DOWN_TWO, 1000)
-//                }
-//                mCounter++
-//            }
-//        }
-//    }
 
     interface IRfidClick {
         fun onItemClick(modelList: MutableList<StockDetailsModel>?, layer: Int)
@@ -386,9 +384,11 @@ class LabelDialog(
                 // 用户按下屏幕时的处理逻辑
                 onUserInteraction()
             }
+
             MotionEvent.ACTION_MOVE -> {
                 // 用户在屏幕上移动手指时的处理逻辑
             }
+
             MotionEvent.ACTION_UP -> {
                 // 用户抬起手指时的处理逻辑
             }

+ 5 - 5
app/src/main/java/com/example/chemical/weidith/prin_label_dialog/PrintLabelDialog.java

@@ -8,7 +8,6 @@ import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Gravity;
-import android.view.MotionEvent;
 import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
@@ -19,16 +18,15 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ThreadUtils;
-import com.blankj.utilcode.util.ToastUtils;
 import com.caysn.autoreplyprint.AutoReplyPrint;
 import com.example.chemical.R;
 import com.example.chemical.databinding.DialogPrintLabelBinding;
-import com.example.chemical.receiver.UsbReceiver;
 import com.example.chemical.ui.PrintBean;
 import com.example.chemical.ui.adapter.LabelDialogAdapter;
 import com.example.chemical.ui.plan.room.bean.input_add.InventoryItemBean;
 import com.example.chemical.utils.AudioPlayer;
 import com.example.chemical.utils.BitmapUtils;
+import com.kongzue.dialogx.dialogs.PopTip;
 import com.rc.httpcore.HttpConfig;
 import com.rc.httpcore.bean.BelongingPersonBean;
 import com.rc.httpcore.bean.HxpChemicalVo;
@@ -89,7 +87,7 @@ public class PrintLabelDialog extends AppCompatDialog {
         // 总标签数
         binding.sumTV.setText("共  " + inventoryItemBean.getSize() + "  张");
         // 净含量
-        double netWt = hxpChemicalVo.getNetWt();
+        double netWt = hxpChemicalVo.getNetContent();
         binding.netWtTV.setText("净含量:" + netWt + hxpChemicalVo.getSpecUnit());
         // 存储位置
         binding.layerTV.setText(planPath);
@@ -102,6 +100,7 @@ public class PrintLabelDialog extends AppCompatDialog {
                     String code = "ZJ" + System.currentTimeMillis();
                     String wxCode = HttpConfig.Companion.getAPI_BASE_QC_URL() + "?code=" + code + "&type=9";
                     int no = i + 1;
+
                     labelList.add(new StockDetailsModel(null, null, code, no, wxCode));
                     Thread.sleep(10);
                 }
@@ -130,7 +129,7 @@ public class PrintLabelDialog extends AppCompatDialog {
                             binding.sumTV.setText("共  " + labelList.size() + "  张");
                         } catch (Exception e) {
                             LogUtils.e(Log.getStackTraceString(e));
-                            ToastUtils.showLong("删除失败!");
+                            PopTip.show("删除失败!");
                         }
                     }
                 });
@@ -240,4 +239,5 @@ public class PrintLabelDialog extends AppCompatDialog {
 
         void close();
     }
+
 }

+ 6 - 0
app/src/main/res/drawable/selector_input_bt.xml

@@ -5,6 +5,12 @@
             <corners android:radius="10px" />
         </shape>
     </item>
+    <item android:state_enabled="false">
+        <shape android:shape="rectangle">
+            <solid android:color="#e5e5e5" />
+            <corners android:radius="10px" />
+        </shape>
+    </item>
     <item>
         <shape android:shape="rectangle">
             <solid android:color="#2697FF" />

+ 5 - 7
app/src/main/res/layout/activity_add.xml

@@ -209,7 +209,6 @@
                         android:imeOptions="actionSearch"
                         android:maxLines="1"
                         android:paddingHorizontal="10px"
-                        android:text="乙酸"
                         android:textAppearance="@style/input_hint_text_size" />
 
                     <Button
@@ -293,7 +292,6 @@
                             android:imeOptions="actionDone"
                             android:inputType="numberDecimal"
                             android:paddingHorizontal="10px"
-                            android:text="30"
                             android:textAppearance="@style/input_hint_text_size" />
                     </RelativeLayout>
                 </LinearLayout>
@@ -322,7 +320,6 @@
                         android:hint="输入姓名或工号搜索"
                         android:imeOptions="actionSearch"
                         android:paddingHorizontal="10px"
-                        android:text="刘一航"
                         android:textAppearance="@style/input_hint_text_size" />
 
                     <Button
@@ -357,9 +354,9 @@
                         android:ellipsize="marquee"
                         android:focusable="true"
                         android:focusableInTouchMode="true"
+                        android:gravity="center"
                         android:marqueeRepeatLimit="marquee_forever"
                         android:singleLine="true"
-                        android:gravity="center"
                         android:text="请选择化学品柜层" />
 
                     <Button
@@ -401,10 +398,12 @@
                         android:layout_height="50px"
                         android:layout_marginStart="20px"
                         android:background="@drawable/shape_input_box"
+                        android:digits="1234567890-"
                         android:gravity="center_vertical"
                         android:hint="输入CAS码搜索"
                         android:imeOptions="actionSearch"
-                        android:inputType="numberSigned"
+                        android:inputType="number"
+                        android:maxLength="12"
                         android:paddingHorizontal="10px"
                         android:textAppearance="@style/input_hint_text_size" />
 
@@ -504,7 +503,6 @@
                         android:imeOptions="actionDone"
                         android:inputType="number"
                         android:paddingHorizontal="10px"
-                        android:text="1"
                         android:textAppearance="@style/input_hint_text_size" />
 
                 </LinearLayout>
@@ -718,7 +716,7 @@
         android:layout_marginBottom="20dp"
         android:background="@drawable/bg_retrun"
         android:gravity="center"
-        android:text="返回180s"
+        android:text="返回"
         android:textColor="@color/white"
         android:textSize="10sp" />
 </RelativeLayout>

+ 2 - 2
app/src/main/res/layout/activity_plan_add.xml

@@ -317,7 +317,7 @@
                         android:layout_marginTop="10dp"
                         android:gravity="center_horizontal"
                         android:text="扫描化学品标签\n或手动录入化学品"
-                        android:textSize="18sp" />
+                        android:textSize="26px" />
                 </LinearLayout>
             </LinearLayout>
         </RelativeLayout>
@@ -333,7 +333,7 @@
         android:layout_marginBottom="20dp"
         android:background="@drawable/bg_retrun"
         android:gravity="center"
-        android:text="返回180s"
+        android:text="返回"
         android:textColor="@color/white"
         android:textSize="10sp" />
 

+ 13 - 3
app/src/main/res/layout/dialog_bluetooth_weigh.xml

@@ -24,12 +24,21 @@
             android:textColor="#333"
             android:textSize="30px" />
 
+        <com.airbnb.lottie.LottieAnimationView
+            android:id="@+id/loading_LAV"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            app:lottie_autoPlay="true"
+            app:lottie_rawRes="@raw/ble_loading" />
+
         <RelativeLayout
             android:id="@+id/weight_RL"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_below="@id/hint_TV"
-            android:layout_marginTop="20px">
+            android:layout_marginTop="20px"
+            android:visibility="invisible">
 
             <ImageView
                 android:id="@+id/hint_IV"
@@ -38,6 +47,7 @@
                 android:layout_centerHorizontal="true"
                 android:src="@mipmap/img_syt_cz" />
 
+
             <RelativeLayout
                 android:layout_width="680px"
                 android:layout_height="220px"
@@ -79,7 +89,7 @@
                         android:layout_alignParentBottom="true"
                         android:layout_marginEnd="10px"
                         android:layout_marginBottom="15px"
-                        android:text="500.20g"
+                        android:text="0"
                         android:textColor="#333"
                         android:textSize="30px" />
                 </RelativeLayout>
@@ -111,7 +121,7 @@
                         android:layout_centerVertical="true"
                         android:layout_marginEnd="10px"
                         android:layout_marginBottom="15px"
-                        android:text="500.20ml"
+                        android:text="0"
                         android:textColor="#333"
                         android:textSize="30px" />
                 </RelativeLayout>

BIN
app/src/main/res/mipmap-xhdpi/icon_gzxx_zh.png


BIN
app/src/main/res/mipmap-xhdpi/img_gh_smsb.webp