HkPutinMainActivity.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. package com.fxy.hk;
  2. import android.annotation.SuppressLint;
  3. import android.content.BroadcastReceiver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.IntentFilter;
  7. import android.os.Bundle;
  8. import android.os.Handler;
  9. import android.os.Message;
  10. import android.text.Editable;
  11. import android.text.TextWatcher;
  12. import android.view.KeyEvent;
  13. import android.view.View;
  14. import android.view.inputmethod.EditorInfo;
  15. import android.widget.EditText;
  16. import android.widget.ImageButton;
  17. import android.widget.TextView;
  18. import com.elvishew.xlog.XLog;
  19. import com.fxy.R;
  20. import com.fxy.baselibrary.base.BaseActivity;
  21. import com.fxy.baselibrary.bean.BaseEventBusBean;
  22. import com.fxy.baselibrary.interfaces.OnRxScanerListener;
  23. import com.fxy.baselibrary.qrcode.ActivityScanerCode;
  24. import com.fxy.baselibrary.util.JsonUtil;
  25. import com.fxy.baselibrary.util.StringUtils;
  26. import com.fxy.baselibrary.views.MarqueeTextView;
  27. import com.fxy.bean.ActionBean;
  28. import com.fxy.bean.ScanBean;
  29. import com.fxy.bean.UploadResultBean;
  30. import com.fxy.common.FiledUpload;
  31. import com.fxy.constant.BaseConfig;
  32. import com.fxy.constant.EventCode;
  33. import com.fxy.helper.HkDataHelper;
  34. import com.fxy.net.MyDialogCallback;
  35. import com.fxy.net.Urls;
  36. import com.fxy.realm.CutRuleRealm;
  37. import com.fxy.realm.HkTransDetailRealm;
  38. import com.fxy.realm.HkTransRealm;
  39. import com.fxy.view.FloatingImageView;
  40. import com.google.gson.Gson;
  41. import com.google.zxing.Result;
  42. import com.jaredrummler.materialspinner.MaterialSpinner;
  43. import com.luck.picture.lib.PictureSelector;
  44. import com.luck.picture.lib.config.PictureConfig;
  45. import com.luck.picture.lib.config.PictureMimeType;
  46. import com.luck.picture.lib.entity.LocalMedia;
  47. import com.lzy.okgo.OkGo;
  48. import com.lzy.okgo.model.Response;
  49. import org.json.JSONException;
  50. import org.json.JSONObject;
  51. import java.util.ArrayList;
  52. import java.util.List;
  53. import butterknife.BindView;
  54. import butterknife.ButterKnife;
  55. import butterknife.OnClick;
  56. import butterknife.Unbinder;
  57. import io.realm.RealmResults;
  58. import sto.android.app.StoJNI;
  59. import sto.android.app.StoPdaKeyEvent;
  60. import sto.android.app.StoTongJNI;
  61. public class HkPutinMainActivity extends BaseActivity implements StoJNI.ScanCallBack{
  62. /**
  63. * 列表适配器
  64. */
  65. Context mContext = this;
  66. //单号清除
  67. @BindView(R.id.ib_order_no_clear)
  68. ImageButton ibOrderNoClear;
  69. //单号
  70. @BindView(R.id.et_order_no)
  71. EditText etOrderNo;
  72. @BindView(R.id.ms_batch_list)
  73. MaterialSpinner batchListSpinner;
  74. @BindView(R.id.mt_order_code)
  75. MarqueeTextView mtOrderCode;
  76. @BindView(R.id.tv_sort)
  77. TextView tvSort;
  78. private String batchNumber = "";
  79. private FiledUpload filedUpload;
  80. //
  81. //扫码扫码动作
  82. private ScanBean scanBean;
  83. private List<CutRuleRealm> cutRuleRealmList;
  84. //浮动按钮
  85. @BindView(R.id.iv_drag)
  86. FloatingImageView iv_drag;
  87. private List<String> spinnerBatchList = new ArrayList<String>();
  88. protected String action;
  89. private Unbinder unbinder;
  90. @Override
  91. public int getContentViewResId() {
  92. return R.layout.activity_fxy_hk_putin;
  93. }
  94. @Override
  95. public boolean showToolBar() {
  96. return true;
  97. }
  98. @Override
  99. public boolean openEventBus() {
  100. return true;
  101. }
  102. @Override
  103. protected void getBundleExtras(Bundle bundle) {
  104. }
  105. //finish的返回监听
  106. //这里的requestCode参数,就是上面设置的 1 ,当跳转的页面返回的时候,通过这个加以判断
  107. //resultCode ,这个参数是在跳转的页面里面规定的,它也是一个int类型的标志
  108. //第三个参数包含了返回的值
  109. //如果不需要所跳转的页面返回值,也就不需要这个方法了
  110. @Override
  111. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  112. super.onActivityResult(requestCode, resultCode, data);
  113. // 图片选择结果回调
  114. if (resultCode == RESULT_OK && requestCode == PictureConfig.CHOOSE_REQUEST) {
  115. List<LocalMedia> images = PictureSelector.obtainMultipleResult(data);
  116. LocalMedia localMedia = images.get(0);
  117. String localPath = localMedia.isCompressed() ? localMedia.getCompressPath():localMedia.getPath();
  118. filedUpload.filedUpload(localPath);
  119. filedUpload.setOnChangeListener(new FiledUpload.UploadChangeListener() {
  120. @Override
  121. public void uploadResult(UploadResultBean uploadResultBean) {
  122. if (uploadResultBean.getStatus()==1){
  123. ArrayList<String> photoList = new ArrayList<String>();
  124. photoList.add(uploadResultBean.getPath());
  125. pictureInbound(photoList);
  126. }else{
  127. showErrorToast("上传图片失败");
  128. XLog.e("上传结果失败"+uploadResultBean.getError());
  129. }
  130. }
  131. });
  132. }
  133. }
  134. /**
  135. * EventBus接收信息的方法,开启后才会调用(非粘性事件)
  136. *
  137. * @param event
  138. */
  139. @Override
  140. protected void EventBean(BaseEventBusBean event) {
  141. // XLog.e("----------接收返回--------------");
  142. // XLog.e("接收返回:"+event.getEventCode());
  143. if (event != null && event.getEventCode() == EventCode.displacement_refresh){
  144. }
  145. }
  146. @Override
  147. public boolean isPlayMusic() {
  148. return true;
  149. }
  150. @Override
  151. protected void initView() {
  152. unbinder = ButterKnife.bind(this);
  153. setTitleName("托盘入库");
  154. //拉取数据
  155. (new HkDataHelper(HkPutinMainActivity.this)).getBaseInfo();
  156. initEdit();
  157. iniData();
  158. initSpinner();
  159. filedUpload = new FiledUpload(HkPutinMainActivity.this,"photo");
  160. //监听浮动按钮
  161. iv_drag.setOnClickListener(new View.OnClickListener() {
  162. @Override
  163. public void onClick(View v) {
  164. if(!iv_drag.isDrag()){
  165. ActivityScanerCode.setScanerListener(mScanerListener);
  166. ActivityScanerCode.intent2Activity(mContext, BaseConfig.COMMON_SCANNER_ONLY);
  167. }
  168. }
  169. });
  170. }
  171. private void iniData(){
  172. RealmResults<HkTransRealm> realmResultsAll = mRealm.where(HkTransRealm.class).findAll();
  173. realmResultsAll.load();
  174. spinnerBatchList = new ArrayList<String>();
  175. if (realmResultsAll.size()>0){
  176. for (int i=0;i<realmResultsAll.size();i++){
  177. spinnerBatchList.add(realmResultsAll.get(i).getBatch());
  178. }
  179. }
  180. if (spinnerBatchList.size()>0){
  181. batchNumber = spinnerBatchList.get(0);
  182. }
  183. batchListSpinner.setItems(spinnerBatchList);
  184. batchListSpinner.setSelected(false);
  185. cutRuleRealmList = mRealm.where(CutRuleRealm.class).findAll();
  186. initSpinner();
  187. }
  188. /**
  189. * 初始化下拉框控件值
  190. */
  191. private void initSpinner() {
  192. batchListSpinner.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener<String>() {
  193. @Override public void onItemSelected(MaterialSpinner view, int position, long id, String item) {
  194. batchNumber = item;
  195. etOrderNo.setEnabled(true);
  196. }
  197. });
  198. }
  199. //拍照上传
  200. private void pictureInbound(ArrayList<String> photoList){
  201. try {
  202. JSONObject jsonObject = new JSONObject();
  203. Gson gson = new Gson();
  204. jsonObject.put("photo",gson.toJson(photoList));
  205. OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_GK_INBOUND_PICTURE).upJson(jsonObject)
  206. .execute(new MyDialogCallback(this, true, false) {
  207. @Override
  208. public void onSuccess(Response<String> response) {
  209. super.onSuccess(response);
  210. try {
  211. ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
  212. if(bean.code == 1){
  213. showSuccessToast("上传成功");
  214. }else{
  215. showErrorToast("上传失败");
  216. }
  217. } catch (Exception e) {
  218. e.printStackTrace();
  219. XLog.e("香港图片结果返回错误",e.getMessage());
  220. }
  221. }
  222. });
  223. } catch (Exception e) {
  224. e.printStackTrace();
  225. }
  226. }
  227. @Override
  228. public boolean dispatchKeyEvent(KeyEvent event) {
  229. //XLog.e("event:"+event.getKeyCode());
  230. if ((event.getKeyCode()==KeyEvent.KEYCODE_DPAD_CENTER || event.getKeyCode()==KeyEvent.KEYCODE_ENTER ) && event.getAction() == KeyEvent.ACTION_DOWN){
  231. //按确定键
  232. }
  233. return super.dispatchKeyEvent(event);
  234. }
  235. //监听按键
  236. public boolean onKeyDown(int keyCode, KeyEvent event) {
  237. XLog.e("监听按键:"+keyCode);XLog.e(event);
  238. if (scanBean.getIsBroadcast()==0 && StoTongJNI.getIns(mContext).getEventFuction(keyCode) == StoPdaKeyEvent.KEYCODE_SCAN
  239. && event.getRepeatCount() == 0) {
  240. if (StoTongJNI.getIns(mContext).GetScannerIsScanning()) {
  241. //
  242. } else {
  243. StoTongJNI.getIns(mContext).SetScannerStart();
  244. }
  245. }
  246. return super.onKeyDown(keyCode, event);
  247. }
  248. @SuppressLint("HandlerLeak")
  249. Handler scanHandler = new Handler() {
  250. @Override
  251. public void handleMessage(Message msg) {
  252. // TODO Auto-generated method stub
  253. if (msg.obj != null) {
  254. String scanResult = msg.obj.toString().trim();
  255. if (!scanResult.isEmpty()){
  256. setScanResult(scanResult);
  257. }
  258. }
  259. }
  260. };
  261. @Override
  262. public void onScanResults(String str) {
  263. Message msg = new Message();
  264. msg.obj = str;
  265. scanHandler.sendMessage(msg);
  266. }
  267. @Override
  268. public void onScanResults(String str, int type) {
  269. }
  270. /**
  271. * 定义广播接受
  272. */
  273. BroadcastReceiver mReceiver = new BroadcastReceiver() {
  274. @Override
  275. public void onReceive(Context context, Intent intent) {
  276. String scanResult = intent.getStringExtra(scanBean.getDataName());
  277. if (scanResult==null){return; }
  278. String scanStatus = "";
  279. if (!scanBean.getStatusName().isEmpty()){
  280. scanStatus = intent.getStringExtra(scanBean.getStatusName());
  281. }else{
  282. scanStatus = scanResult.isEmpty()? "" : "ok"; //有值 默认是扫码成功;
  283. }
  284. //新大陆(MT65,MT90) 需要手动关闭
  285. if (!scanBean.getActionStop().isEmpty()){
  286. Intent stopIntent = new Intent(scanBean.getActionStop());
  287. mContext.sendBroadcast(stopIntent);
  288. }
  289. if ("ok".equals(scanStatus)){
  290. setScanResult(scanResult);
  291. }else{
  292. showErrorToast(getString(R.string.scan_failed));
  293. }
  294. }
  295. };
  296. /**
  297. * 注册广播
  298. */
  299. private void initReceiver(){
  300. try {
  301. String scanStr = getScanSetting();
  302. scanBean = JsonUtil.getObject(scanStr, ScanBean.class);
  303. Integer is_broadcast = scanBean.getIsBroadcast();//是否广播
  304. if (is_broadcast ==1){
  305. IntentFilter mFilter = new IntentFilter(scanBean.getAction());
  306. this.registerReceiver(mReceiver, mFilter);
  307. }else{
  308. //不广播进行处理 jni模式
  309. String pdaBrand = StoTongJNI.getmPdaBrand();
  310. if (!pdaBrand.isEmpty()){
  311. StoTongJNI.getIns(this).setmScanCB(this);
  312. StoTongJNI.getIns(this).SetScannerOn();
  313. }
  314. }
  315. }catch (Exception e) {
  316. showErrorToast("获取扫码配置失败"+e.getMessage());
  317. XLog.e("获取扫码配置失败:" + e.getMessage());
  318. }
  319. }
  320. private void initEdit() {
  321. //
  322. etOrderNo.setOnEditorActionListener(new TextView.OnEditorActionListener() {
  323. @Override
  324. public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
  325. if (actionId == EditorInfo.IME_ACTION_DONE) {
  326. String orderNo = etOrderNo.getText().toString().trim();
  327. if (StringUtils.isEmpty(orderNo)) {
  328. setEditTextFocused(v,true);
  329. showWarningToast(v.getHint().toString());
  330. return false;
  331. }
  332. inboundPutin();
  333. return false;
  334. }
  335. return false;
  336. }
  337. });
  338. etOrderNo.addTextChangedListener(new TextWatcher() {
  339. public void onTextChanged(CharSequence s, int start, int before, int count) {
  340. if (s.length() > 0 ) {
  341. if (etOrderNo.isEnabled()){
  342. ibOrderNoClear.setVisibility(View.VISIBLE);
  343. }
  344. setEditTextNormal(etOrderNo,true);
  345. } else {
  346. ibOrderNoClear.setVisibility(View.INVISIBLE);
  347. setEditTextFocused(etOrderNo,true);
  348. }
  349. }
  350. public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  351. }
  352. public void afterTextChanged(Editable s) {
  353. }
  354. });
  355. ibOrderNoClear.setOnClickListener(new View.OnClickListener() {
  356. @Override
  357. public void onClick(View view) {
  358. etOrderNo.requestFocus();
  359. etOrderNo.getText().clear();
  360. }
  361. });
  362. }
  363. private OnRxScanerListener mScanerListener = new OnRxScanerListener() {
  364. @Override
  365. public void onSuccess(String type, Result result) {
  366. String scanResult = result.getText();
  367. switch (type){
  368. case BaseConfig.COMMON_SCANNER_ONLY:
  369. setScanResult(scanResult);
  370. break;
  371. }
  372. }
  373. @Override
  374. public void onFail(String type, String message) {
  375. }
  376. };
  377. //把扫描结果赋值
  378. private void setScanResult(String scanResult){
  379. //获取焦点的view对象
  380. View view=getWindow().getDecorView().findFocus();
  381. //如果是EditText
  382. if(view instanceof EditText)
  383. {
  384. ((EditText) view).setText(scanResult);
  385. switch (view.getId()) {
  386. case R.id.et_order_no:
  387. inboundPutin();
  388. break;
  389. default:
  390. }
  391. }
  392. }
  393. public String strByCutRule(String str,List<CutRuleRealm> cutRuleRealmList){
  394. str = str.replaceAll("\u001D", "");
  395. str = str.trim();
  396. if (cutRuleRealmList.size()==0){
  397. return str;
  398. }
  399. int len = str.length();
  400. for (int i=0;i<cutRuleRealmList.size();i++){
  401. CutRuleRealm cutRuleRealm = cutRuleRealmList.get(i);
  402. if (len!=cutRuleRealm.getNumberLength()){
  403. continue;
  404. }
  405. String number_start = cutRuleRealm.getNumberStart();
  406. int cut_type = cutRuleRealm.getCutType();
  407. int number_length = cutRuleRealm.getNumberLength();
  408. int start_index = cutRuleRealm.getStartIndex()-1;
  409. int cut_length = cutRuleRealm.getCutLength();
  410. if (len!=number_length){
  411. continue;
  412. }
  413. if (!number_start.equals("%") && !str.startsWith(number_start)){
  414. continue;
  415. }
  416. if (cut_type==1){
  417. str = str.substring(start_index,cut_length+start_index);
  418. }
  419. //从后往前截取待完善
  420. }
  421. return str;
  422. }
  423. /**
  424. * 查询订单
  425. * @param trackingNumber
  426. * @return
  427. */
  428. private HkTransDetailRealm getDetailRealm(String trackingNumber){
  429. HkTransDetailRealm detailRealm = mRealm.where(HkTransDetailRealm.class)
  430. .equalTo("tracking_number",trackingNumber)
  431. .equalTo("batch_number",batchNumber)
  432. .findFirst();
  433. if (detailRealm==null){
  434. trackingNumber = strByCutRule(trackingNumber,cutRuleRealmList);
  435. detailRealm = mRealm.where(HkTransDetailRealm.class)
  436. .equalTo("tracking_number",trackingNumber)
  437. .equalTo("batch_number",batchNumber)
  438. .findFirst();
  439. }
  440. return detailRealm;
  441. }
  442. private void inboundPutin(){
  443. if (!validate()){
  444. return;
  445. }
  446. String trackingNumber = etOrderNo.getText().toString().trim();
  447. HkTransDetailRealm detailRealm = getDetailRealm(trackingNumber);
  448. if (detailRealm==null){
  449. authCamera();
  450. mtOrderCode.setText("");
  451. tvSort.setText("");
  452. etOrderNo.setText("");
  453. return;
  454. }
  455. showSuccessToast("Success","hk"+detailRealm.getSort());
  456. mtOrderCode.setText(detailRealm.getTrackingNumber());
  457. tvSort.setText(detailRealm.getSort());
  458. etOrderNo.setText("");
  459. try {
  460. JSONObject postParam = new JSONObject();
  461. postParam.put("transport_order_number",batchNumber);
  462. postParam.put("tracking_number",detailRealm.getTrackingNumber());
  463. postParam.put("realm_id",detailRealm.getId());
  464. OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_GK_INBOUND_PUTIN).upJson(postParam)
  465. .execute(new MyDialogCallback(this, true, true) {
  466. @Override
  467. public void onSuccess(Response<String> response) {
  468. super.onSuccess(response);
  469. try {
  470. ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
  471. if(bean.code == 1){
  472. JSONObject data = new JSONObject(bean.data);
  473. if (data.has("realm_id")){
  474. setIsFinish(data.getString("realm_id"),1);
  475. }
  476. }else{
  477. // showWarningToast(bean.msg);
  478. }
  479. } catch (Exception e) {
  480. e.printStackTrace();
  481. XLog.e("添加理货数据结果返回错误",e.getMessage());
  482. }
  483. }
  484. });
  485. } catch (JSONException e) {
  486. e.printStackTrace();
  487. }
  488. }
  489. private void setIsFinish(String realmId,int isFinish){
  490. //更新值
  491. mRealm.beginTransaction();
  492. HkTransDetailRealm myObject = mRealm.where(HkTransDetailRealm.class).equalTo("id",realmId).findFirst();
  493. myObject.setPushStatus(isFinish);
  494. mRealm.commitTransaction();
  495. }
  496. /*
  497. * 校验必录
  498. */
  499. private boolean validate(){
  500. if (batchNumber.isEmpty()){
  501. showErrorToast(batchListSpinner.getHint().toString());
  502. setEditTextFocused(batchListSpinner,true);
  503. return false;
  504. }
  505. setEditTextNormal(batchListSpinner,true);
  506. //数据检查不通过
  507. String orderNo = etOrderNo.getText().toString().trim();
  508. if (orderNo.isEmpty()){
  509. showWarningToast(etOrderNo.getHint().toString());
  510. return false;
  511. }
  512. return true;
  513. }
  514. private void authCamera(){
  515. //拍照
  516. com.luck.picture.lib.PictureSelector.create(this)
  517. .openCamera(PictureMimeType.ofImage())
  518. //只需要拍照
  519. //.selectionMode(PictureConfig.SINGLE)
  520. // .isCamera(true)
  521. //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
  522. .compress(true) // 压缩
  523. .cropCompressQuality(100)// 裁剪压缩质量 默认100
  524. .minimumCompressSize(100) //最新压缩图片 默认100
  525. .forResult(PictureConfig.CHOOSE_REQUEST);
  526. }
  527. //
  528. @OnClick({R.id.btn_photos})
  529. public void onViewClicked(View view) {
  530. Bundle bundle = new Bundle();
  531. switch (view.getId()) {
  532. case R.id.btn_photos:
  533. authCamera();
  534. break;
  535. default:
  536. break;
  537. }
  538. }
  539. @Override
  540. protected void onDestroy() {
  541. unbinder.unbind();
  542. super.onDestroy();
  543. }
  544. @Override
  545. protected void onResume() {
  546. super.onResume();
  547. initReceiver();
  548. }
  549. @Override
  550. protected void onPause() {
  551. super.onPause();
  552. //销毁在onResume()方法中的广播
  553. try {
  554. //停止扫描
  555. Integer is_broadcast = scanBean.getIsBroadcast();//是否广播
  556. if (is_broadcast==0){
  557. StoTongJNI.getIns(mContext).SetScannerStop();
  558. StoTongJNI.getIns(mContext).SetScannerOff();
  559. }else{
  560. unregisterReceiver(mReceiver);
  561. }
  562. }catch (Exception e){
  563. XLog.e("销毁广播失败:",e.getMessage());
  564. }
  565. }
  566. }