You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SZXBGJ/app/src/main/java/com/example/tyre/OutStoreHouseActivity.java

376 lines
14 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.example.tyre;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.databinding.ObservableBoolean;
import com.android.hdhe.uhf.reader.UhfReader;
import com.android.hdhe.uhf.readerInterface.TagModel;
import com.example.tyre.databinding.ActivityOutStoreHouseBinding;
import com.example.tyre.entity.AjaxResult;
import com.example.tyre.entity.BaseTyre;
import com.example.tyre.entity.EPC;
import com.example.tyre.util.CommonDialog;
import com.example.tyre.util.MyUrl;
import com.example.tyre.util.SharedPreferencesUtils;
import com.example.tyre.util.Util;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;
import java.util.ArrayList;
import java.util.List;
import cn.pda.serialport.Tools;
public class OutStoreHouseActivity extends AppCompatActivity {
TextView scan;
TextView pinpai;
TextView xinghao;
TextView cengji;
TextView huawen;
TextView wtbm;
TextView ltlb;
long lastTime;
long nextTime;
private ActivityOutStoreHouseBinding binding;
private ProgressDialog progressDialog;
private boolean runFlag = true;
private boolean startFlag = false;
private UhfReader manager; // UHF manager,UHF Operating handle
private ArrayList<EPC> listEPC;
private ArrayList<String> listepc = new ArrayList<String>();
private KeyReceiver keyReceiver;
private ObservableBoolean aType;
private static final int STATE_IDLE = 0; // 空闲状态,可扫描
private static final int STATE_LOCKED = 1; // 锁定状态,禁止下拉
private int currentSpinnerState = STATE_IDLE;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityOutStoreHouseBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
bindViews();
setupClickListeners();
manager = MyApplication.getManager();
listEPC = new ArrayList<EPC>();
Thread thread = new InventoryThread();
thread.start();
Util.initSoundPool(this);
Intent intent = getIntent();
String title = intent.getStringExtra("title");
binding.outTitle.setText(title);
aType = new ObservableBoolean();
aType.set(title.equals("轮胎出库"));
binding.setAType(aType);
}
private void bindViews() {
scan = binding.epc;
pinpai = binding.pinpai;
xinghao = binding.xinghao;
cengji = binding.cengji;
huawen = binding.huawen;
wtbm = binding.wtbm;
ltlb = binding.ltlb;
}
private void setupClickListeners() {
binding.button.setOnClickListener(v -> {
showLoadingDialog();
out_inventory(scan.getText().toString(), SharedPreferencesUtils.getstring("user", "admin"));
});
binding.back.setOnClickListener(v -> {
finish();
});
}
@Override
public void onResume() {
super.onResume();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
registerReceiver();
}
@Override
public void onPause() {
startFlag = false;
super.onPause();
unregisterReceiver();
}
@Override
protected void onDestroy() {
startFlag = false;
runFlag = false;
super.onDestroy();
}
private void showLoadingDialog() {
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("数据加载中...");
progressDialog.setCancelable(false);
progressDialog.show();
}
private void hideLoadingDialog() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
private void addToList(final List<EPC> list, final String epc, final byte rssi) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// The epc for the first time
if (list.isEmpty()) {
EPC epcTag = new EPC();
epcTag.setEpc(epc);
epcTag.setCount(1);
epcTag.setRssi(rssi);
list.add(epcTag);
listepc.add(epc);
} else {
for (int i = 0; i < list.size(); i++) {
EPC mEPC = list.get(i);
// list contain this epc
if (epc.equals(mEPC.getEpc())) {
mEPC.setCount(mEPC.getCount() + 1);
mEPC.setRssi(rssi);
list.set(i, mEPC);
break;
} else if (i == (list.size() - 1)) {
// list doesn't contain this epc
EPC newEPC = new EPC();
newEPC.setEpc(epc);
newEPC.setCount(1);
newEPC.setRssi(rssi);
list.add(newEPC);
listepc.add(epc);
}
}
}
// play sound
lastTime = SystemClock.elapsedRealtime();
long time = lastTime - nextTime;
if (time >= 60) {
Util.play(1, 0);
nextTime = lastTime;
Log.e("TAG", "run: " + time);
}
hideLoadingDialog();
Log.e("EPC", "listepc:+ " + listepc);
if (listepc != null && !listepc.isEmpty()) {
startFlag = false;
scan.setText(listepc.get(0).toString());
showLoadingDialog();
find(listepc.get(0).toString());
}
clearData();
}
});
}
private void clearData() {
listEPC.removeAll(listEPC);
listepc.removeAll(listepc);
}
// 基本信息查询
private void find(String epc) {
OkGo.<String>post(MyUrl.url + "/tyre/tyre/pdaQueryTyreInfo").tag(this).params("tyreEpc", epc)
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
String body = response.body();
hideLoadingDialog();
try {
Gson gson = new Gson();
BaseTyre baseTyre = gson.fromJson(body, BaseTyre.class);
if (baseTyre != null) {
// 空值处理:若字段为 null 则显示空字符串
String brand = safeGetString(baseTyre.getTyreBrand());
String tyreno = safeGetString(baseTyre.getTyreNo());
// String zb = safeGetString(baseTyre.getSelfNo());
String size = safeGetString(baseTyre.getTyreModel());
String level = safeGetString(baseTyre.getTyreLevel());
String pattern = safeGetString(baseTyre.getTyrePattern());
String kind = getTyreType(safeGetString(baseTyre.getTyreType()));
String deptId = safeGetString(baseTyre.getDeptId());
pinpai.setText(brand);
wtbm.setText(tyreno);
// zbh.setText(zb);
xinghao.setText(size);
cengji.setText(level);
huawen.setText(pattern);
ltlb.setText(kind);
String deptNameFromServer = safeGetString(baseTyre.getDeptName()); // 或者 getFactorySite()
String[] siteArray = getResources().getStringArray(R.array.zxzd);
// 遍历数组,寻找与服务器返回数据匹配的站点名称
// 这里假设 baseTyre 返回的是站点名称(如 "光明修理厂"
// 如果返回的是 ID如 200则需要先通过 getDeptId() 反查名称,或者直接根据 ID 逻辑处理
int targetIndex = 0; // 默认选中第一个
for (int i = 0; i < siteArray.length; i++) {
if (siteArray[i].equals(deptNameFromServer)) {
targetIndex = i;
break;
}
}
binding.outStoreSiteNow.setSelection(targetIndex);
binding.outStoreSiteNow.setBackground(ContextCompat.getDrawable(OutStoreHouseActivity.this, R.drawable.bg_textview_plain));
binding.outStoreSiteNow.setEnabled(false);
currentSpinnerState = STATE_LOCKED;
} else {
new CommonDialog(OutStoreHouseActivity.this).setMessage("轮胎不存在!").show();
}
} catch (JsonSyntaxException e) {
// 处理 JSON 解析错误
new CommonDialog(OutStoreHouseActivity.this).setMessage("扫描出错!").show();
return;
}
}
});
}
private String safeGetString(String value) {
return value == null || "null".equals(value) ? "" : value;
}
// 出库提交
private void out_inventory(String epc, String createBy) {
OkGo.<String>post(MyUrl.url + "/tyre/inventory/pdaOutInventory").tag(this)
.params("tyreRfid", epc)
.params("createBy", createBy)
.params("outType", (aType.get() ? "0" : "1"))
.params("team",binding.outStoreSite.getSelectedItem().toString())
.params("deptId", getDeptId(binding.outStoreSite.getSelectedItem().toString()))
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
String body = response.body();
hideLoadingDialog();
Gson gson = new Gson();
AjaxResult ajaxResult = gson.fromJson(body, AjaxResult.class);
new CommonDialog(OutStoreHouseActivity.this).setMessage(ajaxResult.getMsg()).show();
}
});
}
private void registerReceiver() {
keyReceiver = new KeyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.rfid.FUN_KEY");
filter.addAction("android.intent.action.FUN_KEY");
registerReceiver(keyReceiver, filter);
}
private void unregisterReceiver() {
unregisterReceiver(keyReceiver);
}
public int getDeptId(String name) {
if (name.equals("光明修理厂")) {
return 200;
} else if (name.equals("石岩修理厂")) {
return 201;
}
return 229;
}
public String getTyreType(String type) {
if (type.equals("circulating")) {
return "周转胎";
}
else if (type.equals("renovate")) {
return "翻新胎";
}
else if (type.equals("experimental")) {
return "实验胎";
}
else if (type.equals("scrap")) {
return "报废胎";
}
return "全新胎";
}
/**
* Inventory EPC Thread
*/
class InventoryThread extends Thread {
byte[] accessPassword = Tools.HexString2Bytes("00000000");
private List<TagModel> tagList;
@Override
public void run() {
super.run();
while (runFlag) {
if (startFlag) {
tagList = manager.inventoryRealTime(); // 实时盘存
if (tagList != null && !tagList.isEmpty()) {
// 播放提示音
Util.play(1, 0);
for (TagModel tag : tagList) {
if (tag == null) {
String epcStr = "";
addToList(listEPC, epcStr, (byte) -1);
} else {
String epcStr =
Tools.Bytes2HexString(tag.getmEpcBytes(), tag.getmEpcBytes().length);
byte rssi = tag.getmRssi();
addToList(listEPC, epcStr, rssi);
}
}
}
tagList = null;
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
private class KeyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int keyCode = intent.getIntExtra("keyCode", 0);
if (keyCode == 0) {
keyCode = intent.getIntExtra("keycode", 0);
}
boolean keyDown = intent.getBooleanExtra("keydown", false);
if (keyDown && (keyCode == 135 || keyCode == 136)) {
startFlag = true;
}
}
}
}