package com.emato.ich.fragment; import android.os.Bundle; import android.os.CountDownTimer; import android.text.Editable; import android.util.Log; 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 androidx.navigation.fragment.NavHostFragment; 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.api.ICSPResponseCodeEnum; import com.emato.ich.databinding.FragmentInputInfoBinding; import com.emato.ich.entity.vo.ResponseData; import com.emato.ich.entity.vo.PreparedOrderResponseVo; import com.emato.ich.entity.vo.PreparedOrderVo; import com.emato.ich.local.LocalStorage; import com.emato.ich.utils.BaseUtils; import com.emato.ich.utils.JacksonUtils; import com.emato.ich.utils.StringUtils; import com.emato.ich.utils.TimeOutUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.android.material.snackbar.Snackbar; 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.Pattern; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; /** * 输入投递信息 */ public class InputInfoFragment extends Fragment { private static final String TAG = "InputInfoFragment"; private FragmentInputInfoBinding binding; private PreparedOrderResponseVo data; private volatile AtomicInteger mailNoLock = new AtomicInteger(1); private volatile AtomicInteger submitLock = new AtomicInteger(1); private CountDownTimer timer; @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) { binding = FragmentInputInfoBinding.inflate(inflater, container, false); return binding.getRoot(); } public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { // BaseUtils.disableEditText(binding.delivererPhone); BaseUtils.disableEditText(binding.delivererPhoneConfirm); BaseUtils.disableEditText(binding.mailNo); try { MainActivity activity = (MainActivity) getActivity(); timer = TimeOutUtils.timeout(activity, InputInfoFragment.this, binding.timeout, 120); timer.start(); } catch (Exception e) { Log.e(TAG, "onViewCreated: 倒计时出现异常! ", e); } Bundle arguments = null; String sectionType = null; try { MainActivity activity = (MainActivity) getActivity(); arguments = activity.getBundleMap().get(ChooseCabinetFragment.class.getName()); sectionType = arguments.getString("section_type"); // 扫描枪监听 扫描运单号 activity.scanGunKeyEventHelper = new ScanGunKeyEventHelper(s -> { // 扫码成功回调 Log.d(TAG, "onScanSuccess: " + s); 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) { // 请求失败 Snackbar.make(view, "服务器异常! 请手动输入! ", Snackbar.LENGTH_LONG).show(); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { getActivity().runOnUiThread(() -> { String parseResponse = ICSPClient.isSuccessfulAndParseResponse(response); try { ResponseData responseData = new ObjectMapper().readValue(parseResponse, new TypeReference>() { }); PreparedOrderResponseVo data = responseData.getData(); if (null != responseData && ICSPResponseCodeEnum.OK.getCode().equals(responseData.getCode())) { String collectorPhone = data.getCollectorPhone(); binding.delivererPhoneConfirm.setText(collectorPhone); } ICSPResponseCodeEnum.responseHint(getContext(), responseData); } catch (JsonProcessingException e) { Log.e(TAG, "onResponse: 服务器响应错误! 自动获取用户手机号失败! ", e); Snackbar.make(view, "网络异常! 请手动输入手机号! ", Snackbar.LENGTH_LONG).show(); } catch (RuntimeException e) { Log.e(TAG, "onResponse: 获取用户手机号未知错误! ", e); Snackbar.make(view, "未查询到手机号! 请手动输入! ", Snackbar.LENGTH_LONG).show(); } }); } }); } }); } catch (RuntimeException e) { Log.e(TAG, "onViewCreated: InputInfoFragment页面获取ChooseCabinetFragment传值错误! ", e); } // TODO 离线逻辑, 暂时不做 Pattern phonePattern = Pattern.compile("^((13[0-9])|(14[0,1,4-9])|(15[0-3,5-9])|(16[2,5,6,7])|(17[0-8])|(18[0-9])|(19[0-3,5-9]))\\d{8}$"); // 下单逻辑 String finalSectionType = sectionType; if (submitLock.get() == 1) { submitLock.incrementAndGet(); binding.buttonConfirm.setOnClickListener(view1 -> { Bundle bundle = new Bundle(); String mailNo = binding.mailNo.getText().toString(); // String phone = binding.delivererPhone.getText().toString(); String phoneConfirm = binding.delivererPhoneConfirm.getText().toString(); if (!phonePattern.matcher(phoneConfirm).matches()) { Snackbar.make(view1, "请输入正确的手机号!", Snackbar.LENGTH_LONG).show(); } else if (StringUtils.isNullOrEmpty(mailNo)) { Snackbar.make(view1, "运单号不能为空!请扫描运单号!", Snackbar.LENGTH_LONG).show(); } else { // 验证完 预下单 PreparedOrderVo preparedOrderVo = new PreparedOrderVo(); preparedOrderVo.setClientId(BaseUtils.getClientId()); preparedOrderVo.setMailNo(mailNo); preparedOrderVo.setCollectorPhone(phoneConfirm); 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 预下单调用失败 Snackbar.make(view, "请求服务器失败!网络异常!", Snackbar.LENGTH_LONG).show(); Log.e(TAG, "onFailure: 预下单失败! call: " + call.timeout().toString(), e); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) { ((MainActivity) getActivity()).runOnUiThread(() -> { try { String responseStr = ICSPClient.isSuccessfulAndParseResponse(response); ObjectMapper objectMapper = JacksonUtils.objectmapper; ResponseData responseData = objectMapper.readValue(responseStr, new TypeReference>() {}); data = responseData.getData(); // 响应信息 if (responseData.getCode().equals(ICSPResponseCodeEnum.OK.getCode())) { bundle.putString("preparedOrderResponse", objectMapper.writeValueAsString(data)); bundle.putString("takeNo", mailNo); bundle.putString("sectionType", finalSectionType); // 跳转到确认投递 try { MainActivity activity = (MainActivity) getActivity(); activity.getBundleMap().put(InputInfoFragment.class.getName(), bundle); } catch (RuntimeException e) { Log.e(TAG, "onResponse: InputInfoFragment页面获取SendInfoConfirmFragment传值错误! ", e); } timer.cancel(); NavHostFragment.findNavController(InputInfoFragment.this).navigate(R.id.action_inputInfoFragment_to_sendInfoConfirmFragment); } else { ICSPResponseCodeEnum.responseHint(getContext(), responseData); Log.e(TAG, "onResponse: ICSP返回码: " + responseData.getCode() + ", 返回信息: " + responseData.getMsg(), new RuntimeException("系统异常")); } } catch (JsonProcessingException e) { Log.e(TAG, "onResponse: 预下单转换成JSON出错! ", e); } catch (RuntimeException e) { Log.e(TAG, "onResponse: 预下单失败! ", e); } }); } }); } }); } // 数字输入 5 手机号 4 密码 binding.delivererPhoneConfirm.setOnFocusChangeListener((view1, hasFocus) -> { if (hasFocus) { binding.inputButton0.setOnClickListener(v -> { int length = binding.delivererPhoneConfirm.getText().length(); if (length >= 11) { Snackbar.make(view1, "手机号不能超过11位", Snackbar.LENGTH_LONG).show(); return; } int start = binding.delivererPhoneConfirm.getSelectionStart(); binding.delivererPhoneConfirm.getText().insert(start, "0"); }); binding.inputButton1.setOnClickListener(v -> { int length = binding.delivererPhoneConfirm.getText().length(); if (length >= 11) { Snackbar.make(view1, "手机号不能超过11位", Snackbar.LENGTH_LONG).show(); return; } int start = binding.delivererPhoneConfirm.getSelectionStart(); binding.delivererPhoneConfirm.getText().insert(start, "1"); }); binding.inputButton2.setOnClickListener(v -> { int length = binding.delivererPhoneConfirm.getText().length(); if (length >= 11) { Snackbar.make(view1, "手机号不能超过11位", Snackbar.LENGTH_LONG).show(); return; } int start = binding.delivererPhoneConfirm.getSelectionStart(); binding.delivererPhoneConfirm.getText().insert(start, "2"); }); binding.inputButton3.setOnClickListener(v -> { int length = binding.delivererPhoneConfirm.getText().length(); if (length >= 11) { Snackbar.make(view1, "手机号不能超过11位", Snackbar.LENGTH_LONG).show(); return; } int start = binding.delivererPhoneConfirm.getSelectionStart(); binding.delivererPhoneConfirm.getText().insert(start, "3"); }); binding.inputButton4.setOnClickListener(v -> { int length = binding.delivererPhoneConfirm.getText().length(); if (length >= 11) { Snackbar.make(view1, "手机号不能超过11位", Snackbar.LENGTH_LONG).show(); return; } int start = binding.delivererPhoneConfirm.getSelectionStart(); binding.delivererPhoneConfirm.getText().insert(start, "4"); }); binding.inputButton5.setOnClickListener(v -> { int length = binding.delivererPhoneConfirm.getText().length(); if (length >= 11) { Snackbar.make(view1, "手机号不能超过11位", Snackbar.LENGTH_LONG).show(); return; } int start = binding.delivererPhoneConfirm.getSelectionStart(); binding.delivererPhoneConfirm.getText().insert(start, "5"); }); binding.inputButton6.setOnClickListener(v -> { int length = binding.delivererPhoneConfirm.getText().length(); if (length >= 11) { Snackbar.make(view1, "手机号不能超过11位", Snackbar.LENGTH_LONG).show(); return; } int start = binding.delivererPhoneConfirm.getSelectionStart(); binding.delivererPhoneConfirm.getText().insert(start, "6"); }); binding.inputButton7.setOnClickListener(v -> { int length = binding.delivererPhoneConfirm.getText().length(); if (length >= 11) { Snackbar.make(view1, "手机号不能超过11位", Snackbar.LENGTH_LONG).show(); return; } int start = binding.delivererPhoneConfirm.getSelectionStart(); binding.delivererPhoneConfirm.getText().insert(start, "7"); }); binding.inputButton8.setOnClickListener(v -> { int length = binding.delivererPhoneConfirm.getText().length(); if (length >= 11) { Snackbar.make(view1, "手机号不能超过11位", Snackbar.LENGTH_LONG).show(); return; } int start = binding.delivererPhoneConfirm.getSelectionStart(); binding.delivererPhoneConfirm.getText().insert(start, "8"); }); binding.inputButton9.setOnClickListener(v -> { int length = binding.delivererPhoneConfirm.getText().length(); if (length >= 11) { Snackbar.make(view1, "手机号不能超过11位", Snackbar.LENGTH_LONG).show(); return; } int start = binding.delivererPhoneConfirm.getSelectionStart(); binding.delivererPhoneConfirm.getText().insert(start, "9"); }); binding.inputButtonCancel.setOnClickListener(v -> { Editable text = binding.delivererPhoneConfirm.getText(); if (text.length() > 0) { text.delete(text.length()-1, text.length()); binding.delivererPhoneConfirm.setText(text, TextView.BufferType.EDITABLE); binding.delivererPhoneConfirm.setSelection(binding.delivererPhoneConfirm.getText().length()); } }); } }); binding.mailNo.setOnFocusChangeListener((view1, hasFocus) -> { if (hasFocus) { binding.inputButton0.setOnClickListener(v -> { int start = binding.mailNo.getSelectionStart(); binding.mailNo.getText().insert(start, "0"); }); binding.inputButton1.setOnClickListener(v -> { int start = binding.mailNo.getSelectionStart(); binding.mailNo.getText().insert(start, "1"); }); binding.inputButton2.setOnClickListener(v -> { int start = binding.mailNo.getSelectionStart(); binding.mailNo.getText().insert(start, "2"); }); binding.inputButton3.setOnClickListener(v -> { int start = binding.mailNo.getSelectionStart(); binding.mailNo.getText().insert(start, "3"); }); binding.inputButton4.setOnClickListener(v -> { int start = binding.mailNo.getSelectionStart(); binding.mailNo.getText().insert(start, "4"); }); binding.inputButton5.setOnClickListener(v -> { int start = binding.mailNo.getSelectionStart(); binding.mailNo.getText().insert(start, "5"); }); binding.inputButton6.setOnClickListener(v -> { int start = binding.mailNo.getSelectionStart(); binding.mailNo.getText().insert(start, "6"); }); binding.inputButton7.setOnClickListener(v -> { int start = binding.mailNo.getSelectionStart(); binding.mailNo.getText().insert(start, "7"); }); binding.inputButton8.setOnClickListener(v -> { int start = binding.mailNo.getSelectionStart(); binding.mailNo.getText().insert(start, "8"); }); binding.inputButton9.setOnClickListener(v -> { int start = binding.mailNo.getSelectionStart(); binding.mailNo.getText().insert(start, "9"); }); binding.inputButtonCancel.setOnClickListener(v -> { Editable text = binding.mailNo.getText(); if (text.length() > 0) { text.delete(text.length()-1, text.length()); binding.mailNo.setText(text, TextView.BufferType.EDITABLE); binding.mailNo.setSelection(binding.mailNo.getText().length()); } }); } }); binding.returnBtn.setOnClickListener(view1 -> { timer.cancel(); NavHostFragment.findNavController(InputInfoFragment.this) .navigate(R.id.action_inputInfoFragment_to_chooseCabinetFragment); }); } public PreparedOrderResponseVo getData() { return data; } @Override public void onDestroy() { timer.cancel(); super.onDestroy(); binding = null; } }