本文基于当前仓库源码静态阅读整理,目标是说明该 Android 终端 App 的:
仓库定位不是通用库存 App,而是实验室化学品安全管理一体机/壁挂终端,围绕“实验室、化学品、安全柜/柜门、领用归还、废弃、预警、MSDS、双人认证、RFID/扫码/蓝牙秤/打印”等能力展开。
该项目是一个部署在实验室场景下的化学品智能管理终端,典型硬件环境包括:
从代码可以确认,该系统主要解决以下问题:
appserialport关键文件:
settings.gradle:23app/build.gradle:6serialport/build.gradle:5app/src/main/java/xn/hxp/ui/login 登录app/src/main/java/xn/hxp/ui/verify 双人认证/二次校验app/src/main/java/xn/hxp/ui/plan 入库计划、手动录入、待入库、开锁app/src/main/java/xn/hxp/ui/uses 领用、预警app/src/main/java/xn/hxp/ui/still 归还、MSDS、静态资料app/src/main/java/xn/hxp/ui/discard 废弃、电子台账app/src/main/java/xn/hxp/ui/inquiry 查询app/src/main/java/xn/hxp/ui/warehousing 标签、库存相关页面app/src/main/java/xn/hxp/ui/fragments 台账/查询子页面app/src/main/java/xn/hxp/ui/adapter 列表适配器app/src/main/java/com/rc/httpcore/client/retrofit/ApiService.javaapp/src/main/java/com/rc/httpcore/client/retrofit/ChemicalRetrofit.ktapp/src/main/java/com/rc/httpcore/client/ApiRepository.ktapp/src/main/java/com/rc/httpcore/HttpClient.ktapp/src/main/java/com/rc/httpcore/client/HttpTool.javaapp/src/main/java/xn/hxp/utils/Tool.javaapp/src/main/java/xn/hxp/utils/bluetooth/SppTool.javaapp/src/main/java/xn/hxp/receiver/PortScanService.ktapp/src/main/java/xn/hxp/receiver/UsbReceiver.ktapp/src/main/java/xn/hxp/receiver/PortScanHelper*app/src/main/java/xn/hxp/ui/plan/room/**app/src/main/java/xn/hxp/utils/SharedPreferencesHelper.kt应用入口类:
app/src/main/java/xn/hxp/app/ChemicalApp.kt:32核心职责:
初始化全局状态
userDatasubjectIdsubjectNameconfslabInfosubRoomadministratorsresponsibles初始化终端能力
SppTool.init()BleManager异常恢复策略
ANRWatchDogChemicalApp.kt:64-81启动页:
app/src/main/java/xn/hxp/ui/StartActivity.java:34启动流程:
HttpTool.getCheck() 获取设备绑定实验室信息MainActivity关键点:
pm grantStartActivity.java:80-96主页:
app/src/main/java/xn/hxp/ui/MainActivity.java:87主页主要做三件事:
关键逻辑:
basicConfig,见 MainActivity.java:295getCabinetIn,见 MainActivity.java:249HttpTool.heartbeat(),见 MainActivity.java:194-217signOutTime 计时,见 MainActivity.java:394-418ui/login/SwipeActivity.kt 刷卡登录ui/login/ScanLoginActivity.kt 扫码登录ui/login/FaceLoginActivity.java 人脸登录ui/login/FacialCardActivity.kt 人脸+刷卡组合登录支持多种登录方式,由实验室配置控制:
配置来源:
ConfigBean.loginType,见 ConfigBean.kt:9MainActivity.java:325-384InquiryActivity.java:623-678刷卡登录流程:
auth/cardNumuserCardValidation关键代码:
SwipeActivity.kt:147-167SwipeActivity.kt:164-205ChemicalRetrofit.kt:100-111角色模型:
UserValidationBean.kt:4-26可确认角色:
schoolLevelAdmincollegeAdminadminUsersafeUsercabinetAdminbelongUsertoipcUserapplywhite登录不是单纯账号体系,而是与实验室、柜门、化学品权限模型深度耦合的身份校验入口。
ui/verify/TwoVerificationActivity.ktTwoPersonActivity.kt、SwipeCodeTwoActivity.kt、ScanCodeTwoActivity.kt双人认证被用于多个高风险业务节点:
关键字段:
mTag 表示业务场景0 新增入库1 归还/废弃/空瓶等2 待入库3 领用认证TwoVerificationActivity.kt:83由 ConfigBean.verifyType 配置:
1 人脸2 刷卡3 扫码1,2、1,3、2,3、多方式组合见:
ConfigBean.kt:31UseActivity.kt:233-320ChemicalsAlsoActivity.kt:110-146, 414-429WasteChemicalsActivity.kt:297-330ChemicalLabelingActivity.kt:185-217checkUserFaceByPicsubId/doorId/stockId/waitId关键代码:
ApiService.java:337-340ChemicalRetrofit.kt:860-885TwoVerificationActivity.kt:514-516useCardVerifydoorId、chemicalLevel 等业务上下文关键代码:
ChemicalRetrofit.kt:125-139ChemicalRetrofit.kt:601-616TwoVerificationActivity.kt:1336-1337aioScanLogin关键代码:
TwoVerificationActivity.kt:142-146TwoVerificationActivity.kt:1658ApiService.java:236-237通过 DoubleDialogBean 记录两位认证人,并写入本地 SharedPreferences:
TwoVerificationActivity.kt:464SharedPreferencesHelper.kt:42-70后续开锁、归还、废弃等操作会读取这两位认证人的 userId/name 写入业务请求。
双人认证是本系统安全策略中心,认证不是独立动作,而是带业务上下文的二次授权。
入库分为两个层次:
页面:
ui/plan/PlanAddActivity.javaui/plan/PlanAddActivityHelp.java职责:
关键代码:
PlanAddActivity.java:100-155PlanAddActivity.java:157-255PlanAddActivityHelp.java:61-144PlanAddActivityHelp.java:317-391页面:
ui/plan/add/AddActivity.javaui/plan/add/AddActivityHelp.java支持信息:
关键代码:
AddActivity.java:151-239AddActivityHelp.java:96-191AddActivityHelp.java:198-305PlanAddActivityHelp 中提供扫码监听:
code=xxx&type=9 的 URL 型码scanCodeChemical 查询化学品信息关键代码:
PlanAddActivityHelp.java:254-315PlanAddActivityHelp.java:181-252录入时会:
getControlConfigs(chemicalLevel) 获取化学品控制策略certitude 做化学品确认/补全关键代码:
AddActivityHelp.java:372-451AddActivityHelp.java:453-458PlanAddActivityHelp.save() 会把本地待入库临时数据组装为后端要求的 HxpChemicalVo 列表,并调用:
HttpTool.addChemical() -> chemical/aio/addStock关键代码:
PlanAddActivityHelp.java:317-391HttpTool.java:101-108主页上“存储/新增入库”入口会先判断是否存在“已申领未入库”记录:
AlreadyActivity 或 PlanAddActivityPlanAddActivity关键代码:
MainActivity.java:645-684入库不是简单表单提交,而是柜位选择 + 化学品确认 + 打印/RFID/称重 + 柜门开锁 + 最终提交的复合流程。
页面:
ui/uses/UseActivity.ktverify 决定是否要求双人认证isControl 决定化学品是否为管控类unlockingMethod == 2 识别见:
UseActivity.kt:198-275mJoinType = 1 表示称重mJoinType = 2 表示手动录入UseActivity.kt:81getByRfid 获取领用对象UseActivity.kt:426ApiService.java:165-176weighData()、connectToDeviceWithTimeout() 等函数负责接秤UseActivity.kt:475-585UseActivity.kt:351-362outTimeWarn 做异常数据上报UseActivity.kt:107-113UseActivity.kt:1318领用流程是该系统最典型的“人-柜-物”闭环流程:选柜门 -> 授权 -> 开门 -> 识别化学品 -> 称重/录入 -> 提交使用记录。
页面:
ui/still/ChemicalsAlsoActivity.ktuseListbackDetailgiveBack/returnGiveBack 提交关键代码:
ChemicalsAlsoActivity.kt:105-170ChemicalsAlsoActivity.kt:172-235ChemicalsAlsoActivity.kt:248-320ChemicalsAlsoActivity.kt:643-747ChemicalsAlsoActivity.kt:959ChemicalsAlsoActivity.kt:1488从代码可推断:
useStatus = 4:归还相关状态useStatus = 3:废弃相关状态returnType = mJoinType:归还方式区分称重/录入见:
ChemicalsAlsoActivity.kt:530-531ChemicalsAlsoActivity.kt:602-603ChemicalsAlsoActivity.kt:822-828归还页面不是单一“归还”,而是将归还、空瓶、废弃、补标、换 RFID 集中在一个化学品出库回流工作台中。
页面:
ui/discard/WasteChemicalsActivity.ktstockDetailsListdiscardDetailGiveBackBeangiveBack 完成废弃出库outTimeWarn关键代码:
WasteChemicalsActivity.kt:93-168WasteChemicalsActivity.kt:237-264WasteChemicalsActivity.kt:297-330WasteChemicalsActivity.kt:520WasteChemicalsActivity.kt:940WasteChemicalsActivity.kt:1237useStatus = 3returnType = 1remark = "repeal"disuseReason见:
WasteChemicalsActivity.kt:106-120废弃复用了归还接口,但在业务上属于单独的危险化学品废弃出库流程,强调原因记录与后续回收提醒。
页面:
ui/inquiry/InquiryActivity.javaui/fragments/QueryOneFragment.ktui/fragments/QueryTwoFragment.ktui/inquiry/QueryDetailsActivity.kt关键代码:
InquiryActivity.java:139-181InquiryActivity.java:240-304InquiryActivity.java:306-362InquiryActivity.java:376-420InquiryActivity.java:505-598查询并非纯浏览页面,而是带柜门上下文的库存/标签/RFID 联动查询入口。
页面:
ui/discard/LedgerActivity.ktui/fragments/UseLedgerFragment.ktui/fragments/InventoryIedgerFragment.kt电子台账分为两类:
切换方式:
LedgerActivity.kt:54-72LedgerActivity.kt:103-110对应后端能力:
useRecordsstockLedgeruseReturnList见:
ApiService.java:254-261ApiRepository.kt:378-397页面:
ui/uses/WarningEventsActivity.ktui/uses/ProcessedActivity.kt关键代码:
WarningEventsActivity.kt:50-60WarningEventsActivity.kt:81-145WarningEventsActivity.kt:210-240WarningEventsActivity.kt:563-576后端接口:
warningNoticeListwarningNoticeDetailhandleMessagewarningNoticeCount见:
ApiService.java:220-230预警模块是完整闭环,不是单纯看板,支持统计、筛选、详情、处置。
页面:
ui/still/MsdsActivity.ktui/still/MsdsScreenActivity.kt关键代码:
MsdsActivity.kt:46-73MsdsActivity.kt:91-129MsdsActivity.kt:154-180后端接口:
getMsdsDetailsmsdsDetailstype=1页面:
ui/warehousing/ChemicalLabelingActivity.kttagDetailsList关键代码:
ChemicalLabelingActivity.kt:70-107ChemicalLabelingActivity.kt:108-161ChemicalLabelingActivity.kt:165-219ChemicalLabelingActivity.kt:436-469ChemicalLabelingActivity.kt:492-513该页面承担了标签重打、RFID 维护、通过标签反查库存并定位开门的现场维护职能。
StartActivity → 获取设备绑定实验室信息 → MainActivity
路径关键点:
iot/aio/reportlabInfo/subjectId/subjectName/subRoom源码:
StartActivity.java:100-150MainActivity.basicConfLog() → SwipeActivity → cardNum → userCardValidation → 登录成功 → 回主页
源码:
MainActivity.java:325-384SwipeActivity.kt:147-214MainActivity.basicConfLog() → FaceLoginActivity → faceNewCompare → 登录成功
MainActivity.basicConfLog() → ScanLoginActivity → auth/scanCode 或扫码验证相关接口 → 登录成功
MainActivity → PlanAddActivity → AddActivity 手动录入/扫码录入 → 本地待入库列表 → UnlockActivity(如需要开门)→ PlanAddActivityHelp.save() → SaveListActivity
关键业务节点:
源码:
MainActivity.java:645-684PlanAddActivity.java:157-255AddActivityHelp.java:372-451PlanAddActivityHelp.java:317-391MainActivity → UseActivity → 选柜/柜门 → 双人认证(如需)→ 开锁(如需)→ 扫标签/RFID → 称重/录入 → addUseRecord
源码:
MainActivity.java:504-513UseActivity.kt:178-321UseActivity.kt:323-585ApiService.java:165-176MainActivity → ChemicalsAlsoActivity → 查询待归还记录或扫描 → 查看详情 → 双人认证(如需)→ 开锁(如需)→ 称重/录入 → giveBack/returnGiveBack
源码:
MainActivity.java:515-524ChemicalsAlsoActivity.kt:105-170ChemicalsAlsoActivity.kt:643-747MainActivity → WasteChemicalsActivity → 查询待废弃记录或扫描 → 双人认证(如需)→ 输入废弃原因 → giveBack(useStatus=3)
源码:
MainActivity.java:482-491WasteChemicalsActivity.kt:93-168MainActivity → InquiryActivity → 选柜/柜门 → 查询 Fragment 切换 → 扫描标签/RFID → 查看详情 → 可选开柜
源码:
MainActivity.java:493-501InquiryActivity.java:240-304InquiryActivity.java:376-420MainActivity → LedgerActivity → 使用台账 / 库存台账 Fragment 切换
源码:
MainActivity.java:526-535LedgerActivity.kt:54-72MainActivity → WarningEventsActivity → 筛选列表 → ProcessedActivity → 查看/处理预警
源码:
MainActivity.java:548-557WarningEventsActivity.kt:61-72MainActivity → MsdsActivity → 搜索 MSDS → 查看 HTML 内容 → 全屏查看
源码:
MainActivity.java:559-564MsdsActivity.kt:46-129模型:
ChemicalSearchBean.ktHxpChemicalVo.java关键字段:
chemicalIdchemicalNamecasNumchemicalLevel:1 管控,2 非管控chemicalPuritychemicalCategorypackNumspecNumdepositRequiremsdsId见:
ChemicalSearchBean.kt:7-32模型:
RuleBean.ktCabinetDoorVo.ktLockVoListBean.kt关键字段:
cabinetIdcabinetNamedoorUniqueIdcabinetDoorVoListlockNum见:
RuleBean.kt:3-28模型:
UserValidationBean.kt决定:
模型:
ConfigBean.kt关键字段:
loginType 登录方式verifyType 双人验证方式operateTimeouttimeoutHouruseHourbackTimesignOutTimeoffTimevinVex 称重容差率见:
ConfigBean.kt:5-32根据 ChemicalApp 与 UserValidationBean,系统至少存在两层权限模型:
ChemicalApp 中维护:
administratorsresponsibles注释说明:
见:
ChemicalApp.kt:56-59代码中明确:
unlockingMethod == 2 表示智能锁见:
InquiryActivity.java:95-103UseActivity.kt:209-214ChemicalsAlsoActivity.kt:154-159ChemicalLabelingActivity.kt:165-219由配置驱动:
backTimesignOutTimeoffTime同时,开锁后若未完成业务就返回,会调用:
outTimeWarn用于记录异常或超时操作。
见:
app/build.gradle:37-45app/build.gradle:85-105xn.hxp.ui/**ApiRepository.ktChemicalRetrofit.ktHttpTool.javaChemicalApp.kt特点:
ApiRepository.INSTANCE.xxx() 调接口HttpTool + OkHttpUtils 直连方式关键文件:
ApiService.javaChemicalRetrofit.ktApiRepository.ktHttpClient.kt网络特征:
ApiService 统一声明业务接口ChemicalRetrofit 做响应成功判断与请求体包装ApiRepository 统一调度线程:IO -> MainHttpClient 负责 OkHttp/Retrofit 创建后端返回统一结构:
codemessagedata在 ChemicalRetrofit.kt 中统一判断 isSuccess(),失败抛 NetException。
HttpClient.tokenTokenHeaderInterceptor 自动加 authorization 头见:
ChemicalRetrofit.kt:108-110ChemicalRetrofit.kt:855-856TokenHeaderInterceptor.kt:21-63HttpTool.java 仍承担若干流程:
说明项目存在一定历史接口兼容层。
用途:
见:
SharedPreferencesHelper.kt:19-39SharedPreferencesHelper.kt:42-70主要用于入库计划编排,不是全局核心数据库。
保存内容:
见:
ui/plan/room/**PlanAddActivity.java:100-113Manifest 中声明了大量普通权限与高权限:
INSTALL_PACKAGESWRITE_SECURE_SETTINGSREAD_PRIVILEGED_PHONE_STATEREAD_LOGSMANAGE_USBUSES_POLICY_FORCE_LOCK见:
AndroidManifest.xml:5-63这表明应用运行环境大概率是:
同时 Tool.java 直接调用:
suExecrebootforce-stoppm set-home-activitysettings put global bluetooth_on见:
Tool.java:24-99说明该 App 不只是普通应用,更像设备侧受控终端软件。
iot/aio/reportterminal/machine/heartbeat见:
MainActivity.java:194-217HttpTool.java:220-248Manifest 申请了安装权限,并配置 FileProvider:
AndroidManifest.xml:249-262接口层也有:
onepcApkUpdate说明系统具备 APK 升级状态回传能力。
依赖与文件:
app/build.gradle:73, 139app/libs/arcsoft_face.jarapp/libs/facedetector-1.0.0.aarTwoVerificationActivity.kt:44-50PortScanHelper 拦截按键流UsbReceiver 监听 USB 插拔PortScanService 设计为系统服务形式统一广播扫码结果见:
SwipeActivity.kt:118-145InquiryActivity.java:117-137PortScanService.kt:9-67SppTool.java 使用 Feasycom SPP SDK见:
SppTool.java:16-91BluetoothHelper.kt00001101-0000-1000-8000-00805F9B34FB见:
BluetoothHelper.kt:22-124设置页支持:
sppMac / sppName见:
SettingActivity.java:78-89后端接口驱动为主:
getCabinetLocklockOperategetLocksoutTimeWarn前端负责:
见:
ApiService.java:209-248InquiryActivity.java:505-598UseActivity.kt:1140-1318ChemicalsAlsoActivity.kt:1488-1630WasteChemicalsActivity.kt:1237-1368ChemicalLabelingActivity.kt:904-1074USBPrintSDK.jarautoreplyprint.aarwhdrawlabel1.1.jarsdkapi.jar见:
app/libs/*页面:
ChemicalLabelingActivity.ktChemicalsAlsoActivity.ktPrintLabelDialog见:
ChemicalApp.kt:142-160MsdsActivity.kt:91-117从 ApiService.java 可以明确后端提供的能力边界:
auth/cardNumchemical/aio/verify/userCardValidationchemical/aio/verify/useCardVerifychemical/aio/verify/aioScanLoginauth/faceByPicchemical/aio/verify/checkUserFaceByPicauth/logoutlaboratory/subRelInfo/getRelListchemical/aio/getCabinetListchemical/aio/getCabinetBySubIdchemical/aio/getCabinetLockchemical/aio/lockOperatechemical/aio/getLockStatuschemical/aio/searchChemicasystem/dict/item/optionchemical/aio/searchProducerchemical/aio/searchSpecchemical/aio/controlConfigchemical/aio/addStockchemical/aio/addStockCheckchemical/aio/getStockWaitDetailschemical/aio/waitListchemical/aio/stockListchemical/aio/indexStockListchemical/aio/tagDetailsListchemical/aio/checkRfidchemical/aio/updateRfidchemical/aio/byRfidchemical/aio/indexDetailbyRfidchemical/aio/getStockDetailsByCodechemical/aio/addUserecordchemical/aio/useListchemical/aio/backDetailchemical/aio/giveBackchemical/aio/useReturnListchemical/aio/discardDetailchemical/aio/stockDetailsListchemical/aio/useRecordschemical/aio/stockLedgersystem/aioUnify/warningNoticeListsystem/aioUnify/warningNoticeDetailsystem/warningNotice/handleMessagesystem/aioUnify/warningNoticeCountchemical/aio/outTimeWarnchemical/aio/msdschemical/aio/msdsDetailschemical/aio/basicConfigsystem/logo/config/getConfInfoiot/aio/reportiot/aio/monitorterminal/machine/heartbeatlaboratory/apkfile/onepcApkUpdate/{id}/{state}主要依赖包括:
见:
app/build.gradle:55-153USBPrintSDK.jararcsoft_face.jararcsoft_image_util.jarautoreplyprint.aarfacedetector-1.0.0.aarfeasyblue.jarsdkapi.jartbs_sdk_v4.3.0.165_20210628_103707.jarwhdrawlabel1.1.jarlibserial_port_wh.solibfacp.solibota.solibutil.so这些依赖说明系统同时整合了:
业务域边界比较清晰
终端场景适配明显
安全流程完整
软硬件融合较深
存在新旧接口栈并存
ApiRepository/ChemicalRetrofit 与 HttpTool 并存全局状态较多依赖 ChemicalApp
页面逻辑较重
部分二维码地址为硬编码域名
https://labcontrol.nwafu.edu.cn/api/...API_BASE_QC_URL 并存该仓库对应的是一个典型的实验室化学品智能管理终端,不是单纯的库存系统,而是一个把以下能力整合到统一设备端工作流里的应用:
从实现角度看,系统采用了传统 Android 业务页面 + Repository/Retrofit + 一体机设备控制 + 本地临时缓存的混合架构,强调“现场操作闭环”和“安全合规可追溯”。
如果后续需要继续深入,建议优先沿以下三个方向细读:
本章节按“从哪里进、看哪些类、每个页面依赖哪些适配器/对话框/接口/模型”的方式整理,适合接手开发时快速建立代码地图。
app/src/main/java/xn/hxp/app/ChemicalApp.kt:32建议先看:
userData / subjectId / confs / labInfo / administrators / responsiblesSppTool、BleManager、DialogX、QbSdkANRWatchDogapp/src/main/java/xn/hxp/ui/StartActivity.java:34建议重点看:
requestPermission():设备权限获取方式unreasonableCode():本地地址/相机配置恢复initView():设备校验与实验室绑定入口关联类:
xn.hxp.ui.SettingActivityxn.hxp.utils.SharedPreferencesHelpercom.rc.httpcore.client.HttpToolapp/src/main/java/xn/hxp/ui/MainActivity.java:87建议重点看:
basicConf():基础配置拉取basicConfLog():登录方式分流getCabinetIn():主页柜体轮播getHxpStockWait():入库入口分流关联适配器/弹窗:
ui/adapter/CabinetBannerAdapter.javaweidith/PlanDialog.javaweidith/CustomDialog.ktapp/src/main/java/xn/hxp/ui/login/SwipeActivity.kt:46建议先看:
handleScanEvent():刷卡登录authenticationInfo():登录后权限校验依赖:
receiver/PortScanHelperreceiver/UsbReceiverApiRepository.cardNumApiRepository.userCardValidationweidith/AuthenticationDialog.ktapp/src/main/java/xn/hxp/ui/login/ScanLoginActivity.kt用途:扫码方式登录或与其它登录方式组合切换。
app/src/main/java/xn/hxp/ui/login/FaceLoginActivity.javaapp/src/main/java/xn/hxp/ui/login/FacialCardActivity.kt用途:纯人脸登录、人脸+刷卡组合登录。
app/src/main/java/xn/hxp/ui/verify/TwoVerificationActivity.kt:64这是接手时必须精读的页面,建议重点关注:
mTag:当前认证服务于哪个业务场景mVerTyps:单认证方式mCertificationType:组合认证方式mDoorId / mChemicalLevel:认证上下文SharedPreferencesHelper.saveList():认证通过后的双人缓存when (mTag):不同业务场景的权限分支当前可确认:
mTag = 0:新增入库mTag = 1:归还/废弃/标签管理等mTag = 2:待入库mTag = 3:领用关键代码点:
TwoVerificationActivity.kt:127-146TwoVerificationActivity.kt:464TwoVerificationActivity.kt:529-616TwoVerificationActivity.kt:1353-1467TwoVerificationActivity.kt:1658-1848关联类:
ui/DoubleDialogBeanweidith/DoublePeopleDialog.ktreceiver/PortScanHelperApiRepository.useCardVerifyApiRepository.aioScanLoginApiRepository.checkUserFaceByPicapp/src/main/java/xn/hxp/ui/plan/PlanAddActivity.java:59建议阅读顺序:
onInit():初始化 Room 临时表、页面事件subAdd 点击逻辑:决定是否需要先开柜门intentActivityResultLauncher:接收手动录入返回关联 DAO:
ui/plan/room/dao/HxpCabinetDAOui/plan/room/dao/HxpDoorDAOui/plan/room/dao/HxpLayerDAOui/plan/room/dao/HxpInventoryDAOui/plan/room/dao/HxpLabDirectorDAOui/plan/room/dao/HxpLabSafeDAOapp/src/main/java/xn/hxp/ui/plan/PlanAddActivityHelp.java:53建议重点看:
getLabInfo():实验室基础信息getCabinetList():柜体/柜门落本地库selectCabinetLayer():当前选中柜层updateInventoryUi():待入库列表刷新chemicalSearchByCode():扫码录入入口startScanEventListener():扫码识别兼容逻辑save():最终入库提交该类是“计划入库编排中枢”。
app/src/main/java/xn/hxp/ui/plan/add/AddActivity.java:58建议重点看:
app/src/main/java/xn/hxp/ui/plan/add/AddActivityHelp.java:38建议重点看:
hxpSearch():化学品搜索chemicalSearchResult():搜索结果回填save(boolean isWeigh):录入校验与后续动作总控startBluetoothWeigh():蓝牙称重入口qrInit():扫码录入后的只读回填模式app/src/main/java/xn/hxp/ui/plan/unlock/UnlockActivity.javaapp/src/main/java/xn/hxp/ui/plan/unlock/UnlockActivityHelp.javaapp/src/main/java/xn/hxp/ui/plan/unlock/UnlockAdapter.java用途:
app/src/main/java/xn/hxp/ui/plan/save_list/SaveListActivity.java用途:提交完成后的结果展示。
app/src/main/java/xn/hxp/ui/plan/already/AlreadyActivity.javaapp/src/main/java/xn/hxp/ui/plan/already/AlreadyAdapter.java用途:处理“已申领未入库”业务分支。
app/src/main/java/xn/hxp/ui/uses/UseActivity.kt:58建议阅读顺序:
onInit():列表、柜门、返回逻辑inAdapter():左柜/右门选择与认证分流verifyChecking():多认证方式组合usageLabelDialog():开门后的领用工作台getByRfid():按 RFID 查领用对象weighData():称重或录入重量getStockList():领用列表查询openLock():开锁请求outTimeWarnData():异常上报关键依赖:
ui/adapter/CabinetDoorAdapter.ktui/adapter/CabinetDoorRighAdapter.ktui/adapter/UseListAdapter.ktui/adapter/UsageLabelDialogAdapter.javaweidith/UsageLabelDialog.javaweidith/WeighDialog.ktweidith/CustomDialog.ktweidith/StorageDialog.ktApiRepository.getStockListApiRepository.getByRfidApiRepository.addUseRecordApiRepository.lockOperateApiRepository.getLocksApiRepository.outTimeWarnUseBeanUsePostDataBeanChemistryBeanLockVoListBeanTimeWarBeanapp/src/main/java/xn/hxp/ui/still/ChemicalsAlsoActivity.kt:59建议阅读顺序:
onInit():页面操作入口useList():待归还列表handleScanEvent():扫码进入详情verifyChecking():归还类双人认证weighData():归还称重cabinetOpen() / openLock():开门updateRfid():标签更换discardDialogShow() / emptiesDialogsShow():废弃/空瓶throwableView():页面统一异常处理关键依赖:
ui/adapter/ReturningChemicalsAdapter.ktweidith/DiscardDialog.ktweidith/EmptiesDialog.ktweidith/AirBottleDialog.ktweidith/AirBottleNewDialog.ktweidith/CabinetOpenDialog.ktweidith/StorageDialog.ktApiRepository.useListApiRepository.backDetailApiRepository.giveBackApiRepository.returnGiveBackApiRepository.updateRfidApiRepository.lockOperateApiRepository.getLocksReturningChemicalsBeanReturnDetailsBeanReturnGiveBackBeanGiveBackBeanapp/src/main/java/xn/hxp/ui/discard/WasteChemicalsActivity.kt:45建议阅读顺序:
onInit():页面入口与分页stockDetailsList():废弃列表handleScanEvent() / codeDateIn():扫描后定位化学品verifyChecking():废弃认证discardDialogShow():废弃原因录入openLock():开门outTimeWarnData():异常退出上报关键依赖:
ui/adapter/WasteChemicalsAdapter.ktweidith/DiscardDialog.ktweidith/StorageDialog.ktApiRepository.stockDetailsListApiRepository.discardDetailApiRepository.giveBackapp/src/main/java/xn/hxp/ui/inquiry/InquiryActivity.java:69建议阅读顺序:
initData():登录态/预选柜门处理fragmentInView():查询页签初始化inAdapter():左柜右门联动getCabinet():柜门初始化逻辑handleScanEvent():扫码查询详情openLock() / getLocks():查询场景开门关键依赖:
ui/fragments/QueryOneFragment.ktui/fragments/QueryTwoFragment.ktui/adapter/CabinetDoorAdapter.ktui/adapter/CabinetDoorRighAdapter.ktweidith/PromptDialog.javaweidith/ScanCodeDialog.ktweidith/CustomDialog.ktApiRepository.getCabinetListApiRepository.indexDetailbyRfidApiRepository.getStockDetailsByCodeApiRepository.lockOperateApiRepository.getLocksapp/src/main/java/xn/hxp/ui/warehousing/ChemicalLabelingActivity.kt:43建议阅读顺序:
onInit():列表、查询、补打、换标labelingData():标签列表查询getIdDate() / upView():点击记录加载详情verifyChecking():标签场景认证updateRfid():RFID 更换openLock():按标签定位开柜关键依赖:
ui/adapter/ChemicalLabelingAdapter.ktui/adapter/CustomSpinnerTwoAdapter.ktweidith/AirBottleDialog.ktweidith/AirBottleNewDialog.ktweidith/StorageDialog.ktApiRepository.tagDetailsListApiRepository.getDetailsByIdApiRepository.updateRfidApiRepository.lockOperateapp/src/main/java/xn/hxp/ui/discard/LedgerActivity.kt:28职责:
app/src/main/java/xn/hxp/ui/fragments/UseLedgerFragment.kt:33建议重点看:
getLists() -> ApiRepository.useRecordsbutReturned -> ChecklistsActivityapp/src/main/java/xn/hxp/ui/fragments/InventoryIedgerFragment.kt:30建议重点看:
getLists() -> ApiRepository.stockLedger关联适配器:
ui/adapter/UseLedgerAdapter.ktui/adapter/InventoryAdapter.ktui/adapter/InventoryListAdapter.ktapp/src/main/java/xn/hxp/ui/uses/WarningEventsActivity.kt:33app/src/main/java/xn/hxp/ui/uses/ProcessedActivity.kt建议阅读顺序:
warningNoticeCount():预警总数getLists():预警分页查询ProcessedActivity关键依赖:
ui/adapter/WarningEventsAdapter.ktApiRepository.warningNoticeListApiRepository.warningNoticeCountApiRepository.warningNoticeDetailApiRepository.handleMessageapp/src/main/java/xn/hxp/ui/still/MsdsActivity.kt:32app/src/main/java/xn/hxp/ui/still/MsdsScreenActivity.kt建议重点看:
msdsDetails(searchValue):查询screen 按钮跳转全屏页关联类:
ui/adapter/MsdsListAdapter.ktcom.rc.core.util.WebViewHelper.ktcom.rc.core.util.VideoFullScreenWebChromeClient.ktapp/src/main/java/xn/hxp/ui/SettingActivity.java:24建议重点看:
app/src/main/java/xn/hxp/utils/Tool.java:16负责:
app/src/main/java/xn/hxp/utils/bluetooth/SppTool.java:16负责:
app/src/main/java/xn/hxp/weidith/ble/BluetoothWeighDialog.java:40建议重点看:
HttpTool.addStockCheck() 的称重校验提交app/src/main/java/xn/hxp/utils/PrintTool.java:16负责:
PrintBean 生成标签图像app/src/main/java/xn/hxp/receiver/PortScanService.kt:9app/src/main/java/xn/hxp/receiver/UsbReceiver.ktapp/src/main/java/xn/hxp/receiver/PortScanHelper*负责:
CabinetDoorAdapter.kt、CabinetDoorRighAdapter.kt、CabinetBannerAdapter.javaUseListAdapter.kt、UsageLabelDialogAdapter.javaReturningChemicalsAdapter.ktWasteChemicalsAdapter.ktChemicalLabelingAdapter.ktWarningEventsAdapter.ktUseLedgerAdapter.kt、InventoryAdapter.ktMsdsListAdapter.ktCustomDialog.ktDoublePeopleDialog.ktUsageLabelDialog.javaWeighDialog.kt、BluetoothWeighDialog.javaStorageDialog.ktDiscardDialog.ktEmptiesDialog.ktAirBottleDialog.kt、AirBottleNewDialog.ktPrintLabelDialog.javaSelectChemicalDialog.javaBelongingPersonDialog.ktSelectTopicDialog.ktPromptDialog.java、ScanCodeDialog.ktBleSelectorDialog.java如果是第一次接手这个项目,建议按下面顺序看源码:
ChemicalApp.kt、StartActivity.java、MainActivity.javaConfigBean.kt、UserValidationBean.kt、RuleBean.ktApiService.java、ChemicalRetrofit.kt、ApiRepository.ktTwoVerificationActivity.ktUseActivity.ktChemicalsAlsoActivity.ktWasteChemicalsActivity.ktPlanAddActivity.java + PlanAddActivityHelp.javaAddActivity.java + AddActivityHelp.javaChemicalLabelingActivity.ktInquiryActivity.javaLedgerActivity.kt + 两个台账 FragmentWarningEventsActivity.kt、MsdsActivity.ktTool.java、SppTool.java、BluetoothWeighDialog.java、PrintTool.java如果目的是修业务 Bug,优先看对应页面 + 认证页 + 开锁逻辑;
如果目的是重构,优先梳理 ApiRepository / HttpTool / ChemicalApp 三条主线。