Android手持机扫码出入库的开发详解-1.项目介绍、项目结构、登录、主功能

154 阅读2分钟

Android手持机扫码出入库的开发详解-第一部分

1. 项目介绍

本项目是一个基于Android平台的手持机扫码出入库管理系统,旨在通过条形码扫描技术实现仓库货物的快速、准确管理。系统支持入库、出库、盘点等核心业务功能,并提供本地数据缓存与服务器同步机制,确保在网络条件不稳定的仓库环境下仍能正常工作。

主要功能特点:

  • 支持一维码/二维码扫描,兼容多种扫码设备
  • 实时数据采集与处理
  • 本地Sqlite数据库缓存,支持离线操作
  • 与后台MsSql2000数据库同步
  • 友好的手持机专用界面设计
  • 操作日志记录与查询

设备选型:

image.png

2. 项目结构

├── app/src/main/
│   ├── AndroidManifest.xml       # 应用配置文件
│   ├── java/cbw/materials/
│   │   ├── controller/          # 控制器层
│   │   │   ├── MainActivity.java             # 主界面
│   │   │   ├── ScanCodeInventoryCheck.java   # 盘点扫码界面
│   │   │   ├── ScanCodeInStorage.java        # 入库扫码界面
│   │   │   ├── ScanCodeOutStorage.java       # 出库扫码界面
│   │   │   └── UpdateVersion.java            # 版本更新
│   │   ├── dao/                  # 数据访问层
│   │   │   ├── InventoryCheckDAO.java
│   │   │   ├── InStorageDAO.java
│   │   │   ├── OutStorageDAO.java
│   │   │   └── impl/
│   │   │       ├── InventoryCheckDAOSqliteImpl.java
│   │   │       ├── InStorageDAOSqliteImpl.java
│   │   │       └── OutStorageDAOSqliteImpl.java
│   │   ├── model/                # 模型层
│   │   │   ├── InventoryCheck.java
│   │   │   ├── InStorage.java
│   │   │   └── OutStorage.java
│   │   └── util/                 # 工具类
│   │       ├── HttpUtil.java
│   │       └── ScanDevice.java
│   └── res/
│       ├── layout/               # 布局文件
│       ├── values/               # 资源文件
│       └── drawable/             # 图片资源
|── app/libs/
│   ├── json.jar
│   ├── gson-2.2.4.jar
│   ├── ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar
│   ├── scanSDK.jar
│   ├── jtds-1.2.7.jar
│   ├── msbase.jar
│   ├── msutil.jar
│   └── mssqlserver.jar

3. 项目整体运行程序图

sequenceDiagram
    participant User as 仓库人员
    participant App as Android手持机APP
    participant DB as 本地SQLite数据库
    participant Server as MsSql2000数据库

    User->>App: 登录系统
    App->>Server: 验证用户凭证
    Server-->>App: 返回验证结果
    App->>User: 显示主菜单

    loop 业务操作
        User->>App: 选择操作类型(入库/出库/盘点)
        User->>App: 扫描条形码
        App->>App: 解析条形码信息
        App->>DB: 存储操作记录
        App->>User: 显示操作结果
    end

    User->>App: 手动同步数据
    App->>Server: 上传本地操作记录
    Server->>App: 返回同步结果
    App->>DB: 更新本地记录状态
    App->>User: 显示同步结果

4. 用户登录

用户登录程序图

flowchart TD
    A[启动应用] --> B[显示登录界面]
    B --> C[输入用户名密码]
    C --> D[点击登录按钮]
    D --> E[验证输入合法性]
    E -->|合法| F[请求服务器验证]
    E -->|不合法| G[提示错误信息]
    G --> C
    F --> H[等待服务器响应]
    H -->|成功| I[保存用户信息]
    H -->|失败| J[提示登录失败]
    J --> C
    I --> K[跳转到主功能界面]

用户登录源代码

// MainActivity.java - 登录功能核心代码
public class MainActivity extends Activity {
    private EditText editText_userName;
    private EditText editText_password;
    private Button button_login;

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

        editText_userName = (EditText) findViewById(R.id.editText_userName);
        editText_password = (EditText) findViewById(R.id.editText_password);
        button_login = (Button) findViewById(R.id.button_login);

        button_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String userName = editText_userName.getText().toString().trim();
                String password = editText_password.getText().toString().trim();

                // 验证输入
                if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(password)) {
                    Toast.makeText(MainActivity.this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
                    return;
                }

                // 发起登录请求
                new LoginTask().execute(userName, password);
            }
        });
    }

    // 登录异步任务
    private class LoginTask extends AsyncTask<String, Void, Boolean> {
        @Override
        protected Boolean doInBackground(String... params) {
            String userName = params[0];
            String password = params[1];
            // 调用HTTP工具类与服务器交互
            return HttpUtil.login(userName, password);
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if (result) {
                // 登录成功,跳转到主界面
                Intent intent = new Intent(MainActivity.this, MainInterface.class);
                intent.putExtra("userName", editText_userName.getText().toString().trim());
                startActivity(intent);
                finish();
            } else {
                Toast.makeText(MainActivity.this, "登录失败,请检查用户名和密码", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

5. 主功能界面

主功能界面程序图

flowchart TD
    A[登录成功] --> B[显示主功能界面]
    B --> C[显示当前用户名]
    B --> D[显示功能按钮]
    D --> E[入库扫码]
    D --> F[出库扫码]
    D --> G[盘点扫码]
    D --> H[数据下载]
    D --> I[数据上传]
    D --> J[版本更新]
    E --> K[跳转入库扫码界面]
    F --> L[跳转出库扫码界面]
    G --> M[跳转盘点扫码界面]
    H --> N[执行数据下载]
    I --> O[执行数据上传]
    J --> P[检查版本更新]

主功能界面源代码

// MainInterface.java - 主功能界面核心代码
public class MainInterface extends Activity {
    private Button button_MainInterface_InventoryScanCode;
    private Button button_MainInterface_InStorage;
    private Button button_MainInterface_OutStorage;
    private Button button_MainInterface_DataDownload;
    private Button button_MainInterface_DataUpload;
    private Button button_MainInterface_VersionUpdate;
    private TextView textView_MainInterface_UserName;
    private String userName;

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

        // 获取登录用户信息
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        this.userName = bundle.getString("userName");
        textView_MainInterface_UserName.setText("扫码人:" + this.userName);

        // 初始化按钮
        button_MainInterface_InventoryScanCode = (Button) findViewById(R.id.button_MainInterface_InventoryScanCode);
        button_MainInterface_InStorage = (Button) findViewById(R.id.button_MainInterface_InStorage);
        button_MainInterface_OutStorage = (Button) findViewById(R.id.button_MainInterface_OutStorage);
        button_MainInterface_DataDownload = (Button) findViewById(R.id.button_MainInterface_DataDownload);
        button_MainInterface_DataUpload = (Button) findViewById(R.id.button_MainInterface_DataUpload);
        button_MainInterface_VersionUpdate = (Button) findViewById(R.id.button_MainInterface_VersionUpdate);

        // 设置按钮点击事件
        button_MainInterface_InventoryScanCode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                execFunction("盘点扫码");
            }
        });

        button_MainInterface_InStorage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                execFunction("入库扫码");
            }
        });

        button_MainInterface_OutStorage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                execFunction("出库扫码");
            }
        });
    }

    // 执行功能跳转
    private void execFunction(String functionName) {
        Intent intent = null;
        if ("盘点扫码".equals(functionName)) {
            intent = new Intent(MainInterface.this, ScanCodeInventoryCheck.class);
        } else if ("入库扫码".equals(functionName)) {
            intent = new Intent(MainInterface.this, ScanCodeInStorage.class);
        } else if ("出库扫码".equals(functionName)) {
            intent = new Intent(MainInterface.this, ScanCodeOutStorage.class);
        }

        if (intent != null) {
            intent.putExtra("userName", this.userName);
            startActivity(intent);
        }
    }
}