Goal:消费页进入后自动连接新开普读卡器并持续寻卡,同时从一卡通服务器每批 1000 条拉取完整人员快照,再通过当前业务服务器分批同步人员。
Architecture:页面只负责生命周期和状态渲染;配置、字段映射、批量上传、同步编排和 USB 寻卡分别由聚焦的类承担。完整 SQLite 快照形成后才允许业务上传。
Tech Stack:Java 8、Android API 24-30、Android USB Host、SQLite、MMKV、Retrofit、Gson、JUnit 4 和项目现有一卡通包。
onecard/config/OnecardSettings:默认值与纯 Java 校验。ValidatedSettingInputPop:通用可校验设置输入弹窗。trace_id 解析。BusinessPersonMapper:八个一卡通字段严格映射。BusinessPersonSyncService 和同步结果。ConsumptionPersonSyncCoordinator:完整拉取后上传。CardSearchStateMachine、ReaderDeviceState 和 ConsumptionCardSearchManager。文件:OnecardSettings.java、ValidatedSettingInputPop.java、Constants.java、SetBasicFragment.java、set_basic_fragment_layout.xml、strings.xml、OnecardSettingsTest.java。
.asmx 校验、正整数 AppID 校验和两个 MMKV 键。JAVA_HOME=/Users/liang/Library/Java/JavaVirtualMachines/corretto-1.8.0_482/Contents/Home ./gradlew -q :app:testDebugUnitTest --tests com.zhct.traybinding.onecard.config.OnecardSettingsTest
文件:SyncPersonsRequest.java、SyncPersonsResult.java、BusinessPersonMapper.java、NetworkResult.java、CPTNetworkRequest.java、NetworkService.java、CPTService.java 及 mapper 测试。
total/created/updated/failed;通用响应增加 trace_id。POST /api/oneCardTerminal/syncPersons 和 ServiceCall 包装,复用当前 Base URL 和拦截器。@POST("/api/oneCardTerminal/syncPersons")
Call<NetworkResult<SyncPersonsResult>> syncPersons(@Body SyncPersonsRequest request);
文件:CustomerRepository.java、SQLiteCustomerRepository.java。
loadBatch(syncId, afterCustomerId, limit),限制 limit 为 1-1000。last_seen_sync_id,按账号升序并关闭全部 Cursor。文件:BusinessPersonGateway.java、NetworkBusinessPersonGateway.java、BusinessPersonSyncResult.java、BusinessPersonSyncService.java 及服务测试。
failed > 0 继续,协议或网络失败停止。void onProgress(int batchNumber, int batchSize, int uploadedCount,
int created, int updated, int failed);
文件:ConsumptionPersonSyncCoordinator.java 及顺序测试。
connectionTask.connect(serverUrl, appId); CustomerSyncResult source = sourceSyncTask.sync(listener::onPullProgress); BusinessPersonSyncResult target = targetSyncTask.sync(source.getSyncId(), listener::onUploadProgress);
文件:CardSearchStateMachine.java、ReaderDeviceState.java、ConsumptionCardSearchManager.java 及两个状态测试。
start/stop/close 生命周期;USB 权限 action 基于 BuildConfig applicationId。public void start(); public void stop(); public void close();
文件:ConsumptionActivity.java、activity_consumption.xml、strings.xml、dimens.xml。
git diff --check 和 git status --short 只读核对。change_records/2026-08-26-consumption-onecard-sync.md/.html,只记录实际执行结果。JAVA_HOME=/Users/liang/Library/Java/JavaVirtualMachines/corretto-1.8.0_482/Contents/Home ./gradlew -q :app:testDebugUnitTest JAVA_HOME=/Users/liang/Library/Java/JavaVirtualMachines/corretto-1.8.0_482/Contents/Home ./gradlew -q :app:assembleDebug git diff --check git status --short
customerid/cardno 用 Java long 表示 JSON 整数,sex/status/cardsn 使用 int。