Android手持机扫码出入库的开发详解-第一部分
1. 项目介绍
本项目是一个基于Android平台的手持机扫码出入库管理系统,旨在通过条形码扫描技术实现仓库货物的快速、准确管理。系统支持入库、出库、盘点等核心业务功能,并提供本地数据缓存与服务器同步机制,确保在网络条件不稳定的仓库环境下仍能正常工作。
主要功能特点:
- 支持一维码/二维码扫描,兼容多种扫码设备
- 实时数据采集与处理
- 本地Sqlite数据库缓存,支持离线操作
- 与后台MsSql2000数据库同步
- 友好的手持机专用界面设计
- 操作日志记录与查询
设备选型:
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);
}
}
}