- 新增入库专用网络层(InboundApiService、InboundRepository、InboundNetworkModule、InboundInterceptor) - 新增入库相关数据模型(IngredientByTrace、SupplierOption、ZoneOption、GoodsSearchModel、CleanInboundParam、RawInboundParam、InboundApiResponse) - 新增 FormField 动态表单模型(FieldType 枚举、apiKey 字段映射、submitValueId 控制提交值) - 新增 FormFieldAdapter,基于 FlexboxLayoutManager 实现两列自动换行表单,支持五种字段类型 - 新增 InboundGoodsSearchDialog(溯源码检索食材)和 InboundGoodsStoreDialog(入库录入,表单转 Map 提交) - 新增 StoreViewModel,提交接口入参改为 Map<String, Any> - 重构 StoreActivity:注入 StoreViewModel,onResume 预加载供应商/区域列表到 GlobalData - 修改 GoodsListActivity:抽取 onGoodsSearchRequested() 供子类重写 - 修改 GoodsRecognizeDialog:StoreActivity 场景下打开 InboundGoodsStoreDialog - GlobalData 新增 inboundSupplierList / inboundZoneList 全局缓存 - build.gradle.kts 新增 flexbox:3.0.0 依赖 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
488 lines
14 KiB
Markdown
488 lines
14 KiB
Markdown
# 入库系统接口文档
|
||
|
||
> 生成时间:2026-05-26
|
||
> 项目:Inbound20260114
|
||
|
||
---
|
||
|
||
## 一、通用说明
|
||
|
||
### 1.1 服务器环境
|
||
|
||
| 环境 | 地址 |
|
||
|------|------|
|
||
| 本地环境 | `http://192.168.1.201:14801` |
|
||
| 测试环境 | `https://dev.yixiong-tech.com:8083` |
|
||
| 生产环境(PROD) | `https://api.dm.yixiong-tech.com:8443` |
|
||
|
||
> 代码中使用 `GlobalData.appBaseUrl` 动态切换,启动时由设备配置决定当前所用环境。
|
||
|
||
---
|
||
|
||
### 1.2 通用请求头
|
||
|
||
以下请求头由拦截器(`RequestInterceptor`)统一注入,**无需在每个接口中单独传递**:
|
||
|
||
| Header 字段 | 说明 | 示例值 |
|
||
|---|---|---|
|
||
| `Content-Type` | 请求体格式 | `application/json` |
|
||
| `Accept` | 响应体格式 | `application/json` |
|
||
| `deviceId` | 设备唯一标识符(UUID) | `bcf396ed-78f6-3864-...` |
|
||
| `X-DEVICE-CODE` | 设备编码(同 deviceId) | `bcf396ed-78f6-3864-...` |
|
||
| `x-access-token` | 用户登录 Token(登录后获取) | `{token}` |
|
||
| `authorization` | 固定鉴权值 | `57ee87183f2a4fa59683ec9ef41c8f5d` |
|
||
|
||
> **特殊说明**:`getDeviceInfo` 接口额外通过 `@Header("X-Access-Token")` 传入设备 Token(设备初始化阶段使用,区别于用户登录 Token)。
|
||
|
||
---
|
||
|
||
### 1.3 通用响应格式
|
||
|
||
所有接口返回结构统一如下:
|
||
|
||
```json
|
||
{
|
||
"code": "00000",
|
||
"msg": "success",
|
||
"data": {}
|
||
}
|
||
```
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `code` | String | 业务状态码,`00000` 表示成功 |
|
||
| `msg` | String | 提示信息 |
|
||
| `data` | T / null | 业务数据,各接口不同 |
|
||
|
||
---
|
||
|
||
### 1.4 接口路径前缀
|
||
|
||
业务接口通用前缀(简称 `{prefix}`):
|
||
|
||
```
|
||
/terminal/neglect/inbound
|
||
```
|
||
|
||
---
|
||
|
||
## 二、接口列表
|
||
|
||
---
|
||
|
||
### 2.1 获取存储方式列表
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `GET` |
|
||
| 接口路径 | `{baseUrl}{prefix}/pad/getDictItemByF` |
|
||
|
||
**Query 参数:**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `dictCode` | String | 否 | 字典编码,固定值 `ccfs`(存储方式) |
|
||
|
||
**响应 data(`List<StorageType>`):**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | String | 存储方式 ID |
|
||
| `value` | String | 存储方式值 |
|
||
| `text` | String | 展示文本 |
|
||
| `title` | String | 标题 |
|
||
| `label` | String | 标签 |
|
||
|
||
---
|
||
|
||
### 2.2 获取物品类型列表
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `GET` |
|
||
| 接口路径 | `{baseUrl}{prefix}/pad/notLimitList` |
|
||
|
||
**Query 参数:** 无
|
||
|
||
**响应 data(`GoodsType`):**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `allType` | List\<AllType\> | 物品类型列表 |
|
||
|
||
**AllType 结构:**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | String | 类型 ID |
|
||
| `typeName` | String | 类型名称 |
|
||
| `typeCode` | String | 类型编码 |
|
||
| `ftype` | String | 父类型 |
|
||
| `superName` | String | 父类型名称 |
|
||
| `status` | Boolean | 是否启用 |
|
||
| `eaId` | Int | 企业 ID |
|
||
| `kidTypes` | List\<String\> | 子类型列表 |
|
||
| `createTime` | String | 创建时间 |
|
||
| `updateTime` | String | 更新时间 |
|
||
|
||
---
|
||
|
||
### 2.3 获取字典数据列表
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `GET` |
|
||
| 接口路径 | `{baseUrl}{prefix}/pad/dataList` |
|
||
|
||
**Query 参数:**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `type` | String | 是 | 字典类型,如仓库列表、单位类型等 |
|
||
|
||
**响应 data(`List<DictType>`):**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | String | 字典项 ID |
|
||
| `value` | String | 字典项名称/值 |
|
||
|
||
---
|
||
|
||
### 2.4 采购单入库列表
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `POST` |
|
||
| 接口路径 | `{baseUrl}{prefix}/pad/receivePage` |
|
||
| Content-Type | `application/json` |
|
||
|
||
**请求体(JSON,`Map<String, String>`):**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `pageNo` | String | 是 | 页码,从 1 开始 |
|
||
| `pageSize` | String | 是 | 每页条数 |
|
||
| *(其他筛选条件)* | String | 否 | 如供应商ID、日期范围等 |
|
||
|
||
**响应 data(`List<SupplierInfo>`):**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | String | 收货单 ID |
|
||
| `purCode` | String | 采购单号 |
|
||
| `receiveCode` | String | 收货单号 |
|
||
| `supplierId` | String | 供应商 ID |
|
||
| `supplierName` | String | 供应商名称 |
|
||
| `purchaseDate` | String | 采购日期 |
|
||
| `receiveDate` | String | 收货时间 |
|
||
| `receiveStatus` | Int | 收货状态:1-收货关闭 / 2-收货完成 / 3-待收货 / 4-部分收货 |
|
||
| `receiveUser` | String | 操作人 |
|
||
| `goodCount` | Int | 物品项数 |
|
||
| `receiveCountAll` | Double | 总收货数量 |
|
||
| `receivePriceEx` | Double | 收货金额(不含税) |
|
||
| `receivePriceIn` | Double | 收货金额(含税) |
|
||
| `taxRateAll` | Double | 税率合计 |
|
||
| `giftAll` | Double | 赠品合计 |
|
||
| `warehouseId` | String | 仓库 ID |
|
||
| `eaId` | Int | 企业 ID |
|
||
| `createTime` | String | 创建时间 |
|
||
| `updateTime` | String | 更新时间 |
|
||
|
||
---
|
||
|
||
### 2.5 采购单入库详情
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `GET` |
|
||
| 接口路径 | `{baseUrl}{prefix}/pad/receiveDetail` |
|
||
|
||
**Query 参数:**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `id` | String | 是 | 收货单 ID |
|
||
|
||
**响应 data(`PurchaseInfo`):**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | String | 收货单 ID |
|
||
| `supplierId` | String | 供应商 ID |
|
||
| `supplierName` | String | 供应商名称 |
|
||
| `purCode` | String | 采购单号 |
|
||
| `receiveCode` | String | 收货单号 |
|
||
| `receiveGoodsInfoList` | List\<GoodsInfo\> | 物品明细列表(见 **GoodsInfo 结构**) |
|
||
|
||
**GoodsInfo 结构:**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | String | 明细 ID |
|
||
| `goodId` | String | 物品 ID |
|
||
| `goodName` | String | 物品名称 |
|
||
| `unitName` | String | 采购单位名称 |
|
||
| `purchaseUnitId` | String | 采购单位 ID |
|
||
| `goodsPurId` | String | 物品采购单位关系 ID |
|
||
| `receiveCount` | Double | 应收数量 |
|
||
| `receivedNum` | Double | 实收数量 |
|
||
| `receiveCountAll` | Double | 总收货数量 |
|
||
| `recUnitPriceTaxIn` | Double | 含税单价 |
|
||
| `newRecUnitPriceTaxIn` | Double | 调整后单价(部分收货使用) |
|
||
| `recPriceExItem` | Double | 不含税金额 |
|
||
| `recPriceInItem` | Double | 含税金额 |
|
||
| `warehouseId` | String | 仓库 ID |
|
||
| `warehouseName` | String | 仓库名称 |
|
||
| `kcUnitId` | String | 库存单位 ID |
|
||
| `kcUnitName` | String | 库存单位名称 |
|
||
| `purchaseValue` | Int | 采购库存转换值 |
|
||
| `consumeValue` | String | 库存与克的转换值 |
|
||
| `goodsWeight` | BigDecimal | 物品重量(千克) |
|
||
| `goodsCount` | Double | 物品数量 |
|
||
| `goodsUnitPrice` | Double | 物品单价 |
|
||
| `goodsPrice` | Double | 物品总价 |
|
||
| `buyToInventoryValue` | String | 采购转库存换算值 |
|
||
|
||
---
|
||
|
||
### 2.6 上传单张图片
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `POST` |
|
||
| 接口路径 | `{baseUrl}/terminal/neglect/upload` |
|
||
| Content-Type | `multipart/form-data` |
|
||
|
||
**Form-Data 参数:**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `file` | File(MultipartBody.Part) | 是 | 图片文件 |
|
||
|
||
**响应 data:**
|
||
|
||
```
|
||
String // 图片访问路径(相对 URL)
|
||
```
|
||
|
||
---
|
||
|
||
### 2.7 上传多张图片
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `POST` |
|
||
| 接口路径 | `{baseUrl}/terminal/neglect/inbound/pad/inboundWeighingScale/add` |
|
||
| Content-Type | `multipart/form-data` |
|
||
|
||
**Form-Data 参数:**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `goodsId` | String(RequestBody) | 是 | 物品 ID |
|
||
| `goodsName` | String(RequestBody) | 是 | 物品名称 |
|
||
| `goodsPics` | List\<MultipartBody.Part\> | 是 | 多张图片文件列表,字段名固定为 `goodsPics` |
|
||
|
||
**响应 data:**
|
||
|
||
```
|
||
String // 操作结果
|
||
```
|
||
|
||
---
|
||
|
||
### 2.8 搜索物品列表
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `POST` |
|
||
| 接口路径 | `{baseUrl}{prefix}/pad/goodsInfoList` |
|
||
| Content-Type | `application/json` |
|
||
|
||
**请求体(JSON,`Map<String, String>`):**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `goodsName` | String | 否 | 物品名称关键词 |
|
||
| `pageNo` | String | 是 | 页码 |
|
||
| `pageSize` | String | 是 | 每页条数 |
|
||
| *(其他筛选条件)* | String | 否 | 按需传入 |
|
||
|
||
**响应 data(`SearchGoodsInfo`,分页结构):**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `current` | Int | 当前页码 |
|
||
| `total` | Int | 总记录数 |
|
||
| `size` | Int | 每页条数 |
|
||
| `pages` | Int | 总页数 |
|
||
| `records` | List\<Record\> | 物品记录列表(见 **Record 结构**) |
|
||
|
||
**Record 结构:**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | String | 物品 ID |
|
||
| `goodsCode` | String | 物品编码 |
|
||
| `goodsName` | String | 物品名称 |
|
||
| `zjmCode` | String | 助记码 |
|
||
| `specification` | String | 规格 |
|
||
| `typeId` | Int | 物品类型 ID |
|
||
| `typeName` | String | 物品类型名称 |
|
||
| `kcUnitId` | Int | 库存单位 ID |
|
||
| `kcUnitName` | String | 库存单位名称 |
|
||
| `consumeValue` | String | 库存与克的转换值 |
|
||
| `purchaseValue` | String | 采购库存转换值 |
|
||
| `unit` | String | 单位 |
|
||
| `relativeUrl` | String | 物品图片相对路径 |
|
||
| `unitVoList` | List\<UnitVo\> | 可选采购单位列表(见 **UnitVo 结构**) |
|
||
|
||
**UnitVo 结构:**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `businessUnitId` | String | 单位关系 ID |
|
||
| `purchaseUnitName` | String | 采购单位名称 |
|
||
| `buyToInventoryValue` | String | 采购转库存换算值 |
|
||
| `consumeValue` | String | 消耗转换值 |
|
||
| `purchaseValue` | Double | 购买单位对应库存数量 |
|
||
| `isDefault` | Int | 是否默认单位(1-是) |
|
||
| `value` | String | 单位展示值 |
|
||
|
||
---
|
||
|
||
### 2.9 图像识别物品列表查询
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `POST` |
|
||
| 接口路径 | `{baseUrl}{prefix}/pad/goodsList` |
|
||
| Content-Type | `application/json` |
|
||
|
||
> 用于图片识别后,根据识别到的物品名称列表批量查询物品信息。
|
||
|
||
**请求体(`RecGoodsName`):**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `nameList` | List\<String\> | 是 | 识别到的物品名称列表 |
|
||
|
||
**响应 data:**
|
||
|
||
```
|
||
List<SearchGoodsInfo.Record> // 物品记录列表(字段同 2.8 的 Record 结构)
|
||
```
|
||
|
||
---
|
||
|
||
### 2.10 自采添加新物品
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `POST` |
|
||
| 接口路径 | `{baseUrl}{prefix}/pad/goodsAdd` |
|
||
| Content-Type | `application/json` |
|
||
|
||
**请求体(`GoodsAddParam`):**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `goodName` | String | 是 | 物品名称 |
|
||
| `goodCode` | String | 否 | 物品编号(服务端自动生成) |
|
||
| `goodType` | String | 是 | 物品类型 ID |
|
||
| `storageType` | String | 是 | 存储方式 ID |
|
||
| `netRate` | Float | 是 | 净材率(0~1 之间) |
|
||
| `unitId` | String | 是 | 库存单位 ID |
|
||
| `purchaseUnit` | String | 是 | 采购单位 ID |
|
||
| `purchaseValue` | Float | 是 | 采购单位对应库存数量(转换值) |
|
||
| `purchasePrice` | BigDecimal | 是 | 采购单价 |
|
||
| `relativeUrl` | String | 否 | 物品图片相对路径 |
|
||
| `consumeValue` | String | 是 | 库存单位对应消耗值(库存与克的转换值) |
|
||
|
||
**响应 data:**
|
||
|
||
```
|
||
String // 新增物品 ID 或操作结果
|
||
```
|
||
|
||
---
|
||
|
||
### 2.11 确认收货(全部收货)
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `POST` |
|
||
| 接口路径 | `{baseUrl}{prefix}/pad/saveAndReceiveAndGoWare` |
|
||
| Content-Type | `application/json` |
|
||
|
||
**请求体(`UploadInfo`):**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `id` | String | 是 | 收货单 ID |
|
||
| `supplierId` | String | 否 | 供应商 ID |
|
||
| `purCode` | String | 否 | 采购单号 |
|
||
| `receiveGoodsInfos` | List\<GoodsInfo\> | 是 | 全部收货物品列表(字段同 GoodsInfo) |
|
||
| `receiveGoodsInfoList` | List\<GoodsInfo\> | 否 | 部分收货列表(全量收货时传空列表) |
|
||
|
||
**响应 data:**
|
||
|
||
```
|
||
Boolean // true 表示操作成功
|
||
```
|
||
|
||
---
|
||
|
||
### 2.12 自采入库
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 请求方式 | `POST` |
|
||
| 接口路径 | `{baseUrl}{prefix}/pad/selfPurchasedGoods` |
|
||
| Content-Type | `application/json` |
|
||
|
||
**请求体(`List<PurchaseWarehouseParam>`):**
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| `goodsId` | String | 是 | 物品 ID |
|
||
| `kcUnitId` | String | 否 | 库存单位 ID |
|
||
| `goodsCount` | Double | 是 | 入库数量 |
|
||
| `goodsUnitPrice` | Double | 是 | 入库单价 |
|
||
| `goodsPrice` | Double | 是 | 入库金额 |
|
||
| `goodPurId` | String | 是 | 物品采购单位关系 ID(`businessUnitId`) |
|
||
| `warehouseId` | String | 是 | 仓库 ID |
|
||
| `buyToInventoryValue` | String | 否 | 采购转库存换算值 |
|
||
| `goodsWeight` | BigDecimal | 是 | 物品重量(千克) |
|
||
| `consumeValue` | String | 否 | 库存单位对应消耗值 |
|
||
|
||
> 注:`goodsName`、`unitName`、`unitList`、`selectUnitType` 等字段为本地 UI 展示用,**不上传至服务端**。
|
||
|
||
**响应 data:**
|
||
|
||
```
|
||
Boolean // true 表示入库成功
|
||
```
|
||
|
||
---
|
||
|
||
## 三、接口速查表
|
||
|
||
| # | 接口名称 | 方法 | 路径 |
|
||
|---|----------|------|------|
|
||
| 2.1 | 获取存储方式列表 | GET | `{prefix}/pad/getDictItemByF` |
|
||
| 2.2 | 获取物品类型列表 | GET | `{prefix}/pad/notLimitList` |
|
||
| 2.3 | 获取字典数据列表 | GET | `{prefix}/pad/dataList` |
|
||
| 2.4 | 采购单入库列表 | POST | `{prefix}/pad/receivePage` |
|
||
| 2.5 | 采购单入库详情 | GET | `{prefix}/pad/receiveDetail` |
|
||
| 2.6 | 上传单张图片 | POST | `/terminal/neglect/upload` |
|
||
| 2.7 | 上传多张图片 | POST | `/terminal/neglect/inbound/pad/inboundWeighingScale/add` |
|
||
| 2.8 | 搜索物品列表 | POST | `{prefix}/pad/goodsInfoList` |
|
||
| 2.9 | 图像识别物品查询 | POST | `{prefix}/pad/goodsList` |
|
||
| 2.10 | 自采添加新物品 | POST | `{prefix}/pad/goodsAdd` |
|
||
| 2.11 | 确认收货(全部) | POST | `{prefix}/pad/saveAndReceiveAndGoWare` |
|
||
| 2.12 | 自采入库 | POST | `{prefix}/pad/selfPurchasedGoods` |
|
||
|
||
> `{prefix}` = `/terminal/neglect/inbound`
|