Bläddra i källkod

快递柜改造

wcq 1 år sedan
förälder
incheckning
7854190fd8
31 ändrade filer med 3063 tillägg och 85 borttagningar
  1. 24 0
      app/src/main/java/com/emato/ich/api/ICSPApi.java
  2. 88 0
      app/src/main/java/com/emato/ich/api/ICSPClient.java
  3. 55 0
      app/src/main/java/com/emato/ich/entity/vo/ExpressSendOrderPickUpDto.java
  4. 13 0
      app/src/main/java/com/emato/ich/entity/vo/PreparedOrderVo.java
  5. 897 0
      app/src/main/java/com/emato/ich/fragment/CollectMaterialsFragment.java
  6. 149 0
      app/src/main/java/com/emato/ich/fragment/CourierFragment.java
  7. 325 0
      app/src/main/java/com/emato/ich/fragment/ExpressDeliveryFragment.java
  8. 47 41
      app/src/main/java/com/emato/ich/fragment/InputInfoKeyBoardFragment.java
  9. 11 4
      app/src/main/java/com/emato/ich/fragment/MainFragment.java
  10. 899 0
      app/src/main/java/com/emato/ich/fragment/PaymentFragment.java
  11. 3 0
      app/src/main/java/com/emato/ich/fragment/SendInfoConfirmFragment.java
  12. 19 2
      app/src/main/java/com/emato/ich/fragment/SendKeyBoardFragment.java
  13. 125 4
      app/src/main/java/com/emato/ich/utils/TimeOutUtils.java
  14. BIN
      app/src/main/res/drawable/jikuaidi.png
  15. BIN
      app/src/main/res/drawable/jikuaidi1.png
  16. BIN
      app/src/main/res/drawable/lanjian.png
  17. BIN
      app/src/main/res/drawable/mendian.png
  18. BIN
      app/src/main/res/drawable/mendianpaijian.png
  19. BIN
      app/src/main/res/drawable/paijian.png
  20. BIN
      app/src/main/res/drawable/paijian1.png
  21. BIN
      app/src/main/res/drawable/paisongyuan.png
  22. BIN
      app/src/main/res/drawable/qrcode1111111.png
  23. 2 2
      app/src/main/res/layout/content_main.xml
  24. 71 0
      app/src/main/res/layout/fragment_collect_materials.xml
  25. 60 0
      app/src/main/res/layout/fragment_courier.xml
  26. 50 0
      app/src/main/res/layout/fragment_express_delivery.xml
  27. 38 20
      app/src/main/res/layout/fragment_main.xml
  28. 71 0
      app/src/main/res/layout/fragment_payment.xml
  29. 15 9
      app/src/main/res/layout/fragment_send_key_board.xml
  30. 92 3
      app/src/main/res/navigation/nav_graph.xml
  31. 9 0
      app/src/main/res/values/strings.xml

+ 24 - 0
app/src/main/java/com/emato/ich/api/ICSPApi.java

@@ -8,6 +8,30 @@ import com.emato.ich.contant.ICSPConstant;
 public class ICSPApi {
 
     /**
+     * 用户投递码 预下单
+     */
+    public static final String DELIVERY_CODE_PREPARE = ICSPConstant.ICSP_SERVICE + "/order/user/prepare";
+    /**
+     * 用户投递码 确认下单
+     */
+    public static final String DELIVERY_CODE_CONFIRM = ICSPConstant.ICSP_SERVICE + "order/user/confirm";
+    /**
+     * 寄送订单运单号/取货码取货接口
+     */
+    public static final String TACK_BY_EXPRESS_NO = ICSPConstant.ICSP_SERVICE + "/order/collect/pick/up/expressSendOrder";
+
+    /**
+     * 查询寄送订单接口
+     */
+    public static final String GET_EXPRESS_SEND_ORDER = ICSPConstant.ICSP_SERVICE + "/order/deliverer/getExpressSendOrder";
+
+    /**
+     * icsp支付接口地址
+     */
+    public static final String MICRO_PAY = ICSPConstant.ICSP_SERVICE + "/api/pay/microPay";
+
+
+    /**
      * 投递员登录接口
      */
     public static final String LOGIN = ICSPConstant.ICSP_SERVICE + "/deliverer/login";

+ 88 - 0
app/src/main/java/com/emato/ich/api/ICSPClient.java

@@ -1,5 +1,6 @@
 package com.emato.ich.api;
 
+import com.emato.ich.entity.vo.ExpressSendOrderPickUpDto;
 import com.emato.ich.utils.Log;
 
 import com.emato.ich.entity.vo.ConfirmOrderVo;
@@ -69,6 +70,22 @@ public class ICSPClient {
     }
 
     /**
+     * 查询寄送订单接口
+     * @param token
+     * @param postmanMob 投递员手机号
+     * @param deliveryCode 用户投递码
+     * @param callback
+     */
+    public static void getExpressSendOrder(String token,String postmanMob ,String deliveryCode ,Callback callback) {
+        String jsonBody = "{\"postmanMob\": \"" + postmanMob + "\",\"deliveryCode\":\""+ deliveryCode + "\"}";
+        RequestBody requestBody = RequestBody.create(jsonBody, MediaType.parse(MEDIA_TYPE_JSON));
+        Request request = postRequest(ICSPApi.GET_EXPRESS_SEND_ORDER, requestBody, token);
+
+        client.newCall(request).enqueue(callback);
+    }
+
+
+    /**
      * 预下单
      * @param token             token
      * @param orderVo           预下单信息
@@ -91,6 +108,52 @@ public class ICSPClient {
         client.newCall(request).enqueue(callback);
     }
 
+
+    /**
+     * 预下单 无token版本
+
+     * @param orderVo           预下单信息
+     * @param callback          回调
+     */
+    public static void preparedOrder(PreparedOrderVo orderVo, Callback callback){
+
+        MediaType mediaType = MediaType.parse(MEDIA_TYPE_JSON);
+        ObjectMapper objectMapper = JacksonUtils.objectmapper;
+        RequestBody requestBody = null;
+        try {
+            requestBody = RequestBody.create(objectMapper.writeValueAsString(orderVo), mediaType);
+        } catch (JsonProcessingException e) {
+            Log.e(TAG, "preparedOrder: 构建预下单请求体错误!", e);
+            LoggingUtils.sendErrorLog("业务异常: 构建预下单请求体错误! ", e);
+        }
+
+        Request request = postRequest(ICSPApi.DELIVERY_CODE_PREPARE, requestBody, null);
+
+        client.newCall(request).enqueue(callback);
+    }
+
+    /**
+     * 确认订单接口 无token版本
+     * @param confirmOrderVo    请求体
+     * @param callback          回调
+     */
+    public static void confirmOrder(ConfirmOrderVo confirmOrderVo, Callback callback){
+
+        MediaType mediaType = MediaType.parse(MEDIA_TYPE_JSON);
+        ObjectMapper objectMapper = JacksonUtils.objectmapper;
+        RequestBody requestBody = null;
+        try {
+            requestBody = RequestBody.create(objectMapper.writeValueAsString(confirmOrderVo), mediaType);
+        } catch (JsonProcessingException e) {
+            Log.e(TAG, "confirmOrder: 构建确认下单请求体错误!", e);
+            LoggingUtils.sendErrorLog("业务异常: 构建确认下单请求体错误! ", e);
+        }
+
+        Request request = postRequest(ICSPApi.DELIVERY_CODE_CONFIRM, requestBody, null);
+
+        client.newCall(request).enqueue(callback);
+
+    }
     /**
      * 确认订单接口
      * @param token             凭证
@@ -115,6 +178,31 @@ public class ICSPClient {
 
     }
 
+
+    /**
+     * 使用运单号取件接口
+     * @param token         凭证
+     * @param expressSendOrderPickUpDto  取件请求体
+     * @param callback      回调
+     */
+    public static void takeParcelByExpressNo(String token, ExpressSendOrderPickUpDto expressSendOrderPickUpDto, Callback callback) {
+
+        MediaType mediaType = MediaType.parse(MEDIA_TYPE_JSON);
+        ObjectMapper objectMapper = JacksonUtils.objectmapper;
+        RequestBody requestBody = null;
+        try {
+            requestBody = RequestBody.create(objectMapper.writeValueAsString(expressSendOrderPickUpDto), mediaType);
+        } catch (JsonProcessingException e) {
+            Log.e(TAG, "takeParcel: 构建取件请求体错误!", e);
+            LoggingUtils.sendErrorLog("业务异常: 构建取件请求体错误! ", e);
+        }
+
+        Request request = postRequest(ICSPApi.TACK_BY_EXPRESS_NO, requestBody, token);
+
+        client.newCall(request).enqueue(callback);
+
+    }
+
     /**
      * 取件接口
      * @param token         凭证

+ 55 - 0
app/src/main/java/com/emato/ich/entity/vo/ExpressSendOrderPickUpDto.java

@@ -0,0 +1,55 @@
+package com.emato.ich.entity.vo;
+
+/**
+ * 寄送订单取件dto对象
+ */
+public class ExpressSendOrderPickUpDto {
+    /**
+     * 快递面单号
+     */
+    private String exprSn;
+    /**
+     * 机柜编号
+     */
+    private String cabSn;
+    /**
+     * 快递员取件码
+     */
+    private String fetchCode;
+    /**
+     * 是否为重开柜门 1:重开,0:非重开
+     */
+    private String reopen;
+
+    public String getExprSn() {
+        return exprSn;
+    }
+
+    public void setExprSn(String exprSn) {
+        this.exprSn = exprSn;
+    }
+
+    public String getCabSn() {
+        return cabSn;
+    }
+
+    public void setCabSn(String cabSn) {
+        this.cabSn = cabSn;
+    }
+
+    public String getReopen() {
+        return reopen;
+    }
+
+    public void setReopen(String reopen) {
+        this.reopen = reopen;
+    }
+
+    public String getFetchCode() {
+        return fetchCode;
+    }
+
+    public void setFetchCode(String fetchCode) {
+        this.fetchCode = fetchCode;
+    }
+}

+ 13 - 0
app/src/main/java/com/emato/ich/entity/vo/PreparedOrderVo.java

@@ -32,6 +32,19 @@ public class PreparedOrderVo {
      */
     private String lockerType;
 
+    /**
+     * 用户投递码
+     */
+    private String deliveryCode;
+
+    public String getDeliveryCode() {
+        return deliveryCode;
+    }
+
+    public void setDeliveryCode(String deliveryCode) {
+        this.deliveryCode = deliveryCode;
+    }
+
     public String getClientId() {
         return clientId;
     }

+ 897 - 0
app/src/main/java/com/emato/ich/fragment/CollectMaterialsFragment.java

@@ -0,0 +1,897 @@
+package com.emato.ich.fragment;
+
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.text.Editable;
+import android.text.InputType;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.cherry.sdk.controller.utils.ScanGunKeyEventHelper;
+import com.emato.ich.MainActivity;
+import com.emato.ich.R;
+import com.emato.ich.api.ICSPClient;
+import com.emato.ich.contant.ICSPConstant;
+import com.emato.ich.contant.ScanGunConstant;
+import com.emato.ich.databinding.FragmentCollectMaterialsBinding;
+import com.emato.ich.entity.vo.ExpressSendOrderPickUpDto;
+import com.emato.ich.entity.vo.PreparedOrderResponseVo;
+import com.emato.ich.entity.vo.PreparedOrderVo;
+import com.emato.ich.entity.vo.ResponseData;
+import com.emato.ich.entity.vo.TakeParcelVo;
+import com.emato.ich.local.LocalStorage;
+import com.emato.ich.utils.BaseUtils;
+import com.emato.ich.utils.JacksonUtils;
+import com.emato.ich.utils.Log;
+import com.emato.ich.utils.LoggingUtils;
+import com.emato.ich.utils.NavUtils;
+import com.emato.ich.utils.StringUtils;
+import com.emato.ich.utils.TimeOutUtils;
+import com.emato.ich.utils.ToastUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
+
+/**
+ * 输入投递信息
+ */
+public class CollectMaterialsFragment extends Fragment {
+
+    private static final String TAG = CollectMaterialsFragment.class.getName();
+    private FragmentCollectMaterialsBinding binding;
+    private PreparedOrderResponseVo data;
+    private final AtomicInteger mailNoLock = new AtomicInteger(1);
+    private final AtomicInteger submitLock = new AtomicInteger(1);
+    private CountDownTimer timer;
+    private long start;
+
+    @Nullable
+    @org.jetbrains.annotations.Nullable
+    @Override
+    public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
+        start = System.currentTimeMillis();
+        binding = FragmentCollectMaterialsBinding.inflate(inflater, container, false);
+
+        return binding.getRoot();
+    }
+
+
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        long end = System.currentTimeMillis();
+        Log.i(TAG, TAG + "页面渲染速度为" + (end - start) + "ms。");
+        BaseUtils.disableEditText(binding.mailNo);
+
+        try {
+            MainActivity activity = (MainActivity) getActivity();
+            timer = TimeOutUtils.timeout(activity, CollectMaterialsFragment.this, binding.timeout, 120);
+            timer.start();
+        } catch (Exception e) {
+            Log.e(TAG, "onViewCreated: 倒计时出现异常! ", e);
+            LoggingUtils.sendErrorLog("业务异常: 输入投递信息页面倒计时出现异常! ", e);
+        }
+
+        Bundle arguments = null;
+        String sectionType = null;
+        try {
+            MainActivity activity = (MainActivity) getActivity();
+            arguments = activity.getBundleMap().get(ChooseCabinetFragment.class.getName());
+            sectionType = arguments.getString("section_type");
+            binding.mailNo.setInputType(InputType.TYPE_NULL);   
+            // 扫描枪监听 扫描运单号
+            activity.scanGunKeyEventHelper = new ScanGunKeyEventHelper(s -> {
+                // 扫码成功回调
+                Log.d(TAG, "onScanSuccess: " + s);
+
+                if (!StringUtils.isNullOrEmpty(s)) {
+                    for (String pattern : ScanGunConstant.getPatterns()) {
+                        Matcher matcher = Pattern.compile(pattern).matcher(s);
+                        if (!matcher.matches()) {
+                            ToastUtils.make(getContext(), "请将条形码置于扫码枪前! ");
+                            return;
+                        }
+                    }
+                }
+
+                if (mailNoLock.get() == 1) {
+                    // 禁用软件盘
+                    Editable text = binding.mailNo.getText();
+                    text.clear();
+                    binding.mailNo.setText(s);
+                    mailNoLock.incrementAndGet();
+                    // TODO 预定义,实际参数可能不一致 oms获取用户手机号 自动填充
+                    ICSPClient.getUserPhoneNumber(LocalStorage.getInstance().getSession().getToken(), BaseUtils.getClientId(), s, new Callback() {
+                        @Override
+                        public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                            // 请求失败
+                            Log.e(TAG, "onFailure: 请求oms获取手机号失败! 网络异常! ", e);
+                            LoggingUtils.sendErrorLog("业务异常: 请求oms获取手机号失败! 网络异常! ", e);
+                            ToastUtils.make(getContext(), "服务器异常! 请手动输入!");
+                            mailNoLock.set(1);
+                        }
+
+                        @Override
+                        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+
+                            getActivity().runOnUiThread(() -> {
+                                String parseResponse = ICSPClient.isSuccessfulAndParseResponse(response);
+                                if (!StringUtils.isNullOrEmpty(parseResponse)) {
+                                    try {
+                                        ResponseData<PreparedOrderResponseVo> responseData = new ObjectMapper().readValue(parseResponse, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {
+                                        });
+
+                                        PreparedOrderResponseVo data = responseData.getData();
+                                        if (null != responseData && ICSPConstant.OK.equals(responseData.getCode())) {
+                                            String collectorPhone = data.getCollectorPhone();
+//                                            binding.delivererPhoneConfirm.setText(collectorPhone);
+                                        } else {
+                                            ToastUtils.make(getContext(), responseData.getMsg());
+                                        }
+
+                                    } catch (JsonProcessingException e) {
+                                        Log.e(TAG, "onResponse: 服务器响应错误! 自动获取用户手机号失败! ", e);
+                                        ToastUtils.make(getContext(), "网络异常! 请手动输入手机号! ");
+                                        LoggingUtils.sendErrorLog("业务异常: 服务器响应错误! 自动获取用户手机号失败! ", e);
+                                    } catch (RuntimeException e) {
+                                        Log.e(TAG, "onResponse: 获取用户手机号未知错误! ", e);
+                                        ToastUtils.make(getContext(), "未查询到手机号! 请手动输入! ");
+                                        LoggingUtils.sendErrorLog("业务异常: 获取用户手机号未知错误! ", e);
+                                    }
+                                } else {
+                                    ToastUtils.make(getContext(), "服务器异常!请稍后重试!");
+                                }
+                                mailNoLock.set(1);
+                            });
+
+                        }
+                    });
+                }
+            });
+
+        } catch (RuntimeException e) {
+            Log.e(TAG, "onViewCreated: InputInfoFragment页面获取ChooseCabinetFragment传值错误! ", e);
+            LoggingUtils.sendErrorLog("业务异常: InputInfoFragment页面获取ChooseCabinetFragment传值错误! ", e);
+        }
+
+        // TODO 离线逻辑, 暂时不做
+
+        // 下单逻辑
+        String finalSectionType = sectionType;
+        if (submitLock.get() == 1) {
+            submitLock.incrementAndGet();
+            binding.keyBoard.inputButtonConfirm.setOnClickListener(view1 -> {
+                Bundle bundle = new Bundle();
+                String mailNo = binding.mailNo.getText().toString();
+//            String phone = binding.delivererPhone.getText().toString();
+
+               if (StringUtils.isNullOrEmpty(mailNo)) {
+                    ToastUtils.make(getContext(), "运单号不能为空!请扫描运单号!");
+                } else {
+                    // todo:调用揽件接口,使用运单号开门
+                   ExpressSendOrderPickUpDto expressSendOrderPickUpDto = new ExpressSendOrderPickUpDto();
+                   expressSendOrderPickUpDto.setExprSn(mailNo);
+                   expressSendOrderPickUpDto.setCabSn(BaseUtils.getClientId());
+
+                   ICSPClient.takeParcelByExpressNo(LocalStorage.getInstance().getSession().getToken(), expressSendOrderPickUpDto, new Callback() {
+                       @Override
+                       public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                           // TODO 取件接口请求失败逻辑处理
+                           ToastUtils.make(getContext(), "取件失败!网络异常!");
+                           Log.e(TAG, "onFailure: 取件请求失败!", e);
+                           LoggingUtils.sendErrorLog("业务异常: 取件请求失败! 网络异常! ", e);
+                       }
+
+                       @Override
+                       public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+                           // TODO 返回锁板和锁id, 开柜门
+                           getActivity().runOnUiThread(() -> {
+                               String parseResponse = ICSPClient.isSuccessfulAndParseResponse(response);
+                               if (!StringUtils.isNullOrEmpty(parseResponse)) {
+                                   try {
+                                       ObjectMapper objectMapper = JacksonUtils.objectmapper;
+                                       ResponseData<PreparedOrderResponseVo> responseData = null;
+                                       try {
+                                           responseData = objectMapper.readValue(parseResponse, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {
+                                           });
+                                           ToastUtils.make(getContext(), responseData.getMsg());
+                                       } catch (JsonProcessingException e) {
+                                           Log.e(TAG, "onResponse: 解析取件开门响应信息失败! ", e);
+                                           LoggingUtils.sendErrorLog("业务异常: 解析取件开门响应信息失败! ", e);
+                                       } catch (RuntimeException e) {
+                                           Log.e(TAG, "onResponse: 未知错误! ", e);
+                                           ToastUtils.make(getContext(), "未知错误!");
+                                           LoggingUtils.sendErrorLog("业务异常: 解析取件开门响应信息失败! 未知错误!  ", e);
+                                       }
+                                       if (null != responseData && responseData.getCode().equals(ICSPConstant.OK)) {
+                                           // 开门
+                                           Log.i(TAG, "onResponse: 取件成功! ");
+                                           ToastUtils.make(getContext(), "取件成功!");
+                                           Bundle bundle = new Bundle();
+                                           bundle.putString("mailNo", mailNo);
+                                           bundle.putString("takeCabinetNo", responseData.getData().getLockerName());
+                                           ((MainActivity) getActivity()).getBundleMap().put(ExpressSendOrderPickUpDto.class.getName(), bundle);
+                                           if (null != timer) {
+                                               timer.cancel();
+                                           }
+                                           NavUtils.navigate(CollectMaterialsFragment.this, R.id.action_collectMaterialsFragment_to_takeSuccessFragment);
+                                       }
+                                   } catch (RuntimeException e) {
+                                       Log.e(TAG, "onResponse: 取件失败! ", e);
+                                       ToastUtils.make(getContext(), "取件失败!");
+                                       LoggingUtils.sendErrorLog("业务异常: 取件失败! ", e);
+                                   }
+                               } else {
+                                   ToastUtils.make(getContext(), "服务器异常! 请稍后重试!");
+                               }
+                           });
+                       }
+                   });
+                }
+            });
+        }
+
+        // 数字输入 5 手机号   4 面单号
+        binding.mailNo.setOnFocusChangeListener((view1, hasFocus) -> {
+            AtomicBoolean caseSmallFlag = new AtomicBoolean(true);
+            
+            binding.keyBoard.inputButton0.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "0");
+            });
+            binding.keyBoard.inputButton1.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "1");
+            });
+            binding.keyBoard.inputButton2.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "2");
+            });
+            binding.keyBoard.inputButton3.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "3");
+            });
+            binding.keyBoard.inputButton4.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "4");
+            });
+            binding.keyBoard.inputButton5.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "5");
+            });
+            binding.keyBoard.inputButton6.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "6");
+            });
+            binding.keyBoard.inputButton7.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "7");
+            });
+            binding.keyBoard.inputButton8.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "8");
+            });
+            binding.keyBoard.inputButton9.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "9");
+            });
+
+            // todo:绑定字母按键
+            binding.keyBoard.inputButtonQ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "Q" : "q");
+            });
+            binding.keyBoard.inputButtonW.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "W" : "w");
+            });
+            binding.keyBoard.inputButtonE.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "E" : "e");
+            });
+            binding.keyBoard.inputButtonR.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "R" : "r");
+            });
+            binding.keyBoard.inputButtonT.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "T" : "t");
+            });
+            binding.keyBoard.inputButtonY.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "Y" : "y");
+            });
+            binding.keyBoard.inputButtonU.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "U" : "u");
+            });
+            binding.keyBoard.inputButtonI.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "I" : "i");
+            });
+            binding.keyBoard.inputButtonO.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "O" : "o");
+            });
+            binding.keyBoard.inputButtonP.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "P" : "p");
+            });
+            binding.keyBoard.inputButtonA.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "A" : "a");
+            });
+            binding.keyBoard.inputButtonS.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "S" : "s");
+            });
+            binding.keyBoard.inputButtonD.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "D" : "d");
+            });
+            binding.keyBoard.inputButtonF.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "F" : "f");
+            });
+            binding.keyBoard.inputButtonG.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "G" : "g");
+            });
+            binding.keyBoard.inputButtonH.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "H" : "h");
+            });
+            binding.keyBoard.inputButtonJ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "J" : "j");
+            });
+            binding.keyBoard.inputButtonK.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "K" : "k");
+            });
+            binding.keyBoard.inputButtonL.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "L" : "l");
+            });
+            binding.keyBoard.inputButtonZ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "Z" : "z");
+            });
+            binding.keyBoard.inputButtonX.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位!");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "X" : "x");
+            });
+            binding.keyBoard.inputButtonC.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "C" : "c");
+            });
+            binding.keyBoard.inputButtonV.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "V" : "v");
+            });
+            binding.keyBoard.inputButtonB.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "B" : "b");
+            });
+            binding.keyBoard.inputButtonN.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "N" : "n");
+            });
+            binding.keyBoard.inputButtonM.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "M" : "m");
+            });
+            //  符号
+            binding.keyBoard.symbolButton1.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "-");
+            });
+            binding.keyBoard.symbolButton2.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "/");
+            });
+            binding.keyBoard.symbolButton3.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, ":");
+            });
+            binding.keyBoard.symbolButton4.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "+");
+            });
+            binding.keyBoard.symbolButton5.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "(");
+            });
+            binding.keyBoard.symbolButton6.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, ")");
+            });
+            binding.keyBoard.symbolButton7.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "#");
+            });
+            binding.keyBoard.symbolButton8.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "@");
+            });
+            binding.keyBoard.symbolButton9.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, ".");
+            });
+            binding.keyBoard.symbolButton10.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "?");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "!");
+            });
+
+
+            // 大小写按键绑定  默认大写
+            binding.keyBoard.inputButtonCaseSmall.setOnClickListener(v -> {
+                if (caseSmallFlag.get()) {
+                    caseSmallFlag.set(false);
+                } else {
+                    caseSmallFlag.set(true);
+                }
+                binding.keyBoard.inputButtonCaseSmall.setText(caseSmallFlag.get() ? "大写" : "小写");
+                // 设置键盘字母大小写
+                binding.keyBoard.inputButtonQ.setText(caseSmallFlag.get() ? "Q" : "q");
+                binding.keyBoard.inputButtonW.setText(caseSmallFlag.get() ? "W" : "w");
+                binding.keyBoard.inputButtonE.setText(caseSmallFlag.get() ? "E" : "e");
+                binding.keyBoard.inputButtonR.setText(caseSmallFlag.get() ? "R" : "r");
+                binding.keyBoard.inputButtonT.setText(caseSmallFlag.get() ? "T" : "t");
+                binding.keyBoard.inputButtonY.setText(caseSmallFlag.get() ? "Y" : "y");
+                binding.keyBoard.inputButtonU.setText(caseSmallFlag.get() ? "U" : "u");
+                binding.keyBoard.inputButtonI.setText(caseSmallFlag.get() ? "I" : "i");
+                binding.keyBoard.inputButtonO.setText(caseSmallFlag.get() ? "O" : "o");
+                binding.keyBoard.inputButtonP.setText(caseSmallFlag.get() ? "P" : "p");
+                binding.keyBoard.inputButtonA.setText(caseSmallFlag.get() ? "A" : "a");
+                binding.keyBoard.inputButtonS.setText(caseSmallFlag.get() ? "S" : "s");
+                binding.keyBoard.inputButtonD.setText(caseSmallFlag.get() ? "D" : "d");
+                binding.keyBoard.inputButtonF.setText(caseSmallFlag.get() ? "F" : "f");
+                binding.keyBoard.inputButtonG.setText(caseSmallFlag.get() ? "G" : "g");
+                binding.keyBoard.inputButtonH.setText(caseSmallFlag.get() ? "H" : "h");
+                binding.keyBoard.inputButtonJ.setText(caseSmallFlag.get() ? "J" : "j");
+                binding.keyBoard.inputButtonK.setText(caseSmallFlag.get() ? "K" : "k");
+                binding.keyBoard.inputButtonL.setText(caseSmallFlag.get() ? "L" : "l");
+                binding.keyBoard.inputButtonZ.setText(caseSmallFlag.get() ? "Z" : "z");
+                binding.keyBoard.inputButtonX.setText(caseSmallFlag.get() ? "X" : "x");
+                binding.keyBoard.inputButtonC.setText(caseSmallFlag.get() ? "C" : "c");
+                binding.keyBoard.inputButtonV.setText(caseSmallFlag.get() ? "V" : "v");
+                binding.keyBoard.inputButtonB.setText(caseSmallFlag.get() ? "B" : "b");
+                binding.keyBoard.inputButtonN.setText(caseSmallFlag.get() ? "N" : "n");
+                binding.keyBoard.inputButtonM.setText(caseSmallFlag.get() ? "M" : "m");
+            });
+
+            binding.keyBoard.inputButtonCancel.setOnClickListener(v -> {
+                Editable text = binding.mailNo.getText();
+                int start = binding.mailNo.getSelectionStart();
+                if (text.length() > 0) {
+                    if (start > 0) {
+                        text.delete(start - 1, start);
+                    }
+                    binding.mailNo.setText(text, TextView.BufferType.EDITABLE);
+                    binding.mailNo.setSelection(start - 1 < 0 ? text.length() : start - 1);
+                }
+            });
+            // 长按删除
+            binding.keyBoard.inputButtonCancel.setOnLongClickListener(v -> {
+                binding.mailNo.getText().clear();
+                return false;
+            });
+
+        });
+
+        binding.returnBtn.setOnClickListener(view1 -> {
+            if (null != timer) {
+                timer.cancel();
+            }
+            NavUtils.navigate(this, R.id.action_collectMaterialsFragment_to_mainFragment);
+        });
+
+        // 默认选中运单号输入框
+        binding.mailNo.requestFocus();
+    }
+
+    private void extracted(AtomicBoolean caseSmallFlag) {
+
+    }
+
+
+    public PreparedOrderResponseVo getData() {
+        return data;
+    }
+
+    @Override
+    public void onDestroy() {
+        if (timer != null) {
+            timer.cancel();
+            timer = null;
+        }
+        super.onDestroy();
+        binding = null;
+        Log.i(TAG, TAG + "被销毁。。。");
+    }
+}

+ 149 - 0
app/src/main/java/com/emato/ich/fragment/CourierFragment.java

@@ -0,0 +1,149 @@
+package com.emato.ich.fragment;
+
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.emato.ich.MainActivity;
+import com.emato.ich.R;
+import com.emato.ich.contant.SystemConfigConstant;
+import com.emato.ich.databinding.FragmentCourierBinding;
+import com.emato.ich.utils.ButtonUtils;
+import com.emato.ich.utils.Log;
+import com.emato.ich.utils.LoggingUtils;
+import com.emato.ich.utils.NavUtils;
+import com.emato.ich.utils.TimeOutUtils;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * 我是派送员页面
+ */
+public class CourierFragment extends Fragment {
+
+    private static final String TAG = CourierFragment.class.getName();
+    private FragmentCourierBinding binding;
+    private CountDownTimer timer;
+    private long start;
+    private Bundle bundle = new Bundle();
+    @Nullable
+    @org.jetbrains.annotations.Nullable
+    @Override
+    public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
+        start = System.currentTimeMillis();
+        binding = FragmentCourierBinding.inflate(inflater, container, false);
+        return binding.getRoot();
+    }
+
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        long end = System.currentTimeMillis();
+        Log.i(TAG, TAG + "页面渲染速度为" + (end - start) + "ms。");
+        super.onViewCreated(view, savedInstanceState);
+
+//        ColorConstant.setButtonColor(binding.returnBtn, ColorConstant.RETURN_BUTTON_BG_COLOR);
+        try {
+            MainActivity activity = ((MainActivity) getActivity());
+            timer = TimeOutUtils.timeout(activity, CourierFragment.this, binding.timeout, 60);
+            timer.start();
+        } catch (Exception e) {
+            Log.e(TAG, "onViewCreated: 倒计时出现异常! ", e);
+            LoggingUtils.sendErrorLog("业务异常: 取件页面倒计时出现异常! ", e);
+        }
+
+        MainActivity activity = (MainActivity) getActivity();
+        String url = activity.getConfigMap().get(SystemConfigConstant.cabinet_take_object_qrcode_url);
+
+/*        if (getActivity() != null && activity.getConfigMap().size() > 0 && !StringUtils.isNullOrEmpty(url)) {
+            // todo:这里可改为从后端获取寄件二维码图片 
+            ICSPClient.getWeChatMPImage(url, new Callback() {
+                @Override
+                public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                    Log.e(TAG, "onFailure: 请求寄件二维码图片错误! 网络异常! ", e);
+                    LoggingUtils.sendErrorLog("业务异常: 请求寄件二维码图片错误! 网络异常!", e);
+                }
+
+                @Override
+                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+                    getActivity().runOnUiThread(() -> {
+                        try {
+                            InputStream is = response.body().byteStream();
+                            final Drawable d = Drawable.createFromStream(is, "src");
+                            binding.expressDeliveryQrCodeImage.setBackground(d);
+                            is.close();
+                        } catch (Exception e) {
+                            Log.e(TAG, "onResponse: 设置图片异常! ", e);
+                            LoggingUtils.sendErrorLog("业务异常: 设置图片异常! ", e);
+                        }
+                    });
+                }
+            });
+        }*/
+
+
+        binding.storeSendBtn.setOnClickListener(view1 -> {
+            if (ButtonUtils.isFastClick()) {
+                return;
+            }
+            if (null != timer) {
+                timer.cancel();
+            }
+            bundle.putString("loginType","store");
+            activity.getBundleMap().put(CourierFragment.class.getName(), bundle);
+            NavUtils.navigate(this, R.id.action_courierFragment_to_sendKeyBoardFragment);
+
+        });
+
+        binding.courierSendBtn.setOnClickListener(view1 -> {
+            if (ButtonUtils.isFastClick()) {
+                return;
+            }
+            if (null != timer) {
+                timer.cancel();
+            }
+            bundle.putString("loginType","courier");
+            activity.getBundleMap().put(CourierFragment.class.getName(), bundle);
+            NavUtils.navigate(this, R.id.action_courierFragment_to_sendKeyBoardFragment);
+
+        });
+        binding.collectMaterial.setOnClickListener(view1 -> {
+            if (ButtonUtils.isFastClick()) {
+                return;
+            }
+            if (null != timer) {
+                timer.cancel();
+            }
+            bundle.putString("loginType","collect");
+            activity.getBundleMap().put(CourierFragment.class.getName(), bundle);
+            NavUtils.navigate(this, R.id.action_courierFragment_to_sendKeyBoardFragment);
+
+        });
+        binding.returnBtn.setOnClickListener(view1 -> {
+            if (ButtonUtils.isFastClick()) {
+                return;
+            }
+            if (null != timer) {
+                timer.cancel();
+            }
+            NavUtils.navigate(this, R.id.action_courierFragment_to_mainFragment);
+        });
+    }
+
+
+    @Override
+    public void onDestroy() {
+        if (timer != null) {
+            timer.cancel();
+            timer = null;
+        }
+        super.onDestroy();
+        binding = null;
+        Log.i(TAG, TAG + "被销毁。。。");
+    }
+
+}

+ 325 - 0
app/src/main/java/com/emato/ich/fragment/ExpressDeliveryFragment.java

@@ -0,0 +1,325 @@
+package com.emato.ich.fragment;
+
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.text.Editable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.emato.ich.MainActivity;
+import com.emato.ich.R;
+import com.emato.ich.api.ICSPClient;
+import com.emato.ich.contant.ICSPConstant;
+import com.emato.ich.contant.SystemConfigConstant;
+import com.emato.ich.databinding.FragmentExpressDeliveryBinding;
+import com.emato.ich.entity.vo.PreparedOrderResponseVo;
+import com.emato.ich.entity.vo.PreparedOrderVo;
+import com.emato.ich.entity.vo.ResponseData;
+import com.emato.ich.local.LocalStorage;
+import com.emato.ich.utils.BaseUtils;
+import com.emato.ich.utils.ButtonUtils;
+import com.emato.ich.utils.JacksonUtils;
+import com.emato.ich.utils.Log;
+import com.emato.ich.utils.LoggingUtils;
+import com.emato.ich.utils.NavUtils;
+import com.emato.ich.utils.StringUtils;
+import com.emato.ich.utils.TimeOutUtils;
+import com.emato.ich.utils.ToastUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
+
+/**
+ * 寄送投递页面
+ */
+public class ExpressDeliveryFragment extends Fragment {
+
+    private static final String TAG = ExpressDeliveryFragment.class.getName();
+    private FragmentExpressDeliveryBinding binding;
+    private CountDownTimer timer;
+    private long start;
+    private PreparedOrderResponseVo data;
+    @Nullable
+    @org.jetbrains.annotations.Nullable
+    @Override
+    public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
+        start = System.currentTimeMillis();
+        binding = FragmentExpressDeliveryBinding.inflate(inflater, container, false);
+        return binding.getRoot();
+    }
+
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        long end = System.currentTimeMillis();
+        Log.i(TAG, TAG + "页面渲染速度为" + (end - start) + "ms。");
+        super.onViewCreated(view, savedInstanceState);
+
+//        ColorConstant.setButtonColor(binding.returnBtn, ColorConstant.RETURN_BUTTON_BG_COLOR);
+        try {
+            MainActivity activity = ((MainActivity) getActivity());
+            timer = TimeOutUtils.timeout(activity, ExpressDeliveryFragment.this, binding.timeout, 60);
+            timer.start();
+        } catch (Exception e) {
+            Log.e(TAG, "onViewCreated: 倒计时出现异常! ", e);
+            LoggingUtils.sendErrorLog("业务异常: 取件页面倒计时出现异常! ", e);
+        }
+        Bundle arguments = null;
+        String sectionType = null;
+        MainActivity activity = (MainActivity) getActivity();
+        String url = activity.getConfigMap().get(SystemConfigConstant.cabinet_take_object_qrcode_url);
+        arguments = activity.getBundleMap().get(ChooseCabinetFragment.class.getName());
+        sectionType = arguments.getString("section_type");
+/*        if (getActivity() != null && activity.getConfigMap().size() > 0 && !StringUtils.isNullOrEmpty(url)) {
+            // todo:这里可改为从后端获取寄件二维码图片 
+            ICSPClient.getWeChatMPImage(url, new Callback() {
+                @Override
+                public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                    Log.e(TAG, "onFailure: 请求寄件二维码图片错误! 网络异常! ", e);
+                    LoggingUtils.sendErrorLog("业务异常: 请求寄件二维码图片错误! 网络异常!", e);
+                }
+
+                @Override
+                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+                    getActivity().runOnUiThread(() -> {
+                        try {
+                            InputStream is = response.body().byteStream();
+                            final Drawable d = Drawable.createFromStream(is, "src");
+                            binding.expressDeliveryQrCodeImage.setBackground(d);
+                            is.close();
+                        } catch (Exception e) {
+                            Log.e(TAG, "onResponse: 设置图片异常! ", e);
+                            LoggingUtils.sendErrorLog("业务异常: 设置图片异常! ", e);
+                        }
+                    });
+                }
+            });
+        }*/
+
+
+
+
+        binding.returnBtn.setOnClickListener(view1 -> {
+            if (ButtonUtils.isFastClick()) {
+                return;
+            }
+            if (null != timer) {
+                timer.cancel();
+            }
+            NavUtils.navigate(this, R.id.action_expressDeliveryFragment_to_mainFragment);
+        });
+
+        // TODO 设置键盘塞值和处理确认按钮
+        String finalSectionType = sectionType;
+        binding.keyBoard.inputButtonConfirm.setOnClickListener(v -> {
+            if (ButtonUtils.isFastClick()) {
+                return;
+            }
+            // 点击确定按钮  获取到editTextDeliveryCode 的值 然后调用icsp判断投递码是否存在接口,在回调方法中判断是成功
+            // 若成功则跳转页面到选择柜子类型的页面,
+            // 在选择柜子类型页面判断如果是投递码投递跳转过来的 则调用投递码下单接口
+            if(StringUtils.isNullOrEmpty(binding.editTextDeliveryCode.getText().toString())){
+                ToastUtils.make(getContext(), "请求服务器失败!网络异常!");
+            }else {
+                Bundle bundle = new Bundle();
+                // 验证完 预下单
+                PreparedOrderVo preparedOrderVo = new PreparedOrderVo();
+                preparedOrderVo.setClientId(BaseUtils.getClientId());
+                preparedOrderVo.setDeliveryCode(binding.editTextDeliveryCode.getText().toString());
+                preparedOrderVo.setLockerType(finalSectionType);
+                // 预下单
+                ICSPClient.preparedOrder(preparedOrderVo, new Callback() {
+                    @Override
+                    public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                        // TODO 预下单调用失败
+                        ToastUtils.make(getContext(), "请求服务器失败!网络异常!");
+                        Log.e(TAG, "onFailure: 预下单失败! call: " + call.timeout().toString(), e);
+                        LoggingUtils.sendErrorLog("业务异常: 预下单失败! call: " + call.timeout().toString(), e);
+                    }
+
+                    @Override
+                    public void onResponse(@NotNull Call call, @NotNull Response response) {
+                        ((MainActivity) getActivity()).runOnUiThread(() -> {
+                            try {
+                                String responseStr = ICSPClient.isSuccessfulAndParseResponse(response);
+                                if (!StringUtils.isNullOrEmpty(responseStr)) {
+                                    ObjectMapper objectMapper = JacksonUtils.objectmapper;
+                                    ResponseData<PreparedOrderResponseVo> responseData = objectMapper.readValue(responseStr, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {
+                                    });
+                                    data = responseData.getData();
+                                    // 响应信息
+                                    if (responseData.getCode().equals(ICSPConstant.OK)) {
+                                        bundle.putString("preparedOrderResponse", objectMapper.writeValueAsString(data));
+                                        bundle.putString("editTextDeliveryCode", binding.editTextDeliveryCode.getText().toString());
+                                        bundle.putString("sectionType", finalSectionType);
+
+                                        // 跳转到确认投递
+                                        try {
+                                            MainActivity activity = (MainActivity) getActivity();
+                                            activity.getBundleMap().put(ExpressDeliveryFragment.class.getName(), bundle);
+                                        } catch (RuntimeException e) {
+                                            Log.e(TAG, "onResponse: InputInfoFragment页面获取SendInfoConfirmFragment传值错误! ", e);
+                                            LoggingUtils.sendErrorLog("业务异常: InputInfoFragment页面获取SendInfoConfirmFragment传值错误! ", e);
+                                        }
+                                        if (null != timer) {
+                                            timer.cancel();
+                                        }
+                                        NavUtils.navigate(ExpressDeliveryFragment.this, R.id.action_collectMaterialsFragment_to_sendInfoConfirmFragment);
+                                    }
+                                    Log.i(TAG, "onResponse: ICSP返回码: " + responseData.getCode() + ", 返回信息: " + responseData.getMsg());
+                                    ToastUtils.make(getContext(), responseData.getMsg());
+                                } else {
+                                    ToastUtils.make(getContext(), "服务器异常!请稍后重试!");
+                                }
+                            } catch (JsonProcessingException e) {
+                                Log.e(TAG, "onResponse: 预下单转换成JSON出错! ", e);
+                                LoggingUtils.sendErrorLog("业务异常: 预下单转换成JSON出错! ", e);
+                            } catch (RuntimeException e) {
+                                Log.e(TAG, "onResponse: 预下单失败! ", e);
+                                LoggingUtils.sendErrorLog("业务异常: 预下单失败! ", e);
+                            }
+                        });
+                    }
+                });
+            }
+
+
+
+        });
+        // 输入投递码
+        binding.editTextDeliveryCode.setOnFocusChangeListener((view1, hasFocus) -> {
+            if (hasFocus) {
+                binding.keyBoard.inputButton0.setOnClickListener(v -> {
+                    int length = binding.editTextDeliveryCode.getText().length();
+                    if (length >= 6) {
+                        ToastUtils.make(getContext(), "投递码不能超过6位! ");
+                        return;
+                    }
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    binding.editTextDeliveryCode.getText().insert(start, "0");
+                });
+                binding.keyBoard.inputButton1.setOnClickListener(v -> {
+                    int length = binding.editTextDeliveryCode.getText().length();
+                    if (length >= 6) {
+                        ToastUtils.make(getContext(), "投递码不能超过6位! ");
+                        return;
+                    }
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    binding.editTextDeliveryCode.getText().insert(start, "1");
+                });
+                binding.keyBoard.inputButton2.setOnClickListener(v -> {
+                    int length = binding.editTextDeliveryCode.getText().length();
+                    if (length >= 6) {
+                        ToastUtils.make(getContext(), "投递码不能超过6位! ");
+                        return;
+                    }
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    binding.editTextDeliveryCode.getText().insert(start, "2");
+                });
+                binding.keyBoard.inputButton3.setOnClickListener(v -> {
+                    int length = binding.editTextDeliveryCode.getText().length();
+                    if (length >= 6) {
+                        ToastUtils.make(getContext(), "投递码不能超过6位! ");
+                        return;
+                    }
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    binding.editTextDeliveryCode.getText().insert(start, "3");
+                });
+                binding.keyBoard.inputButton4.setOnClickListener(v -> {
+                    int length = binding.editTextDeliveryCode.getText().length();
+                    if (length >= 6) {
+                        ToastUtils.make(getContext(), "投递码不能超过6位! ");
+                        return;
+                    }
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    binding.editTextDeliveryCode.getText().insert(start, "4");
+                });
+                binding.keyBoard.inputButton5.setOnClickListener(v -> {
+                    int length = binding.editTextDeliveryCode.getText().length();
+                    if (length >= 6) {
+                        ToastUtils.make(getContext(), "投递码不能超过6位! ");
+                        return;
+                    }
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    binding.editTextDeliveryCode.getText().insert(start, "5");
+                });
+                binding.keyBoard.inputButton6.setOnClickListener(v -> {
+                    int length = binding.editTextDeliveryCode.getText().length();
+                    if (length >= 6) {
+                        ToastUtils.make(getContext(), "投递码不能超过6位! ");
+                        return;
+                    }
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    binding.editTextDeliveryCode.getText().insert(start, "6");
+                });
+                binding.keyBoard.inputButton7.setOnClickListener(v -> {
+                    int length = binding.editTextDeliveryCode.getText().length();
+                    if (length >= 6) {
+                        ToastUtils.make(getContext(), "投递码不能超过6位! ");
+                        return;
+                    }
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    binding.editTextDeliveryCode.getText().insert(start, "7");
+                });
+                binding.keyBoard.inputButton8.setOnClickListener(v -> {
+                    int length = binding.editTextDeliveryCode.getText().length();
+                    if (length >= 6) {
+                        ToastUtils.make(getContext(), "投递码不能超过6位! ");
+                        return;
+                    }
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    binding.editTextDeliveryCode.getText().insert(start, "8");
+                });
+                binding.keyBoard.inputButton9.setOnClickListener(v -> {
+                    int length = binding.editTextDeliveryCode.getText().length();
+                    if (length >= 6) {
+                        ToastUtils.make(getContext(), "投递码不能超过6位! ");
+                        return;
+                    }
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    binding.editTextDeliveryCode.getText().insert(start, "9");
+                });
+                binding.keyBoard.inputButtonCancel.setOnClickListener(v -> {
+                    Editable text = binding.editTextDeliveryCode.getText();
+                    int start = binding.editTextDeliveryCode.getSelectionStart();
+                    if (text.length() > 0) {
+                        if (start > 0) {
+                            text.delete(start - 1, start);
+                        }
+                        binding.editTextDeliveryCode.setText(text, TextView.BufferType.EDITABLE);
+                        binding.editTextDeliveryCode.setSelection(start - 1 < 0 ? text.length() : start - 1);
+                    }
+                });
+                // 长按删除
+                binding.keyBoard.inputButtonCancel.setOnLongClickListener(v -> {
+                    binding.editTextDeliveryCode.getText().clear();
+                    return false;
+                });
+            }
+        });
+    }
+
+
+    @Override
+    public void onDestroy() {
+        if (timer != null) {
+            timer.cancel();
+            timer = null;
+        }
+        super.onDestroy();
+        binding = null;
+        Log.i(TAG, TAG + "被销毁。。。");
+    }
+}

+ 47 - 41
app/src/main/java/com/emato/ich/fragment/InputInfoKeyBoardFragment.java

@@ -100,7 +100,7 @@ public class InputInfoKeyBoardFragment extends Fragment {
             activity.scanGunKeyEventHelper = new ScanGunKeyEventHelper(s -> {
                 // 扫码成功回调
                 Log.d(TAG, "onScanSuccess: " + s);
-
+                String loginType = activity.getBundleMap().get(CourierFragment.class.getName()).getString("loginType");
                 if (!StringUtils.isNullOrEmpty(s)) {
                     for (String pattern : ScanGunConstant.getPatterns()) {
                         Matcher matcher = Pattern.compile(pattern).matcher(s);
@@ -117,52 +117,58 @@ public class InputInfoKeyBoardFragment extends Fragment {
                     text.clear();
                     binding.mailNo.setText(s);
                     mailNoLock.incrementAndGet();
-                    // TODO 预定义,实际参数可能不一致 oms获取用户手机号 自动填充
-                    ICSPClient.getUserPhoneNumber(LocalStorage.getInstance().getSession().getToken(), BaseUtils.getClientId(), s, new Callback() {
-                        @Override
-                        public void onFailure(@NotNull Call call, @NotNull IOException e) {
-                            // 请求失败
-                            Log.e(TAG, "onFailure: 请求oms获取手机号失败! 网络异常! ", e);
-                            LoggingUtils.sendErrorLog("业务异常: 请求oms获取手机号失败! 网络异常! ", e);
-                            ToastUtils.make(getContext(), "服务器异常! 请手动输入!");
-                            mailNoLock.set(1);
-                        }
 
-                        @Override
-                        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+                    if("store".equals(loginType)){
+                        // TODO 预定义,实际参数可能不一致 oms获取用户手机号 自动填充
+                        ICSPClient.getUserPhoneNumber(LocalStorage.getInstance().getSession().getToken(), BaseUtils.getClientId(), s, new Callback() {
+                            @Override
+                            public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                                // 请求失败
+                                Log.e(TAG, "onFailure: 请求oms获取手机号失败! 网络异常! ", e);
+                                LoggingUtils.sendErrorLog("业务异常: 请求oms获取手机号失败! 网络异常! ", e);
+                                ToastUtils.make(getContext(), "服务器异常! 请手动输入!");
+                                mailNoLock.set(1);
+                            }
 
-                            getActivity().runOnUiThread(() -> {
-                                String parseResponse = ICSPClient.isSuccessfulAndParseResponse(response);
-                                if (!StringUtils.isNullOrEmpty(parseResponse)) {
-                                    try {
-                                        ResponseData<PreparedOrderResponseVo> responseData = new ObjectMapper().readValue(parseResponse, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {
-                                        });
+                            @Override
+                            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
 
-                                        PreparedOrderResponseVo data = responseData.getData();
-                                        if (null != responseData && ICSPConstant.OK.equals(responseData.getCode())) {
-                                            String collectorPhone = data.getCollectorPhone();
-                                            binding.delivererPhoneConfirm.setText(collectorPhone);
-                                        } else {
-                                            ToastUtils.make(getContext(), responseData.getMsg());
-                                        }
+                                getActivity().runOnUiThread(() -> {
+                                    String parseResponse = ICSPClient.isSuccessfulAndParseResponse(response);
+                                    if (!StringUtils.isNullOrEmpty(parseResponse)) {
+                                        try {
+                                            ResponseData<PreparedOrderResponseVo> responseData = new ObjectMapper().readValue(parseResponse, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {
+                                            });
+
+                                            PreparedOrderResponseVo data = responseData.getData();
+                                            if (null != responseData && ICSPConstant.OK.equals(responseData.getCode())) {
+                                                String collectorPhone = data.getCollectorPhone();
+                                                if(StringUtils.isNullOrEmpty(collectorPhone)){
+                                                    ToastUtils.make(getContext(), "未查询到手机号信息,请确认运单号是否正确!");
+                                                }
+                                                binding.delivererPhoneConfirm.setText(collectorPhone);
+                                            } else {
+                                                ToastUtils.make(getContext(), responseData.getMsg());
+                                            }
 
-                                    } catch (JsonProcessingException e) {
-                                        Log.e(TAG, "onResponse: 服务器响应错误! 自动获取用户手机号失败! ", e);
-                                        ToastUtils.make(getContext(), "网络异常! 请手动输入手机号! ");
-                                        LoggingUtils.sendErrorLog("业务异常: 服务器响应错误! 自动获取用户手机号失败! ", e);
-                                    } catch (RuntimeException e) {
-                                        Log.e(TAG, "onResponse: 获取用户手机号未知错误! ", e);
-                                        ToastUtils.make(getContext(), "未查询到手机号! 请手动输入! ");
-                                        LoggingUtils.sendErrorLog("业务异常: 获取用户手机号未知错误! ", e);
+                                        } catch (JsonProcessingException e) {
+                                            Log.e(TAG, "onResponse: 服务器响应错误! 自动获取用户手机号失败! ", e);
+                                            ToastUtils.make(getContext(), "网络异常! 请手动输入手机号! ");
+                                            LoggingUtils.sendErrorLog("业务异常: 服务器响应错误! 自动获取用户手机号失败! ", e);
+                                        } catch (RuntimeException e) {
+                                            Log.e(TAG, "onResponse: 获取用户手机号未知错误! ", e);
+                                            ToastUtils.make(getContext(), "未查询到手机号! 请手动输入! ");
+                                            LoggingUtils.sendErrorLog("业务异常: 获取用户手机号未知错误! ", e);
+                                        }
+                                    } else {
+                                        ToastUtils.make(getContext(), "服务器异常!请稍后重试!");
                                     }
-                                } else {
-                                    ToastUtils.make(getContext(), "服务器异常!请稍后重试!");
-                                }
-                                mailNoLock.set(1);
-                            });
+                                    mailNoLock.set(1);
+                                });
 
-                        }
-                    });
+                            }
+                        });
+                    }
                 }
             });
 

+ 11 - 4
app/src/main/java/com/emato/ich/fragment/MainFragment.java

@@ -88,19 +88,26 @@ public class MainFragment extends Fragment {
             });*/
         }
 
-        // 递页面跳转
+        // 我要寄快递页面跳转
         binding.sendBtn.setOnClickListener(view12 -> {
             if (ButtonUtils.isFastClick()) {
                 return;
             }
-            NavUtils.navigate(this, R.id.action_mainFragment_to_sendFragment);
+            NavUtils.navigate(this, R.id.action_mainFragment_to_express_delivery_fragment);
         });
         // 取件页面跳转 德合隐藏
-        binding.takeBtn.setOnClickListener(view1 -> {
+//        binding.takeBtn.setOnClickListener(view1 -> {
+//            if (ButtonUtils.isFastClick()) {
+//                return;
+//            }
+//            NavUtils.navigate(this, R.id.action_mainFragment_to_takeFragment);
+//        });
+        // 派件员页面跳转
+        binding.delivererBtn.setOnClickListener(view1 -> {
             if (ButtonUtils.isFastClick()) {
                 return;
             }
-            NavUtils.navigate(this, R.id.action_mainFragment_to_takeFragment);
+            NavUtils.navigate(this, R.id.action_mainFragment_to_courier_fragment);
         });
     }
 

+ 899 - 0
app/src/main/java/com/emato/ich/fragment/PaymentFragment.java

@@ -0,0 +1,899 @@
+package com.emato.ich.fragment;
+
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.text.Editable;
+import android.text.InputType;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.cherry.sdk.controller.utils.ScanGunKeyEventHelper;
+import com.emato.ich.MainActivity;
+import com.emato.ich.R;
+import com.emato.ich.api.ICSPClient;
+import com.emato.ich.contant.ICSPConstant;
+import com.emato.ich.contant.ScanGunConstant;
+import com.emato.ich.databinding.FragmentPaymentBinding;
+import com.emato.ich.databinding.FragmentPaymentBinding;
+import com.emato.ich.entity.vo.PreparedOrderResponseVo;
+import com.emato.ich.entity.vo.PreparedOrderVo;
+import com.emato.ich.entity.vo.ResponseData;
+import com.emato.ich.local.LocalStorage;
+import com.emato.ich.utils.BaseUtils;
+import com.emato.ich.utils.JacksonUtils;
+import com.emato.ich.utils.Log;
+import com.emato.ich.utils.LoggingUtils;
+import com.emato.ich.utils.NavUtils;
+import com.emato.ich.utils.StringUtils;
+import com.emato.ich.utils.TimeOutUtils;
+import com.emato.ich.utils.ToastUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
+
+/**
+ * 扫描付款码支付
+ */
+public class PaymentFragment extends Fragment {
+
+    private static final String TAG = PaymentFragment.class.getName();
+    private FragmentPaymentBinding binding;
+    private PreparedOrderResponseVo data;
+    private final AtomicInteger paymentNoLock = new AtomicInteger(1);
+    private final AtomicInteger submitLock = new AtomicInteger(1);
+    private CountDownTimer timer;
+    private long start;
+
+    @Nullable
+    @org.jetbrains.annotations.Nullable
+    @Override
+    public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
+        start = System.currentTimeMillis();
+        binding = FragmentPaymentBinding.inflate(inflater, container, false);
+
+        return binding.getRoot();
+    }
+
+
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        long end = System.currentTimeMillis();
+        Log.i(TAG, TAG + "页面渲染速度为" + (end - start) + "ms。");
+        BaseUtils.disableEditText(binding.paymentNo);
+
+        try {
+            MainActivity activity = (MainActivity) getActivity();
+            timer = TimeOutUtils.timeout(activity, PaymentFragment.this, binding.timeout, 120);
+            timer.start();
+        } catch (Exception e) {
+            Log.e(TAG, "onViewCreated: 倒计时出现异常! ", e);
+            LoggingUtils.sendErrorLog("业务异常: 输入投递信息页面倒计时出现异常! ", e);
+        }
+
+        Bundle arguments = null;
+        String sectionType = null;
+        try {
+            MainActivity activity = (MainActivity) getActivity();
+            arguments = activity.getBundleMap().get(ChooseCabinetFragment.class.getName());
+            sectionType = arguments.getString("section_type");
+            binding.paymentNo.setInputType(InputType.TYPE_NULL);   
+            // 扫描枪监听 扫描运单号
+            activity.scanGunKeyEventHelper = new ScanGunKeyEventHelper(s -> {
+                // 扫码成功回调
+                Log.d(TAG, "onScanSuccess: " + s);
+
+                if (!StringUtils.isNullOrEmpty(s)) {
+                    for (String pattern : ScanGunConstant.getPatterns()) {
+                        Matcher matcher = Pattern.compile(pattern).matcher(s);
+                        if (!matcher.matches()) {
+                            ToastUtils.make(getContext(), "请将条形码置于扫码枪前! ");
+                            return;
+                        }
+                    }
+                }
+
+                if (paymentNoLock.get() == 1) {
+                    // 禁用软件盘
+                    Editable text = binding.paymentNo.getText();
+                    text.clear();
+                    binding.paymentNo.setText(s);
+                    paymentNoLock.incrementAndGet();
+                    // TODO 预定义,实际参数可能不一致 oms获取用户手机号 自动填充
+                    ICSPClient.getUserPhoneNumber(LocalStorage.getInstance().getSession().getToken(), BaseUtils.getClientId(), s, new Callback() {
+                        @Override
+                        public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                            // 请求失败
+                            Log.e(TAG, "onFailure: 请求oms获取手机号失败! 网络异常! ", e);
+                            LoggingUtils.sendErrorLog("业务异常: 请求oms获取手机号失败! 网络异常! ", e);
+                            ToastUtils.make(getContext(), "服务器异常! 请手动输入!");
+                            paymentNoLock.set(1);
+                        }
+
+                        @Override
+                        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+
+                            getActivity().runOnUiThread(() -> {
+                                String parseResponse = ICSPClient.isSuccessfulAndParseResponse(response);
+                                if (!StringUtils.isNullOrEmpty(parseResponse)) {
+                                    try {
+                                        ResponseData<PreparedOrderResponseVo> responseData = new ObjectMapper().readValue(parseResponse, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {
+                                        });
+
+                                        PreparedOrderResponseVo data = responseData.getData();
+                                        if (null != responseData && ICSPConstant.OK.equals(responseData.getCode())) {
+                                            String collectorPhone = data.getCollectorPhone();
+//                                            binding.delivererPhoneConfirm.setText(collectorPhone);
+                                        } else {
+                                            ToastUtils.make(getContext(), responseData.getMsg());
+                                        }
+
+                                    } catch (JsonProcessingException e) {
+                                        Log.e(TAG, "onResponse: 服务器响应错误! 自动获取用户手机号失败! ", e);
+                                        ToastUtils.make(getContext(), "网络异常! 请手动输入手机号! ");
+                                        LoggingUtils.sendErrorLog("业务异常: 服务器响应错误! 自动获取用户手机号失败! ", e);
+                                    } catch (RuntimeException e) {
+                                        Log.e(TAG, "onResponse: 获取用户手机号未知错误! ", e);
+                                        ToastUtils.make(getContext(), "未查询到手机号! 请手动输入! ");
+                                        LoggingUtils.sendErrorLog("业务异常: 获取用户手机号未知错误! ", e);
+                                    }
+                                } else {
+                                    ToastUtils.make(getContext(), "服务器异常!请稍后重试!");
+                                }
+                                paymentNoLock.set(1);
+                            });
+
+                        }
+                    });
+                }
+            });
+
+        } catch (RuntimeException e) {
+            Log.e(TAG, "onViewCreated: InputInfoFragment页面获取ChooseCabinetFragment传值错误! ", e);
+            LoggingUtils.sendErrorLog("业务异常: InputInfoFragment页面获取ChooseCabinetFragment传值错误! ", e);
+        }
+
+        // TODO 离线逻辑, 暂时不做
+
+        // 下单逻辑
+        String finalSectionType = sectionType;
+        if (submitLock.get() == 1) {
+            submitLock.incrementAndGet();
+            binding.keyBoard.inputButtonConfirm.setOnClickListener(view1 -> {
+                Bundle bundle = new Bundle();
+                String paymentNo = binding.paymentNo.getText().toString();
+//            String phone = binding.delivererPhone.getText().toString();
+
+               if (StringUtils.isNullOrEmpty(paymentNo)) {
+                    ToastUtils.make(getContext(), "运单号不能为空!请扫描运单号!");
+                } else {
+                    // todo: 将支付码传到后端进行支付
+                   //  todo:支付成功后调用预下单接口进行开门
+                    PreparedOrderVo preparedOrderVo = new PreparedOrderVo();
+                    preparedOrderVo.setClientId(BaseUtils.getClientId());
+
+                    preparedOrderVo.setLockerType(finalSectionType);
+                    preparedOrderVo.setDelivererPhone(LocalStorage.getInstance().getSession().getPhone());
+
+                    // 预下单
+                    ICSPClient.preparedOrder(LocalStorage.getInstance().getSession().getToken(), preparedOrderVo, new Callback() {
+                        @Override
+                        public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                            // TODO 预下单调用失败
+                            ToastUtils.make(getContext(), "请求服务器失败!网络异常!");
+                            Log.e(TAG, "onFailure: 预下单失败! call: " + call.timeout().toString(), e);
+                            LoggingUtils.sendErrorLog("业务异常: 预下单失败! call: " + call.timeout().toString(), e);
+                        }
+
+                        @Override
+                        public void onResponse(@NotNull Call call, @NotNull Response response) {
+                            ((MainActivity) getActivity()).runOnUiThread(() -> {
+                                try {
+                                    String responseStr = ICSPClient.isSuccessfulAndParseResponse(response);
+                                    if (!StringUtils.isNullOrEmpty(responseStr)) {
+                                        ObjectMapper objectMapper = JacksonUtils.objectmapper;
+                                        ResponseData<PreparedOrderResponseVo> responseData = objectMapper.readValue(responseStr, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {
+                                        });
+                                        data = responseData.getData();
+                                        // 响应信息
+                                        if (responseData.getCode().equals(ICSPConstant.OK)) {
+                                            bundle.putString("preparedOrderResponse", objectMapper.writeValueAsString(data));
+                                            bundle.putString("takeNo", paymentNo);
+                                            bundle.putString("sectionType", finalSectionType);
+
+                                            // 跳转到确认投递
+                                            try {
+                                                MainActivity activity = (MainActivity) getActivity();
+                                                activity.getBundleMap().put(PaymentFragment.class.getName(), bundle);
+                                            } catch (RuntimeException e) {
+                                                Log.e(TAG, "onResponse: InputInfoFragment页面获取SendInfoConfirmFragment传值错误! ", e);
+                                                LoggingUtils.sendErrorLog("业务异常: InputInfoFragment页面获取SendInfoConfirmFragment传值错误! ", e);
+                                            }
+                                            if (null != timer) {
+                                                timer.cancel();
+                                            }
+                                            NavUtils.navigate(PaymentFragment.this, R.id.action_InputInfoKeyBoardFragment_to_sendInfoConfirmFragment);
+                                        }
+                                        Log.i(TAG, "onResponse: ICSP返回码: " + responseData.getCode() + ", 返回信息: " + responseData.getMsg());
+                                        ToastUtils.make(getContext(), responseData.getMsg());
+                                    } else {
+                                        ToastUtils.make(getContext(), "服务器异常!请稍后重试!");
+                                    }
+                                } catch (JsonProcessingException e) {
+                                    Log.e(TAG, "onResponse: 预下单转换成JSON出错! ", e);
+                                    LoggingUtils.sendErrorLog("业务异常: 预下单转换成JSON出错! ", e);
+                                } catch (RuntimeException e) {
+                                    Log.e(TAG, "onResponse: 预下单失败! ", e);
+                                    LoggingUtils.sendErrorLog("业务异常: 预下单失败! ", e);
+                                }
+                            });
+                        }
+                    });
+                }
+            });
+        }
+
+        // 数字输入 5 手机号   4 面单号
+        binding.paymentNo.setOnFocusChangeListener((view1, hasFocus) -> {
+            AtomicBoolean caseSmallFlag = new AtomicBoolean(true);
+            
+            binding.keyBoard.inputButton0.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "0");
+            });
+            binding.keyBoard.inputButton1.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "1");
+            });
+            binding.keyBoard.inputButton2.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "2");
+            });
+            binding.keyBoard.inputButton3.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "3");
+            });
+            binding.keyBoard.inputButton4.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "4");
+            });
+            binding.keyBoard.inputButton5.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "5");
+            });
+            binding.keyBoard.inputButton6.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "6");
+            });
+            binding.keyBoard.inputButton7.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "7");
+            });
+            binding.keyBoard.inputButton8.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "8");
+            });
+            binding.keyBoard.inputButton9.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "9");
+            });
+
+            // todo:绑定字母按键
+            binding.keyBoard.inputButtonQ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "Q" : "q");
+            });
+            binding.keyBoard.inputButtonW.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "W" : "w");
+            });
+            binding.keyBoard.inputButtonE.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "E" : "e");
+            });
+            binding.keyBoard.inputButtonR.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "R" : "r");
+            });
+            binding.keyBoard.inputButtonT.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "T" : "t");
+            });
+            binding.keyBoard.inputButtonY.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "Y" : "y");
+            });
+            binding.keyBoard.inputButtonU.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "U" : "u");
+            });
+            binding.keyBoard.inputButtonI.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "I" : "i");
+            });
+            binding.keyBoard.inputButtonO.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "O" : "o");
+            });
+            binding.keyBoard.inputButtonP.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "P" : "p");
+            });
+            binding.keyBoard.inputButtonA.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "A" : "a");
+            });
+            binding.keyBoard.inputButtonS.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "S" : "s");
+            });
+            binding.keyBoard.inputButtonD.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "D" : "d");
+            });
+            binding.keyBoard.inputButtonF.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "F" : "f");
+            });
+            binding.keyBoard.inputButtonG.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "G" : "g");
+            });
+            binding.keyBoard.inputButtonH.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "H" : "h");
+            });
+            binding.keyBoard.inputButtonJ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "J" : "j");
+            });
+            binding.keyBoard.inputButtonK.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "K" : "k");
+            });
+            binding.keyBoard.inputButtonL.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "L" : "l");
+            });
+            binding.keyBoard.inputButtonZ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "Z" : "z");
+            });
+            binding.keyBoard.inputButtonX.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位!");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "X" : "x");
+            });
+            binding.keyBoard.inputButtonC.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "C" : "c");
+            });
+            binding.keyBoard.inputButtonV.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "V" : "v");
+            });
+            binding.keyBoard.inputButtonB.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "B" : "b");
+            });
+            binding.keyBoard.inputButtonN.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "N" : "n");
+            });
+            binding.keyBoard.inputButtonM.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, caseSmallFlag.get() ? "M" : "m");
+            });
+            //  符号
+            binding.keyBoard.symbolButton1.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "-");
+            });
+            binding.keyBoard.symbolButton2.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "/");
+            });
+            binding.keyBoard.symbolButton3.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, ":");
+            });
+            binding.keyBoard.symbolButton4.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "+");
+            });
+            binding.keyBoard.symbolButton5.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "(");
+            });
+            binding.keyBoard.symbolButton6.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, ")");
+            });
+            binding.keyBoard.symbolButton7.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "#");
+            });
+            binding.keyBoard.symbolButton8.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "@");
+            });
+            binding.keyBoard.symbolButton9.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, ".");
+            });
+            binding.keyBoard.symbolButton10.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.paymentNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "?");
+                    return;
+                }
+                int start = binding.paymentNo.getSelectionStart();
+                binding.paymentNo.getText().insert(start, "!");
+            });
+
+
+            // 大小写按键绑定  默认大写
+            binding.keyBoard.inputButtonCaseSmall.setOnClickListener(v -> {
+                if (caseSmallFlag.get()) {
+                    caseSmallFlag.set(false);
+                } else {
+                    caseSmallFlag.set(true);
+                }
+                binding.keyBoard.inputButtonCaseSmall.setText(caseSmallFlag.get() ? "大写" : "小写");
+                // 设置键盘字母大小写
+                binding.keyBoard.inputButtonQ.setText(caseSmallFlag.get() ? "Q" : "q");
+                binding.keyBoard.inputButtonW.setText(caseSmallFlag.get() ? "W" : "w");
+                binding.keyBoard.inputButtonE.setText(caseSmallFlag.get() ? "E" : "e");
+                binding.keyBoard.inputButtonR.setText(caseSmallFlag.get() ? "R" : "r");
+                binding.keyBoard.inputButtonT.setText(caseSmallFlag.get() ? "T" : "t");
+                binding.keyBoard.inputButtonY.setText(caseSmallFlag.get() ? "Y" : "y");
+                binding.keyBoard.inputButtonU.setText(caseSmallFlag.get() ? "U" : "u");
+                binding.keyBoard.inputButtonI.setText(caseSmallFlag.get() ? "I" : "i");
+                binding.keyBoard.inputButtonO.setText(caseSmallFlag.get() ? "O" : "o");
+                binding.keyBoard.inputButtonP.setText(caseSmallFlag.get() ? "P" : "p");
+                binding.keyBoard.inputButtonA.setText(caseSmallFlag.get() ? "A" : "a");
+                binding.keyBoard.inputButtonS.setText(caseSmallFlag.get() ? "S" : "s");
+                binding.keyBoard.inputButtonD.setText(caseSmallFlag.get() ? "D" : "d");
+                binding.keyBoard.inputButtonF.setText(caseSmallFlag.get() ? "F" : "f");
+                binding.keyBoard.inputButtonG.setText(caseSmallFlag.get() ? "G" : "g");
+                binding.keyBoard.inputButtonH.setText(caseSmallFlag.get() ? "H" : "h");
+                binding.keyBoard.inputButtonJ.setText(caseSmallFlag.get() ? "J" : "j");
+                binding.keyBoard.inputButtonK.setText(caseSmallFlag.get() ? "K" : "k");
+                binding.keyBoard.inputButtonL.setText(caseSmallFlag.get() ? "L" : "l");
+                binding.keyBoard.inputButtonZ.setText(caseSmallFlag.get() ? "Z" : "z");
+                binding.keyBoard.inputButtonX.setText(caseSmallFlag.get() ? "X" : "x");
+                binding.keyBoard.inputButtonC.setText(caseSmallFlag.get() ? "C" : "c");
+                binding.keyBoard.inputButtonV.setText(caseSmallFlag.get() ? "V" : "v");
+                binding.keyBoard.inputButtonB.setText(caseSmallFlag.get() ? "B" : "b");
+                binding.keyBoard.inputButtonN.setText(caseSmallFlag.get() ? "N" : "n");
+                binding.keyBoard.inputButtonM.setText(caseSmallFlag.get() ? "M" : "m");
+            });
+
+            binding.keyBoard.inputButtonCancel.setOnClickListener(v -> {
+                Editable text = binding.paymentNo.getText();
+                int start = binding.paymentNo.getSelectionStart();
+                if (text.length() > 0) {
+                    if (start > 0) {
+                        text.delete(start - 1, start);
+                    }
+                    binding.paymentNo.setText(text, TextView.BufferType.EDITABLE);
+                    binding.paymentNo.setSelection(start - 1 < 0 ? text.length() : start - 1);
+                }
+            });
+            // 长按删除
+            binding.keyBoard.inputButtonCancel.setOnLongClickListener(v -> {
+                binding.paymentNo.getText().clear();
+                return false;
+            });
+
+        });
+
+        binding.returnBtn.setOnClickListener(view1 -> {
+            if (null != timer) {
+                timer.cancel();
+            }
+            NavUtils.navigate(this, R.id.action_paymentFragment_to_mainFragment);
+        });
+
+        // 默认选中运单号输入框
+        binding.paymentNo.requestFocus();
+    }
+
+    private void extracted(AtomicBoolean caseSmallFlag) {
+
+    }
+
+
+    public PreparedOrderResponseVo getData() {
+        return data;
+    }
+
+    @Override
+    public void onDestroy() {
+        if (timer != null) {
+            timer.cancel();
+            timer = null;
+        }
+        super.onDestroy();
+        binding = null;
+        Log.i(TAG, TAG + "被销毁。。。");
+    }
+}

+ 3 - 0
app/src/main/java/com/emato/ich/fragment/SendInfoConfirmFragment.java

@@ -121,6 +121,9 @@ public class SendInfoConfirmFragment extends Fragment {
             confirmOrderVo.setClientId(clientId);
             confirmOrderVo.setOrderSn(finalOrderSn);
             confirmOrderVo.setDecision(DecisionConstant.CONFIRM_00);
+
+
+
             ICSPClient.confirmOrder(LocalStorage.getInstance().getSession().getToken(), confirmOrderVo, new Callback() {
                 @Override
                 public void onFailure(@NotNull Call call, @NotNull IOException e) {

+ 19 - 2
app/src/main/java/com/emato/ich/fragment/SendKeyBoardFragment.java

@@ -10,6 +10,7 @@ import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.drawerlayout.widget.DrawerLayout;
 import androidx.fragment.app.Fragment;
 
 import com.emato.ich.MainActivity;
@@ -63,6 +64,10 @@ public class SendKeyBoardFragment extends Fragment {
         return binding.getRoot();
     }
 
+
+
+
+
     public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
         long end = System.currentTimeMillis();
         Log.i(TAG, TAG + "页面渲染速度为" + (end - start) + "ms。");
@@ -83,14 +88,20 @@ public class SendKeyBoardFragment extends Fragment {
 
         // 如果有配置账号密码, 账号定死
         String loginPhone = null;
+        String loginType = null; // store 门店 courier 快递员投递 collect 快递员揽件
         try {
             MainActivity activity = (MainActivity) getActivity();
             loginPhone = activity.getConfigMap().get(SystemConfigConstant.cabinet_login_phone);
+            loginType = activity.getBundleMap().get(CourierFragment.class.getName()).getString("loginType");
+            if("store".equals(loginType)){
+                // 如果不是门店店员进来 则将注册二维码设置为隐藏
+                view.findViewById(R.id.qrCodeImage).setVisibility(View.GONE);
+            }
         } catch (Exception e) {
             Log.e(TAG, "onViewCreated: 配置登录手机号出错! ", e);
             LoggingUtils.sendErrorLog("业务异常: 配置登录手机号出错! ", e);
         }
-        if (!StringUtils.isNullOrEmpty(loginPhone)) {
+        if (!StringUtils.isNullOrEmpty(loginPhone) && "store".equals(loginType)) {
             String loginPhoneShow = toHidePhone(loginPhone);
             binding.editTextTextPersonName4.setText(loginPhoneShow);
             binding.editTextTextPersonName4.setEnabled(false);
@@ -209,6 +220,7 @@ public class SendKeyBoardFragment extends Fragment {
         }
 
         String finalLoginPhone = loginPhone;
+        String finalLoginType = loginType;
         binding.keyBoard.inputButtonConfirm.setOnClickListener(view1 -> {
             if (ButtonUtils.isFastClick()) {
                 return;
@@ -254,7 +266,12 @@ public class SendKeyBoardFragment extends Fragment {
                                         if (null != timer) {
                                             timer.cancel();
                                         }
-                                        NavUtils.navigate(SendKeyBoardFragment.this, R.id.action_sendFragment_to_sendMainFragment);
+                                        if ("store".equals(finalLoginType) || "courier".equals(finalLoginType)){
+                                            NavUtils.navigate(SendKeyBoardFragment.this, R.id.action_sendFragment_to_sendMainFragment);
+                                        }else{
+                                            NavUtils.navigate(SendKeyBoardFragment.this, R.id.action_sendFragment_to_collectMaterialsFragment);
+                                        }
+
                                     } else {
                                         ToastUtils.make(getContext(), responseData.getMsg());
                                         Log.w(TAG, "onResponse: " + responseData.getMsg());

+ 125 - 4
app/src/main/java/com/emato/ich/utils/TimeOutUtils.java

@@ -1,5 +1,6 @@
 package com.emato.ich.utils;
 
+import android.os.Bundle;
 import android.os.CountDownTimer;
 import android.widget.TextView;
 
@@ -8,10 +9,20 @@ import androidx.navigation.fragment.NavHostFragment;
 
 import com.emato.ich.MainActivity;
 import com.emato.ich.R;
+import com.emato.ich.api.ICSPClient;
+import com.emato.ich.contant.DecisionConstant;
+import com.emato.ich.contant.ICSPConstant;
+import com.emato.ich.entity.vo.ConfirmOrderVo;
+import com.emato.ich.entity.vo.PreparedOrderResponseVo;
+import com.emato.ich.entity.vo.ResponseData;
 import com.emato.ich.fragment.ChooseCabinetFragment;
+import com.emato.ich.fragment.CollectMaterialsFragment;
+import com.emato.ich.fragment.CourierFragment;
 import com.emato.ich.fragment.ExceptionFragment;
+import com.emato.ich.fragment.ExpressDeliveryFragment;
 import com.emato.ich.fragment.InputInfoFragment;
 import com.emato.ich.fragment.InputInfoKeyBoardFragment;
+import com.emato.ich.fragment.PaymentFragment;
 import com.emato.ich.fragment.SendFragment;
 import com.emato.ich.fragment.SendInfoConfirmFragment;
 import com.emato.ich.fragment.SendKeyBoardFragment;
@@ -21,12 +32,22 @@ import com.emato.ich.fragment.TakeCodeFragment;
 import com.emato.ich.fragment.TakeFragment;
 import com.emato.ich.fragment.TakeSuccessFragment;
 import com.emato.ich.local.LocalStorage;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
 
 /**
  * 页面倒计时工具类
  */
 public class TimeOutUtils {
-
+    private static final  String TAG = "超时自动确认投递";
     /**
      * 倒计时
      * @param mainActivity      activity
@@ -42,7 +63,7 @@ public class TimeOutUtils {
             public void onTick(long millisUntilFinished) {
                 textView.setText(String.valueOf((millisUntilFinished / 1000)));
                 if (millisUntilFinished <= 1999) {
-                    int fragmentAction = getFragmentAction(fragment);
+                    int fragmentAction = getFragmentAction(mainActivity,fragment);
                     if (fragmentAction != 0) {
                         NavUtils.navigate(fragment, fragmentAction);
                         fragment.onDestroy();
@@ -52,7 +73,7 @@ public class TimeOutUtils {
 
             @Override
             public void onFinish() {
-                int fragmentAction = getFragmentAction(fragment);
+                int fragmentAction = getFragmentAction(mainActivity,fragment);
                 if (fragmentAction != 0) {
                     // 清空session和页面传值, 异常处理有不同处理方式
                     boolean isException = false;
@@ -74,7 +95,7 @@ public class TimeOutUtils {
      * @param fragment      fragment
      * @return              跳转所对应的action id
      */
-    private static int getFragmentAction(Fragment fragment) {
+    private static int getFragmentAction(MainActivity mainActivity ,Fragment fragment) {
 
         if (fragment instanceof ChooseCabinetFragment) {
             return R.id.action_chooseCabinetFragment_to_mainFragment;
@@ -89,6 +110,8 @@ public class TimeOutUtils {
         } else if (fragment instanceof SendKeyBoardFragment) {
             return R.id.action_sendFragment_to_mainFragment;
         }else if (fragment instanceof SendInfoConfirmFragment) {
+            //todo: 在此调用确认投递接口  确认投递后返回首页  待测试
+            confirmOrder(mainActivity);
             return R.id.action_sendInfoConfirmFragment_to_mainFragment;
         } else if (fragment instanceof SendMainFragment) {
             return R.id.action_sendMainFragment_to_mainFragment;
@@ -100,9 +123,107 @@ public class TimeOutUtils {
             return R.id.action_takeFragment_to_mainFragment;
         } else if (fragment instanceof TakeSuccessFragment) {
             return R.id.action_takeSuccessFragment_to_mainFragment;
+        } else if (fragment instanceof CourierFragment) {
+            return R.id.action_courierFragment_to_mainFragment;
+        } else if (fragment instanceof ExpressDeliveryFragment) {
+            return R.id.action_expressDeliveryFragment_to_mainFragment;
+        } else if (fragment instanceof CollectMaterialsFragment) {
+            return R.id.action_collectMaterialsFragment_to_mainFragment;
+        } else if (fragment instanceof PaymentFragment) {
+            return R.id.action_paymentFragment_to_mainFragment;
         }
         return 0;
     }
 
+    /**
+     * 确认订单
+     * @param mainActivity
+     */
+    private static void confirmOrder(MainActivity mainActivity) {
+        Bundle arguments = null;
+        MainActivity activity = null;
+        try {
+            activity = mainActivity;
+            arguments = activity.getBundleMap().get(InputInfoKeyBoardFragment.class.getName());
+        } catch (RuntimeException e) {
+            Log.e(TAG, "onResponse: SendInfoConfirmFragment页面获取InputInfoKeyBoardFragment传值错误! ", e);
+            LoggingUtils.sendErrorLog("业务异常: SendInfoConfirmFragment页面获取InputInfoKeyBoardFragment传值错误! ", e);
+        }
+
+        String orderSn = null;
+        String collectorPhone;
+        PreparedOrderResponseVo orderResponseVo;
+        String sectionType = null;
+        // 设置订单提示属性
+        if (null != arguments) {
+            try {
+                String response = arguments.getString("preparedOrderResponse");
+                sectionType = arguments.getString("sectionType");
+                orderResponseVo = JacksonUtils.objectmapper.readValue(response, PreparedOrderResponseVo.class);
+                collectorPhone = orderResponseVo.getCollectorPhone();
+                orderSn = orderResponseVo.getOrderSn();
+                           /* binding.openCabinetNo.setText(orderResponseVo.getLockerName());
+                            binding.takeNo.setText(arguments.getString("takeNo"));
+                            binding.takeNumber.setText(collectorPhone);*/
+
+            } catch (JsonProcessingException e) {
+                Log.e(TAG, "onViewCreated: 解析预下单页面传递信息错误! ", e);
+                LoggingUtils.sendErrorLog("业务异常: 解析预下单页面传递信息错误! ", e);
+            }
+
+        }
+        String finalOrderSn = orderSn;
+        // TODO 确认投递, 真正下单
+        String clientId = BaseUtils.getClientId();
+        // /order/deliverer/confirm
+        ConfirmOrderVo confirmOrderVo = new ConfirmOrderVo();
+        confirmOrderVo.setClientId(clientId);
+        confirmOrderVo.setOrderSn(finalOrderSn);
+        confirmOrderVo.setDecision(DecisionConstant.CONFIRM_00);
+        MainActivity finalActivity = activity;
+        ICSPClient.confirmOrder(LocalStorage.getInstance().getSession().getToken(), confirmOrderVo, new Callback() {
+            @Override
+            public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                // TODO 确认失败
+//                    getActivity().runOnUiThread(() -> {
+//
+//                    });
+                Log.e(TAG, "onFailure: 确认投递失败! ", e);
+                LoggingUtils.sendErrorLog("业务异常: 投递失败!网络异常! ", e);
+            }
+
+            @Override
+            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+                finalActivity.runOnUiThread(() -> {
+                    String parseResponse = ICSPClient.isSuccessfulAndParseResponse(response);
+                    if (!StringUtils.isNullOrEmpty(parseResponse)) {
+                        ObjectMapper objectMapper = JacksonUtils.objectmapper;
+                        try {
+                            ResponseData responseData = objectMapper.readValue(parseResponse, ResponseData.class);
+                            String code = responseData.getCode();
+                            if (code.equals(ICSPConstant.OK)) {
+                                // TODO 确认投递成功逻辑处理
+                            } else {
+                                // TODO 确认投递失败逻辑处理
+                                ToastUtils.make(null, responseData.getMsg());
+                                Log.w(TAG, "onResponse: " + responseData.getMsg());
+                            }
+                        } catch (JsonProcessingException e) {
+                            Log.e(TAG, "onResponse: 确认投递解析响应信息失败!", e);
+                            LoggingUtils.sendErrorLog("业务异常: 确认投递解析响应信息失败! ", e);
+                        } catch (RuntimeException e) {
+                            Log.e(TAG, "onResponse: 投递失败! ", e);
+                            LoggingUtils.sendErrorLog("业务异常: 投递失败! 未知异常! ", e);
+                        }
+                    } else {
+                        ToastUtils.make(null, "服务器异常! 请稍后重试!");
+                    }
+                });
+            }
+        });
+        // 投递完成后已经是另外一单, 可以继续异常处理
+        LocalStorage.getInstance().getSession().setException(true);
+    }
+
 
 }

BIN
app/src/main/res/drawable/jikuaidi.png


BIN
app/src/main/res/drawable/jikuaidi1.png


BIN
app/src/main/res/drawable/lanjian.png


BIN
app/src/main/res/drawable/mendian.png


BIN
app/src/main/res/drawable/mendianpaijian.png


BIN
app/src/main/res/drawable/paijian.png


BIN
app/src/main/res/drawable/paijian1.png


BIN
app/src/main/res/drawable/paisongyuan.png


BIN
app/src/main/res/drawable/qrcode1111111.png


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

@@ -23,7 +23,7 @@
         app:layout_constraintVertical_bias="0.0"
         app:navGraph="@navigation/nav_graph" />
 
- <!--   <ImageView
+    <ImageView
         android:id="@+id/imageView"
         android:layout_width="344dp"
         android:layout_height="290dp"
@@ -33,7 +33,7 @@
         app:layout_constraintStart_toStartOf="parent"
         app:srcCompat="@drawable/deheguizizhutu"
         tools:ignore="MissingConstraints"
-        tools:layout_editor_absoluteY="0dp" />-->
+        tools:layout_editor_absoluteY="0dp" />
 
     <com.hacknife.carouselbanner.CarouselBanner
         android:id="@+id/banner"

+ 71 - 0
app/src/main/res/layout/fragment_collect_materials.xml

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true">
+
+    <!-- 引入键盘页面 -->
+    <include
+        android:id="@+id/key_board"
+        layout="@layout/fragment_my_key_board"/>
+
+    <EditText
+        android:id="@+id/mail_no"
+        android:layout_width="245dp"
+        android:layout_height="50dp"
+        android:layout_x="55dp"
+        android:layout_y="290dp"
+        android:ems="10"
+        android:hint="@string/input_express_number"
+        android:inputType="none"
+        android:longClickable="false"
+        android:textSize="10dp" />
+
+<!--    <EditText
+        android:id="@+id/deliverer_phone_confirm"
+        android:layout_width="145dp"
+        android:layout_height="50dp"
+        android:layout_x="181dp"
+        android:layout_y="290dp"
+        android:ems="10"
+        android:hint="@string/input_recipients_phone"
+        android:inputType="phone"
+        android:longClickable="false"
+        android:textSize="10dp" />-->
+
+
+
+    <!--  返回按钮  -->
+    <TextView
+        android:id="@+id/return_btn"
+        android:layout_width="80dp"
+        android:layout_height="29dp"
+        android:layout_x="29dp"
+        android:layout_y="529dp"
+        android:background="@drawable/return1" />
+
+    <!-- 倒计时 -->
+    <TextView
+        android:id="@+id/timeout"
+        android:layout_width="55dp"
+        android:layout_height="55dp"
+        android:layout_x="276dp"
+        android:layout_y="518dp"
+        android:gravity="center"
+        android:textSize="30dp"
+        android:textStyle="bold" />
+
+    <!--    <EditText-->
+<!--        android:id="@+id/deliverer_phone"-->
+<!--        android:layout_width="150dp"-->
+<!--        android:layout_height="50dp"-->
+<!--        android:layout_x="10dp"-->
+<!--        android:layout_y="405dp"-->
+<!--        android:longClickable="false"-->
+<!--        android:textSize="10dp"-->
+<!--        android:ems="10"-->
+<!--        android:hint="@string/input_recipients_phone_confirm"-->
+<!--        android:inputType="phone" />-->
+
+</AbsoluteLayout>

+ 60 - 0
app/src/main/res/layout/fragment_courier.xml

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <TextView
+        android:id="@+id/timeout"
+        android:layout_width="50dp"
+        android:layout_height="50dp"
+        android:layout_x="285dp"
+        android:layout_y="545dp"
+        android:gravity="center"
+        android:textSize="22dp"
+        android:textStyle="bold"/>
+
+    <TextView
+        android:id="@+id/store_send_btn"
+        android:layout_width="107dp"
+        android:layout_height="wrap_content"
+        android:layout_x="18dp"
+        android:layout_y="366dp"
+        android:drawableTop="@drawable/mendianpaijian"
+        android:gravity="center"
+        android:text="@string/store_delivery"
+        android:textSize="15sp"
+        android:textStyle="bold" />
+
+
+    <TextView
+        android:id="@+id/courier_send_btn"
+        android:layout_width="107dp"
+        android:layout_height="wrap_content"
+        android:layout_x="123dp"
+        android:layout_y="367dp"
+        android:drawableTop="@drawable/paijian"
+        android:gravity="center"
+        android:text="@string/courier_delivery"
+        android:textSize="15sp"
+        android:textStyle="bold" />
+
+    <TextView
+        android:id="@+id/collect_material"
+        android:layout_width="107dp"
+        android:layout_height="wrap_content"
+        android:layout_x="228dp"
+        android:layout_y="367dp"
+        android:drawableTop="@drawable/lanjian"
+        android:gravity="center"
+        android:text="@string/collect_materials"
+        android:textSize="15sp"
+        android:textStyle="bold" />
+
+    <TextView
+        android:id="@+id/return_btn"
+        android:layout_width="80dp"
+        android:layout_height="30dp"
+        android:layout_x="30dp"
+        android:layout_y="548dp"
+        android:background="@drawable/return1" />
+
+</AbsoluteLayout>

+ 50 - 0
app/src/main/res/layout/fragment_express_delivery.xml

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <TextView
+        android:id="@+id/timeout"
+        android:layout_width="50dp"
+        android:layout_height="50dp"
+        android:layout_x="285dp"
+        android:layout_y="545dp"
+        android:gravity="center"
+        android:textSize="22dp"
+        android:textStyle="bold"/>
+
+
+    <EditText
+        android:id="@+id/editTextDeliveryCode"
+        android:layout_width="wrap_content"
+        android:layout_height="50dp"
+        android:layout_x="29dp"
+        android:layout_y="289dp"
+        android:ems="15"
+        android:hint="@string/input_delivery_code"
+        android:inputType="number"
+        android:longClickable="false"
+        android:textSize="10dp" />
+
+    <TextView
+        android:id="@+id/expressDeliveryQrCodeImage"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_x="232dp"
+        android:layout_y="287dp"
+        android:background="@drawable/e_mp_qrcode_8x8_backup"
+        />
+
+    <include
+        android:id="@+id/key_board"
+        layout="@layout/fragment_my_key_board"
+      />
+
+    <TextView
+        android:id="@+id/return_btn"
+        android:layout_width="80dp"
+        android:layout_height="30dp"
+        android:layout_x="30dp"
+        android:layout_y="548dp"
+        android:background="@drawable/return1" />
+
+</AbsoluteLayout>

+ 38 - 20
app/src/main/res/layout/fragment_main.xml

@@ -42,28 +42,11 @@
     <!--android:layout_y="376dp"-->
     <!--新位置-->
     <!--android:layout_y="416dp"-->
-    <TextView
-        android:id="@+id/send_btn"
-        android:layout_width="150dp"
-        android:layout_height="78dp"
-        android:layout_x="38dp"
-        android:layout_y="376dp"
-        android:background="@drawable/send"
-        android:textSize="20sp"
-        android:textStyle="bold" />
 
     <!--德合的取件按钮隐藏-->
-    <TextView
-        android:id="@+id/take_btn"
-        android:layout_width="150dp"
-        android:layout_height="87dp"
-        android:layout_x="38dp"
-        android:layout_y="476dp"
-        android:background="@drawable/take"
-        android:textSize="20sp"
-        android:textStyle="" />
 
-<!--    <ImageView
+
+        <ImageView
         android:id="@+id/serialImageView"
         android:layout_width="263dp"
         android:layout_height="60dp"
@@ -73,7 +56,42 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintHorizontal_bias="0.0"
         app:layout_constraintStart_toStartOf="parent"
-        app:srcCompat="@drawable/img2" />-->
+        app:srcCompat="@drawable/img2" />
+
+
+<!--        <TextView
+        android:id="@+id/take_btn"
+        android:layout_width="150dp"
+        android:layout_height="87dp"
+        android:layout_x="44dp"
+        android:layout_y="511dp"
+        android:background="@drawable/take"
+        android:textSize="20sp"
+        android:textStyle="" />-->
+
+    <TextView
+        android:id="@+id/send_btn"
+        android:layout_width="107dp"
+        android:layout_height="wrap_content"
+        android:layout_x="46dp"
+        android:layout_y="367dp"
+        android:drawableTop="@drawable/jikuaidi"
+        android:gravity="center"
+        android:text="@string/express_delivery"
+        android:textSize="15sp"
+        android:textStyle="bold" />
+
+    <TextView
+        android:id="@+id/deliverer_btn"
+        android:layout_width="107dp"
+        android:layout_height="wrap_content"
+        android:layout_x="46dp"
+        android:layout_y="473dp"
+        android:drawableTop="@drawable/paisongyuan"
+        android:gravity="center"
+        android:text="@string/delivery"
+        android:textSize="15sp"
+        android:textStyle="bold" />
 
     <ImageView
         android:id="@+id/fast_take_send"

+ 71 - 0
app/src/main/res/layout/fragment_payment.xml

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true">
+
+    <!-- 引入键盘页面 -->
+    <include
+        android:id="@+id/key_board"
+        layout="@layout/fragment_my_key_board"/>
+
+    <EditText
+        android:id="@+id/payment_no"
+        android:layout_width="245dp"
+        android:layout_height="50dp"
+        android:layout_x="55dp"
+        android:layout_y="290dp"
+        android:ems="10"
+        android:hint="@string/input_payment_number"
+        android:inputType="none"
+        android:longClickable="false"
+        android:textSize="10dp" />
+
+<!--    <EditText
+        android:id="@+id/deliverer_phone_confirm"
+        android:layout_width="145dp"
+        android:layout_height="50dp"
+        android:layout_x="181dp"
+        android:layout_y="290dp"
+        android:ems="10"
+        android:hint="@string/input_recipients_phone"
+        android:inputType="phone"
+        android:longClickable="false"
+        android:textSize="10dp" />-->
+
+
+
+    <!--  返回按钮  -->
+    <TextView
+        android:id="@+id/return_btn"
+        android:layout_width="80dp"
+        android:layout_height="29dp"
+        android:layout_x="29dp"
+        android:layout_y="529dp"
+        android:background="@drawable/return1" />
+
+    <!-- 倒计时 -->
+    <TextView
+        android:id="@+id/timeout"
+        android:layout_width="55dp"
+        android:layout_height="55dp"
+        android:layout_x="276dp"
+        android:layout_y="518dp"
+        android:gravity="center"
+        android:textSize="30dp"
+        android:textStyle="bold" />
+
+    <!--    <EditText-->
+<!--        android:id="@+id/deliverer_phone"-->
+<!--        android:layout_width="150dp"-->
+<!--        android:layout_height="50dp"-->
+<!--        android:layout_x="10dp"-->
+<!--        android:layout_y="405dp"-->
+<!--        android:longClickable="false"-->
+<!--        android:textSize="10dp"-->
+<!--        android:ems="10"-->
+<!--        android:hint="@string/input_recipients_phone_confirm"-->
+<!--        android:inputType="phone" />-->
+
+</AbsoluteLayout>

+ 15 - 9
app/src/main/res/layout/fragment_send_key_board.xml

@@ -5,11 +5,11 @@
     android:focusable="true"
     android:focusableInTouchMode="true">
 
+    <!--  返回按钮  -->
     <include
         android:id="@+id/key_board"
-        layout="@layout/fragment_my_key_board"/>
+        layout="@layout/fragment_my_key_board" />
 
-    <!--  返回按钮  -->
     <TextView
         android:id="@+id/return_btn"
         android:layout_width="80dp"
@@ -19,6 +19,15 @@
         android:background="@drawable/return1" />
 
     <!-- 倒计时 -->
+
+    <TextView
+        android:id="@+id/qrCodeImage"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_x="276dp"
+        android:layout_y="286dp"
+        android:background="@drawable/e_mp_qrcode_8x8_backup" />
+
     <TextView
         android:id="@+id/timeout"
         android:layout_width="50dp"
@@ -31,7 +40,7 @@
     <!--  投递员手机号  -->
     <EditText
         android:id="@+id/editTextTextPersonName4"
-        android:layout_width="145dp"
+        android:layout_width="120dp"
         android:layout_height="50dp"
         android:layout_x="25dp"
         android:layout_y="290dp"
@@ -44,10 +53,10 @@
 
     <EditText
         android:id="@+id/editTextTextPersonName5"
-        android:layout_width="145dp"
+        android:layout_width="120dp"
         android:layout_height="50dp"
-        android:layout_x="181dp"
-        android:layout_y="290dp"
+        android:layout_x="155dp"
+        android:layout_y="291dp"
         android:ems="15"
         android:hint="@string/input_send_password"
         android:inputType="textPassword"
@@ -55,7 +64,4 @@
         android:textSize="10dp" />
 
 
-
-
-
 </AbsoluteLayout>

+ 92 - 3
app/src/main/res/navigation/nav_graph.xml

@@ -14,7 +14,15 @@
 
         <action
             android:id="@+id/action_mainFragment_to_sendFragment"
-            app:destination="@id/SendFragment" />
+            app:destination="@id/SendKeyBoardFragment" />
+
+        <action
+            android:id="@+id/action_mainFragment_to_express_delivery_fragment"
+            app:destination="@id/ExpressDelivery" />
+        <action
+            android:id="@+id/action_mainFragment_to_courier_fragment"
+            app:destination="@id/Courier" />
+
         <action
             android:id="@+id/action_mainFragment_to_takeFragment"
             app:destination="@id/TakeFragment" />
@@ -22,7 +30,7 @@
 
     <!--  投递页面:投递员登录页面  -->
     <fragment
-        android:id="@+id/SendFragment"
+        android:id="@+id/SendKeyBoardFragment"
         android:name="com.emato.ich.fragment.SendKeyBoardFragment"
         android:label="@string/send_fragment_label"
         tools:layout="@layout/fragment_send_key_board">
@@ -31,6 +39,9 @@
             android:id="@+id/action_sendFragment_to_sendMainFragment"
             app:destination="@id/SendMainFragment" />
         <action
+            android:id="@+id/action_sendFragment_to_collectMaterialsFragment"
+            app:destination="@id/CollectMaterialsFragment" />
+        <action
             android:id="@+id/action_sendFragment_to_mainFragment"
             app:destination="@id/MainFragment" />
     </fragment>
@@ -53,6 +64,50 @@
             app:destination="@id/MainFragment"/>
     </fragment>
 
+
+
+    <!--  我要寄快递页面  -->
+    <fragment
+        android:id="@+id/ExpressDelivery"
+        android:name="com.emato.ich.fragment.ExpressDeliveryFragment"
+        android:label="@string/express_Delivery_fragment_label"
+        tools:layout="@layout/fragment_express_delivery">
+
+        <action
+            android:id="@+id/action_ExpressDeliveryFragment_to_ChooseCabinetFragment"
+            app:destination="@id/ChooseCabinetFragment" />
+
+        <action
+            android:id="@+id/action_expressDeliveryFragment_to_mainFragment"
+            app:destination="@id/MainFragment" />
+    </fragment>
+
+
+    <!--  我是快递员页面  -->
+    <fragment
+        android:id="@+id/Courier"
+        android:name="com.emato.ich.fragment.CourierFragment"
+        android:label="@string/courier_label"
+        tools:layout="@layout/fragment_courier">
+
+        <action
+            android:id="@+id/action_courierFragment_to_mainFragment"
+            app:destination="@id/MainFragment" />
+
+        <action
+            android:id="@+id/action_courierFragment_to_sendKeyBoardFragment"
+            app:destination="@id/SendKeyBoardFragment" />
+        <!--快点员派件-->
+<!--        <action
+            android:id="@+id/action_courierFragment_to_mainFragment"
+            app:destination="@id/MainFragment" />-->
+        <!--揽件按钮-->
+<!--        <action
+            android:id="@+id/action_courierFragment_to_mainFragment"
+            app:destination="@id/MainFragment" />-->
+
+    </fragment>
+
     <!--  取件页面  -->
     <fragment
         android:id="@+id/TakeFragment"
@@ -87,6 +142,37 @@
             app:destination="@id/MainFragment"/>
     </fragment>
 
+    <!--  输入运单号揽件页面  -->
+    <fragment
+        android:id="@+id/CollectMaterialsFragment"
+        android:name="com.emato.ich.fragment.CollectMaterialsFragment"
+        android:label="运单号揽件页面"
+        tools:layout="@layout/fragment_collect_materials">
+
+        <action
+            android:id="@+id/action_collectMaterialsFragment_to_takeSuccessFragment"
+            app:destination="@id/TakeSuccessFragment"/>
+        <action
+            android:id="@+id/action_collectMaterialsFragment_to_sendInfoConfirmFragment"
+            app:destination="@id/SendInfoConfirmFragment"/>
+        <action
+            android:id="@+id/action_collectMaterialsFragment_to_mainFragment"
+            app:destination="@id/MainFragment"/>
+    </fragment>
+    <!--  扫码支付页面  -->
+    <fragment
+        android:id="@+id/PaymentFragment"
+        android:name="com.emato.ich.fragment.PaymentFragment"
+        android:label="扫码支付页面"
+        tools:layout="@layout/fragment_payment">
+
+        <action
+            android:id="@+id/action_paymentFragment_to_sendSuccess"
+            app:destination="@id/SendSuccessFragment"/>
+        <action
+            android:id="@+id/action_paymentFragment_to_mainFragment"
+            app:destination="@id/MainFragment"/>
+    </fragment>
     <!--  选择投递还是异常处理  -->
     <fragment
         android:id="@+id/SendMainFragment"
@@ -102,7 +188,7 @@
             app:destination="@id/ExceptionFragment"/>
         <action
             android:id="@+id/action_sendMainFragment_to_sendFragment"
-            app:destination="@id/SendFragment"/>
+            app:destination="@id/SendKeyBoardFragment"/>
         <action
             android:id="@+id/action_sendMainFragment_to_mainFragment"
             app:destination="@id/MainFragment"/>
@@ -207,5 +293,8 @@
         <action
             android:id="@+id/action_takeSuccessFragment_to_takeCodeFragment"
             app:destination="@id/TakeCodeFragment"/>
+        <action
+            android:id="@+id/action_takeSuccessFragment_to_collectMaterialsFragment"
+            app:destination="@id/CollectMaterialsFragment"/>
     </fragment>
 </navigation>

+ 9 - 0
app/src/main/res/values/strings.xml

@@ -4,6 +4,8 @@
     <!-- Strings used for fragments for navigation -->
     <string name="main_fragment_label">e码头快递柜</string>
     <string name="take_fragment_label">快速取件</string>
+    <string name="express_Delivery_fragment_label">寄快递页面</string>
+    <string name="courier_label">我是派件员</string>
     <string name="take_btn">我要取件</string>
     <string name="send_btn">我要投递</string>
 <!--    <string name="fast_take_or_send">快速投递/取件</string>-->
@@ -65,6 +67,7 @@
     <string name="input_send_password">请输入投递人密码</string>
     <string name="input_recipients_phone">请输入收件人手机号</string>
     <string name="input_express_number">扫描快递单号</string>
+    <string name="input_payment_number">请扫描付款码支付</string>
     <string name="input_take_code">请输入取件码</string>
     <string name="android_take">取件码取件</string>
     <string name="wx_scan_take">微信扫码取件</string>
@@ -109,6 +112,7 @@
     <string name="invalid_password">Password must be >5 characters</string>
     <string name="login_failed">"Login failed"</string>
     <string name="input_send_phone">请输入投递员手机号</string>
+    <string name="input_delivery_code">请扫码下单后输入投递码</string>
     <string name="confirm_open_door_btn">开门</string>
     <string name="send_success">当前操作已完成</string>
     <string name="continue_send">继续投递</string>
@@ -119,4 +123,9 @@
     <string name="re_open_cabinet">再开一次</string>
     <string name="open_info">全开柜门</string>
     <string name="register_info">注册信息</string>
+    <string name="express_delivery">我要寄快递</string>
+    <string name="delivery">我是派送员</string>
+    <string name="courier_delivery">快递员派件</string>
+    <string name="collect_materials">揽件</string>
+    <string name="store_delivery">门店派件</string>
 </resources>