InputInfoFragment.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. package com.emato.ich.fragment;
  2. import android.os.Bundle;
  3. import android.text.Editable;
  4. import android.util.Log;
  5. import android.view.KeyEvent;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.TextView;
  10. import androidx.annotation.NonNull;
  11. import androidx.annotation.Nullable;
  12. import androidx.fragment.app.Fragment;
  13. import androidx.fragment.app.FragmentActivity;
  14. import androidx.navigation.fragment.NavHostFragment;
  15. import com.cherry.sdk.controller.callback.OnScanListen;
  16. import com.cherry.sdk.controller.utils.ScanGunKeyEventHelper;
  17. import com.emato.ich.MainActivity;
  18. import com.emato.ich.R;
  19. import com.emato.ich.api.ICSPClient;
  20. import com.emato.ich.api.ICSPResponseCodeEnum;
  21. import com.emato.ich.databinding.FragmentInputInfoBinding;
  22. import com.emato.ich.entity.vo.ResponseData;
  23. import com.emato.ich.entity.vo.PreparedOrderResponseVo;
  24. import com.emato.ich.entity.vo.PreparedOrderVo;
  25. import com.emato.ich.local.LocalStorage;
  26. import com.emato.ich.utils.BaseUtils;
  27. import com.emato.ich.utils.StringUtils;
  28. import com.fasterxml.jackson.core.JsonProcessingException;
  29. import com.fasterxml.jackson.core.type.TypeReference;
  30. import com.fasterxml.jackson.databind.ObjectMapper;
  31. import com.google.android.material.snackbar.Snackbar;
  32. import org.jetbrains.annotations.NotNull;
  33. import java.io.IOException;
  34. import java.util.concurrent.CountDownLatch;
  35. import java.util.concurrent.atomic.AtomicBoolean;
  36. import java.util.regex.Pattern;
  37. import okhttp3.Call;
  38. import okhttp3.Callback;
  39. import okhttp3.Response;
  40. /**
  41. * 输入投递信息
  42. */
  43. public class InputInfoFragment extends Fragment {
  44. private static final String TAG = "InputInfoFragment";
  45. private FragmentInputInfoBinding binding;
  46. private PreparedOrderResponseVo data;
  47. @Nullable
  48. @org.jetbrains.annotations.Nullable
  49. @Override
  50. public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
  51. binding = FragmentInputInfoBinding.inflate(inflater, container, false);
  52. return binding.getRoot();
  53. }
  54. public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
  55. BaseUtils.disableEditText(binding.delivererPhone);
  56. BaseUtils.disableEditText(binding.delivererPhoneConfirm);
  57. BaseUtils.disableEditText(binding.mailNo);
  58. Bundle arguments = null;
  59. String sectionType = null;
  60. try {
  61. MainActivity activity = (MainActivity) getActivity();
  62. arguments = activity.getBundleMap().get(ChooseCabinetFragment.class.getName());
  63. sectionType = arguments.getString("section_type");
  64. // 扫描枪监听 扫描运单号
  65. activity.scanGunKeyEventHelper = new ScanGunKeyEventHelper(s -> {
  66. // 扫码成功回调
  67. Log.d(TAG, "onScanSuccess: " + s);
  68. binding.mailNo.setText(s);
  69. // TODO 预定义,实际参数可能不一致 oms获取用户手机号 自动填充
  70. /*ICSPClient.getUserPhoneNumber(LocalStorage.getInstance().getSession().getToken(), BaseUtils.getClientId(), s, new Callback() {
  71. @Override
  72. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  73. // 请求失败
  74. Snackbar.make(view, "服务器异常! 请手动输入! ", Snackbar.LENGTH_LONG).show();
  75. }
  76. @Override
  77. public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  78. getActivity().runOnUiThread(() -> {
  79. String parseResponse = ICSPClient.isSuccessfulAndParseResponse(response);
  80. try {
  81. ResponseData<PreparedOrderResponseVo> responseData = new ObjectMapper().readValue(parseResponse, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {
  82. });
  83. PreparedOrderResponseVo data = responseData.getData();
  84. if (null != responseData && ICSPResponseCodeEnum.OK.getCode().equals(responseData.getCode())) {
  85. String collectorPhone = data.getCollectorPhone();
  86. binding.delivererPhone.setText(collectorPhone);
  87. }
  88. ICSPResponseCodeEnum.responseHint(view, responseData);
  89. } catch (JsonProcessingException e) {
  90. Log.e(TAG, "onResponse: 服务器响应错误! 自动获取用户手机号失败! ", e);
  91. } catch (RuntimeException e) {
  92. Log.e(TAG, "onResponse: 获取用户手机号未知错误! ", e);
  93. }
  94. });
  95. }
  96. });*/
  97. });
  98. } catch (RuntimeException e) {
  99. Log.e(TAG, "onViewCreated: InputInfoFragment页面获取ChooseCabinetFragment传值错误! ", e);
  100. }
  101. // TODO 根据运单号调用ICSP查询oms接口, 查询取件人手机号, 暂时不做
  102. // TODO 离线逻辑, 暂时不做
  103. 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}$");
  104. // 下单逻辑
  105. String finalSectionType = sectionType;
  106. binding.buttonConfirm.setOnClickListener(view1 -> {
  107. Bundle bundle = new Bundle();
  108. String mailNo = binding.mailNo.getText().toString();
  109. String phone = binding.delivererPhone.getText().toString();
  110. String phoneConfirm = binding.delivererPhoneConfirm.getText().toString();
  111. if (!phonePattern.matcher(phone).matches() || !phonePattern.matcher(phoneConfirm).matches()) {
  112. Snackbar.make(view1, "请输入正确的手机号!", Snackbar.LENGTH_LONG).show();
  113. } else if (!phone.equals(phoneConfirm)) {
  114. Snackbar.make(view1, "两次输入的手机号不相同!", Snackbar.LENGTH_LONG).show();
  115. } else if (StringUtils.isNullOrEmpty(mailNo)) {
  116. Snackbar.make(view1, "运单号不能为空!请扫描运单号!", Snackbar.LENGTH_LONG).show();
  117. } else {
  118. // 验证完 预下单
  119. PreparedOrderVo preparedOrderVo = new PreparedOrderVo();
  120. preparedOrderVo.setClientId(BaseUtils.getClientId());
  121. preparedOrderVo.setMailNo(mailNo);
  122. preparedOrderVo.setCollectorPhone(phone);
  123. preparedOrderVo.setLockerType(finalSectionType);
  124. preparedOrderVo.setDelivererPhone(LocalStorage.getInstance().getSession().getPhone());
  125. // 预下单
  126. ICSPClient.preparedOrder(LocalStorage.getInstance().getSession().getToken(), preparedOrderVo, new Callback() {
  127. @Override
  128. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  129. // TODO 预下单调用失败
  130. Snackbar.make(view, "请求服务器失败!网络异常!", Snackbar.LENGTH_LONG).show();
  131. Log.e(TAG, "onFailure: 预下单失败! call: " + call.timeout().toString(), e);
  132. }
  133. @Override
  134. public void onResponse(@NotNull Call call, @NotNull Response response) {
  135. ((MainActivity) getActivity()).runOnUiThread(() -> {
  136. try {
  137. String responseStr = ICSPClient.isSuccessfulAndParseResponse(response);
  138. ObjectMapper objectMapper = new ObjectMapper();
  139. ResponseData<PreparedOrderResponseVo> responseData = objectMapper.readValue(responseStr, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {});
  140. data = responseData.getData();
  141. // 响应信息
  142. if (responseData.getCode().equals(ICSPResponseCodeEnum.OK.getCode())) {
  143. bundle.putString("preparedOrderResponse", objectMapper.writeValueAsString(data));
  144. bundle.putString("takeNo", mailNo);
  145. bundle.putString("sectionType", finalSectionType);
  146. // 跳转到确认投递
  147. try {
  148. MainActivity activity = (MainActivity) getActivity();
  149. activity.getBundleMap().put(InputInfoFragment.class.getName(), bundle);
  150. } catch (RuntimeException e) {
  151. Log.e(TAG, "onResponse: InputInfoFragment页面获取SendInfoConfirmFragment传值错误! ", e);
  152. }
  153. NavHostFragment.findNavController(InputInfoFragment.this).navigate(R.id.action_inputInfoFragment_to_sendInfoConfirmFragment);
  154. } else {
  155. ICSPResponseCodeEnum.responseHint(view, responseData);
  156. Log.e(TAG, "onResponse: ICSP返回码: " + responseData.getCode() + ", 返回信息: " + responseData.getMsg(), new RuntimeException("系统异常"));
  157. }
  158. } catch (JsonProcessingException e) {
  159. Log.e(TAG, "onResponse: 预下单转换成JSON出错! ", e);
  160. } catch (RuntimeException e) {
  161. Log.e(TAG, "onResponse: 预下单失败! ", e);
  162. }
  163. });
  164. }
  165. });
  166. }
  167. });
  168. // 数字输入 5 手机号 4 密码
  169. binding.delivererPhone.setOnFocusChangeListener((view1, hasFocus) -> {
  170. if (hasFocus) {
  171. binding.inputButton0.setOnClickListener(v -> {
  172. int start = binding.delivererPhone.getSelectionStart();
  173. binding.delivererPhone.getText().insert(start, "0");
  174. });
  175. binding.inputButton1.setOnClickListener(v -> {
  176. int start = binding.delivererPhone.getSelectionStart();
  177. binding.delivererPhone.getText().insert(start, "1");
  178. });
  179. binding.inputButton2.setOnClickListener(v -> {
  180. int start = binding.delivererPhone.getSelectionStart();
  181. binding.delivererPhone.getText().insert(start, "2");
  182. });
  183. binding.inputButton3.setOnClickListener(v -> {
  184. int start = binding.delivererPhone.getSelectionStart();
  185. binding.delivererPhone.getText().insert(start, "3");
  186. });
  187. binding.inputButton4.setOnClickListener(v -> {
  188. int start = binding.delivererPhone.getSelectionStart();
  189. binding.delivererPhone.getText().insert(start, "4");
  190. });
  191. binding.inputButton5.setOnClickListener(v -> {
  192. int start = binding.delivererPhone.getSelectionStart();
  193. binding.delivererPhone.getText().insert(start, "5");
  194. });
  195. binding.inputButton6.setOnClickListener(v -> {
  196. int start = binding.delivererPhone.getSelectionStart();
  197. binding.delivererPhone.getText().insert(start, "6");
  198. });
  199. binding.inputButton7.setOnClickListener(v -> {
  200. int start = binding.delivererPhone.getSelectionStart();
  201. binding.delivererPhone.getText().insert(start, "7");
  202. });
  203. binding.inputButton8.setOnClickListener(v -> {
  204. int start = binding.delivererPhone.getSelectionStart();
  205. binding.delivererPhone.getText().insert(start, "8");
  206. });
  207. binding.inputButton9.setOnClickListener(v -> {
  208. int start = binding.delivererPhone.getSelectionStart();
  209. binding.delivererPhone.getText().insert(start, "9");
  210. });
  211. binding.inputButtonCancel.setOnClickListener(v -> {
  212. Editable text = binding.delivererPhone.getText();
  213. if (text.length() > 0) {
  214. text.delete(text.length()-1, text.length());
  215. binding.delivererPhone.setText(text, TextView.BufferType.EDITABLE);
  216. binding.delivererPhone.setSelection(binding.delivererPhone.getText().length());
  217. }
  218. });
  219. }
  220. });
  221. binding.delivererPhoneConfirm.setOnFocusChangeListener((view1, hasFocus) -> {
  222. if (hasFocus) {
  223. binding.inputButton0.setOnClickListener(v -> {
  224. int start = binding.delivererPhoneConfirm.getSelectionStart();
  225. binding.delivererPhoneConfirm.getText().insert(start, "0");
  226. });
  227. binding.inputButton1.setOnClickListener(v -> {
  228. int start = binding.delivererPhoneConfirm.getSelectionStart();
  229. binding.delivererPhoneConfirm.getText().insert(start, "1");
  230. });
  231. binding.inputButton2.setOnClickListener(v -> {
  232. int start = binding.delivererPhoneConfirm.getSelectionStart();
  233. binding.delivererPhoneConfirm.getText().insert(start, "2");
  234. });
  235. binding.inputButton3.setOnClickListener(v -> {
  236. int start = binding.delivererPhoneConfirm.getSelectionStart();
  237. binding.delivererPhoneConfirm.getText().insert(start, "3");
  238. });
  239. binding.inputButton4.setOnClickListener(v -> {
  240. int start = binding.delivererPhoneConfirm.getSelectionStart();
  241. binding.delivererPhoneConfirm.getText().insert(start, "4");
  242. });
  243. binding.inputButton5.setOnClickListener(v -> {
  244. int start = binding.delivererPhoneConfirm.getSelectionStart();
  245. binding.delivererPhoneConfirm.getText().insert(start, "5");
  246. });
  247. binding.inputButton6.setOnClickListener(v -> {
  248. int start = binding.delivererPhoneConfirm.getSelectionStart();
  249. binding.delivererPhoneConfirm.getText().insert(start, "6");
  250. });
  251. binding.inputButton7.setOnClickListener(v -> {
  252. int start = binding.delivererPhoneConfirm.getSelectionStart();
  253. binding.delivererPhoneConfirm.getText().insert(start, "7");
  254. });
  255. binding.inputButton8.setOnClickListener(v -> {
  256. int start = binding.delivererPhoneConfirm.getSelectionStart();
  257. binding.delivererPhoneConfirm.getText().insert(start, "8");
  258. });
  259. binding.inputButton9.setOnClickListener(v -> {
  260. int start = binding.delivererPhoneConfirm.getSelectionStart();
  261. binding.delivererPhoneConfirm.getText().insert(start, "9");
  262. });
  263. binding.inputButtonCancel.setOnClickListener(v -> {
  264. Editable text = binding.delivererPhoneConfirm.getText();
  265. if (text.length() > 0) {
  266. text.delete(text.length()-1, text.length());
  267. binding.delivererPhoneConfirm.setText(text, TextView.BufferType.EDITABLE);
  268. binding.delivererPhoneConfirm.setSelection(binding.delivererPhoneConfirm.getText().length());
  269. }
  270. });
  271. }
  272. });
  273. binding.returnBtn.setOnClickListener(view1 -> NavHostFragment.findNavController(InputInfoFragment.this)
  274. .navigate(R.id.action_inputInfoFragment_to_chooseCabinetFragment));
  275. }
  276. public PreparedOrderResponseVo getData() {
  277. return data;
  278. }
  279. @Override
  280. public void onDestroy() {
  281. super.onDestroy();
  282. binding = null;
  283. }
  284. }