Explorar el Código

初步完成化学品存储模块重写

JaycePC hace 10 meses
padre
commit
fc709962df
Se han modificado 21 ficheros con 1039 adiciones y 288 borrados
  1. 143 0
      HttpCoreLibrary/src/main/java/com/rc/httpcore/bean/HxpChemicalVo.java
  2. 35 3
      HttpCoreLibrary/src/main/java/com/rc/httpcore/client/HttpTool.java
  3. 21 19
      app/src/main/java/com/example/chemical/ui/common/BaseCountDownActivity.kt
  4. 0 14
      app/src/main/java/com/example/chemical/ui/plan/PlanAddActivity.java
  5. 11 2
      app/src/main/java/com/example/chemical/ui/plan/PlanAddActivityHelp.java
  6. 27 7
      app/src/main/java/com/example/chemical/ui/plan/add/AddActivity.java
  7. 37 14
      app/src/main/java/com/example/chemical/ui/plan/add/AddActivityHelp.java
  8. 78 14
      app/src/main/java/com/example/chemical/ui/plan/save_list/SaveListActivity.java
  9. 141 49
      app/src/main/java/com/example/chemical/ui/plan/save_list/SaveListAdapter.java
  10. 11 6
      app/src/main/java/com/example/chemical/ui/plan/unlock/UnlockActivity.java
  11. 72 7
      app/src/main/java/com/example/chemical/ui/plan/unlock/UnlockActivityHelp.java
  12. 25 23
      app/src/main/java/com/example/chemical/ui/verify/DoubleVerifyActivity.java
  13. 207 21
      app/src/main/java/com/example/chemical/ui/verify/DoubleVerifyActivityHelp.java
  14. 32 11
      app/src/main/java/com/example/chemical/ui/verify/include/FaceDetectView.java
  15. 50 6
      app/src/main/java/com/example/chemical/utils/BitmapUtils.kt
  16. 26 8
      app/src/main/java/com/example/chemical/weidith/BluetoothWeighDialog.java
  17. 18 7
      app/src/main/java/com/example/chemical/weidith/prin_label_dialog/PrintLabelDialog.java
  18. 92 39
      app/src/main/res/layout/activity_add.xml
  19. 1 1
      app/src/main/res/layout/activity_double_verify.xml
  20. 12 0
      app/src/main/res/layout/activity_save_list.xml
  21. 0 37
      app/src/main/res/layout/item_save_list.xml

+ 143 - 0
HttpCoreLibrary/src/main/java/com/rc/httpcore/bean/HxpChemicalVo.java

@@ -2,9 +2,12 @@ package com.rc.httpcore.bean;
 
 
 import java.io.Serializable;
+import java.util.List;
 
 public class HxpChemicalVo implements Serializable {
 
+    // 实验室id
+    private long subId;
     // ("化学平id")
     private long chemicalId;
     // ("化学品类别(参考字典表)")
@@ -53,11 +56,87 @@ public class HxpChemicalVo implements Serializable {
     // 归属人工号
     private String belongAccount;
 
+    // 标签信息
+    private List<StockDetailsModel> stockDetailsModelList;
+
     // "马克思2:15222222220,熊学生:15200000001"
     private String safeUser;
     // "高安全:18700001202"
     private String adminUser;
 
+    // ("第一认证人id")
+    private long oneUserId;
+    // ("第一认证人姓名")
+    private String oneUserName;
+    // ("第一认证人电话")
+    private String oneUserMobile;
+
+    // ("第二认证人id")
+    private long twoUserId;
+    // ("第二认证人姓名")
+    private String twoUserName;
+    // ("第二认证人电话")
+    private String twoUserMobile;
+    // 化学品数量
+    private int chemicalNumber;
+    // 机柜Id
+    private long cabinetId;
+    // ("机柜名称")
+    private String cabinetName;
+    // ("柜门id")
+    private Long doorId;
+    // ("柜门名称")
+    private String doorName;
+    // 存储到哪层层数
+    private String layers;
+
+    public long getCabinetId() {
+        return cabinetId;
+    }
+
+    public void setCabinetId(long cabinetId) {
+        this.cabinetId = cabinetId;
+    }
+
+    public String getCabinetName() {
+        return cabinetName;
+    }
+
+    public void setCabinetName(String cabinetName) {
+        this.cabinetName = cabinetName;
+    }
+
+    public Long getDoorId() {
+        return doorId;
+    }
+
+    public void setDoorId(Long doorId) {
+        this.doorId = doorId;
+    }
+
+    public String getDoorName() {
+        return doorName;
+    }
+
+    public void setDoorName(String doorName) {
+        this.doorName = doorName;
+    }
+
+    public String getLayers() {
+        return layers;
+    }
+
+    public void setLayers(String layers) {
+        this.layers = layers;
+    }
+
+    public int getChemicalNumber() {
+        return chemicalNumber;
+    }
+
+    public void setChemicalNumber(int chemicalNumber) {
+        this.chemicalNumber = chemicalNumber;
+    }
 
     public String getBelongAccount() {
         return belongAccount;
@@ -258,4 +337,68 @@ public class HxpChemicalVo implements Serializable {
     public void setFactory(String factory) {
         this.factory = factory;
     }
+
+    public List<StockDetailsModel> getStockDetailsModelList() {
+        return stockDetailsModelList;
+    }
+
+    public void setStockDetailsModelList(List<StockDetailsModel> stockDetailsModelList) {
+        this.stockDetailsModelList = stockDetailsModelList;
+    }
+
+    public long getSubId() {
+        return subId;
+    }
+
+    public void setSubId(long subId) {
+        this.subId = subId;
+    }
+
+    public long getOneUserId() {
+        return oneUserId;
+    }
+
+    public void setOneUserId(long oneUserId) {
+        this.oneUserId = oneUserId;
+    }
+
+    public String getOneUserName() {
+        return oneUserName;
+    }
+
+    public void setOneUserName(String oneUserName) {
+        this.oneUserName = oneUserName;
+    }
+
+    public String getOneUserMobile() {
+        return oneUserMobile;
+    }
+
+    public void setOneUserMobile(String oneUserMobile) {
+        this.oneUserMobile = oneUserMobile;
+    }
+
+    public long getTwoUserId() {
+        return twoUserId;
+    }
+
+    public void setTwoUserId(long twoUserId) {
+        this.twoUserId = twoUserId;
+    }
+
+    public String getTwoUserName() {
+        return twoUserName;
+    }
+
+    public void setTwoUserName(String twoUserName) {
+        this.twoUserName = twoUserName;
+    }
+
+    public String getTwoUserMobile() {
+        return twoUserMobile;
+    }
+
+    public void setTwoUserMobile(String twoUserMobile) {
+        this.twoUserMobile = twoUserMobile;
+    }
 }

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

@@ -7,14 +7,21 @@ 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.AddChemical;
 import com.rc.httpcore.bean.HxpChemicalVo;
 import com.rc.httpcore.vo.request.FaceCompare1Req;
 
+import org.json.JSONObject;
+
 import java.io.File;
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import okhttp3.Call;
 import okhttp3.Response;
+import retrofit2.http.POST;
 
 public final class HttpTool {
 
@@ -64,12 +71,14 @@ public final class HttpTool {
     /**
      * 入库
      */
-    public static Response addChemical(List<HxpChemicalVo> hxpChemicalList) throws IOException {
-        return OkHttpUtils.postSync(HttpConfig.Companion.getAPI_BASE_URL() + "chemical/aio/addStock", GsonUtils.toJson(hxpChemicalList));
+    public static Response addChemical(List<HxpChemicalVo> hxpChemicalList) throws Exception {
+        String json = GsonUtils.toJson(new AddChemical(hxpChemicalList));
+        LogUtils.d(json);
+        return OkHttpUtils.postSync(HttpConfig.Companion.getAPI_BASE_URL() + "chemical/aio/addStock", json);
     }
 
     /**
-     * 双人验证
+     * 双人验证人脸
      *
      * @param photoFile       图片
      * @param faceCompare1Req 支持多个柜门权限验证
@@ -78,4 +87,27 @@ public final class HttpTool {
         return OkHttpUtils.postFileAndJson(HttpConfig.Companion.getAPI_BASE_URL() + "chemical/aio/verify/checkUserFaceByPic1", photoFile, subjectId, faceCompare1Req);
     }
 
+    /**
+     * 双人验证刷卡
+     */
+    public static Response useCardVerify1(String card, String subjectId, List<String> doorIds) throws IOException {
+        Map<String, Object> map = new HashMap<>();
+        map.put("cardNum", card);
+        map.put("subId", subjectId);
+        map.put("doorIds", doorIds);
+        return OkHttpUtils.postSync(HttpConfig.Companion.getAPI_BASE_URL() + "chemical/aio/verify/useCardVerify1", GsonUtils.toJson(map));
+    }
+
+    /**
+     * 双人验证扫码
+     * 小程序扫码后查询小程序扫码登录状态
+     */
+    public static Response aioScanLogin1(String time, String subjectId, List<String> doorIds) throws IOException {
+        Map<String, Object> map = new HashMap<>();
+        map.put("code", time);
+        map.put("subId", subjectId);
+        map.put("doorIds", doorIds);
+        return OkHttpUtils.postSync(HttpConfig.Companion.getAPI_BASE_URL() + "chemical/aio/verify/aioScanLogin1", GsonUtils.toJson(map));
+    }
+
 }

+ 21 - 19
app/src/main/java/com/example/chemical/ui/common/BaseCountDownActivity.kt

@@ -7,6 +7,7 @@ import android.os.Looper
 import android.os.Message
 import android.util.Log
 import androidx.viewbinding.ViewBinding
+import com.blankj.utilcode.util.LogUtils
 import com.example.chemical.ChemicalApp
 import com.example.chemical.comm.Constants
 import com.example.chemical.iml.IBankTeps
@@ -26,6 +27,7 @@ abstract class BaseCountDownActivity<VB : ViewBinding> : RcBaseActivity<VB>() {
     var mDialog: Dialog? = null
     private var mCounter = 0
     private var mIBankTeps: IBankTeps? = null
+
     companion object {
         private var MAX_TIME = 60    //注销时间必须大于自动返回时间   单位
         private const val WHAT_COUNT_DOWN = 1
@@ -92,25 +94,25 @@ abstract class BaseCountDownActivity<VB : ViewBinding> : RcBaseActivity<VB>() {
     private val mCountDownHandler = object : Handler(Looper.getMainLooper()) {
 
         override fun handleMessage(msg: Message) {
-//            if (WHAT_COUNT_DOWN == msg.what) {
-//
-//                val countDown = MAX_TIME - mCounter
-//                if (isDestroyed) return
-//                if (countDown <= 0) {
-//                    if (Constants.VIEW_TYPE) {
-//                        //当前在废弃or领用页面
-//                        mIBankTeps!!.onViewLint()
-//                    } else {
-//                        UiManager.switcherCashier(
-//                            this@BaseCountDownActivity,
-//                            MainActivity::class.java
-//                        )
-//                    }
-//                } else {
-//                    sendEmptyMessageDelayed(WHAT_COUNT_DOWN, 1000)
-//                }
-//                mCounter++
-//            }
+            if (WHAT_COUNT_DOWN == msg.what) {
+                val countDown = MAX_TIME - mCounter
+                LogUtils.d(MAX_TIME, mCounter, countDown)
+                if (isDestroyed) return
+                if (countDown <= 0) {
+                    if (Constants.VIEW_TYPE) {
+                        //当前在废弃or领用页面
+                        mIBankTeps!!.onViewLint()
+                    } else {
+                        UiManager.switcherCashier(
+                            this@BaseCountDownActivity,
+                            MainActivity::class.java
+                        )
+                    }
+                } else {
+                    sendEmptyMessageDelayed(WHAT_COUNT_DOWN, 1000)
+                }
+                mCounter++
+            }
         }
     }
 

+ 0 - 14
app/src/main/java/com/example/chemical/ui/plan/PlanAddActivity.java

@@ -17,7 +17,6 @@ import androidx.annotation.Nullable;
 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;
@@ -25,7 +24,6 @@ import com.blankj.utilcode.util.TimeUtils;
 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;
@@ -48,25 +46,13 @@ import com.example.chemical.utils.UiManager;
 import com.kongzue.dialogx.dialogs.PopTip;
 import com.rc.httpcore.HttpConfig;
 import com.rc.httpcore.bean.ChemicalInfoBean;
-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 java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 /**
  * 待录入页面

+ 11 - 2
app/src/main/java/com/example/chemical/ui/plan/PlanAddActivityHelp.java

@@ -24,8 +24,10 @@ 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.kongzue.dialogx.dialogs.PopTip;
+import com.rc.httpcore.HttpConfig;
 import com.rc.httpcore.bean.ChemicalInfoBean;
 import com.rc.httpcore.bean.HxpChemicalVo;
+import com.rc.httpcore.bean.StockDetailsModel;
 import com.rc.httpcore.client.ApiRepository;
 import com.rc.httpcore.client.HttpTool;
 import com.rc.httpcore.exception.NetException;
@@ -34,6 +36,7 @@ import org.json.JSONObject;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -124,8 +127,6 @@ public class PlanAddActivityHelp {
                     activity.binding.lockerVP2.setOffscreenPageLimit(1);
 
                     updateInventoryUi();
-                } else {
-                    activity.showToast("未找到化学品柜!");
                 }
             }
 
@@ -205,6 +206,14 @@ public class PlanAddActivityHelp {
                 if (result == null) {
                     PopTip.show("未找到该化学品!");
                 } else {
+                    List<StockDetailsModel> stockDetailsModelList = result.getStockDetailsModelList();
+                    if (null == stockDetailsModelList) {
+                        stockDetailsModelList = new ArrayList<>();
+                    }
+                    String wxCode = HttpConfig.Companion.getAPI_BASE_QC_URL() + "?code=" + code + "&type=9";
+                    StockDetailsModel stockDetailsModel = new StockDetailsModel(null, null, code, 0, wxCode);
+                    stockDetailsModelList.add(stockDetailsModel);
+                    result.setStockDetailsModelList(stockDetailsModelList);
                     Intent intent = new Intent(activity, AddActivity.class);
                     intent.putExtra("data", "qr");
                     intent.putExtra("Chemical", GsonUtils.toJson(result));

+ 27 - 7
app/src/main/java/com/example/chemical/ui/plan/add/AddActivity.java

@@ -164,6 +164,24 @@ public class AddActivity extends BaseCountDownActivity<ActivityAddBinding> {
         binding.controlledRB.setOnClickListener(v -> hxpChemicalVo.setChemicalLevel(1));
         // 重置
         binding.resetBT.setOnClickListener(v -> addActivityHelp.reset());
+        // 归属人选择
+        binding.belongRB.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                binding.belongLL.setVisibility(View.VISIBLE);
+                binding.topicLL.setVisibility(View.GONE);
+                hxpChemicalVo.setBelongType(2);
+            }
+        });
+        // 课题组选择
+        binding.topicRB.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                binding.topicLL.setVisibility(View.VISIBLE);
+                binding.belongLL.setVisibility(View.GONE);
+                hxpChemicalVo.setBelongType(1);
+            }
+        });
 
         // 位置选择
         intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@@ -244,16 +262,18 @@ public class AddActivity extends BaseCountDownActivity<ActivityAddBinding> {
             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.tvOutLogin.setOnClickListener(v -> callLogoutApi(aBoolean -> {
+            ChemicalApp.userData = null;
+            ChemicalApp.subjectId = null;
+            UiManager.INSTANCE.switcherCashier(AddActivity.this, SplashActivity.class);
+            return null;
+        }));
+
         hxpCabinetDAO = RoomTool.getInstance().hxpCabinetDAO();
         hxpDoorDAO = RoomTool.getInstance().hxpDoorDAO();
         hxpLayerDAO = RoomTool.getInstance().hxpLayerDAO();

+ 37 - 14
app/src/main/java/com/example/chemical/ui/plan/add/AddActivityHelp.java

@@ -322,14 +322,6 @@ public class AddActivityHelp {
         }
         activity.inventoryItemBean.setSize(size);
 
-        // 归属人
-        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 = activity.binding.purityET.getText();
@@ -341,17 +333,37 @@ public class AddActivityHelp {
         if (null != factoryETText && !TextUtils.isEmpty(factoryETText)) {
             activity.hxpChemicalVo.setFactory(factoryETText.toString());
         }
-        // 课题组
-        Editable topicETText = activity.binding.topicET.getText();
-        if (null != topicETText && !TextUtils.isEmpty(topicETText)) {
-            // SQL课题组
+
+
+        // 已选择归属人
+        if (activity.binding.belongTypeRG.getCheckedRadioButtonId() == activity.binding.belongRB.getId()) {
+            // 归属人
+            String userId = (String) activity.binding.belongET.getTag();
+            LogUtils.d(userId);
+            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;
+            }
+            // SQL归属人信息
+            activity.inventoryItemBean.setBelongingPersonBean(activity.belongingPerson);
+        }
+        // 已选择课题组
+        else if (activity.binding.belongTypeRG.getCheckedRadioButtonId() == activity.binding.topicRB.getId()) {
+            // 课题组
+            String topicId = (String) activity.binding.topicET.getTag();
+            LogUtils.d(topicId);
+            if (activity.topicDataBean == null || activity.topicDataBean.getTopicId().isEmpty() || null == topicId || TextUtils.isEmpty(topicId) || !activity.topicDataBean.getTopicId().equals(topicId)) {
+                activity.binding.topicET.setError("请先搜索并选择课题组");
+                activity.binding.topicET.requestFocus();
+                return;
+            }
+            // SQL课题组信息
             activity.inventoryItemBean.setTopicDataBean(activity.topicDataBean);
         }
 
         // SQL化学品信息
         activity.inventoryItemBean.setHxpChemicalVo(activity.hxpChemicalVo);
-        // SQL归属人信息
-        activity.inventoryItemBean.setBelongingPersonBean(activity.belongingPerson);
 
         // 化学品基础信息配置
         activity.addDisposable(ApiRepository.INSTANCE.getControlConfigs(activity.hxpChemicalVo.getChemicalLevel()).subscribe(hxpControlConfig -> {
@@ -495,9 +507,13 @@ public class AddActivityHelp {
             belongName = TextUtils.isEmpty(belongName) ? "" : belongName;
             belongAccount = TextUtils.isEmpty(belongAccount) ? "" : belongAccount;
             activity.binding.belongET.setText(belongName + "-" + belongAccount);
+            activity.binding.belongET.setTag(activity.belongingPerson.getUserId());
             activity.binding.belongET.setEnabled(false);
             activity.binding.belongET.setInputType(InputType.TYPE_NULL);
             activity.binding.belongBT.setEnabled(false);
+            activity.binding.topicLL.setVisibility(View.VISIBLE);
+            activity.binding.belongLL.setVisibility(View.GONE);
+            activity.binding.belongRB.setChecked(true);
         }
         // 课题组
         else {
@@ -507,7 +523,11 @@ public class AddActivityHelp {
             activity.binding.topicET.setText(topicName);
             activity.binding.topicET.setEnabled(false);
             activity.binding.topicET.setInputType(InputType.TYPE_NULL);
+            activity.binding.topicET.setTag(activity.topicDataBean.getTopicId());
             activity.binding.topicBT.setEnabled(false);
+            activity.binding.topicLL.setVisibility(View.VISIBLE);
+            activity.binding.belongLL.setVisibility(View.GONE);
+            activity.binding.topicRB.setChecked(true);
         }
         // 厂家
         String factory = chemicalVo.getFactory();
@@ -557,6 +577,9 @@ public class AddActivityHelp {
             activity.binding.controlledRB.setEnabled(false);
             activity.binding.chemicalSpecMlRB.setEnabled(false);
             activity.binding.chemicalSpecGRB.setEnabled(false);
+
+            activity.binding.topicRB.setEnabled(false);
+            activity.binding.belongRB.setEnabled(false);
         }
 
     }

+ 78 - 14
app/src/main/java/com/example/chemical/ui/plan/save_list/SaveListActivity.java

@@ -1,50 +1,108 @@
 package com.example.chemical.ui.plan.save_list;
 
+import android.content.Intent;
 import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
 
 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.TimeUtils;
+import com.bumptech.glide.Glide;
+import com.example.chemical.ChemicalApp;
 import com.example.chemical.databinding.ActivitySaveListBinding;
+import com.example.chemical.ui.MainActivity;
+import com.example.chemical.ui.SplashActivity;
 import com.example.chemical.ui.common.BaseCountDownActivity;
+import com.example.chemical.ui.plan.PlanAddActivity;
+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.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.utils.UiManager;
+import com.kongzue.dialogx.dialogs.PopTip;
+import com.rc.httpcore.HttpConfig;
+import com.rc.httpcore.bean.UserValidationBean;
+import com.rc.httpcore.client.ApiRepository;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.TreeMap;
 
+import io.reactivex.disposables.Disposable;
+
 public class SaveListActivity extends BaseCountDownActivity<ActivitySaveListBinding> {
 
     protected ActivitySaveListBinding binding;
     private SaveListAdapter saveListAdapter;
     private Map<Long, List<SaveListBean>> saveListBeanMap = new TreeMap<>();
+    protected HxpInventoryDAO inventoryDAO;
+    protected HxpCabinetDAO cabinetDAO;
+    protected HxpDoorDAO doorDAO;
+
+    protected PlanAddData planAddData;
+    protected UserValidationBean userValidation1;
+    protected UserValidationBean userValidation2;
+
+    protected Disposable unlockDisposable, unlockStatusDisposable;
+    protected CountDownTimer unlockStatusCDTimer;
 
     @NonNull
     @Override
     protected ActivitySaveListBinding createViewBinding() {
+        ChemicalApp.confs.setBackTime(10);
         binding = ActivitySaveListBinding.inflate(getLayoutInflater());
         return binding;
     }
 
     @Override
-    protected void initViews(@Nullable Bundle savedInstanceState) {
-        super.initViews(savedInstanceState);
-    }
-
-    @Override
     protected void initData() {
         super.initData();
+        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);
+        } catch (Exception e) {
+            LogUtils.e(Log.getStackTraceString(e));
+        }
 
-        HxpInventoryDAO inventoryDAO = RoomTool.getInstance().hxpInventoryDAO();
-        HxpCabinetDAO cabinetDAO = RoomTool.getInstance().hxpCabinetDAO();
-        HxpDoorDAO doorDAO = RoomTool.getInstance().hxpDoorDAO();
+        // 退出
+        binding.tvOutLogin.setOnClickListener(v -> callLogoutApi(aBoolean -> {
+            ChemicalApp.userData = null;
+            ChemicalApp.subjectId = null;
+            UiManager.INSTANCE.switcherCashier(SaveListActivity.this, SplashActivity.class);
+            return null;
+        }));
+
+        inventoryDAO = RoomTool.getInstance().hxpInventoryDAO();
+        cabinetDAO = RoomTool.getInstance().hxpCabinetDAO();
+        doorDAO = RoomTool.getInstance().hxpDoorDAO();
         List<InventoryItemBean> inventoryItemBeanList = inventoryDAO.getAll();
 
         for (int i = 0; i < inventoryItemBeanList.size(); i++) {
@@ -65,18 +123,24 @@ public class SaveListActivity extends BaseCountDownActivity<ActivitySaveListBind
             } else {
                 saveListBean.setTitle(false);
             }
-
-
             saveListBeanList.add(saveListBean);
             saveListBeanMap.put(doorVo.getDoorId(), saveListBeanList);
         }
 
         saveListAdapter = new SaveListAdapter(this, saveListBeanMap);
         binding.saveLV.setAdapter(saveListAdapter);
-//        List<String> logs = splitStringIntoChunks(GsonUtils.toJson(saveListBeanMap), 500);
-//        for (int i = 0; i < logs.size(); i++) {
-//            Log.d("Jacye", logs.get(i));
-//        }
+        List<String> logs = splitStringIntoChunks(GsonUtils.toJson(saveListBeanMap), 500);
+        for (int i = 0; i < logs.size(); i++) {
+            Log.d("Jacye", logs.get(i));
+        }
+
+        Intent getIntent = getIntent();
+        planAddData = GsonUtils.fromJson(getIntent.getStringExtra("data"), PlanAddData.class);
+        userValidation1 = GsonUtils.fromJson(getIntent.getStringExtra("userValidation1"), UserValidationBean.class);
+        userValidation2 = GsonUtils.fromJson(getIntent.getStringExtra("userValidation2"), UserValidationBean.class);
+
+        binding.exit.setOnClickListener(v -> UiManager.INSTANCE.switcher(SaveListActivity.this, MainActivity.class));
+
     }
 
     public List<String> splitStringIntoChunks(String inputString, int chunkSize) {

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

@@ -1,22 +1,30 @@
 package com.example.chemical.ui.plan.save_list;
 
+import android.os.CountDownTimer;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 
 import com.blankj.utilcode.util.LogUtils;
+import com.example.chemical.ChemicalApp;
 import com.example.chemical.databinding.ItemSaveListBinding;
 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.HxpDoorDAO;
+import com.kongzue.dialogx.dialogs.PopTip;
 import com.rc.httpcore.bean.BelongingPersonBean;
 import com.rc.httpcore.bean.HxpChemicalVo;
+import com.rc.httpcore.bean.TopicDataBean;
+import com.rc.httpcore.client.ApiRepository;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -68,7 +76,7 @@ public class SaveListAdapter extends BaseAdapter {
                     List<HxpCabinetLockVo> lockVoList = doorVo.getCabinetLockVoList();
                     if (null != lockVoList && !lockVoList.isEmpty()) {
                         HxpCabinetLockVo lockVo = lockVoList.get(0);
-                        LogUtils.d("再次开锁", lockVo.getLockName(), lockVo.getLockNum());
+                        unlock(lockVo);
                     }
                 }
             });
@@ -76,56 +84,61 @@ public class SaveListAdapter extends BaseAdapter {
             viewHolder = (ViewHolder) convertView.getTag();
         }
 
-        if (null != saveListBean) {
-            if (saveListBean.isTitle()) {
-                viewHolder.binding.titlleLL.setVisibility(View.VISIBLE);
-            } else {
-                viewHolder.binding.titlleLL.setVisibility(View.GONE);
-            }
-            String cabinetName = saveListBean.getCabinetName();
-            cabinetName = TextUtils.isEmpty(cabinetName) ? "" : cabinetName;
-            String doorName = saveListBean.getDoorName();
-            doorName = TextUtils.isEmpty(doorName) ? "" : doorName;
-            viewHolder.binding.cabinetTV.setText(cabinetName + "-" + doorName);
-
-            InventoryItemBean inventoryItemBean = saveListBean.getInventoryItemBean();
-            if (null != inventoryItemBean) {
-                HxpChemicalVo chemicalVo = inventoryItemBean.getHxpChemicalVo();
-                if (null != chemicalVo) {
-                    // 化学品名称
-                    String chemicalName = chemicalVo.getChemicalName();
-                    viewHolder.binding.name.setText(TextUtils.isEmpty(chemicalName) ? "" : cabinetName);
-                    // CAS
-                    String casNum = chemicalVo.getCasNum();
-                    viewHolder.binding.cas.setText(TextUtils.isEmpty(casNum) ? "" : casNum);
-                    // 类别
-                    String chemicalCategoryName = chemicalVo.getChemicalCategoryName();
-                    viewHolder.binding.type.setText(TextUtils.isEmpty(chemicalCategoryName) ? "" : chemicalCategoryName);
-                    // 级别
-                    String levelName = chemicalVo.getChemicalLevelName();
-                    viewHolder.binding.level.setText(TextUtils.isEmpty(levelName) ? "" : levelName);
-                    // 规格
-                    double specNum = chemicalVo.getSpecNum();
-                    String specUnit = chemicalVo.getSpecUnit();
-                    specUnit = TextUtils.isEmpty(specUnit) ? "" : specUnit;
-                    viewHolder.binding.specs.setText(specNum + "/" + specUnit);
-                    // 净含量
-                    double netWt = chemicalVo.getNetContent();
-                    viewHolder.binding.netWT.setText(netWt + specUnit);
-                    // 数量
-                    int size = inventoryItemBean.getSize();
-                    viewHolder.binding.hxpSum.setText(String.valueOf(size));
-                    // 归属人
-                    BelongingPersonBean personBean = inventoryItemBean.getBelongingPersonBean();
-                    String userName = personBean.getUserName();
-                    viewHolder.binding.owner.setText(TextUtils.isEmpty(userName) ? "" : userName);
-                    // 是否全新
-//                    viewHolder.binding.cas.setText(TextUtils.isEmpty(casNum) ? "" : casNum);
-                    // 存储层
-                    int layer = inventoryItemBean.getLayer();
-                    viewHolder.binding.layer.setText(layer + "层");
+        try {
+            if (null != saveListBean) {
+                if (saveListBean.isTitle()) {
+                    viewHolder.binding.titlleLL.setVisibility(View.VISIBLE);
+                } else {
+                    viewHolder.binding.titlleLL.setVisibility(View.GONE);
+                }
+                String cabinetName = saveListBean.getCabinetName();
+                cabinetName = TextUtils.isEmpty(cabinetName) ? "" : cabinetName;
+                String doorName = saveListBean.getDoorName();
+                doorName = TextUtils.isEmpty(doorName) ? "" : doorName;
+                viewHolder.binding.cabinetTV.setText(cabinetName + "-" + doorName);
+
+                InventoryItemBean inventoryItemBean = saveListBean.getInventoryItemBean();
+                if (null != inventoryItemBean) {
+                    HxpChemicalVo chemicalVo = inventoryItemBean.getHxpChemicalVo();
+                    if (null != chemicalVo) {
+                        // 化学品名称
+                        String chemicalName = chemicalVo.getChemicalName();
+                        viewHolder.binding.name.setText(TextUtils.isEmpty(chemicalName) ? "" : cabinetName);
+                        // CAS
+                        String casNum = chemicalVo.getCasNum();
+                        viewHolder.binding.cas.setText(TextUtils.isEmpty(casNum) ? "" : casNum);
+                        // 类别
+                        String chemicalCategoryName = chemicalVo.getChemicalCategoryName();
+                        viewHolder.binding.type.setText(TextUtils.isEmpty(chemicalCategoryName) ? "" : chemicalCategoryName);
+                        // 级别
+                        int level = chemicalVo.getChemicalLevel();
+                        viewHolder.binding.level.setText(1 == level ? "管控" : "非管控");
+                        // 规格
+                        double specNum = chemicalVo.getSpecNum();
+                        String specUnit = chemicalVo.getSpecUnit();
+                        specUnit = TextUtils.isEmpty(specUnit) ? "" : specUnit;
+                        viewHolder.binding.specs.setText(specNum + "/" + specUnit);
+                        // 净含量
+                        double netWt = chemicalVo.getNetContent();
+                        viewHolder.binding.netWT.setText(netWt + specUnit);
+                        // 数量
+                        int size = inventoryItemBean.getSize();
+                        viewHolder.binding.hxpSum.setText(String.valueOf(size));
+                        // 归属
+                        BelongingPersonBean personBean = inventoryItemBean.getBelongingPersonBean();
+                        TopicDataBean topicDataBean = inventoryItemBean.getTopicDataBean();
+                        String name;
+                        if (null == personBean) {
+                            name = topicDataBean.getTopicName();
+                        } else {
+                            name = personBean.getUserName();
+                        }
+                        viewHolder.binding.owner.setText(TextUtils.isEmpty(name) ? "" : name);
+                    }
                 }
             }
+        } catch (Exception e) {
+            LogUtils.e(Log.getStackTraceString(e));
         }
         return convertView;
     }
@@ -137,4 +150,83 @@ public class SaveListAdapter extends BaseAdapter {
             this.binding = binding;
         }
     }
+
+    /**
+     * 单独开锁
+     */
+    public void unlock(HxpCabinetLockVo nowLockVo) {
+        activity.showLoading("开锁中...", false);
+        Map<String, Object> map = new HashMap<>();
+        map.put("subId", ChemicalApp.subjectId);
+        map.put("subName", ChemicalApp.subjectName);
+
+
+        HxpCabinetDoorVo hxpDoorVo = doorDAO.getById(nowLockVo.getDoorId());
+
+
+        if (null != hxpDoorVo) {
+            map.put("doorId", hxpDoorVo.getDoorId());
+            map.put("doorName", hxpDoorVo.getDoorName());
+            HxpCabinetVo hxpCabinetVo = activity.cabinetDAO.getById(hxpDoorVo.getCabinetId());
+            if (null != hxpCabinetVo) {
+                map.put("cabinetId", hxpCabinetVo.getCabinetId());
+                map.put("cabinetName", hxpCabinetVo.getCabinetName());
+            }
+        }
+        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 (activity.userValidation1 != null) {
+            map.put("oneUserId", activity.userValidation1.getUserId());
+            map.put("oneUserName", activity.userValidation1.getUserName());
+        }
+        if (null != activity.userValidation2) {
+            map.put("twoUserId", activity.userValidation2.getUserId());
+            map.put("twoUserName", activity.userValidation2.getUserName());
+        }
+        LogUtils.json("手动开锁", map);
+        activity.unlockDisposable = ApiRepository.INSTANCE.lockOperate(map).subscribe(aBoolean -> {
+            LogUtils.d("手动开锁", nowLockVo.getLockNum(), nowLockVo.getLockName(), aBoolean);
+            if (aBoolean) {
+                activity.unlockStatusCDTimer = new CountDownTimer(30 * 1000, 3000) {
+                    @Override
+                    public void onTick(long millisUntilFinished) {
+                        if (null != activity.unlockStatusDisposable) {
+                            activity.delDisposable(activity.unlockStatusDisposable);
+                        }
+                        activity.unlockStatusDisposable = ApiRepository.INSTANCE.getLocks(ChemicalApp.subjectId, nowLockVo.getLockNum()).subscribe(aBoolean -> {
+                            LogUtils.d("手动开锁查询状态", nowLockVo.getLockNum(), nowLockVo.getLockName(), aBoolean);
+                            if (aBoolean) {
+                                activity.unlockStatusCDTimer.cancel();
+                                PopTip.show("开门成功!");
+                                activity.dismissLoading();
+                            }
+                        }, throwable -> LogUtils.e(Log.getStackTraceString(throwable)));
+                        activity.addDisposable(activity.unlockStatusDisposable);
+                    }
+
+                    @Override
+                    public void onFinish() {
+                        LogUtils.d("手动开锁失败", nowLockVo.getLockNum(), nowLockVo.getLockName());
+                        activity.dismissLoading();
+
+                        if (null != hxpDoorVo) {
+                            PopTip.show(hxpDoorVo.getDoorName() + "开门失败!");
+                        } else {
+                            PopTip.show("开门失败!");
+                        }
+                    }
+                };
+                activity.unlockStatusCDTimer.start();
+            } else {
+                nowLockVo.setUnlockType(2);
+            }
+        }, throwable -> LogUtils.e(Log.getStackTraceString(throwable)));
+        activity.addDisposable(activity.unlockDisposable);
+    }
 }

+ 11 - 6
app/src/main/java/com/example/chemical/ui/plan/unlock/UnlockActivity.java

@@ -22,14 +22,11 @@ public class UnlockActivity extends BaseCountDownActivity<ActivityUnlockBinding>
     private ActivityResultLauncher<Intent> intentActivityResultLauncher;
     protected UnlockActivityHelp activityHelp;
 
+    protected PlanAddData planAddData;
     // 验证通过的人员1
     private UserValidationBean userValidation1;
     // 验证通过的人员2
     private UserValidationBean userValidation2;
-    /**
-     * 是否管控
-     */
-    private boolean isControl = false;
 
     protected UnlockAdapter unlockAdapter;
 
@@ -46,7 +43,7 @@ public class UnlockActivity extends BaseCountDownActivity<ActivityUnlockBinding>
         if (null != getIntent && getIntent.hasExtra("data")) {
             String json = getIntent.getStringExtra("data");
             if (null != json && !TextUtils.isEmpty(json)) {
-                PlanAddData planAddData = GsonUtils.fromJson(json, PlanAddData.class);
+                planAddData = GsonUtils.fromJson(json, PlanAddData.class);
                 activityHelp = new UnlockActivityHelp(this, planAddData);
 
                 intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
@@ -61,7 +58,15 @@ public class UnlockActivity extends BaseCountDownActivity<ActivityUnlockBinding>
                         activityHelp.unlock(userValidation1, userValidation2);
                     }
                 });
-                binding.validateBT.setOnClickListener(v -> intentActivityResultLauncher.launch(new Intent(UnlockActivity.this, DoubleVerifyActivity.class)));
+                binding.validateBT.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        Intent intent = new Intent(UnlockActivity.this, DoubleVerifyActivity.class);
+                        String json = GsonUtils.toJson(planAddData);
+                        intent.putExtra("data", json);
+                        intentActivityResultLauncher.launch(intent);
+                    }
+                });
 
                 binding.retryBT.setOnClickListener(v -> activityHelp.reTryUnlock());
                 binding.saveBT.setOnClickListener(new View.OnClickListener() {

+ 72 - 7
app/src/main/java/com/example/chemical/ui/plan/unlock/UnlockActivityHelp.java

@@ -1,11 +1,13 @@
 package com.example.chemical.ui.plan.unlock;
 
+import android.content.Intent;
 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.GsonUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ThreadUtils;
 import com.example.chemical.ChemicalApp;
@@ -18,14 +20,21 @@ 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.verify.DoubleVerifyActivity;
 import com.kongzue.dialogx.dialogs.PopTip;
+import com.rc.httpcore.bean.BelongingPersonBean;
 import com.rc.httpcore.bean.HxpChemicalVo;
+import com.rc.httpcore.bean.TopicDataBean;
 import com.rc.httpcore.bean.UserValidationBean;
 import com.rc.httpcore.client.ApiRepository;
 import com.rc.httpcore.client.HttpTool;
 
+import org.json.JSONObject;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -61,7 +70,6 @@ public class UnlockActivityHelp {
         }
     }
 
-
     public UnlockActivityHelp(UnlockActivity activity, PlanAddData planAddData) {
         this.activity = activity;
         this.cabinetList = planAddData.getCabinetList();
@@ -489,27 +497,84 @@ public class UnlockActivityHelp {
 
     public void save() {
         activity.showLoading("入库中...", false);
-        ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Object>() {
+        ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<String>() {
             @Override
-            public Object doInBackground() throws Throwable {
+            public String doInBackground() throws Throwable {
                 HxpInventoryDAO hxpInventoryDAO = RoomTool.getInstance().hxpInventoryDAO();
+                HxpCabinetDAO cabinetDAO = RoomTool.getInstance().hxpCabinetDAO();
+                HxpDoorDAO doorDAO = RoomTool.getInstance().hxpDoorDAO();
                 List<InventoryItemBean> inventoryItemBeanList = hxpInventoryDAO.getAll();
+                LogUtils.json(inventoryItemBeanList);
                 List<HxpChemicalVo> hxpChemicalVoList = new ArrayList<>();
                 for (int i = 0; i < inventoryItemBeanList.size(); i++) {
                     InventoryItemBean inventoryItemBean = inventoryItemBeanList.get(i);
+                    BelongingPersonBean belongingPersonBean = inventoryItemBean.getBelongingPersonBean();
+                    TopicDataBean topicDataBean = inventoryItemBean.getTopicDataBean();
                     HxpChemicalVo hxpChemicalVo = inventoryItemBean.getHxpChemicalVo();
+                    if (null == belongingPersonBean) {
+                        hxpChemicalVo.setBelongId(Long.parseLong(topicDataBean.getTopicId()));
+                        hxpChemicalVo.setBelongName(topicDataBean.getTopicName());
+                        hxpChemicalVo.setBelongType(2);
+                    } else {
+                        hxpChemicalVo.setBelongId(Long.parseLong(belongingPersonBean.getUserId()));
+                        hxpChemicalVo.setBelongName(belongingPersonBean.getUserId());
+                        hxpChemicalVo.setBelongType(1);
+                    }
+                    hxpChemicalVo.setOneUserId(Long.parseLong(userValidation1.getUserId()));
+                    hxpChemicalVo.setOneUserName(userValidation1.getUserName());
+                    hxpChemicalVo.setTwoUserId(Long.parseLong(userValidation2.getUserId()));
+                    hxpChemicalVo.setTwoUserName(userValidation2.getUserName());
+                    hxpChemicalVo.setSubId(Long.parseLong(ChemicalApp.subjectId));
+
+                    hxpChemicalVo.setChemicalNumber(inventoryItemBean.getSize());
+                    HxpCabinetVo cabinetVo = cabinetDAO.getById(inventoryItemBean.getCabinetId());
+                    hxpChemicalVo.setCabinetId(cabinetVo.getCabinetId());
+                    hxpChemicalVo.setCabinetName(cabinetVo.getCabinetName());
+
+                    HxpCabinetDoorVo doorVo = doorDAO.getById(inventoryItemBean.getDoorId());
+                    hxpChemicalVo.setDoorId(doorVo.getDoorId());
+                    hxpChemicalVo.setDoorName(doorVo.getDoorName());
+
+                    hxpChemicalVo.setLayers(String.valueOf(inventoryItemBean.getLayer()));
                     hxpChemicalVoList.add(hxpChemicalVo);
                 }
                 Response response = HttpTool.addChemical(hxpChemicalVoList);
-                LogUtils.json(response);
-                LogUtils.d(response.body().string());
-                return null;
+                if (response.isSuccessful()) {
+                    String json = response.body().string();
+                    JSONObject jsonObject = new JSONObject(json);
+                    int code = jsonObject.getInt("code");
+                    if (code == 200) {
+                        return "";
+                    } else {
+                        return jsonObject.getString("message");
+                    }
+                } else {
+                    return response.message();
+                }
             }
 
             @Override
-            public void onSuccess(Object result) {
+            public void onSuccess(String result) {
+                activity.dismissLoading();
+                if (!TextUtils.isEmpty(result)) {
+                    PopTip.show(result);
+                } else {
+                    activity.finish();
+
+                    Intent intent = new Intent(activity, SaveListActivity.class);
+                    intent.putExtra("data", GsonUtils.toJson(activity.planAddData));
+                    intent.putExtra("userValidation1", GsonUtils.toJson(userValidation1));
+                    intent.putExtra("userValidation2", GsonUtils.toJson(userValidation1));
+                    activity.startActivity(intent);
+                }
+            }
+
+            @Override
+            public void onFail(Throwable t) {
+                super.onFail(t);
                 activity.dismissLoading();
             }
         });
     }
+
 }

+ 25 - 23
app/src/main/java/com/example/chemical/ui/verify/DoubleVerifyActivity.java

@@ -7,38 +7,42 @@ import android.view.View;
 
 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;
 import com.example.chemical.ui.common.BaseCountDownActivity;
+import com.example.chemical.ui.plan.PlanAddData;
 import com.example.chemical.ui.verify.include.DetectType;
 import com.rc.httpcore.bean.UserValidationBean;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import kotlin.Triple;
+
 public class DoubleVerifyActivity extends BaseCountDownActivity<ActivityDoubleVerifyBinding> {
     protected ActivityDoubleVerifyBinding binding;
-
     private DoubleVerifyActivityHelp activityHelp;
-    private PortScanHelper portScanHelper;
+    protected PortScanHelper portScanHelper;
 
     /**
      * 当前识别类型
      */
-    private DetectType detectType = DetectType.FACE_DETECT;
+    protected DetectType detectType = DetectType.FACE_DETECT;
 
     /**
      * a:是否验证通过
      * b:是否是 全部柜门管理员或安全员或实验室负责人
+     * c:通过人的ID
      */
-    protected final List<Pair<Boolean, Boolean>> doubleVerifyList = new ArrayList<Pair<Boolean, Boolean>>() {{
-        add(Pair.create(false, false));
-        add(Pair.create(false, false));
+    protected final List<Triple<Boolean, Boolean, Long>> doubleVerifyList = new ArrayList<Triple<Boolean, Boolean, Long>>() {{
+        add(new Triple<>(false, false, 0L));
+        add(new Triple<>(false, false, 0L));
     }};
 
+    protected PlanAddData planAddData;
+
     @NonNull
     @Override
     protected ActivityDoubleVerifyBinding createViewBinding() {
@@ -54,6 +58,9 @@ public class DoubleVerifyActivity extends BaseCountDownActivity<ActivityDoubleVe
     @Override
     protected void initData() {
         super.initData();
+
+        planAddData = GsonUtils.fromJson(getIntent().getStringExtra("data"), PlanAddData.class);
+
         binding.card1IB.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -93,21 +100,7 @@ public class DoubleVerifyActivity extends BaseCountDownActivity<ActivityDoubleVe
         });
         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.tvReturn.setOnClickListener(v -> finish());
     }
 
     @Override
@@ -118,6 +111,15 @@ public class DoubleVerifyActivity extends BaseCountDownActivity<ActivityDoubleVe
         return super.dispatchKeyEvent(event);
     }
 
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (null != activityHelp) {
+            activityHelp.onDestroy();
+            activityHelp = null;
+        }
+    }
+
     public interface DoubleVerifyListener {
         /**
          * @param type               验证类型

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

@@ -2,42 +2,163 @@ package com.example.chemical.ui.verify;
 
 import android.content.Intent;
 import android.graphics.Bitmap;
+import android.os.CountDownTimer;
 import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
-import androidx.core.util.Pair;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.util.ConvertUtils;
 import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.RegexUtils;
 import com.blankj.utilcode.util.ResourceUtils;
 import com.blankj.utilcode.util.ThreadUtils;
+import com.example.chemical.ChemicalApp;
 import com.example.chemical.R;
 import com.example.chemical.databinding.ActivityDoubleVerifyBinding;
+import com.example.chemical.receiver.OnSerialScanListener;
+import com.example.chemical.receiver.PortScanHelper;
+import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetDoorVo;
 import com.example.chemical.ui.verify.include.DetectType;
 import com.example.chemical.ui.verify.include.FaceDetectView;
 import com.example.chemical.utils.AudioPlayer;
+import com.example.chemical.utils.TimesUils;
 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.lztek.toolkit.Lztek;
 import com.rc.httpcore.HttpConfig;
 import com.rc.httpcore.bean.UserValidationBean;
+import com.rc.httpcore.client.HttpTool;
+
+import org.json.JSONObject;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import kotlin.Triple;
+import okhttp3.Response;
 
 public class DoubleVerifyActivityHelp {
     private DoubleVerifyActivity activity;
     private ActivityDoubleVerifyBinding binding;
+    private String qrScanTime;
     /**
      * 验证通过的人信息
      */
     private UserValidationBean userValidation1, userValidation2;
 
+    public void onDestroy() {
+        if (null != qrTimer) {
+            qrTimer.cancel();
+            qrTimer = null;
+        }
+
+    }
+
     public DoubleVerifyActivityHelp(DoubleVerifyActivity activity) {
         this.activity = activity;
         binding = activity.binding;
+
+        activity.portScanHelper = new PortScanHelper(activity, new OnSerialScanListener() {
+            @Override
+            public void dispatchScanEvent(@NonNull ScanType type, @NonNull String content) {
+                boolean isCard = RegexUtils.isMatch("^[-+]?\\d+$", content);
+                if (isCard) {
+                    List<HxpCabinetDoorVo> planAddDataDoorList = activity.planAddData.getDoorList();
+                    List<String> doorIdList = new ArrayList<>();
+                    if (null != planAddDataDoorList && !planAddDataDoorList.isEmpty()) {
+                        for (int i = 0; i < planAddDataDoorList.size(); i++) {
+                            doorIdList.add(String.valueOf(planAddDataDoorList.get(i).getDoorId()));
+                        }
+                    }
+                    ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<UserValidationBean>() {
+                        @Override
+                        public UserValidationBean doInBackground() throws Throwable {
+                            try {
+                                Response response = HttpTool.useCardVerify1(content, ChemicalApp.subjectId, doorIdList);
+                                if (response.isSuccessful()) {
+                                    String json = response.body().string();
+                                    JSONObject jsonObject = new JSONObject(json);
+                                    int code = jsonObject.getInt("code");
+                                    if (200 == code) {
+                                        return GsonUtils.fromJson(jsonObject.getJSONObject("data").toString(), UserValidationBean.class);
+                                    } else {
+                                        PopTip.show(jsonObject.getString("message"));
+                                    }
+                                } else {
+                                    PopTip.show(response.message());
+                                }
+                            } catch (IOException e) {
+                                LogUtils.e(Log.getStackTraceString(e));
+                            }
+
+                            return null;
+                        }
+
+                        @Override
+                        public void onSuccess(UserValidationBean result) {
+                            if (null != result) {
+                                verifyProcess(result);
+                            }
+                        }
+                    });
+                } else {
+                    PopTip.show("非法的卡号");
+                }
+            }
+        });
+    }
+
+    private void verifyProcess(UserValidationBean userValidation) {
+        // 是否是 全部柜门管理员、安全员、实验室负责人
+        boolean isAdmin = Boolean.TRUE.equals(userValidation.getSafeUser()) || Boolean.TRUE.equals(userValidation.getAdminUser()) || Boolean.TRUE.equals(userValidation.getCabinetAdmin());
+        Triple<Boolean, Boolean, Long> first = activity.doubleVerifyList.get(0);
+        Triple<Boolean, Boolean, Long> second = activity.doubleVerifyList.get(1);
+        // 第一个人是否已认证通过 第二个人未通过
+        if (!first.getFirst() && !second.getFirst()) {
+            binding.hint1IV.setText("第一位验证已通过");
+            PopTip.show("第一位验证已通过!");
+            userValidation1 = userValidation;
+            activity.doubleVerifyList.set(0, new Triple<>(true, isAdmin, Long.valueOf(userValidation.getUserId())));
+            // 切换到第二位验证人 默认人脸方式
+            switchShowDetect(DetectType.FACE_DETECT, false, true);
+        }
+        if (first.getFirst() && !second.getFirst()) {
+            //  至少一个人是管理员
+            if (!first.getSecond() && !isAdmin) {
+                PopTip.show("请联系柜门管理员、安全员、实验室负责人进行验证");
+                return;
+            }
+
+//                                    // 重复的人
+//                                    if (first.getThird() == Long.parseLong(result.getUserId())) {
+//                                        PopTip.show("验证人不能相同!");
+//                                        return;
+//                                    }
+            activity.doubleVerifyList.set(1, new Triple<>(true, isAdmin, Long.valueOf(userValidation.getUserId())));
+            binding.hint2IV.setText("第二位验证已通过");
+            PopTip.show("第2位验证已通过!");
+            userValidation2 = userValidation;
+            doubleVerifySuccess();
+        }
+
+    }
+
+    private void doubleVerifySuccess() {
+        PopTip.show("双人认证成功");
+        AudioPlayer.getInstance().play(R.raw.shuangren_tongguo);
+        Intent intent = new Intent();
+        intent.putExtra("userValidation1", GsonUtils.toJson(userValidation1));
+        intent.putExtra("userValidation2", GsonUtils.toJson(userValidation2));
+        activity.setResult(TwoPersonActivity.RESULT_OK, intent);
+        activity.finish();
     }
 
     /**
@@ -48,17 +169,15 @@ public class DoubleVerifyActivityHelp {
      * @param isShow     是否展示
      */
     public void switchShowDetect(DetectType faceDetect, boolean isFirst, boolean isShow) {
-        Pair<Boolean, Boolean> first = activity.doubleVerifyList.get(0);
-        Pair<Boolean, Boolean> second = activity.doubleVerifyList.get(1);
-        if (first.first && second.first) {
+        Triple<Boolean, Boolean, Long> first = activity.doubleVerifyList.get(0);
+        Triple<Boolean, Boolean, Long> second = activity.doubleVerifyList.get(1);
+        if (first.getFirst() && second.getFirst()) {
             PopTip.show("双人认证已通过!");
             return;
         }
-        // 切换UI
-        switchDetectUi(faceDetect, isFirst);
         // 是否第一位
         if (isFirst) {
-            if (first.first) {
+            if (first.getFirst()) {
                 PopTip.show("第一位验证已通过!");
                 return;
             }
@@ -66,7 +185,7 @@ public class DoubleVerifyActivityHelp {
             switch (faceDetect) {
                 case FACE_DETECT:
                     if (isShow) {
-                        binding.include1LL.addView(new FaceDetectView(activity, activity, activity.doubleVerifyList, new DoubleVerifyActivity.DoubleVerifyListener() {
+                        binding.include1LL.addView(new FaceDetectView(activity, activity, activity.doubleVerifyList, activity.planAddData, new DoubleVerifyActivity.DoubleVerifyListener() {
                             @Override
                             public void detect(DetectType type, Bitmap faceBitmap, UserValidationBean userValidationBean) {
                                 binding.include1LL.removeAllViewsInLayout();
@@ -100,7 +219,12 @@ public class DoubleVerifyActivityHelp {
                     ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Bitmap>() {
                         @Override
                         public Bitmap doInBackground() throws Throwable {
-                            return createQrCode();
+                            Lztek mLztek = Lztek.create(activity);
+                            String toUpperCase = mLztek.getEthMac().toUpperCase().replace(":", "");
+                            qrScanTime = TimesUils.INSTANCE.getCurrentDateTime();
+                            String url = HttpConfig.Companion.getAPI_BASE_QC_URL() + "?doorId=-1" + "&subId=0" + ChemicalApp.subjectId + "&type=12&macId=" + toUpperCase + "&code=" + qrScanTime;
+                            LogUtils.d("qrUrl", url);
+                            return createQrCode(url);
                         }
 
                         @Override
@@ -108,6 +232,7 @@ public class DoubleVerifyActivityHelp {
                             if (null != result) {
                                 qrIv.setBackground(null);
                                 qrIv.setImageBitmap(result);
+                                startQrTimer();
                             }
                         }
                     });
@@ -116,7 +241,7 @@ public class DoubleVerifyActivityHelp {
                     break;
             }
         } else {
-            if (!first.first) {
+            if (!first.getFirst()) {
                 PopTip.show("第一位验证未通过!");
                 return;
             }
@@ -124,7 +249,7 @@ public class DoubleVerifyActivityHelp {
             switch (faceDetect) {
                 case FACE_DETECT:
                     if (isShow) {
-                        binding.include2LL.addView(new FaceDetectView(activity, activity, activity.doubleVerifyList, new DoubleVerifyActivity.DoubleVerifyListener() {
+                        binding.include2LL.addView(new FaceDetectView(activity, activity, activity.doubleVerifyList, activity.planAddData, new DoubleVerifyActivity.DoubleVerifyListener() {
                             @Override
                             public void detect(DetectType type, Bitmap faceBitmap, UserValidationBean userValidationBean) {
                                 binding.include2LL.removeAllViewsInLayout();
@@ -133,13 +258,7 @@ public class DoubleVerifyActivityHelp {
                                 binding.include2LL.addView(imageView);
                                 binding.hint2IV.setText("第二位验证已通过");
                                 userValidation2 = userValidationBean;
-                                PopTip.show("双人认证成功");
-                                AudioPlayer.getInstance().play(R.raw.shuangren_tongguo);
-                                Intent intent = new Intent();
-                                intent.putExtra("userValidation1", GsonUtils.toJson(userValidation1));
-                                intent.putExtra("userValidation2", GsonUtils.toJson(userValidation2));
-                                activity.setResult(TwoPersonActivity.RESULT_OK, intent);
-                                activity.finish();
+                                doubleVerifySuccess();
                             }
                         }));
                         AudioPlayer.getInstance().play(R.raw.dierwei_renlianshibie);
@@ -165,7 +284,12 @@ public class DoubleVerifyActivityHelp {
                     ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Bitmap>() {
                         @Override
                         public Bitmap doInBackground() throws Throwable {
-                            return createQrCode();
+                            Lztek mLztek = Lztek.create(activity);
+                            String toUpperCase = mLztek.getEthMac().toUpperCase().replace(":", "");
+                            qrScanTime = TimesUils.INSTANCE.getCurrentDateTime();
+                            String url = HttpConfig.Companion.getAPI_BASE_QC_URL() + "?doorId=-1" + "&subId=0" + ChemicalApp.subjectId + "&type=12&macId=" + toUpperCase + "&code=" + qrScanTime;
+                            LogUtils.d("qrUrl", url);
+                            return createQrCode(url);
                         }
 
                         @Override
@@ -173,6 +297,7 @@ public class DoubleVerifyActivityHelp {
                             if (null != result) {
                                 qrIv.setBackground(null);
                                 qrIv.setImageBitmap(result);
+                                startQrTimer();
                             }
                         }
                     });
@@ -181,6 +306,67 @@ public class DoubleVerifyActivityHelp {
                     break;
             }
         }
+        // 切换UI
+        switchDetectUi(faceDetect, isFirst);
+    }
+
+    private CountDownTimer qrTimer = new CountDownTimer(1000, 1000) {
+        @Override
+        public void onTick(long millisUntilFinished) {
+
+        }
+
+        @Override
+        public void onFinish() {
+            if (activity.detectType != DetectType.SCAN_DETECT) {
+                qrTimer.cancel();
+                qrTimer = null;
+            } else {
+                ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<UserValidationBean>() {
+                    @Override
+                    public UserValidationBean doInBackground() throws Throwable {
+                        List<HxpCabinetDoorVo> planAddDataDoorList = activity.planAddData.getDoorList();
+                        List<String> doorIdList = new ArrayList<>();
+                        if (null != planAddDataDoorList && !planAddDataDoorList.isEmpty()) {
+                            for (int i = 0; i < planAddDataDoorList.size(); i++) {
+                                doorIdList.add(String.valueOf(planAddDataDoorList.get(i).getDoorId()));
+                            }
+                        }
+                        Response response = HttpTool.aioScanLogin1(qrScanTime, ChemicalApp.subjectId, doorIdList);
+                        LogUtils.json(response);
+                        LogUtils.d(response.body().string());
+                        if (response.isSuccessful()) {
+                            String json = response.body().string();
+                            JSONObject jsonObject = new JSONObject(json);
+                            int code = jsonObject.getInt("code");
+                            if (200 == code) {
+                                return GsonUtils.fromJson(jsonObject.getJSONObject("data").toString(), UserValidationBean.class);
+                            } else {
+                                PopTip.show(jsonObject.getString("message"));
+                            }
+                        } else {
+                            PopTip.show(response.message());
+                        }
+                        return null;
+                    }
+
+                    @Override
+                    public void onSuccess(UserValidationBean result) {
+                        if (null != result) {
+                            qrTimer.cancel();
+                            qrTimer = null;
+                            verifyProcess(result);
+                        }
+                    }
+                });
+                qrTimer.start();
+            }
+        }
+    };
+
+    private void startQrTimer() {
+        qrTimer.cancel();
+        qrTimer.start();
     }
 
     private void switchDetectUi(DetectType detectType, boolean isFirst) {
@@ -235,10 +421,10 @@ public class DoubleVerifyActivityHelp {
         }
     }
 
-    private Bitmap createQrCode() {
+    private Bitmap createQrCode(String url) {
         BitMatrix bitMatrix;
         try {
-            bitMatrix = new MultiFormatWriter().encode(HttpConfig.Companion.getAPI_BASE_QC_URL(), BarcodeFormat.QR_CODE, 400, 400);
+            bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 400, 400);
         } catch (WriterException e) {
             LogUtils.e(Log.getStackTraceString(e));
             return null;

+ 32 - 11
app/src/main/java/com/example/chemical/ui/verify/include/FaceDetectView.java

@@ -25,6 +25,8 @@ import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ThreadUtils;
 import com.example.chemical.ChemicalApp;
 import com.example.chemical.databinding.FragmentFaceDetectBinding;
+import com.example.chemical.ui.plan.PlanAddData;
+import com.example.chemical.ui.plan.room.bean.locker.HxpCabinetDoorVo;
 import com.example.chemical.ui.verify.DoubleVerifyActivity;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.mlkit.vision.face.FaceDetection;
@@ -42,6 +44,7 @@ import java.io.IOException;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import kotlin.Triple;
 import okhttp3.Response;
 
 public class FaceDetectView extends RelativeLayout {
@@ -59,10 +62,12 @@ public class FaceDetectView extends RelativeLayout {
     private ImageCapture.OutputFileOptions outputFileOptions;
     private File photoFile;
     private DoubleVerifyActivity.DoubleVerifyListener doubleVerifyListener;
-    private List<Pair<Boolean, Boolean>> doubleVerifyList;
+    private List<Triple<Boolean, Boolean, Long>> doubleVerifyList;
+    private PlanAddData planAddData;
 
-    public FaceDetectView(Context context, LifecycleOwner lifecycleOwner, List<Pair<Boolean, Boolean>> doubleVerifyList, DoubleVerifyActivity.DoubleVerifyListener doubleVerifyListener) {
+    public FaceDetectView(Context context, LifecycleOwner lifecycleOwner, List<Triple<Boolean, Boolean, Long>> doubleVerifyList, PlanAddData planAddData, DoubleVerifyActivity.DoubleVerifyListener doubleVerifyListener) {
         super(context);
+        this.planAddData = planAddData;
         this.context = context;
         this.lifecycleOwner = lifecycleOwner;
         this.doubleVerifyListener = doubleVerifyListener;
@@ -157,6 +162,9 @@ public class FaceDetectView extends RelativeLayout {
         ThreadUtils.cancel(simpleTask);
     }
 
+    /**
+     * 每三秒拍照一次
+     */
     ThreadUtils.SimpleTask<Object> simpleTask = new ThreadUtils.SimpleTask<Object>() {
         @Override
         public Object doInBackground() throws Throwable {
@@ -167,7 +175,13 @@ public class FaceDetectView extends RelativeLayout {
                         @Override
                         public UserValidationBean doInBackground() throws Throwable {
                             FaceCompare1Req faceCompare1Req = new FaceCompare1Req();
-                            faceCompare1Req.getDoorIds().add("1877265538691350529");
+                            List<HxpCabinetDoorVo> hxpCabinetDoorVoList = planAddData.getDoorList();
+                            if (null != hxpCabinetDoorVoList) {
+                                for (int i = 0; i < hxpCabinetDoorVoList.size(); i++) {
+                                    HxpCabinetDoorVo hxpCabinetDoorVo = hxpCabinetDoorVoList.get(i);
+                                    faceCompare1Req.getDoorIds().add(String.valueOf(hxpCabinetDoorVo.getDoorId()));
+                                }
+                            }
                             try {
                                 Response response = HttpTool.checkUserFaceByPic1(photoFile, ChemicalApp.subjectId, faceCompare1Req);
                                 if (response.isSuccessful()) {
@@ -193,19 +207,26 @@ public class FaceDetectView extends RelativeLayout {
                             if (null != result) {
                                 // 是否是 全部柜门管理员、安全员、实验室负责人
                                 boolean isAdmin = Boolean.TRUE.equals(result.getSafeUser()) || Boolean.TRUE.equals(result.getAdminUser()) || Boolean.TRUE.equals(result.getCabinetAdmin());
-
-                                Pair<Boolean, Boolean> first = doubleVerifyList.get(0);
-                                Pair<Boolean, Boolean> second = doubleVerifyList.get(0);
+                                Triple<Boolean, Boolean, Long> first = doubleVerifyList.get(0);
+                                Triple<Boolean, Boolean, Long> second = doubleVerifyList.get(1);
                                 // 第一个人是否已认证通过 第二个人未通过
-                                if (!first.first && !second.first) {
-                                    doubleVerifyList.set(0, Pair.create(true, isAdmin));
-                                } else if (first.first && second.first) {
-                                    if (!first.second && !isAdmin) {
+                                if (!first.getFirst() && !second.getFirst()) {
+                                    doubleVerifyList.set(0, new Triple<>(true, isAdmin, Long.valueOf(result.getUserId())));
+                                }
+                                if (first.getFirst() && !second.getFirst()) {
+                                    //  至少一个人是管理员
+                                    if (!first.getSecond() && !isAdmin) {
                                         PopTip.show("请联系柜门管理员、安全员、实验室负责人进行验证");
                                         return;
                                     }
-                                    doubleVerifyList.set(1, Pair.create(true, isAdmin));
+//                                    // 重复的人
+//                                    if (first.getThird() == Long.parseLong(result.getUserId())) {
+//                                        PopTip.show("验证人不能相同!");
+//                                        return;
+//                                    }
+                                    doubleVerifyList.set(1, new Triple<>(true, isAdmin, Long.valueOf(result.getUserId())));
                                 }
+
                                 ThreadUtils.cancel(simpleTask);
                                 doubleVerifyListener.detect(DetectType.FACE_DETECT, ImageUtils.getBitmap(photoFile), result);
                             }

+ 50 - 6
app/src/main/java/com/example/chemical/utils/BitmapUtils.kt

@@ -31,11 +31,11 @@ object BitmapUtils {
         val qrCodeSize = 225
         val qrCodeX = (width - qrCodeSize) / 2
         val qrCodeY = 0
-        drawQRCode(printDate.wxCode,canvas, qrCodeX, qrCodeY, 230)
+        drawQRCode(printDate.wxCode, canvas, qrCodeX, qrCodeY, 230)
         // 在二维码下方居中绘制文本
         val text = "编码:${printDate.tag}"
         val textX = (width - getTextWidth(text, 20)) / 2
-        val textY = qrCodeY + qrCodeSize-6
+        val textY = qrCodeY + qrCodeSize - 6
         drawText(canvas, text, textX, textY.toFloat(), 19)
         // 计算剩余内容的起始 Y 坐标
         val contentStartY = textY + 30
@@ -52,8 +52,52 @@ object BitmapUtils {
         return bitmap
     }
 
+    fun generateBitmap(isBelong: Boolean, printDate: PrintBean): Bitmap? {
+        // 设置画布尺寸
+        val width = 400
+        val height = 400 // 225 * 3,每行占 225 的高度
+
+        // 创建 Bitmap
+        val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
+
+        // 创建 Canvas
+        val canvas = Canvas(bitmap)
+
+        // 设置背景色
+        canvas.drawColor(Color.WHITE)
+
+        // 居中绘制二维码
+        val qrCodeSize = 225
+        val qrCodeX = (width - qrCodeSize) / 2
+        val qrCodeY = 0
+        drawQRCode(printDate.wxCode, canvas, qrCodeX, qrCodeY, 230)
+        // 在二维码下方居中绘制文本
+        val text = "编码:${printDate.tag}"
+        val textX = (width - getTextWidth(text, 20)) / 2
+        val textY = qrCodeY + qrCodeSize - 6
+        drawText(canvas, text, textX, textY.toFloat(), 19)
+        // 计算剩余内容的起始 Y 坐标
+        val contentStartY = textY + 30
+        // 绘制剩余的内容,左对齐显示
+        val string: String = if (isBelong) {
+            "归属人:${printDate.person} "
+        } else {
+            "课题组:${printDate.person} "
+        }
+        val content = listOf(
+            "${printDate.level} 一 ${printDate.name}",
+            "CAS:${printDate.casNo}      ${printDate.types}",
+            string,
+        )
+        val lineHeight = 24
+        content.forEachIndexed { index, line ->
+            drawText(canvas, line, 10f, contentStartY + index * lineHeight.toFloat(), 20)
+        }
+        return bitmap
+    }
+
     //编码 生成二维码
-    private fun drawQRCode(tag:String,canvas: Canvas, x: Int, y: Int, size: Int) {
+    private fun drawQRCode(tag: String, canvas: Canvas, x: Int, y: Int, size: Int) {
         val multiFormatWriter = MultiFormatWriter()
         try {
             val bitMatrix = multiFormatWriter.encode(
@@ -95,7 +139,7 @@ object BitmapUtils {
     }
 
     //气瓶信息打印
-    fun airBottlePrint(rfid:String): Bitmap? {
+    fun airBottlePrint(rfid: String): Bitmap? {
         // 设置画布尺寸
         val width = 400
         val height = 400 // 225 * 3,每行占 225 的高度
@@ -114,12 +158,12 @@ object BitmapUtils {
         val qrCodeX = (width - qrCodeSize) / 2
         RcLog.info("======二维码剧中数据$qrCodeX")
         val qrCodeY = 6
-        drawQRCode(rfid,canvas, qrCodeX, qrCodeY, 230)
+        drawQRCode(rfid, canvas, qrCodeX, qrCodeY, 230)
         // 在二维码下方居中绘制文本
         val text = "" +
                 "$rfid"
         val textX = (width - getTextWidth(text, 20)) / 2
-        val textY = qrCodeY + qrCodeSize-6
+        val textY = qrCodeY + qrCodeSize - 6
         drawText(canvas, text, textX, textY.toFloat(), 19)
         // 计算剩余内容的起始 Y 坐标
         val contentStartY = textY + 30

+ 26 - 8
app/src/main/java/com/example/chemical/weidith/BluetoothWeighDialog.java

@@ -22,11 +22,14 @@ 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.PopTip;
 import com.kongzue.dialogx.dialogs.WaitDialog;
 import com.rc.httpcore.HttpConfig;
 import com.rc.httpcore.bean.HxpChemicalVo;
 import com.rc.httpcore.client.HttpTool;
 
+import org.json.JSONObject;
+
 import okhttp3.Response;
 
 public class BluetoothWeighDialog extends AppCompatDialog {
@@ -87,20 +90,35 @@ public class BluetoothWeighDialog extends AppCompatDialog {
             }
             hxpChemicalVo.setNetContent(netWt);
             WaitDialog.show("校验中...");
-            // TODO 待入库前检查
-            ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Object>() {
+            ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<String>() {
                 @Override
-                public Object doInBackground() throws Throwable {
+                public String doInBackground() throws Throwable {
                     Response response = HttpTool.addStockCheck(hxpChemicalVo);
-                    LogUtils.json(response);
-                    LogUtils.json(response.body().string());
-                    return null;
+                    if (response.isSuccessful()) {
+                        String json = response.body().string();
+                        JSONObject jsonObject = new JSONObject(json);
+                        int code = jsonObject.getInt("code");
+                        if (code == 200) {
+                            return "ok";
+                        } else {
+                            return jsonObject.getString("message");
+                        }
+                    } else {
+                        return response.message();
+                    }
                 }
 
                 @Override
-                public void onSuccess(Object result) {
+                public void onSuccess(String result) {
                     WaitDialog.dismiss();
-                    dismiss();
+                    if ("ok".equals(result)) {
+                        dismiss();
+                    } else if (null == result || result.isEmpty()) {
+                        PopTip.show("系统异常!");
+                        dismiss();
+                    } else {
+                        PopTip.show(result);
+                    }
                 }
             });
         });

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

@@ -31,6 +31,7 @@ import com.rc.httpcore.HttpConfig;
 import com.rc.httpcore.bean.BelongingPersonBean;
 import com.rc.httpcore.bean.HxpChemicalVo;
 import com.rc.httpcore.bean.StockDetailsModel;
+import com.rc.httpcore.bean.TopicDataBean;
 import com.sun.jna.Pointer;
 
 import java.util.ArrayList;
@@ -104,7 +105,6 @@ public class PrintLabelDialog extends AppCompatDialog {
                     labelList.add(new StockDetailsModel(null, null, code, no, wxCode));
                     Thread.sleep(10);
                 }
-                LogUtils.d(labelList);
                 return null;
             }
 
@@ -162,10 +162,19 @@ public class PrintLabelDialog extends AppCompatDialog {
                         // CAS
                         String casNum = hxpChemicalVo.getCasNum();
                         printBean.setCasNo(TextUtils.isEmpty(casNum) ? "" : casNum);
+                        int belongType = hxpChemicalVo.getBelongType();
+                        String name = "";
                         // 归属人
-                        BelongingPersonBean belongingPersonBean = inventoryItemBean.getBelongingPersonBean();
-                        String belongingPersonUserName = belongingPersonBean.getUserName();
-                        printBean.setPerson(TextUtils.isEmpty(belongingPersonUserName) ? "" : belongingPersonUserName);
+                        if (belongType == 2) {
+                            BelongingPersonBean belongingPersonBean = inventoryItemBean.getBelongingPersonBean();
+                            name = belongingPersonBean.getUserName();
+                        }
+                        // 课题组
+                        else if (belongType == 1) {
+                            TopicDataBean topicDataBean = inventoryItemBean.getTopicDataBean();
+                            name = topicDataBean.getTopicName();
+                        }
+                        printBean.setPerson(TextUtils.isEmpty(name) ? "" : name);
                         // 管控非管控
                         int chemicalLevel = hxpChemicalVo.getChemicalLevel();
                         printBean.setLevel(1 == chemicalLevel ? "管控" : "非管控");
@@ -174,7 +183,7 @@ public class PrintLabelDialog extends AppCompatDialog {
                         printBean.setTypes(TextUtils.isEmpty(chemicalCategory) ? "" : chemicalCategory.toString());
                         // 打印
                         if (isPrint) {
-                            printLabel(printBean);
+                            printLabel(belongType == 2, printBean);
                         }
                     }
                     return null;
@@ -183,6 +192,8 @@ public class PrintLabelDialog extends AppCompatDialog {
                 @Override
                 public void onSuccess(Object result) {
                     printState(false);
+                    hxpChemicalVo.setStockDetailsModelList(labelList);
+
                     printLabelCallBack.confirm();
                     dismiss();
                 }
@@ -211,12 +222,12 @@ public class PrintLabelDialog extends AppCompatDialog {
     }
 
     // 打印
-    private void printLabel(PrintBean printBean) {
+    private void printLabel(boolean isBelong, PrintBean printBean) {
         try {
             if (pointer == Pointer.NULL) {
                 pointer = AutoReplyPrint.INSTANCE.CP_Port_OpenUsb("VID:0x0FE6,PID:0x811E", 1);
             }
-            Bitmap bitmap = BitmapUtils.INSTANCE.generateBitmap(printBean);
+            Bitmap bitmap = BitmapUtils.INSTANCE.generateBitmap(isBelong, printBean);
             AutoReplyPrint.INSTANCE.CP_Label_BackPaperToPrintPosition(pointer);
             AutoReplyPrint.CP_Pos_PrintRasterImageFromData_Helper.PrintRasterImageFromBitmap(pointer,
                     bitmap.getWidth(),

+ 92 - 39
app/src/main/res/layout/activity_add.xml

@@ -307,6 +307,58 @@
                         android:layout_width="120px"
                         android:layout_height="wrap_content"
                         android:gravity="end"
+                        android:text="类型"
+                        android:textColor="#333" />
+
+                    <RadioGroup
+                        android:id="@+id/belong_type_RG"
+                        android:layout_width="wrap_content"
+                        android:layout_height="65px"
+                        android:layout_marginStart="10px"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal">
+
+                        <RadioButton
+                            android:id="@+id/belong_RB"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"
+                            android:background="@drawable/selector_input_select_unit_ml_rb"
+                            android:button="@null"
+                            android:checked="true"
+                            android:gravity="center"
+                            android:paddingHorizontal="20px"
+                            android:text="归属人"
+                            android:textColor="@drawable/selector_input_select_text_color"
+                            android:textSize="12sp" />
+
+                        <RadioButton
+                            android:id="@+id/topic_RB"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"
+                            android:background="@drawable/selector_input_select_unit_g_rb"
+                            android:button="@null"
+                            android:gravity="center"
+                            android:paddingHorizontal="20px"
+                            android:text="课题组"
+                            android:textColor="@drawable/selector_input_select_text_color"
+                            android:textSize="12sp" />
+                    </RadioGroup>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/belong_LL"
+                    android:layout_width="match_parent"
+                    android:layout_height="65px"
+                    android:layout_marginStart="50px"
+                    android:layout_weight="1"
+                    android:gravity="center_vertical">
+
+                    <TextView
+                        android:layout_width="120px"
+                        android:layout_height="wrap_content"
+                        android:gravity="end"
                         android:text="归属人"
                         android:textColor="#333" />
 
@@ -333,43 +385,43 @@
                 </LinearLayout>
 
                 <LinearLayout
+                    android:id="@+id/topic_LL"
                     android:layout_width="match_parent"
                     android:layout_height="65px"
                     android:layout_marginStart="50px"
                     android:layout_weight="1"
-                    android:gravity="center_vertical">
+                    android:gravity="center_vertical"
+                    android:visibility="gone">
 
                     <TextView
                         android:layout_width="120px"
                         android:layout_height="wrap_content"
                         android:gravity="end"
-                        android:text="存储位置"
+                        android:text="课题组"
                         android:textColor="#333" />
 
-                    <TextView
-                        android:id="@+id/cabinet_Layer_select_TV"
-                        android:layout_width="260px"
+                    <androidx.appcompat.widget.AppCompatEditText
+                        android:id="@+id/topic_ET"
+                        android:layout_width="250px"
                         android:layout_height="50px"
-                        android:layout_marginStart="10px"
-                        android:ellipsize="marquee"
-                        android:focusable="true"
-                        android:focusableInTouchMode="true"
-                        android:gravity="center"
-                        android:marqueeRepeatLimit="marquee_forever"
-                        android:singleLine="true"
-                        android:text="请选择化学品柜层" />
+                        android:layout_marginStart="20px"
+                        android:background="@drawable/shape_input_box"
+                        android:gravity="center_vertical"
+                        android:hint="非必填"
+                        android:imeOptions="actionSearch"
+                        android:paddingHorizontal="10px"
+                        android:textAppearance="@style/input_hint_text_size" />
 
                     <Button
-                        android:id="@+id/change_cabinet_BT"
+                        android:id="@+id/topic_BT"
                         android:layout_width="80px"
                         android:layout_height="50px"
                         android:layout_marginStart="10px"
-                        android:background="@drawable/selector_input_select_bt"
-                        android:text=""
+                        android:background="@drawable/selector_input_bt"
+                        android:text="搜索"
                         android:textColor="@color/white" />
                 </LinearLayout>
 
-
             </LinearLayout>
 
             <LinearLayout
@@ -518,29 +570,21 @@
                         android:layout_width="120px"
                         android:layout_height="wrap_content"
                         android:gravity="end"
-                        android:text="课题组"
+                        android:text="厂家"
                         android:textColor="#333" />
 
                     <androidx.appcompat.widget.AppCompatEditText
-                        android:id="@+id/topic_ET"
+                        android:id="@+id/factory_ET"
                         android:layout_width="250px"
                         android:layout_height="50px"
                         android:layout_marginStart="20px"
                         android:background="@drawable/shape_input_box"
                         android:gravity="center_vertical"
                         android:hint="非必填"
-                        android:imeOptions="actionSearch"
+                        android:imeOptions="actionDone"
                         android:paddingHorizontal="10px"
                         android:textAppearance="@style/input_hint_text_size" />
 
-                    <Button
-                        android:id="@+id/topic_BT"
-                        android:layout_width="80px"
-                        android:layout_height="50px"
-                        android:layout_marginStart="10px"
-                        android:background="@drawable/selector_input_bt"
-                        android:text="搜索"
-                        android:textColor="@color/white" />
                 </LinearLayout>
 
                 <View
@@ -678,21 +722,30 @@
                         android:layout_width="120px"
                         android:layout_height="wrap_content"
                         android:gravity="end"
-                        android:text="厂家"
+                        android:text="存储位置"
                         android:textColor="#333" />
 
-                    <androidx.appcompat.widget.AppCompatEditText
-                        android:id="@+id/factory_ET"
-                        android:layout_width="250px"
+                    <TextView
+                        android:id="@+id/cabinet_Layer_select_TV"
+                        android:layout_width="260px"
                         android:layout_height="50px"
-                        android:layout_marginStart="20px"
-                        android:background="@drawable/shape_input_box"
-                        android:gravity="center_vertical"
-                        android:hint="非必填"
-                        android:imeOptions="actionDone"
-                        android:paddingHorizontal="10px"
-                        android:textAppearance="@style/input_hint_text_size" />
+                        android:layout_marginStart="10px"
+                        android:ellipsize="marquee"
+                        android:focusable="true"
+                        android:focusableInTouchMode="true"
+                        android:gravity="center"
+                        android:marqueeRepeatLimit="marquee_forever"
+                        android:singleLine="true"
+                        android:text="请选择化学品柜层" />
 
+                    <Button
+                        android:id="@+id/change_cabinet_BT"
+                        android:layout_width="80px"
+                        android:layout_height="50px"
+                        android:layout_marginStart="10px"
+                        android:background="@drawable/selector_input_select_bt"
+                        android:text="⇋"
+                        android:textColor="@color/white" />
                 </LinearLayout>
 
                 <View

+ 1 - 1
app/src/main/res/layout/activity_double_verify.xml

@@ -336,7 +336,7 @@
         android:layout_alignParentBottom="true"
         android:layout_marginBottom="20dp"
         android:background="@drawable/bg_retrun"
-        android:text="返回180s"
+        android:text="返回"
         android:textColor="@color/white"
         android:textSize="12sp" />
 </RelativeLayout>

+ 12 - 0
app/src/main/res/layout/activity_save_list.xml

@@ -137,4 +137,16 @@
             tools:listitem="@layout/item_save_list" />
 
     </LinearLayout>
+
+    <Button
+        android:id="@+id/exit"
+        android:layout_width="85dp"
+        android:layout_height="30dp"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginBottom="20dp"
+        android:background="@drawable/bg_retrun_two"
+        android:text="结束"
+        android:textColor="@color/white"
+        android:textSize="10sp" />
 </RelativeLayout>

+ 0 - 37
app/src/main/res/layout/item_save_list.xml

@@ -132,25 +132,6 @@
                 android:textColor="#333"
                 android:textSize="26px"
                 android:textStyle="bold" />
-
-            <TextView
-                android:layout_width="165px"
-                android:layout_height="match_parent"
-                android:gravity="center"
-                android:text="是否全新"
-                android:textColor="#333"
-                android:textSize="26px"
-                android:textStyle="bold" />
-
-            <TextView
-                android:layout_width="165px"
-                android:layout_height="match_parent"
-                android:gravity="center"
-                android:text="存储层"
-                android:textColor="#333"
-                android:textSize="26px"
-                android:textStyle="bold" />
-
         </LinearLayout>
     </LinearLayout>
 
@@ -235,24 +216,6 @@
             android:textColor="#333"
             android:textSize="20px" />
 
-        <TextView
-            android:id="@+id/new_TV"
-            android:layout_width="165px"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:text="是否全新"
-            android:textColor="#333"
-            android:textSize="20px" />
-
-        <TextView
-            android:id="@+id/layer"
-            android:layout_width="165px"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:text="存储层"
-            android:textColor="#333"
-            android:textSize="20px" />
-
     </LinearLayout>
 
 </LinearLayout>