Android手持机扫码出入库的开发详解-4.盘点扫码

30 阅读1分钟

Android手持机扫码出入库的开发详解-4.盘点扫码

盘点扫码界面

盘点扫码程序图

flowchart TD
    A[进入盘点扫码界面] --> B[初始化扫码设备]
    B --> C[等待扫描材料条码]
    C --> D[验证条码格式]
    D -->|格式错误| E[提示错误信息]
    D -->|格式正确| F[显示材料信息]
    F --> G[等待扫描货位条码]
    G --> H[验证货位格式]
    H -->|格式错误| I[提示错误信息]
    H -->|格式正确| J[显示货位信息]
    J --> K[保存盘点记录]
    K --> L[判断是否继续]
    L -->|继续| C
    L -->|结束| M[执行数据上传]
    M --> N[返回主界面]

盘点扫码源代码

// ScanCodeInventoryCheck.java - 盘点扫码核心代码
public class ScanCodeInventoryCheck extends Activity {
    private ScanDevice sm = null;
    private String strCode = null;
    private String strHwh = null;
    private String userName;
    private InventoryCheckDAO inventoryCheckDAO;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_code_inventory_check);

        // 获取用户信息
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        this.userName = bundle.getString("userName");

        // 初始化扫码设备
        sm = new ScanDevice();
        sm.initDevice(this);
        sm.startScan();

        // 初始化数据库访问对象
        inventoryCheckDAO = new InventoryCheckDAOSqliteImpl(this);

        // 注册扫码广播接收器
        registerReceiver(mScanReceiver, new IntentFilter(ScanDevice.SCAN_ACTION));
    }

    // 扫码广播接收器
    private BroadcastReceiver mScanReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(ScanDevice.SCAN_ACTION)) {
                byte[] barocode = intent.getByteArrayExtra("barocode");
                int barocodelen = intent.getIntExtra("length", 0);
                barcodeStr = new String(barocode, 0, barocodelen);

                // 条码处理逻辑
                if (barcodeStr.length() == 21) {
                    // 材料条码
                    strCode = barcodeStr;
                    // 查询材料地址
                    new QueryAddressTask().execute(barcodeStr);
                } else if (barcodeStr.length() == 8 || barcodeStr.length() == 9) {
                    // 货位条码
                    strHwh = barcodeStr;
                    // 查询货位地址
                    new QueryAddressTask().execute(barcodeStr);
                } else {
                    Toast.makeText(ScanCodeInventoryCheck.this, "条码格式不正确,请重新扫描", Toast.LENGTH_SHORT).show();
                }

                // 当材料和货位都扫描完成后,保存盘点记录
                if (strCode != null && strHwh != null) {
                    SaveDataToSqlite(new String[]{strCode}, strHwh);
                }
            }
        }
    };

    // 保存数据到SQLite
    private void SaveDataToSqlite(String[] codes, String hwh) {
        List<InventoryCheck> inventoryChecks = new ArrayList<>();
        for (String code : codes) {
            InventoryCheck inventoryCheck = new InventoryCheck();
            inventoryCheck.setCode(code);
            inventoryCheck.setHwh(hwh);
            inventoryCheck.setName(this.userName);
            inventoryCheck.setDateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            inventoryChecks.add(inventoryCheck);
        }

        try {
            inventoryCheckDAO.insertDatas(inventoryChecks);
            Toast.makeText(this, "盘点记录保存成功", Toast.LENGTH_SHORT).show();
            // 清空已扫描信息
            strCode = null;
            strHwh = null;
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "盘点记录保存失败", Toast.LENGTH_SHORT).show();
        }
    }

    // 上传数据到服务器
    private void UploadData() {
        new AsyncTask<Void, Void, Boolean>() {
            @Override
            protected Boolean doInBackground(Void... params) {
                try {
                    // 获取所有未上传的盘点记录
                    List<InventoryCheck> records = inventoryCheckDAO.getAllRecords();
                    if (records.isEmpty()) {
                        return true;
                    }

                    // 上传数据到MSSQL2000服务器
                    boolean success = HttpUtil.uploadInventoryCheckData(records);
                    if (success) {
                        // 删除已上传的本地记录
                        inventoryCheckDAO.deleteAllRecords();
                    }
                    return success;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

            @Override
            protected void onPostExecute(Boolean result) {
                if (result) {
                    Toast.makeText(ScanCodeInventoryCheck.this, "数据上传成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ScanCodeInventoryCheck.this, "数据上传失败", Toast.LENGTH_SHORT).show();
                }
            }
        }.execute();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销广播接收器
        unregisterReceiver(mScanReceiver);
        // 关闭扫码设备
        if (sm != null) {
            sm.stopScan();
            sm.closeDevice();
        }
    }
}