- 新增入库专用网络层(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>
290 lines
6.6 KiB
Markdown
290 lines
6.6 KiB
Markdown
# 入库秤设备端接口文档
|
||
|
||
**Base URL**:`http://192.168.10.101:24801/nutrition/neglect/inbound`
|
||
**鉴权**:无需 Sa-Token(Nacos 白名单 `/nutrition/neglect/**`)
|
||
|
||
| Header 字段 | 说明 | 示例值 |
|
||
|---|---|---|
|
||
| `authorization` | 固定鉴权值 | `57ee87183f2a4fa59683ec9ef41c8f5d` |
|
||
**Content-Type**:`application/json`
|
||
|
||
---
|
||
|
||
## 通用响应结构
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "success",
|
||
"data": { ... }
|
||
}
|
||
```
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| code | int | 200 成功,其他为业务错误码 |
|
||
| msg | string | 提示信息 |
|
||
| data | any | 响应数据,无数据时为 `null` |
|
||
|
||
---
|
||
|
||
## 接口列表
|
||
|
||
### 1. 按溯源码查食材
|
||
|
||
**GET** `/nutrition/neglect/inbound/ingredient-by-trace`
|
||
|
||
按溯源码反查命中的食材列表,返回食材 id、名称、净菜类型,用于毛菜/净菜入库时联动选择食材。
|
||
|
||
**Query 参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| traceCode | string | ✅ | 溯源码 |
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "success",
|
||
"data": [
|
||
{
|
||
"traceCode": "TC20240501001",
|
||
"materId": 1001,
|
||
"materName": "西红柿",
|
||
"vegTypes": "切丁,切片"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**响应字段说明**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| traceCode | string | 溯源码 |
|
||
| materId | long | 食材 id(关联 nut_mater_base.id) |
|
||
| materName | string | 食材名称 |
|
||
| vegTypes | string | 净菜类型,逗号分隔,如 `切丁,切片` |
|
||
|
||
---
|
||
|
||
### 2. 仓库区域下拉列表
|
||
|
||
**GET** `/nutrition/neglect/inbound/zone-options`
|
||
|
||
获取仓库区域选项,用于入库时选择存放区域。
|
||
|
||
**Query 参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| warehouseId | long | ❌ | 仓库 id,不传则返回所有区域 |
|
||
| keyword | string | ❌ | 关键字模糊搜索(区域编号/名称) |
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "success",
|
||
"data": [
|
||
{
|
||
"id": 101,
|
||
"zoneNo": "WH-A-01",
|
||
"zoneName": "A仓-蔬菜区-01",
|
||
"warehouseId": 10
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**响应字段说明**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | long | 区域主键 id |
|
||
| zoneNo | string | 区域编号,如 `WH-A-01` |
|
||
| zoneName | string | 区域名称,如 `A仓-蔬菜区-01` |
|
||
| warehouseId | long | 关联仓库 id |
|
||
|
||
---
|
||
|
||
### 3. 供应商下拉列表
|
||
|
||
**GET** `/nutrition/neglect/inbound/supplier-options`
|
||
|
||
获取供应商选项,内部与外部供应商合并返回。
|
||
|
||
**Query 参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| type | int | ❌ | 供应商类型:`1`-内部,`2`-外部,不传则返回全部 |
|
||
| keyword | string | ❌ | 关键字模糊搜索(供应商名称) |
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "success",
|
||
"data": [
|
||
{
|
||
"id": 201,
|
||
"name": "绿源农场",
|
||
"type": 1
|
||
},
|
||
{
|
||
"id": 202,
|
||
"name": "鲜达食品有限公司",
|
||
"type": 2
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**响应字段说明**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | long | 供应商 id |
|
||
| name | string | 供应商名称 |
|
||
| type | int | `1`-内部供应商,`2`-外部供应商 |
|
||
|
||
---
|
||
|
||
### 4. 毛菜入库提交
|
||
|
||
**POST** `/nutrition/neglect/inbound/raw-inbound`
|
||
|
||
入库秤设备提交毛菜入库记录,`opType` 由后端固定为 `1`(设备自动),无需传入。
|
||
|
||
**Request Body**
|
||
|
||
```json
|
||
{
|
||
"traceCode": "TC20240501001",
|
||
"supplierType": 1,
|
||
"materialName": "西红柿",
|
||
"supplierId": 201,
|
||
"spec": "25kg/件",
|
||
"quantity": 2,
|
||
"weight": 49.8,
|
||
"zoneId": 101,
|
||
"operator": "张三",
|
||
"storageArea": "A仓-蔬菜区-01",
|
||
"reportNo": "RPT-2024-001",
|
||
"cameraCode": "CAM-001",
|
||
"videoUrl": "http://example.com/video/001.mp4",
|
||
"remark": ""
|
||
}
|
||
```
|
||
|
||
**字段说明**
|
||
|
||
| 字段 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| traceCode | string | ✅ | 溯源码 |
|
||
| supplierType | short | ✅ | 供应商类型:`1`-内部,`2`-外部 |
|
||
| materialName | string | ✅ | 食材名称 |
|
||
| supplierId | long | ✅ | 供应商 id |
|
||
| spec | string | ✅ | 入库规格,如 `25kg/件`、`散装(kg)` |
|
||
| quantity | int | ✅ | 入库数量 |
|
||
| weight | decimal | ✅ | 入库重量(kg) |
|
||
| zoneId | long | ✅ | 存放区域 id |
|
||
| operator | string | ✅ | 操作人姓名 |
|
||
| storageArea | string | ❌ | 存放区域名称(冗余字段,可与 zoneId 对应名称一致) |
|
||
| reportNo | string | ❌ | 卫生检测报告编号 |
|
||
| cameraCode | string | ❌ | 摄像头编号 |
|
||
| videoUrl | string | ❌ | 监控视频地址 |
|
||
| remark | string | ❌ | 备注 |
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "保存成功",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 5. 净菜入库提交
|
||
|
||
**POST** `/nutrition/neglect/inbound/clean-inbound`
|
||
|
||
入库秤设备提交净菜入库记录,`opType` 由后端固定为 `1`(设备自动),无需传入。
|
||
|
||
**Request Body**
|
||
|
||
```json
|
||
{
|
||
"traceCode": "TC20240501002",
|
||
"ingredientName": "西红柿",
|
||
"cleanType": "切丁",
|
||
"spec": "袋装/500g",
|
||
"quantity": 10,
|
||
"weight": 5.0,
|
||
"inboundTime": "2024-05-01T08:30:00",
|
||
"zoneId": 102,
|
||
"operator": "李四",
|
||
"expiryDate": "2024-05-03T00:00:00",
|
||
"storageTemp": 4.5,
|
||
"cameraCode": "CAM-002",
|
||
"videoUrl": "http://example.com/video/002.mp4",
|
||
"remark": ""
|
||
}
|
||
```
|
||
|
||
**字段说明**
|
||
|
||
| 字段 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| traceCode | string | ✅ | 溯源码 |
|
||
| ingredientName | string | ✅ | 食材名称 |
|
||
| cleanType | string | ✅ | 净菜类型,如 `切丁`、`切片`(参考接口1返回的 `vegTypes`) |
|
||
| spec | string | ✅ | 入库规格,如 `袋装/500g`、`盒装/300g` |
|
||
| quantity | int | ✅ | 入库数量(包/盒/份) |
|
||
| weight | decimal | ✅ | 入库重量(kg) |
|
||
| inboundTime | datetime | ✅ | 入库时间,格式:`yyyy-MM-dd'T'HH:mm:ss` |
|
||
| zoneId | long | ✅ | 仓库区域 id |
|
||
| operator | string | ❌ | 操作人姓名 |
|
||
| expiryDate | datetime | ❌ | 保质期至,格式同 `inboundTime` |
|
||
| storageTemp | decimal | ❌ | 存放温度(℃) |
|
||
| cameraCode | string | ❌ | 摄像头编号 |
|
||
| videoUrl | string | ❌ | 监控视频地址 |
|
||
| remark | string | ❌ | 备注 |
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "保存成功",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 典型业务流程
|
||
|
||
```
|
||
设备扫溯源码
|
||
↓
|
||
GET /ingredient-by-trace?traceCode=xxx → 获取食材列表
|
||
↓
|
||
GET /zone-options → 获取区域列表
|
||
GET /supplier-options → 获取供应商列表(毛菜需要)
|
||
↓
|
||
用户确认信息 / 秤自动称重
|
||
↓
|
||
POST /raw-inbound (毛菜)
|
||
或
|
||
POST /clean-inbound(净菜)
|
||
```
|