# wms系统文档
**Repository Path**: nieps/wms-system-documentation
## Basic Information
- **Project Name**: wms系统文档
- **Description**: wms系统文档
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2025-08-05
- **Last Updated**: 2025-12-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# WMS系统
面试问题:
* 软件开发流程是什么?
>
* 项目中有几个人开发?
> 3~4人
>
> 后端: 最少2人 我们也写中后台 理想:1+1+2 高级开人员+中级+初级
>
> 前端:app 小程序 h5 (混合开发) uniapp 1~2人
>
> 测试人员
>
> UI设计师、美工
>
> 技术架构:一般指后端
>
> 产品经理: 根据客户需求设计原型 (原型工具: axure | 墨刀)
>
> 技术经理(高级开发人员)
>
> 项目经理(协调客户与开发人员 )
* 你做为开发人员,与测试人员、产品经历有什么矛盾没有?如何解决
## 项目管理工具
1. 早期项目管理 计划进度表
> 如到货登记: 开发时间 自己预估的时间上\* 1.5/2/3
>
> 数据库设计:2h
>
> 接口实现:3h
>
> 页面排版:2h
>
> 绑定接口实现交互:3h
>
> 10h*1.5 = 15h===2个工作日
>
> 开发时间:
>
> * 需求分析时间 很长 2个月
> * 开发时间 1 个月
> * 测试 修复bug 1~2个月
2. 项目管理工具
> * jira
> * teambition
> * 禅道 http://192.168.20.72:8088/zentao/user-login.html admin/Admin1357
>
> 云项目管理:
>
> * 阿里云
> * 腾讯 https://coding.net/company/about
## 仓储作业

## OMS
跨境ERP
## WMS
WMS,也就是仓库管理系统,堪称仓库管理的“大脑”。它的**核心使命是帮助企业高效管理仓库库存,确保商品从入库到出库的每个环节都井然有序**。

## 数据库设计
一般表中要有常用字段:
* 创建时间 createTime
* 创建人 createUserId
* 更新时间 updateTime
* 更新人 updateUserId
* 逻辑删除 isdel 0未删除 1已删除
## 系统设置
* 类别表 id 名称 上级id 排序
* 产品 类别id
> 设计冗余字段: 类别名称
* 库管: 库管员 登录手机号 常用字段 状态 密码(初始密码) 难点: 授权时 库官对应---(仓库/库区)
> 第三方表: 库管仓库表 : 库管人员id 库区编码
>
> A001-001
## 到货管理
* 到货登记单
* 到货登记明细
## 入库任务单
* 入库单
* 入库明细
## 数据库账号
~~~mysql
#创建数据库
create database wms;
#创建账号
create user 'wms2'@'%' identified by '1357';
#授权
grant all privileges on wms.* to 'wms2'@'%';
#提交
commit;
~~~
## 类别
> id name cid
>
> 1 苹果 3
>
> 2 香蕉 3
id=1的是水果 ----该类别有一个父类 水果类 1
编码:
> 10 家用电器
>
> > 1001 电视
> >
> > > 100101 游戏电视
> > >
> > > .....
> >
> > 1002 空调
> >
> > ....
>
> 11 手机
>
> 12 家具
> id 名称 类别编码
>
> 1 xxx 100101
>
> 2 bxxx 100101
10%
物料的编码: 类别编码+物料序号
1001001 1001002
## 物料 管理
* 新增物料 区分类别 编码建议自动生成 (1001)
> 查询类别1001下有没有物料,如果没有 第一个物料的编码 10010001
>
> 如果有如1001003 ----新编码在些基础上加1
* 查询物料 必传条件:类型 是产品还是商品 分页显示
* 更新功能
* 删除功能
* 设置库存 必传物料 id , 根据id查询物料库存表中是否有记录,如果没有,插入库存 ,如果有 直接更新
## 8月7日
* 自动触发
> 1. 保存
>
> 2. 查询
>
> > 返回的数据 :
> >
> > 1. 返回 数组
> >
> > ~~~json
> > [
> > {type:1,categoryCodes:[]},
> > {type:2,categoryCodes:[]},
> > ]
> > ~~~
> >
> >
>
>
* 分页
>
* 动态编码
> 1. 如果父id是0 说明添加的是一级编码
>
> > 逻辑:
> >
> > 1. 先查询父id为0的 最大编码 ,如果不存在,编码默认是10 ,如果存在(假如是16,新的编码17),在已有编码的基础上加1
>
> 2. 如果父id不为0,假如为1
>
> > 逻辑: 查询 父id为1的最大编码 ,如果不存在 (查询id=1的编码如10),则第一个子类的编码 1001 ; 如果存在,现有的编码基础上加1
### 编码规则
前缀+日期+序号
按日归零:
> DH20250808001 ...002 ...
>
> 明天 :DH20250809001
按月归零:
> DH202508001
按年归零:
> DH2025001
## 8月11号
### 采购
采购单、采购明细 正常应该在scm供应链系统 (另外一个服务器的接口)
接口:
* 采购单列表 (采购日期倒序排序 )分页 多条件
* 采购单详情
* 新增采购单(接口) 不用写页面,模拟能过接口添加数据
### 编码:前缀+日期+序号
CG25001
默认将最大编码存储内存中。
产生新的编码:
1. 判断内存中是否有最大编码,如果没有 查询,存储到内存中
2. 获取系统年份 判断年份与最大编码是否是同一年,如果是同一年 序号+1
3. 如果不是同一年,直接根据年份产生新的编码
### 质检
在到货记录----增加按钮(质检) ,点击质检 -----质检列表 ,填写

质检日期
* 保存质检 结果
### 出库
有共同的属性,也有不同的属性,设计方案:
* 主表+子表实现
> 主表:设计共有的字段
>
> 子表:设计 个性字段
* json 格式
> 存储不同的字段 extrea_info json
>
> * {"purchaseCode":"cg001", "supplier":"sss"}
> * {"warmarea":"aa", "num":100}
方案:
* 出库单 主表+子表 1+4
* 出库单明细 1张表 + 个性字段 用 json格式 存
## 8月12号

实现入库单列表如下入库物品描述:
* 在入库单表 增加一个字段 入库物品(根据明细按照上面的规则 拼接成字符串)
* 如果前期没有增加 对应字段 也可以查
~~~sql
select t.id,t.arrivalCode,t.purchaseCode,t.supplier,(select GROUP_CONCAT(CONCAT(d.productName,'(',d.spec,')X',d.inNum,d.unit) SEPARATOR ';') from b_stock_in_task_detail d where d.taskId=t.id) '物品' from b_stock_in_task t ;
#使用视图简化
select t.id,t.arrivalCode,t.purchaseCode,t.supplier,s.note from b_stock_in_task t JOIN v_stock s on t.id=s.taskId ;
#mysql字符串函数 concat
select CONCAT(d.productName,'(',d.spec,')X',d.inNum,d.unit) from b_stock_in_task_detail d where d.id=1;
#根据任务id查询
select CONCAT(d.productName,'(',d.spec,')X',d.inNum,d.unit) from b_stock_in_task_detail d where d.taskId=1;
#用group_concat 合并多行 多行 之间用,隔开
select GROUP_CONCAT( d.productName) from b_stock_in_task_detail d where d.taskId=1;
#指定分隔符
select GROUP_CONCAT( d.productName SEPARATOR ';') from b_stock_in_task_detail d where d.taskId=1;
#嵌套函数
select d.taskId,GROUP_CONCAT(CONCAT(d.productName,'(',d.spec,')X',d.inNum,d.unit) SEPARATOR ';') from b_stock_in_task_detail d GROUP BY d.taskId;
#视图view 虚拟表
create view v_stock as select d.taskId,GROUP_CONCAT(CONCAT(d.productName,'(',d.spec,')X',d.inNum,d.unit) SEPARATOR ';') as note from b_stock_in_task_detail d GROUP BY d.taskId;
~~~
### 报表下载
* 定时任务 spring task 在指定 时间内执行任务
* 任务是 : 查询最近7天的 出库明细 ,然后导出为excel EasyExcel ,将excel文件存储到服务器 ,然后将服务器地址 存储到表中
> 难点:
>
> 最近7天怎么查?
>
> 用到日期函数:
>
> ~~~sql
> #现在购买一个月会员 用户表中有一个字段:会员到期日
>
> select CURRENT_DATE(),DATE_ADD(CURRENT_DATE(),INTERVAL 1 MONTH);
>
> #查最近7天
> select CURRENT_DATE,DATE_SUB(CURRENT_DATE,INTERVAL 6 DAY);
> ~~~
>
>
CDZC-A-U-...
## 8月13号
库存盘点:
* 由盘点人员 核实实际商品数量与 库存数量
> 苹果: 10
>
> 盘点结果:
>
> * 10 个 正常
> * 12 个 盘赢 ----> 盘赢入库 2 ---12
> * 8个 盘亏 ------> 盘亏出库2 ---8
## 8.14号
### 批次管理
当到货时,同一批物料 是同一个批次号,保存到货单和到货明细后(假如有5条明细),在批次管理中批量插入数据(5条 对应5条物料 ):批次号相同 供应商id 物料
发现没有值: 生产日期 质检状态 入库时间
* 质检状态 到货质检修改状态
* 生产日期 入库时填写日期
* 入库时间 入库时填写
入库时: 更新批次里生产日期 入库时间 ,同时 在物料库区库存表 插入记录 ,不要忘记更新 物料库存表(库存数量 可用数量 +)
## 8月19号
路由的两个函数:
* useRouter 返回的路由实例 用于跳转
* useRoute 返回路由参数
> 
>
>
push方法:
~~~javascript
// 字符串
router.push('home')
// 对象
router.push({ path: 'home' })
// 命名的路由
router.push({ name: 'user', params: { userId: '123' }})
// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
~~~
### 新增到货单
* 保存到货单 自动生成到货单编码
* 保存到货明细
* 保存对应明细 待 质检信息
* 生产批次号
* 调用采购入库任务单接口 ,生成入库任务单
## 8.20
到货单:
* 到货状态 1 未到货 2 部分到货 3 全部到货
### 入库
* 批量入库
> 遍历入库任务明细:
>
> 一个物料入库:
>
> 1. 根据批次号和物料id 更新批次表:生产日期 供应商 入库时间
> 2. 在物料库区库存表中 插入 批次id(决定唯一 的批次号和物料id) 库存数量 可用数量 冻结数量
> 3. 更新物料 库存表 库存数量 可用数量
* 单个物料 入库
## 8月21
到货质检:
* 查询质检列表 (根据到货单id查询 )
* 保存 更新质检信息
* 上传质检报告 (在到货质检结果 表中记录下来) 针对到货单
* 保存评论 ---(根据质检id 查询 如果存在评论更新 不存在新增)
### 移动端
采购入库:
* 查询采购入库任务单 返回未完全入库的
> 
>
> 返回:供应商id 入库任务单id
* 根据任务id查询明细 (未完全入库的)
* 单个商品入库
A001-01-02
### css定位
position定位:
* absolute 绝对 定位
* fixed 固定位置
* relative 相对定位
| 定位方式 | 是否占空间 | 定位基准 | 适用场景 |
| ---------- | ---------- | ---------------- | ------------------------------ |
| `relative` | 是 | 自身原有位置 | 微调元素位置、作为绝对定位容器 |
| `absolute` | 否 | 最近的已定位祖先 | 相对于父元素精确定位 |
| `fixed` | 否 | 浏览器视口 | 固定导航、悬浮按钮等 |
## 8月25
主表+子表+明细表
> 主表和子表:一对一 共用主键 (任务单)
>
> 任务单----明细: 一对多
>
> 明细----出库记录: 一对多
出库任务单:
* 新增
> 1. 保存任务单 (主+子 表 )
>
> 2. 保存任务明细
>
> 3. 是否要冻结库存
>
> > 与出库明细对应:
> >
> > 明细A: ---(根据出库原则冻结FIFO)-- 将指定的批量 数量冻结 (记录冻结 记录 出库是根据冻结记录直接出库)
> >
> > ----总的物料库存 冻结
* 查看 列表
* 查看详情
把表格梳理一 遍,所有涉及到物料信息时都要物料id
## 8月26
调拨:
* 调拨记录 (发起了申请 )
> 1. 调拨单 记录 涉及的仓库及操作人 相关信息
> 2. 调拨明细 记录调拨的商品及数量
* 审批
> 1. 记录审批结果
>
> 2. 审核通过后
>
> > 1. 生成调拨出库任务单 库存数量的冻结等相信息 -----办理出库
> > 2. 生成调拨入库任务单 ----收货 ------办理入库
* 调拨单列表 多条件 分页 一个接口
* 调拨单详情
* 删除 逻辑删除 无法查看
* 关闭 不需要审核 但能查看
调拨操作记录表: 1 制单 2 审核 3 调出 4 调入 5取消
## Token
常用种认证方式:
* **Basic Auth** 基础认证 每次请求携带用户名和密码 (很少用)
* Cookie认证 (会话技术: session 服务器端会话 cookie是客户端会话) (不用)
> 最早jsp时代:
>
> * 登录 保存登录人的信息
> * 购物车
* token 认证 令牌 通俗理解:就是一个特殊的 加密过的 字符串 (解密),里面包含用户相关的信息 (常用)
* oauth2 授权认证 搭建平台用的
token: 用户id 用户名 角色 权限 部门 岗位
## 盘点
* 按货架盘点
* 按物品盘点
> 要求都要生成盘点任务、盘点明细
盘点任务(按区):
* 按任务id查询 盘点任务涉及到的库区 (taskid type=1)
* 按任务id 库区id 查询任务中涉及到的货位 (taskid type=2 库区id=当前库区)
* 按任务id 货位id 查询要盘点的物料
* 列表展示: 按任务id查询所有的 物料
保存盘点任务:
* 保存任务单
* 保存明细
> 1. 遍历库区
>
> > 在库区的基础上 ,遍历对应的货位
> >
> > > 查询该货位下的物料
## 调拨单
* 调拨单----一对多-----调拨明细
* 审核
> 调拨出库任务单------多条明细--------锁定库存(对应库区 货位 哪些批次---对应批次的数量)
>
> > 原仓库管理人员: -----办理出库 ----扣减库存
>
> 调拨入库任务单------多条明细
### 调拨入库单
* 新增
> 1. 调拨单
> 2. 调拨明细
* 列表 多条件 分页
* 入库单收货
> 1. 如果收货数量与调拨数量 一致 更改收货状态 为已收货
> 2. 如果收货数量小于调拨数量 更改收货状态 为部分收货
> 3. 如果收货数量大于调拨数量 提示收货失败---数量不对
* 调入处理列表 罗列具体的调拨明细
* 导出
* 业务处理
> 1. 5种处理类型,要求根据不同的处理类型,实现不同的处理结果
> 2. 记录处理日志
* 根据入库明细 查询 处理日志记录
测试:
调拨单:id=3
调拨明细:2条
> 1. 物料id=2 数量10----- 物料库存 冻结数量0----10 可用数量 100---90 批次p2508001 够了 可用数量变为0
>
> 2. 物料id=3 数量5 ------ 物料库存 冻结数量0----20 可用数量 200---180
>
> 批次p2508001 ---扣减10个
>
> 批次p2508002 ---扣减10个
## Vue3打印
在 Vue3 项目中,实现打印功能常用的插件有`vue3-print-nb`和`print-js`。下面分别介绍这两个插件的使用方法:
### 1. vue3-print-nb
这是一个专为 Vue3 设计的打印插件,使用简单,支持局部打印。
**安装:**
```bash
pnpm add vue3-print-nb
```
**全局注册(main.js):**
```javascript
import { createApp } from 'vue'
import App from './App.vue'
import print from 'vue3-print-nb'
const app = createApp(App)
app.use(print)
app.mount('#app')
```
**组件中使用:**
```vue
```
### 2. print-js
这是一个更通用的打印库,不仅支持 Vue,还支持其他框架。
**安装:**
```bash
pnpm add print-js
```
**组件中使用:**
~~~vue
订单详情
| 商品 |
价格 |
数量 |
| 商品1 |
¥100 |
2 |
| 商品2 |
¥200 |
1 |
~~~
选择建议
- 如果只需要简单的局部打印功能,`vue3-print-nb` 更适合 Vue3 项目,使用更简洁
- 如果需要打印 PDF、图片等多种类型,或者需要更丰富的配置选项,`print-js` 功能更全面
# 前端
> 现有的中后台,若依
## 准备
~~~shell
#安装pnpm
npm install -g pnpm
#查看帮助
pnpm --help
#安装依赖
pnpm i #install
#运行
pnpm dev
~~~
## `husky` 是什么?可以删除 `husky` 提交前校验吗?如何彻底删除?
- `husky` 是什么?
答:[官方文档(opens new window)](https://typicode.github.io/husky/#/)
- 可以删除 `husky` 提交前校验吗?
答:如果您们提交代码不需要严格的提交前校验,这当然可以删除
- 如何彻底删除?
① 删除根目录 `.husky` 文件夹以及里面所有文件
② 删除根目录 `commitlint.config.js` 文件
③ 来到 `package.json` 下的 `devDependencies` ,删除 `@commitlint/cli` 、 `@commitlint/config-conventional` 、 `@commitlint/types` 、 `husky` 、 `lint-staged` 这些依赖
④ 最后来到 `package.json` 下的 `scripts` ,删除 `"prepare": "husky"` 命令即可
## 关闭eslint代码检查
找到eslint.config.js文件,增加如下:

# 移动端
## 准备
~~~shell
#创建工程
pnpm create vue@latest
#创建后 安装依赖
pnpm i
#运行
pnpm dev
~~~
## 编写移动的问题?
如何适应移动端的屏幕大小 ?
### 单位
> 微信小程序:rpx
* rem 相对单位 相对于根元素字体大小
> html font-size:100px 1rem=100px
* em 用的相对少 相对于父元素大小 设置的
### 换算
页面设计:750稿 750px ---7.5rem
核心js:
#### 参考一
~~~javascript
(function(doc, win) {
var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
recalc = function() {
var clientWidth = docEl.clientWidth;
if (!clientWidth) return;
if (clientWidth >= 750) {
docEl.style.fontSize = '100px';
} else {
docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
}
};
if (!doc.addEventListener) return;
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);
~~~
#### 参考二
~~~javascript
(function(w, d) {
function setSize() {
var screenWidth = d.documentElement.clientWidth;
var currentFontSize = screenWidth * 100 / 750; // 750 是设计稿的宽度
d.documentElement.style.fontSize = currentFontSize + 'px';
}
w.addEventListener('resize', setSize);
w.addEventListener('pageshow', setSize);
w.addEventListener('DOMContentLoaded', setSize);
})(window, document);
~~~
### UI
[Vant](https://develop365.gitlab.io/vant/zh-CN/home/)
~~~shell
#安装依赖
pnpm add vant
~~~
在main.js引入公共样式:
~~~javascript
// 引入vant组件样式
import 'vant/lib/index.css';
~~~
按需引入:
~~~vue
import { showToast } from 'vant';
~~~
# 知识参考
## WMS常见术语
以下是常见的 **WMS(仓储管理系统)术语** 及其解释,涵盖业务流程、功能模块、技术应用等维度,帮助你快速理解仓储管理领域的核心概念:
### **一、基础概念类**
1. **仓储管理系统(WMS,Warehouse Management System)**
- 用于管理仓库日常操作(如入库、出库、库存管理、拣货、盘点等)的软件系统,通过优化流程提高仓储效率和准确性。
2. **仓库(Warehouse)**
- 用于存储、保管货物的场所,可分为原材料仓、成品仓、中转仓等类型。
3. **库存(Inventory)**
- 仓库中所有物料、半成品、成品的总和,包括在途库存、在制品库存等状态。
4. **SKU(Stock Keeping Unit)**
- 库存保有单位,用于唯一标识一种商品或物料(如某品牌某规格的洗发水)。
5. **BOM(Bill of Materials)**
- 物料清单,记录产品所需零部件、原材料及其数量的结构表,常用于生产型仓储的领料管理。
### **二、业务流程与操作术语**
1. **入库(Receiving/Inbound)**
- 货物从供应商或外部运输到仓库并完成验收、上架的过程,包括采购入库、退货入库、调拨入库等。
2. **出库(Shipping/Outbound)**
- 货物从仓库发出的过程,包括销售出库、生产领料、调拨出库、报废出库等。
3. **拣货(Picking)**
- 根据订单需求从存储区域提取货物的操作,常见方式包括:
- **单品拣货**:按单个 SKU 拣选。
- **批量拣货**:一次拣选多个订单的同类货物,再分拣至各订单。
- **波次拣货(Wave Picking)**:按订单属性(如区域、优先级)分组批量拣货,提高效率。
4. **上架(Putaway)**
- 将入库货物放置到指定库位的操作,需结合库位管理策略(如分类存放、周转率优先)。
5. **盘点(Inventory Count)**
- 定期或不定期对仓库实物库存进行清点,核对系统数据与实际库存的差异,分为全盘、抽盘、循环盘点等。
6. **补货(Replenishment)**
- 当拣货区库存不足时,从存储区向拣货区补充货物的过程,确保拣货效率。
7. **调拨(Transfer)**
- 货物在不同仓库、库位或部门之间的转移,如跨仓调拨、库位调整。
8. **退货管理(Return Management)**
- 处理客户退货的流程,包括验收、质检、入库(良品)或报废(不良品)。
### **三、库位与存储管理**
1. **库位(Location)**
- 仓库内用于存储货物的具体位置,通常用唯一编码标识(如 A-01-05 表示 A 区第 1 货架第 5 层)。
2. **库区(Zone)**
- 仓库内按功能或属性划分的区域,如:
- **待检区**:存放待验收货物。
- **合格品区**:存放合格库存。
- **不合格品区**:存放待处理的不良品。
- **拣货区**:用于订单拣选的高频库存区域。
- **存储区**:用于长期存放的低频库存区域。
3. **货位分配策略(Slotting Strategy)**
- 确定货物存放位置的规则,常见策略包括:
- **周转率优先**:高频出货的 SKU 存放在靠近出入口或拣货区的库位。
- **相关性原则**:经常同时销售的商品就近存放。
- **体积 / 重量原则**:大件、重物存放在低楼层或易搬运的库位。
4. **托盘(Pallet)**
- 用于集装、堆放货物的水平平台装置,便于叉车搬运,常见尺寸有 1200mm×1000mm(欧标)、1100mm×1100mm(日标)等。
5. **货架(Racking)**
- 仓库内用于存放货物的架子,类型包括:
- **托盘货架**:存放托盘货物的重型货架。
- **阁楼货架**:分层结构,用于存放中小件货物。
- **流利式货架**:利用重力实现先进先出(FIFO)的拣货货架。
### **四、技术与系统功能**
1. **条形码(Barcode)**
- 用线条和空白组成的编码,用于快速标识商品信息,通过扫码枪读取数据(如 EAN-13、UPC 码)。
2. **RFID(Radio Frequency Identification)**
- 无线射频识别技术,通过电子标签(RFID 标签)非接触式读取货物信息,适用于高速盘点和追踪。
3. **波次管理(Wave Management)**
- 将多个订单按规则(如时间、区域、优先级)分组为 “波次”,统一执行拣货、复核等操作,提升批量处理效率。
4. **库存周转率(Inventory Turnover Rate)**
- 衡量库存流动性的指标,计算公式:库存周转率 = 销售成本 / 平均库存余额,反映库存管理效率。
5. **先进先出(FIFO,First In First Out)**
- 一种库存管理原则,先入库的货物优先出库,适用于对保质期敏感的商品(如食品、药品)。
6. **后进先出(LIFO,Last In First Out)**
- 后入库的货物优先出库,适用于价格波动较大或需优先处理最新批次的场景(需符合会计准则)。
7. **ABC 分类法(ABC Analysis)**
- 根据库存价值将 SKU 分为三类:
- **A 类**:高价值、低数量(占库存价值 70%~80%,数量占 10%~20%)。
- **B 类**:中价值、中数量(占库存价值 15%~20%,数量占 20%~30%)。
- **C 类**:低价值、高数量(占库存价值 5%~10%,数量占 50%~70%),用于差异化管理。
8. **预警管理(Alert Management)**
- 系统自动触发的异常提醒,如库存低于安全库存、保质期临近、订单超时未处理等。
### **五、绩效与策略**
1. **订单履行率(Order Fulfillment Rate)**
- 按时交付的订单数量占总订单数量的比例,衡量仓储对订单的处理能力。
2. **拣货准确率(Picking Accuracy)**
- 正确拣货的订单数量占总拣货订单数量的比例,反映拣货操作的准确性(通常要求 99% 以上)。
3. **库存准确率(Inventory Accuracy)**
- 系统库存与实物库存一致的比例,计算公式:(1 - 差异数量 / 总库存数量)× 100%。
4. **安全库存(Safety Stock)**
- 为应对需求波动或供应延迟而预留的库存,用于防止缺货。
5. **JIT(Just-In-Time)**
- 准时制库存策略,追求零库存或最小库存,通过精准计划实现 “按需供货”,减少库存成本。
### **六、其他相关术语**
1. **TMS(Transportation Management System)**
- 运输管理系统,与 WMS 对接实现仓储与运输的无缝协同(如出库后自动规划物流路线)。
2. **OMS(Order Management System)**
- 订单管理系统,接收前端订单并传递至 WMS 执行仓储操作。
3. **WCS(Warehouse Control System)**
- 仓储控制系统,连接 WMS 与自动化设备(如 AGV、堆垛机),实现设备调度和作业执行。
4. **自动化立体库(AS/RS,Automated Storage and Retrieval System)**
- 利用自动化设备(如堆垛机)实现货物存储和 retrieval 的高架仓库,提升空间利用率和效率。
如果需要进一步了解某个术语的具体应用场景或系统功能,可以随时补充说明!
## 库存盘点
在仓储管理系统(WMS)中,**库存盘点**是确保实际库存与系统记录一致的关键操作,目的是及时发现并纠正库存差异(如数量不符、货位错误、物品损坏等),保障库存数据的准确性,为采购、销售、生产等环节提供可靠依据。
### 一、WMS 库存盘点的核心目标
1. **账实一致**:核对系统记录的库存数量、规格、批次等信息与实际仓储物品是否匹配。
2. **发现问题**:识别库存管理中的漏洞(如错发、漏发、盗窃、损坏等)。
3. **数据修正**:通过盘点结果更新 WMS 系统数据,确保后续操作(如出库、调拨)的准确性。
4. **合规审计**:满足财务核算、行业监管对库存数据的合规性要求。
### 二、WMS 支持的盘点方式
根据业务需求和盘点范围,WMS 通常支持以下几种盘点方式:
| 盘点方式 | 特点 | 适用场景 |
| ---------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 全盘(全面盘点) | 对仓库内所有物品进行逐一清点,覆盖范围最广。 | 月末、年末财务结算;年度审计;库存差异较大时的彻底核查。 |
| 抽盘(抽样盘点) | 随机或有针对性地选取部分物品、货位进行盘点,效率较高。 | 日常库存监控;验证近期出入库操作的准确性;重点核查高价值或易损耗物品。 |
| 循环盘点 | 按计划分批次、周期性对不同区域或物品进行盘点(如每周盘点 1/5 货位)。 | 替代全盘的高频次盘点;维持日常库存准确性;适合大型仓库的持续库存管理。 |
| 动态盘点 | 结合出入库操作实时盘点(如出库时核对剩余数量)。 | 高周转率物品的日常管理;减少专门盘点的停机时间,适合连续生产的仓库。 |
| 盲盘 | 盘点时不显示系统记录数量,仅记录实际数量后再与系统比对。 | 避免盘点人员受系统数据干扰,提高盘点客观性(如第三方审计场景)。 |
### 三、WMS 库存盘点的操作流程
1. **盘点计划创建**
- 在 WMS 中设定盘点范围(如仓库、货位、物品类别)、时间、参与人员。
- 可选:冻结盘点范围内的物品出入库操作(避免数据变动影响盘点结果)。
2. **盘点任务下发**
- WMS 生成盘点清单(含物品编码、名称、系统库存数、货位等信息),通过 PDA、纸质单据或系统界面下发给盘点人员。
3. **实际清点与记录**
- 盘点人员到指定货位清点物品,记录实际数量、批次、状态(如完好、损坏)等信息,通过 PDA 实时上传至 WMS,或录入系统。
- 支持多单位盘点(如箱 / 个)、批次管理(如生产日期、保质期)、序列号管理(如电子设备的唯一序列号)。
4. **差异比对与确认**
- WMS 自动比对实际数量与系统库存数,生成 “盘点差异表”,标注差异物品(如盘盈、盘亏、货位错误)。
- 对差异项进行二次复核(避免误盘),确认差异原因(如录入错误、实际损坏、系统漏记等)。
5. **差异处理与数据更新**
- 经审批后,WMS 根据盘点结果执行 “调账” 操作:盘盈时增加系统库存,盘亏时减少系统库存,并记录差异原因(作为后续分析依据)。
- 同步更新物品货位信息(如发现物品放错货位,自动修正货位关联)。
6. **盘点报告生成**
- WMS 输出盘点报告,包含盘点完成率、差异率、差异明细、原因分析等数据,供管理层复盘和优化库存管理流程。
### 四、WMS 在盘点中的核心功能支持
- **条码 / RFID 集成**:通过扫描物品条码或 RFID 标签快速识别物品,减少人工录入错误。
- **实时数据同步**:PDA 盘点数据实时上传至 WMS,避免纸质记录的二次录入误差。
- **差异预警**:自动标记超阈值的差异项(如盘亏数量超过 5%),提醒优先处理。
- **历史记录追溯**:保存每次盘点的时间、人员、差异原因等日志,支持后续查询和审计。
- **多维度分析**:通过 WMS 报表分析差异趋势(如某类物品频繁盘亏),定位管理问题(如货位规划不合理、出入库流程漏洞)。
### 五、常见问题与解决建议
1. **差异率过高**
- 原因:出入库操作不规范(如错扫、漏扫)、货位管理混乱、系统数据未及时更新。
- 建议:加强员工操作培训;优化货位标识(如清晰的条码 / 二维码);启用 WMS 的实时库存更新功能。
2. **盘点效率低**
- 原因:盘点计划不合理(如高峰时段盘点)、依赖纸质记录、人员不熟悉流程。
- 建议:采用循环盘点替代全盘;使用 PDA 实时采集数据;通过 WMS 路径优化功能规划盘点路线(减少无效移动)。
3. **盘点与业务冲突**
- 原因:全盘时冻结库存导致出入库停滞,影响生产或销售。
- 建议:采用动态盘点或分时段盘点;对紧急出入库物品单独标记,盘点后优先处理差异。
通过 WMS 的系统化管理,库存盘点从传统的人工主导转变为流程化、数字化操作,既能提高盘点效率,又能通过数据追溯持续优化库存管理,是现代仓储精细化运营的核心环节之一。
## 盘亏与盘赢:库存管理中的核心差异概念
#### **一、盘亏(Inventory Shrinkage)**
**定义**:
盘亏指**实际库存数量小于系统账面库存数量**的情况,即实物短缺。这是仓储管理中常见的异常状态,需及时追溯原因并处理。
##### **常见原因**
1. **操作失误**:
- 入库时漏记、错记数量(如供应商送货数量与单据不符,未及时核对)。
- 拣货或出库时多发货、发错货,未更新系统库存。
- 库内移库后未同步更新库位信息(如货物从 A 库位移至 B 库位,但系统仍记录在 A 库位)。
2. **损耗与报废**:
- 货物因存储环境问题(如潮湿、高温)损坏或过期,未及时报损处理。
- 易碎品、液体类商品在搬运中意外破损,未记录。
3. **盗窃或挪用**:
- 仓库内人员违规取用货物未登记(尤其高价值商品,如电子产品、奢侈品)。
4. **系统漏洞**:
- WMS 系统故障导致数据未同步(如网络延迟、软件 BUG)。
- 多系统对接时数据传输错误(如 ERP 与 WMS 库存数据不一致)。
##### **影响**
- **财务失真**:导致成本核算错误,利润虚高或虚低,影响财务报表准确性。
- **订单履约风险**:账面库存显示有货,但实际无货,导致客户订单延迟或取消,影响信誉。
- **供应链紊乱**:误导采购计划(如因盘亏未及时补货,导致缺货停产)。
##### **处理流程**
1. **确认差异**:
- 复盘盘点过程,排除盘点误差(如重复盘点、漏盘)。
- 重新核对出入库单据、库位移动记录,确认实际库存是否真的短缺。
2. **追溯责任与原因**:
- 调取监控录像(如有)查看异常时段操作,排查是否人为失误或盗窃。
- 检查仓储流程薄弱环节(如入库验收是否严格、拣货复核是否到位)。
3. **系统修正与报损**:
- 经审批后,在 WMS 中调减账面库存,记录盘亏数量及原因(如 “拣货多发”“货物破损”)。
- 涉及报废的货物,需走报废流程并申报税务处理(如进项税转出)。
4. **流程优化**:
- 针对高频盘亏点加强管控(如增加复核环节、优化库位标识)。
- 对责任人员进行培训或调整岗位(如拣货员操作不规范导致多发)。
#### **二、盘赢(Inventory Overage)**
**定义**:
盘赢指**实际库存数量大于系统账面库存数量**的情况,即实物多余账面记录。虽然看似 “有利”,但同样是库存管理异常的信号。
##### **常见原因**
1. **操作失误**:
- 入库时多记数量(如供应商实际送货 101 件,单据误记为 100 件,系统按 100 件录入)。
- 退货处理不当(如客户退货已收讫,但未在系统中恢复库存)。
- 出库时少发货(如订单需发 5 件,实际发 4 件,系统按 5 件扣减库存)。
2. **系统误差**:
- 盘点时重复扫描同一货物(如 PDA 设备故障导致同一商品多次记录)。
- 历史数据调整未同步(如以前年度盘亏未完全处理,遗留差异)。
3. **供应链异常**:
- 供应商超额供货未察觉(如误将其他客户订单混入本次发货)。
- 运输途中意外拾得货物(如相邻订单货物混装,仓库误收)。
##### **影响**
- **数据误导**:虚增库存可能导致采购决策失误(如本无需补货却重复采购,占用资金)。
- **合规风险**:盘赢若涉及供应商多供货未及时退回,可能引发法律纠纷或商业信誉损失。
- **流程隐患**:掩盖真实问题(如长期盘赢可能源于入库验收不严格,导致后续持续错漏)。
##### **处理流程**
1. **确认差异真实性**:
- 重新盘点并核对出入库记录,排除盘点操作错误(如计数错误、设备故障)。
- 检查是否存在未登记的退货、暂存货物或供应商多送货情况。
2. **追溯来源**:
- 联系供应商核实是否超额发货,或与客户确认是否存在未结退货订单。
- 排查历史单据,确认是否因前期操作错误(如出库少扣库存)积累导致。
3. **系统修正与账务处理**:
- 若属于供应商多供货,协商退回或补录采购订单(需供应商确认)。
- 若属于历史操作错误,调整对应期间的库存数据(如冲减前期盘亏记录)。
- 无明确来源的盘赢,需按 “无主物资” 流程申报,经审批后计入 “待处理财产损益” 科目。
4. **预防措施**:
- 加强入库验收环节(如双人核对数量、扫码实收)。
- 规范退货流程(退货需系统登记并同步库存)。
- 定期校验系统数据与实物的一致性,避免差异累积。
#### **三、盘亏与盘赢的管理要点**
| **维度** | **盘亏** | **盘赢** |
| ------------ | ------------------------------ | ---------------------------------- |
| **核心原则** | 优先追溯短缺原因,避免损失扩大 | 优先确认多余库存来源,避免数据失真 |
| **流程重点** | 追责、止损、优化防损机制 | 溯源、合规处理、修正流程漏洞 |
| **KPI 关联** | 库存准确率、损耗率 | 库存准确率、供应商交货准确率 |
| **技术工具** | WMS 差异报警功能、监控系统 | 智能验收系统(如称重、扫码实收) |
##### **关键行动建议**
1. **建立预警机制**:
- 在 WMS 中设置盘亏 / 盘赢阈值(如差异率>0.5% 时自动触发报警),实时监控异常。
2. **ABC 分类管理**:
- 对高价值 A 类商品严格管控,高频盘点(如每日循环盘点),降低盘亏风险;对 B/C 类商品定期抽盘,避免盘赢积累。
3. **人员考核挂钩**:
- 将库存准确率纳入员工绩效,对持续低差异率的团队给予奖励,对人为失误导致的差异追责。
4. **定期复盘**:
- 每月汇总盘亏 / 盘赢数据,分析趋势(如某库区高频盘亏可能因库位设计不合理),针对性优化仓储布局或流程。
#### **总结**
盘亏与盘赢本质上都是**库存管理失控的表现**,需以 “零差异” 为目标,通过流程优化、技术工具升级和人员管理减少异常。
## 库存调拨
在仓储管理系统(WMS)中,**库存调拨**是指为平衡库存、满足需求或优化仓储布局,将商品从一个存储位置(如库位、仓库)转移到另一个存储位置的操作。其核心逻辑是通过标准化流程确保调拨过程可追溯、库存数据准确,并适配不同场景(如同一仓库内调拨、跨仓库调拨等)。
### 一、库存调拨的核心目标
1. 平衡库存:解决部分仓库 / 库位积压、部分短缺的问题;
2. 支持业务需求:如从存储区调拨至拣货区满足订单拣货,或向其他仓库调拨以响应区域订单;
3. 优化仓储效率:例如将滞销品从黄金库位移至次要库区,释放优质位置给畅销品;
4. 满足特殊场景:如临期商品集中处理、破损商品移至待处理区等。
### 二、库存调拨的核心业务流程
WMS 的库存调拨流程需确保 “有据可依、操作可溯、库存同步”,通常分为以下步骤:
#### 1. 调拨发起(生成调拨单)
- 触发方式
:
- 手动发起:仓管人员根据库存报表或业务需求在 WMS 中手动创建;
- 系统自动发起:WMS 根据预设规则(如拣货区库存低于安全阈值时,自动从存储区调拨补货)或接收外部系统(如 ERP)指令生成。
- 调拨单核心信息
:
- 基础信息:调拨单号(唯一标识)、发起时间、状态(待审核 / 已审核 / 执行中 / 已完成等);
- 源位置:源仓库、源库位(明确货物从哪里出);
- 目标位置:目标仓库、目标库位(明确货物到哪里去);
- 商品信息:SKU 编码、名称、规格、调拨数量;
- 附加信息:批次号(批次管理商品)、保质期(效期管理商品)、调拨原因(如补货、移库、退货等)。
#### 2. 调拨审核
- **目的**:确保调拨的合理性(如源仓库是否有足够库存、是否符合业务规则),避免无效操作。
- 审核规则
:
- 库存校验:检查源仓库 / 库位的实际库存是否满足调拨数量(需考虑已锁定库存,如已被订单占用的商品不可调拨);
- 业务合规性:如跨仓库调拨需确认目标仓库是否具备存储该商品的条件(如冷链商品需目标仓库有冷库);
- 权限控制:审核需由指定人员(如仓库主管)完成,防止误操作。
#### 3. 生成调拨任务
审核通过后,WMS 将调拨单拆分为具体执行任务,包括:
- **下架任务**:指定人员到源库位下架商品(需核对商品、数量、批次等信息);
- **搬运任务**:若为跨区域(如同一仓库的不同库区)或跨仓库调拨,需安排搬运 / 运输(跨仓库可能关联物流系统);
- **上架任务**:指定人员将商品送至目标库位并完成上架(需核对目标库位是否合规,如是否为对应商品的存储区)。
#### 4. 执行调拨操作
- **下架**:操作人员通过 PDA 扫描源库位、商品条码,确认下架数量(若实际数量与调拨单不符,需实时反馈异常);
- **移库**:商品从源库位移至目标库位(跨仓库调拨可能涉及出库、运输、入库环节,需记录运输轨迹);
- **上架**:操作人员扫描目标库位、商品条码,确认上架数量(需确保商品存放符合规则,如先进先出 FIFO、批次隔离等)。
#### 5. 调拨确认与库存更新
- **确认**:操作人员完成上架后,在 WMS 中确认调拨任务完成,系统自动核对实际调拨数量与调拨单差异(无差异则直接通过,有差异需生成差异单并人工确认);
- 库存同步
:
- 源位置:扣减对应商品的库存(扣减数量 = 实际调拨数量);
- 目标位置:增加对应商品的库存(增加数量 = 实际调拨数量);
- 同步外部系统:若对接 ERP 等系统,需将调拨结果(如完成时间、实际数量)同步至外部系统,确保全链路库存一致。
### 三、不同调拨类型的业务差异
根据调拨范围,库存调拨可分为以下类型,流程略有差异:
| 调拨类型 | 场景举例 | 核心差异点 |
| ----------------- | -------------------------------- | ------------------------------------------------------------ |
| 同仓内库位调拨 | 从存储区→拣货区、破损区→待处理区 | 无需运输环节,仅涉及内部下架 + 上架;可快速完成,库存实时更新。 |
| 跨仓库调拨 | 从 A 仓(北京)→B 仓(上海) | 需增加 “出库 - 运输 - 入库” 环节;可能涉及物流单、运输跟踪;库存更新需等商品到达目标仓并确认上架后完成。 |
| 跨区域 / 公司调拨 | 总仓→区域分仓、子公司→母公司 | 可能涉及财务结算(如成本核算)、跨主体审批;需严格记录商品所有权转移信息。 |
### 四、涉及的核心单据与数据
1. **调拨单**:全程唯一标识,记录调拨全量信息(源 / 目标位置、商品、数量等);
2. **下架单 / 出库单**:源仓库发货凭证,关联调拨单,记录下架商品明细;
3. **上架单 / 入库单**:目标仓库收货凭证,关联调拨单,记录上架商品明细;
4. **差异单**:当实际调拨数量与计划不符时生成,用于后续库存调整和原因追溯;
5. **库存流水账**:记录源 / 目标位置的库存变动(如 “调拨出库 - 10 件”“调拨入库 + 10 件”),支持追溯。
### 五、异常处理逻辑
调拨过程中可能出现异常,WMS 需支持针对性处理:
- **数量不符**:实际下架 / 上架数量与调拨单不一致(如少货、多货),需生成差异单,经审核后调整库存;
- **商品损坏**:搬运过程中商品破损,需终止调拨,将商品移至破损区,并更新库存(源位置扣减、破损区增加);
- **库位错误**:误将商品送至非目标库位,需通过 “库位调整” 功能二次调拨至正确位置;
- **调拨中止**:因业务取消或其他原因需终止调拨,系统需解锁源位置库存(释放被锁定的商品),并标记调拨单为 “已中止”。
### 六、与其他系统的集成
库存调拨并非孤立流程,需与其他系统联动:
- **ERP 系统**:调拨单可能由 ERP 发起(如根据销售预测调拨至区域仓),WMS 执行后反馈结果,双方同步库存数据;
- **TMS(运输管理系统)**:跨仓库调拨时,WMS 将运输需求同步至 TMS,由 TMS 安排运力并反馈运输状态;
- **MES(制造执行系统)**:针对生产型仓库,可能从原材料库调拨至生产线,需与 MES 同步生产进度。
综上,WMS 的库存调拨业务逻辑通过 “单据驱动、流程标准化、异常可控、系统联动”,确保商品在不同位置间的转移高效、准确,最终实现库存的动态平衡与精细化管理。
## 调拨出库 调拨入库
在 WMS 的库存调拨业务中,**调拨出库**和**调拨入库**是两个核心执行环节,分别对应商品从源位置移出和向目标位置移入的操作,两者紧密衔接且需严格遵循 “账实一致、流程可溯” 原则。以下是两者的详细业务逻辑:
### 一、调拨出库(源位置发货)
调拨出库是调拨流程中 “商品离开源仓库 / 库位” 的执行步骤,核心目标是确保从源位置准确、合规地取出商品,并同步扣减库存。
#### 1. 出库前准备
- 任务分配
:WMS 将审核通过的调拨单拆分为 “调拨出库任务”,分配给指定操作人员(通过 PDA 或作业终端推送),明确任务内容:
- 源仓库、源库位(精确到具体货架 / 储位);
- 商品信息(SKU、名称、规格、需出库数量);
- 批次 / 效期要求(如先进先出 FIFO 的商品需优先出库最早批次)。
- **库存锁定**:为防止出库过程中商品被其他任务占用(如订单拣货),WMS 会临时锁定源位置的对应库存(锁定数量 = 调拨单数量),锁定状态持续至出库完成或调拨中止。
#### 2. 出库操作流程
- **库位核对**:操作人员到达源库位后,通过 PDA 扫描库位条码,WMS 校验库位是否与任务一致(防止错拿库位商品)。
- **商品核对**:扫描商品条码(或批次码),系统校验商品 SKU、批次是否与调拨单匹配(如批次管理商品必须出库指定批次)。
- 数量确认
:
- 若为整箱 / 整托商品,直接确认数量(如 1 托 = 10 箱,扫描托码即可关联数量);
- 若为散货,需人工清点后在 PDA 输入实际数量(或通过称重设备自动获取)。
- **异常处理**:若实际可出库数量少于调拨单数量(如商品破损、短少),操作人员需在系统中记录差异,触发 “差异处理流程”(如部分出库、取消调拨等)。
- 出库确认
:完成商品取出后,操作人员在 WMS 中确认 “调拨出库完成”,系统自动:
- 解除源位置的库存锁定;
- 扣减源仓库 / 库位的实际库存(扣减数量 = 实际出库数量);
- 更新调拨单状态为 “出库完成,待入库”。
#### 3. 出库后的商品状态
- 若为**同仓内调拨**:商品处于 “在库内转移中” 状态,由操作人员直接搬运至目标库位,无需额外记录运输环节。
- 若为**跨仓库调拨**:商品需通过运输环节送至目标仓库,此时 WMS 会将商品状态标记为 “在途”,并可能与 TMS(运输管理系统)联动,记录运输单号、承运人等信息,便于跟踪。
### 二、调拨入库(目标位置收货)
调拨入库是调拨流程中 “商品进入目标仓库 / 库位” 的执行步骤,核心目标是确保商品准确送达目标位置,并同步增加库存,同时校验商品状态是否符合要求。
#### 1. 入库前准备
- **任务触发**:当商品到达目标仓库(或同仓内搬运至目标区域)后,WMS 自动生成 “调拨入库任务”(关联对应调拨单),分配给目标仓库的操作人员。
- **库位规划**:系统根据商品特性(如尺寸、重量、存储条件)和目标仓库的库位规则(如 SKU 专属库位、随机库位),自动推荐目标库位;操作人员也可手动指定(需符合系统规则,如禁止将常温商品存入冷库)。
#### 2. 入库操作流程
- 商品接收校验
:
- 核对调拨单:操作人员通过 PDA 调取对应调拨单,确认商品 SKU、批次、预计入库数量与实际到货一致;
- 状态检查:检查商品是否完好(如有无破损、包装是否完整)、效期是否符合要求(如临期商品是否允许入库),若有异常需记录并反馈(如拒收破损商品)。
- 数量确认
:
- 同出库操作,通过扫描或清点确认实际入库数量(需与出库数量核对,若有差异需说明原因,如运输损耗);
- 若存在差异(如入库数量<出库数量),需在系统中记录 “入库差异”,经审核后调整(如按实际数量入库,差异部分由源仓库处理)。
- 上架操作
:
- 操作人员将商品送至目标库位,扫描库位条码确认位置;
- 系统校验库位与商品的匹配性(如是否为该 SKU 的允许存储库位);
- 完成上架后,在 PDA 中确认 “商品已放置到位”。
- 入库确认
:操作人员在 WMS 中确认 “调拨入库完成”,系统自动:
- 增加目标仓库 / 库位的实际库存(增加数量 = 实际入库数量);
- 若为跨仓库调拨,清除商品 “在途” 状态;
- 更新调拨单状态为 “已完成”;
- 同步库存变动至关联系统(如 ERP),确保全链路数据一致。
#### 3. 入库后的后续处理
- 对于入库过程中记录的异常(如破损、数量差异),WMS 会生成 “调拨异常单”,由仓管人员审核后处理(如破损商品移至待处理区、差异数量进行库存调整)。
- 系统自动生成调拨出库 / 入库的明细记录(如操作人、时间、数量),作为库存追溯的依据。
### 三、调拨出库与入库的关联与差异
| 维度 | 调拨出库 | 调拨入库 |
| ------------ | ------------------------------------ | ---------------------------------- |
| **核心动作** | 从源位置取出商品,扣减库存 | 向目标位置放入商品,增加库存 |
| **校验重点** | 源库存是否充足、商品信息与调拨单匹配 | 商品状态是否完好、与出库数量一致性 |
| **异常类型** | 源库存不足、商品短少 / 破损 | 到货数量差异、商品损坏 / 效期异常 |
| **库存影响** | 源位置库存减少 | 目标位置库存增加 |
| **状态联动** | 触发 “待入库” 状态 | 触发 “调拨完成” 状态 |
### 总结
调拨出库和入库是 WMS 中确保商品 “从哪里来,到哪里去” 的关键闭环,通过严格的校验(库位、商品、数量)、状态跟踪和库存同步,保障调拨过程的准确性和效率。两者的协同运作,最终实现了库存在不同位置间的有序转移,支撑仓储资源的优化配置和业务需求的响应。
## wms 编码系统设计
WMS(仓库管理系统)编码系统是仓库数字化管理的核心基础,其设计直接影响库存准确性、作业效率和系统扩展性。合理的编码系统能实现对仓库内所有实体(货品、库位、批次等)的唯一标识、快速识别和全链路追踪。以下从设计原则、核心对象编码规则、管理机制三个维度展开设计方案。
### 一、编码系统设计原则
1. **唯一性**:每个实体(如 SKU、库位)对应唯一编码,无重复或歧义。
2. **可读性**:兼顾机器识别(条码 / RFID)和人工理解(包含业务属性信息)。
3. **可扩展性**:预留编码位,支持业务扩展(如新增仓库、品类、规格)。
4. **兼容性**:与上游系统(ERP、SRM)和下游系统(TMS、MES)编码规则兼容,减少映射成本。
5. **高效性**:编码长度适中(通常 8-20 位),便于扫描、存储和传输。
### 二、核心对象编码规则设计
WMS 编码系统需覆盖**货品、库位、批次、托盘、订单**等核心实体,不同实体的编码规则需结合其业务属性设计。
#### 1. 货品编码(SKU 编码)
用于唯一标识一款货品,需包含品类、规格等关键属性,支持快速定位货品分类。
- **结构**:`前缀 + 品类码 + 子品类码 + 规格码 + 校验位`
- 说明:
- 前缀(1 位):固定为 “S”(表示 SKU),区分其他类型编码。
- 品类码(2 位):一级分类(如 01 = 电子,02 = 服装,03 = 食品)。
- 子品类码(2 位):二级分类(如 01 = 手机,02 = 电脑,隶属电子品类)。
- 规格码(4 位):区分规格(如 0500=500ml,1000=1000g,或自定义规格编码)。
- 校验位(1 位):通过模 10 算法计算,用于校验输入错误。
- 示例:
```
S010205003
```
- 解析:S(SKU)+ 01(电子)+ 02(电脑)+ 0500(500g,此处为自定义规格)+ 3(校验位)。
#### 2. 库位编码
用于标识货品存储的物理位置,需反映仓库分区、货架、层位等空间信息,支持作业人员快速定位。
- **结构**:`仓库码 + 区域码 + 货架码 + 层码 + 列码`
- 说明:
- 仓库码(2 位):多仓库场景下区分仓库(如 W1 = 北京仓,W2 = 上海仓;单仓库可省略)。
- 区域码(2 位):仓库内功能分区(如 A1 = 收货区,B2 = 存储区,C3 = 拣货区)。
- 货架码(3 位):货架编号(001-999,支持千级货架)。
- 层码(2 位):货架层号(01-20,支持 20 层以内货架)。
- 列码(2 位):货架列号(01-50,支持 50 列以内货架)。
- 示例:
```
W1B20150308
```
- 解析:W1(北京仓)+ B2(存储区)+ 015(15 号货架)+ 03(第 3 层)+ 08(第 8 列)。
#### 3. 批次编码
用于追溯同 SKU 不同批次的货品(如生产日期、供应商差异),支持效期管理和质量追溯。
- **结构**:`生产日期 + 供应商码 + 批次序号 + 校验位`
- 说明:
- 生产日期(6 位):格式为 “YYMMDD”(如 250819 表示 2025 年 8 月 19 日)。
- 供应商码(3 位):供应商唯一标识(如 001=A 供应商,002=B 供应商)。
- 批次序号(3 位):同一供应商同日生产的批次流水号(001-999)。
- 校验位(1 位):模 11 算法计算,用于校验输入错误。
- 示例:
```
2508190010057
```
- 解析:250819(20250819 生产)+ 001(A 供应商)+ 005(当日第 5 批)+ 7(校验位)。
#### 4. 托盘编码
用于整托货品的管理(如大宗存储、整托出入库),需关联托盘承载的 SKU / 批次信息。
- **结构**:`前缀 + 生成日期 + 流水号 + 校验位`
- 说明:
- 前缀(1 位):固定为 “P”(表示托盘)。
- 生成日期(6 位):格式 “YYMMDD”(托盘创建日期)。
- 流水号(6 位):每日托盘流水号(000001-999999,支持百万级日产能)。
- 校验位(1 位):模 10 算法计算。
- 示例:
```
P250819001234
```
- 解析:P(托盘)+ 250819(20250819 创建)+ 001234(当日第 1234 个托盘)+ 4(校验位)。
#### 5. 订单编码
用于标识仓库作业订单(入仓、出仓、移库等),需区分订单类型和时间。
- **结构**:`类型前缀 + 日期 + 流水号`
- 说明:
- 类型前缀(1 位):I = 入仓单,O = 出仓单,T = 移库单,R = 退货单。
- 日期(8 位):格式 “YYYYMMDD”(订单创建日期)。
- 流水号(6 位):当日同类型订单流水号(000001-999999)。
- 示例:
```
O20250819000567
```
- 解析:O(出仓单)+ 20250819(创建日期)+ 000567(当日第 567 个出仓单)。
### 三、编码管理机制
1. **编码生成**:
- 系统自动生成:SKU、订单、托盘等编码由 WMS 按规则自动生成,避免人工输入错误。
- 人工辅助录入:库位编码可结合物理布局人工规划后录入系统,确保与实际位置一致。
2. **编码映射与维护**:
- 建立编码字典表:存储品类、区域、供应商等代码与名称的映射关系(如 “01 = 电子”),支持前台展示名称,后台存储编码。
- 版本控制:当编码规则调整时(如品类扩展需增加位数),需兼容旧编码(通过规则版本号区分),避免历史数据失效。
3. **校验机制**:
- 校验位校验:通过算法(如模 10/11)检测扫描或输入错误(如少输、错输字符)。
- 格式校验:系统校验编码长度、前缀、日期格式等是否符合规则(如生产日期不能为未来日期)。
4. **集成适配**:
- 与 ERP 对接:若 ERP 有自有物料编码,可在 WMS 中建立 “ERP 编码→WMS SKU 编码” 映射表,同步时双向转换。
- 条码 / RFID 关联:编码生成后自动转换为条码(Code128)或 RFID 标签,支持移动端扫描识别。
### 四、扩展场景考虑
- **多仓 / 跨境场景**:库位编码增加 “国家码”(2 位,如 CN = 中国,US = 美国),批次编码增加 “进口批次标识”。
- **特殊货品**:危险品编码前缀增加 “D”(如 DS010205003),便于优先管理和安全作业。
- **系统升级**:预留 1-2 位 “扩展位”,应对未来业务新增属性(如环保等级、溯源标识)。
通过以上设计,WMS 编码系统可实现 “一物一码、一位一码、一批一码”,为库存精准管理、作业流程优化和全链路追溯提供坚实基础。实际落地时需结合企业业务规模(如是否多仓、SKU 量级)和系统集成需求调整细节。
## 一批一位 多批一位
在 WMS(仓库管理系统)中,同一库区、同一物料的多批次存储需要兼顾**可追溯性**、**操作效率**和**管理原则(如 FIFO/FEFO)**,核心是通过 “货位与批次的精准绑定” 和 “布局策略” 实现有序管理。以下是具体方案:
### 一、明确批次管理的核心目标
在设计存储方案前,需先明确批次管理的目的,这直接影响存储策略:
- **追溯需求**:如药品、食品需记录生产批次、供应商、质检报告等,需严格隔离;
- **先进先出(FIFO)**:如电子元件、化工原料,需按入库顺序消耗;
- **近效期先出(FEFO)**:如保健品、化妆品,需按保质期优先级;
- **质量隔离**:如同一物料不同批次可能存在质检状态差异(合格 / 待检 / 不合格),需物理隔离。
### 二、存储策略设计
#### 1. 货位分配原则:“一批一位” 优先,灵活兼容 “多批一位”
- 核心原则:每个货位尽量只存放一个批次(“一批一位”),确保追溯清晰;若批次数量极少(如零散件),可在系统严格记录下 “多批一位”,但需明确标识。
- **示例**:同一库区的 A 物料有 3 个批次(B001、B002、B003),优先分配 3 个独立货位(如 S01-01-01、S01-01-02、S01-01-03),分别绑定 B001、B002、B003。
- **例外情况**:若 B003 批次仅余 2 件,可存入 B002 所在货位,但 WMS 需记录 “货位 S01-01-02 包含 B002(10 件)、B003(2 件)”,并通过条码区分(如每件商品贴批次码)。
#### 2. 布局策略:按批次属性分区 / 分层,强化操作效率
根据批次管理目标,在同一库区内部通过 “微分区” 或 “分层” 实现有序排列:
- **按入库时间(FIFO)**:
库区内部划分 “入库顺序带”,如从左到右按批次入库时间递增排列(先入库的批次放左侧,后入库的放右侧)。拣货时优先从左侧货位取货,自然实现 FIFO。
*示例:B001(2024-01 入库)放 S01-01-01(左侧),B002(2024-02 入库)放 S01-01-02(中间),B003(2024-03 入库)放 S01-01-03(右侧)。*
- **按效期(FEFO)**:
按批次保质期截止日排序,近效期批次放 “优先拣货区”(如库区前端或底层货架),远效期放后端或高层。
*示例:B001(效期 2025-06)放高层,B002(效期 2024-12)放中层,B003(效期 2024-09)放底层(最易存取)。*
- **按质量状态**:
同一库区划分 “合格区”“待检区”“不合格区”(可用货位前缀区分,如 HQ-XXX 为合格,DJ-XXX 为待检),不同质检状态的批次严格分区域存储。
### 三、系统与操作支撑
1. **批次与货位的精准绑定**
WMS 需实时记录 “物料 + 批次 + 货位 + 数量” 的对应关系,入库时通过 PDA 扫描物料批次码和货位码,自动关联;出库时扫描批次码,系统指引对应货位,确保不混批。
2. **可视化标识**
- 货位标签需标注 “当前存储的批次号”(如多批一位,需列出所有批次);
- 物料包装贴批次码(包含生产时间、效期等关键信息),便于快速识别。
3. **智能预警**
WMS 可设置批次预警(如 FIFO 中先入库批次未消耗、FEFO 中近效期批次即将过期),提醒优先处理,避免呆滞或过期。
### 四、特殊场景处理
- **批次合并**:若同一物料的多个小批次需合并存储(如零散件凑整),需确保批次信息可追溯(如合并后包装标注 “包含批次 B001、B002”,WMS 同步更新数量拆分关系)。
- **退货批次**:退货的同一物料批次需单独标识(如批次号后加 “-R”),与正常采购批次分区存储,避免混淆。
### 总结
同一库区、同一物料的多批次存储核心是 “**以批次为单位规划货位,以管理目标(FIFO/FEFO/ 追溯)驱动布局,以系统绑定和操作规范确保准确**”。通过上述方案,既能满足合规性要求,又能提升入库、出库的操作效率。
## 一批一位 多批一位 数据库设计参考
在 WMS 系统中,支持 “一批一位” 和 “多批一位” 的数据库设计需核心解决**批次、货位、数量的精准关联**,同时满足可扩展性(如支持 FIFO/FEFO 规则)和查询效率。以下是具体设计方案:
### 核心设计思路
通过 5 张核心表实现关联:
- 用**物料表**定义物料基础信息;
- 用**批次表**记录批次属性(如效期、质检状态);
- 用**库区表**和**货位表**定位存储位置;
- 用**库存明细表**作为核心关联表,记录 “批次 - 货位 - 数量” 的映射关系(支持一对多或多对一)。
### 详细表结构设计
#### 1. 物料表(material)
存储物料的基础信息,作为所有批次的 “母体” 标识。
| 字段名 | 类型 | 说明 | 约束 |
| ------------- | ------------ | ------------------- | -------------------------- |
| material_id | bigint | 物料唯一 ID(主键) | 自增、非空 |
| material_code | varchar(50) | 物料编码(如 SKU) | 唯一、非空(业务唯一标识) |
| material_name | varchar(100) | 物料名称 | 非空 |
| spec | varchar(50) | 规格型号 | 可空 |
| unit | varchar(20) | 单位(如个、箱) | 非空 |
| create_time | datetime | 创建时间 | 自动生成 |
#### 2. 库区表(warehouse_zone)
定义库区(如 “原材料区 A”“成品区 B”),用于划分货位的所属区域。
| 字段名 | 类型 | 说明 | 约束 |
| --------- | ------------ | --------------------------- | ---------- |
| zone_id | bigint | 库区唯一 ID(主键) | 自增、非空 |
| zone_code | varchar(30) | 库区编码(如 “ZY01”) | 唯一、非空 |
| zone_name | varchar(50) | 库区名称(如 “原材料一区”) | 非空 |
| remark | varchar(200) | 备注(如 “存放常温物料”) | 可空 |
#### 3. 货位表(location)
记录具体存储位置(如货架的 “排 - 列 - 层”),关联到所属库区。
| 字段名 | 类型 | 说明 | 约束 |
| ------------- | ------------- | ------------------------------------ | --------------------------- |
| location_id | bigint | 货位唯一 ID(主键) | 自增、非空 |
| location_code | varchar(50) | 货位编码(如 “S01-02-03”) | 唯一、非空(业务标识) |
| zone_id | bigint | 所属库区 ID(外键) | 关联 warehouse_zone.zone_id |
| capacity | decimal(18,2) | 货位最大容量(按单位) | 非空(如 “100 箱”) |
| use_status | tinyint | 状态(0 - 空闲;1 - 占用;2 - 锁定) | 非空,默认 0 |
#### 4. 批次表(batch)
记录同一物料的不同批次属性,是批次管理的核心。
| 字段名 | 类型 | 说明 | 约束 |
| --------------- | ----------- | ------------------------------------------ | ------------------------- |
| batch_id | bigint | 批次唯一 ID(主键) | 自增、非空 |
| batch_no | varchar(50) | 批次号(如 “20240501-B001”) | 唯一、非空(业务标识) |
| material_id | bigint | 所属物料 ID(外键) | 关联 material.material_id |
| production_date | date | 生产日期(用于 FIFO) | 可空(部分物料无生产日) |
| expiry_date | date | 过期日期(用于 FEFO) | 可空(部分物料无保质期) |
| supplier_id | bigint | 供应商 ID(外键,可选) | 关联供应商表(若有) |
| quality_status | tinyint | 质检状态(0 - 待检;1 - 合格;2 - 不合格) | 非空,默认 0 |
| in_time | datetime | 入库时间 | 非空 |
#### 5. 库存明细表(inventory_detail)
**核心关联表**,记录 “批次 - 货位 - 数量” 的映射关系,同时支持 “一批一位” 和 “多批一位”。
| 字段名 | 类型 | 说明 | 约束 |
| ------------- | ------------- | -------------------------- | ------------------------- |
| id | bigint | 记录唯一 ID(主键) | 自增、非空 |
| batch_id | bigint | 批次 ID(外键) | 关联 batch.batch_id |
| location_id | bigint | 货位 ID(外键) | 关联 location.location_id |
| quantity | decimal(18,2) | 该批次在该货位的数量 | 非空(>0) |
| lock_quantity | decimal(18,2) | 锁定数量(如拣货中未确认) | 非空,默认 0 |
| update_time | datetime | 最后更新时间 | 自动更新 |
### 设计亮点(支持两种存储模式)
1. **兼容 “一批一位” 和 “多批一位”**:
- 库存明细表通过batch_id和location_id的组合,允许:
- 一个批次对应多个货位(`batch_id`相同,`location_id`不同);
- 一个货位对应多个批次(`location_id`相同,`batch_id`不同)。
- 例如:
- 一批一位:`batch_id=100`仅关联`location_id=50`;
- 多批一位:`location_id=50`关联`batch_id=100`和`batch_id=101`。
2. **支持批次管理规则**:
- 通过`batch`表的`production_date`(生产日)和`expiry_date`(过期日),可快速查询 “最早入库批次”(FIFO)或 “最近过期批次”(FEFO);
- 通过`quality_status`可过滤 “合格批次”,避免不合格品被误出库。
3. **库存准确性保障**:
- 用`quantity`(可用量)和`lock_quantity`(锁定量)区分实际可操作库存,避免超卖或重复拣货;
- 所有库存变动(入库 / 出库)需同步更新此表,确保数据实时性。
### 关键 SQL 示例(场景验证)
#### 1. 查询 “同一库区、同一物料的所有批次及存储位置”
```sql
-- 假设查询“库区ZY01”中“物料SKU001”的所有批次存储情况
SELECT
m.material_code,
b.batch_no,
wz.zone_code,
l.location_code,
id.quantity
FROM
inventory_detail id
JOIN batch b ON id.batch_id = b.batch_id
JOIN material m ON b.material_id = m.material_id
JOIN location l ON id.location_id = l.location_id
JOIN warehouse_zone wz ON l.zone_id = wz.zone_id
WHERE
m.material_code = 'SKU001'
AND wz.zone_code = 'ZY01';
```
#### 2. 按 FIFO 规则查询 “某物料最早入库的批次及货位”
```sql
-- 查找“物料SKU001”中最早入库的批次及其存储货位
SELECT
b.batch_no,
b.in_time,
l.location_code,
id.quantity
FROM
batch b
JOIN inventory_detail id ON b.batch_id = id.batch_id
JOIN location l ON id.location_id = l.location_id
WHERE
b.material_id = (SELECT material_id FROM material WHERE material_code = 'SKU001')
AND b.quality_status = 1 -- 仅查合格批次
ORDER BY
b.in_time ASC
LIMIT 1;
```
### 扩展建议
- 若需支持 “批次合并”(如零散批次合并存储),可增加`batch_merge_record`表记录合并关系(原批次→合并后批次);
- 增加 “库存事务表”(inventory_transaction)记录每次入库 / 出库的变动明细,用于追溯和对账;
- 对`inventory_detail`表的`batch_id`和`location_id`建立联合索引,提升多条件查询效率。
通过此设计,既能满足 “一批一位” 的清晰追溯,也能支持 “多批一位” 的灵活存储,同时为后续的批次策略(FIFO/FEFO)提供数据基础。
## PDA
### 介绍
PDA(掌上电脑 / 手持数据终端)的工作原理是通过集成多种硬件组件和软件系统,实现数据的采集、处理、存储、传输和交互,核心是 **“数据闭环处理”**—— 从外部环境获取信息,经内部处理后,再以特定形式输出或上传。
### 硬件核心组件及工作逻辑
PDA 的硬件是实现功能的基础,各组件协同完成数据的 “输入 - 处理 - 输出” 流程:
1. **数据采集模块**:负责从外部获取信息(核心输入源)
- 条码扫描头:最常见的采集方式,原理是通过光源(如激光、LED)照射条码,条码的黑白条纹反射光线强度不同,由光电传感器将光信号转换为电信号,再通过解码芯片解析为数字或字符(如商品编码、批次号)。
- 一维条码:通过线条宽度和间距编码,扫描头需 “瞄准” 线条方向;
- 二维条码(如 QR 码):通过黑白像素矩阵编码,需面阵传感器捕捉整个图案,解码更复杂但信息容量更大。
- **RFID 读写器**:通过射频信号与 RFID 标签通信,标签内置芯片存储数据,读写器发射特定频率的无线电波,标签接收后返回存储的信息(无需接触,适合批量快速读取,如仓库整托盘货物盘点)。
- **摄像头**:除拍摄外,可通过图像识别技术辅助扫描(如扫码支付场景)或采集证件、文档信息。
- **NFC 模块**:近距离(通常 10cm 内)无线通信,用于快速识别卡片、标签(如门禁、小额支付)。
2. **处理器(CPU)与内存**:负责数据处理和临时存储(核心 “大脑”)
- 类似手机的处理器,接收采集模块传来的数据后,进行解析、验证(如与本地数据库比对)、计算(如库存数量增减)等操作。
- 内存(RAM)用于临时存储正在处理的数据和运行中的程序,确保操作流畅;存储芯片(ROM)则长期保存系统、软件和离线数据(如商品库、订单信息)。
3. **通信模块**:负责数据传输(实现 “联网交互”)
- **无线网络**:通过 Wi-Fi、4G/5G 模块接入网络,将处理后的数据实时上传至服务器(如 WMS 系统、ERP 系统),或下载最新任务(如订单、库存清单)。
- **蓝牙**:用于短距离连接外设(如蓝牙打印机、扫码枪),或与其他设备同步数据。
4. **输入输出设备**:实现人机交互
- **屏幕**:触控屏接收用户操作(如点击、输入),同时显示数据(如扫描结果、任务列表);部分工业 PDA 带实体键盘,适合戴手套操作。
- **按键**:自定义功能键(如扫描键、确认键),简化操作流程(如仓库中一键触发扫码)。
- **扬声器 / 指示灯**:通过声音(如扫码成功提示音)或灯光(如红色报错、绿色成功)反馈操作结果。
5. **电源管理**:保障持续工作
- 内置大容量电池(通常 3000-6000mAh),支持低功耗模式,配合电源管理芯片控制各模块电量分配,确保续航(如仓库 PDA 需支持 8-12 小时连续工作)。
### 软件系统的协同作用
硬件需要软件驱动才能实现功能,PDA 的软件系统包括:
1. **操作系统(OS)**:如安卓(主流)、Windows CE,负责管理硬件资源(如分配 CPU 算力、调度通信模块),为上层应用提供运行环境。
2. **驱动程序**:针对扫描头、RFID 模块等硬件的专用程序,确保系统能识别并控制硬件(如通过驱动调用扫描头开始扫码)。
3. 应用程序(APP):根据场景开发的专用软件(如仓库 WMS 的 PDA 端 APP),实现具体业务逻辑:
- 例如 “入库扫码” 流程:APP 调用扫描头读取商品条码→将条码发送至 CPU→CPU 对比本地缓存的入库单信息→验证通过后,APP 更新本地库存数据→同时通过网络上传至服务器→屏幕显示 “入库成功” 并发出提示音。
4. **数据同步机制**:支持离线存储(断网时数据暂存本地),联网后自动与服务器同步,避免数据丢失(关键功能,尤其适合网络不稳定的仓库、物流场景)。
### 典型场景工作流程示例(仓库入库)
1. 仓库员工在 PDA 上打开 WMS 入库 APP,接收服务器下发的 “待入库订单”(含商品编码、数量)。
2. 员工用 PDA 扫描商品条码,扫描头将光信号转为电信号,解码后得到商品编码。
3. PDA 的 CPU 将扫描到的编码与订单中的编码比对,确认匹配后,APP 自动记录 “已扫描数量”。
4. 全部商品扫描完成后,员工点击 “确认入库”,PDA 通过 Wi-Fi 将入库数据(商品、数量、时间)上传至服务器。
5. 服务器更新库存数据,并向 PDA 返回 “入库成功” 指令,PDA 屏幕显示结果并发出提示音。
### 总结
PDA 的核心原理是 **“硬件采集 + 软件处理 + 网络传输” 的协同 **:通过专用模块获取外部数据,经处理器和软件解析处理后,实现本地交互或远程同步,最终满足移动场景下的数据高效管理需求(如仓储、零售、物流等)。其设计重点在于**便携性、耐用性(工业级防护)和针对性的采集能力**,以适应复杂环境下的工作。
## SN 码(Serial Number)详解
SN 码即**序列号**,是英文 “Serial Number” 的缩写,它是产品出厂时由厂商赋予的唯一标识符,相当于产品的 “身份证号码”。每一个合格的产品(尤其是电子产品)通常都配有独一无二的 SN 码,其核心作用是对产品进行身份标识、追溯和管理。
#### 一、SN 码的主要作用
1. **产品身份唯一标识**
同一品牌、同一型号的产品,通过 SN 码可以区分个体,确保每个产品在生产、销售、售后环节都能被精准识别。
2. **生产与质量追溯**
厂商通过 SN 码可查询产品的生产批次、生产日期、生产工厂、零部件来源等信息,便于质量管控和问题追溯(例如召回特定批次产品)。
3. **售后服务凭证**
消费者维修、保修产品时,SN 码是重要依据,厂商可通过它确认产品是否在保修期内、是否为正品等。
4. **防伪造与防伪**
正规 SN 码通常有加密规则,可帮助消费者验证产品真伪(例如通过官网输入 SN 码查询)。
#### 二、SN 码的常见位置
不同产品的 SN 码位置不同,常见场景包括:
- **电子产品**(手机、电脑、耳机等):通常贴在机身背面、电池仓内、包装盒上,或在系统设置中可查询(如手机 “关于本机”、电脑 BIOS)。
- **家电产品**:多印在机身铭牌、说明书或包装盒上。
- **工业设备**:可能刻在设备外壳或内部标签上,用于资产管理和维护记录。
#### 三、SN 码与其他编码的区别
| 编码类型 | 特点 | 用途 |
| ------------------------- | ---------------------------------- | ---------------------- |
| SN 码(序列号) | 唯一,针对单个产品 | 个体身份标识、售后追溯 |
| 型号(Model Number) | 同一批次 / 规格产品共用 | 区分产品类型、规格参数 |
| IMEI 码(移动设备识别码) | 手机等移动设备专用,全球唯一 | 网络注册、防盗追踪 |
| 条形码 / 二维码 | 包含产品信息(可能对应型号或批次) | 快速识别、库存管理 |
#### 四、如何查询和使用 SN 码?
1. **查询 SN 码**:根据产品类型查找机身标签、包装盒或系统信息(如手机 “设置 - 关于手机”)。
2. **验证真伪**:访问厂商官网,在 “产品验证” 页面输入 SN 码,查询是否为正品及出厂信息。
3. **售后维修**:保修时提供 SN 码,厂商可确认产品是否在保、是否为官方正品,避免非正规产品享受保修服务。
总之,SN 码是产品全生命周期管理的重要工具,对厂商的生产管控和消费者的权益保障都具有重要意义。在购买和使用产品时,留意并妥善保存 SN 码,有助于解决后续可能出现的售后问题。
## GS1 编码:全球统一的商业语言
GS1 编码是由**国际物品编码协会(GS1)** 制定的一套全球统一的商业标识标准,旨在通过标准化的编码和数据载体(如条形码、RFID 标签等),实现供应链中产品、位置、资产等信息的高效识别、追踪和共享。它广泛应用于零售、物流、医疗、食品追溯等多个领域,是全球贸易和供应链管理的重要基础。
#### 一、GS1 编码的核心体系
GS1 编码体系包含多种编码标准,覆盖不同的标识对象,核心包括以下几类:
1. **全球贸易项目代码(GTIN)**
- **定义**:用于标识零售商品、非零售商品、服务等 “贸易项目” 的唯一编码。
- 常见形式
- GTIN-8(8 位,用于小型商品)
- GTIN-12(12 位,如美国 UPC 码)
- GTIN-13(13 位,即 EAN-13 码,全球最通用的商品条码)
- GTIN-14(14 位,用于非零售的整箱商品)
- **应用场景**:超市扫码结算、电商商品标识、库存管理等。
2. **全球位置码(GLN)**
- **定义**:标识参与供应链的法律实体(如公司)、功能实体(如仓库、门店)或物理位置(如货架、仓库区域)的唯一编码。
- **应用场景**:订单处理(标识发货 / 收货地址)、供应链协同(标识参与方)、库存定位等。
3. **序列号(Serial Number)**
- **定义**:与 GTIN 或 GLN 结合,用于标识单个产品或资产的唯一性(如同一批次的产品通过序列号区分)。
- **应用场景**:产品追溯(如药品、奢侈品的防伪溯源)、资产追踪(如设备的全生命周期管理)。
4. **其他编码**
- **全球资产标识符(GAI)**:用于标识固定资产(如设备、工具)。
- **全球服务关系代码(GSRN)**:用于标识服务相关的关系(如订阅服务、会员关系)。
- **全球文档类型标识符(GDTI)**:用于标识文档(如发票、装箱单)。
#### 二、GS1 编码的数据载体
GS1 编码需要通过具体的符号(数据载体)呈现,以便机器识别,常见形式包括:
- 条形码
:
- EAN-13:对应 GTIN-13,用于零售商品。
- UPC-A:对应 GTIN-12,主要用于北美市场。
- GS1-128:可包含多个 GS1 编码(如 GTIN + 序列号 + 有效期),适用于物流、医疗等场景。
- Data Matrix:二维条形码,可存储更多信息,适用于小尺寸商品(如电子元件)或需要高密度信息的场景。
- **RFID 标签**:通过无线射频技术读取,可批量识别、非接触读取,常用于供应链中的整箱货物追踪。
#### 三、GS1 编码的作用与优势
1. **全球统一性**:GS1 编码由国际组织制定,全球通用,避免了不同地区编码标准不兼容的问题,方便跨境贸易。
2. **供应链效率提升**:通过标准化标识,实现从生产、仓储、运输到零售的全流程信息共享,减少人工录入错误,加快处理速度。
3. **产品追溯与安全**:结合序列号等信息,可实现产品全生命周期追溯,有助于召回问题产品、打击假冒伪劣(如食品、药品的安全管理)。
4. **数据标准化基础**:为企业 ERP、WMS(仓储管理系统)、电商平台等信息系统提供统一的数据标识标准,便于数据分析和智能化管理(如大数据分析、物联网应用)。
#### 四、如何获取 GS1 编码?
企业或组织需向所在国家 / 地区的 GS1 成员组织(如中国的**中国物品编码中心 ANCC**)申请,流程大致包括:
1. 加入 GS1 成员组织,获得企业前缀(用于生成 GTIN、GLN 等编码的基础)。
2. 基于企业前缀,按规则生成具体的 GS1 编码(如 GTIN 需确保唯一性)。
3. 选择合适的数据载体(如条形码),并按规范印刷或制作。
#### 五、应用案例
- **零售场景**:超市中商品包装上的 EAN-13 条形码,扫码后可快速获取商品名称、价格等信息,完成结算。
- **物流场景**:快递包裹上的 GS1-128 条形码,包含了寄件 / 收件地址(GLN)、商品信息(GTIN)等,便于分拣和追踪。
- **医疗场景**:药品包装上的 GTIN + 序列号,可追溯生产批次、有效期,确保用药安全。
总之,GS1 编码是全球商业活动的 “通用语言”,通过标准化标识连接供应链各环节,为高效、安全、透明的商业运作提供了基础支撑。
## 文章阅读
* [【演示】WMS仓储系统 (PDA-移动端-APP)原型 - AxureShop产品原型网](https://www.axureshop.com/ys/1291159)
* [【演示】WMS仓储系统原型-PC端 - AxureShop产品原型网](https://www.axureshop.com/ys/1291135)
* [【演示】《 SCM供应链管理》解决方案一(原型) - AxureShop产品原型网](https://www.axureshop.com/ys/1144843)
* [WMS仓库管理系统 (qq.com)](https://mp.weixin.qq.com/s/738roxUHWI2cB0HRPGnNgA)
* [仓库管理4大核心系统:OMS、WMS、WCS、WES ...信息系统](https://mp.weixin.qq.com/s/md6twu4b24op6gBVJ-zF3w)
* [一文搞懂MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系 (qq.com)](https://mp.weixin.qq.com/s/w7WpcONik1r1e1xwq3WR_Q)
* [什么是WMS?WMS仓库管理系统核心功能及设计要点(文摘) (qq.com)](https://mp.weixin.qq.com/s/sQjnrwa32j7TEErkUTJ9dg)
* [一文读懂WMS:定义、功能、部署、选型、适用全解析! (qq.com)](https://mp.weixin.qq.com/s/Di48rPSCPfmnyXLP08aLyQ)
* [一文带你全面了解WMS智慧仓库管理系统行业趋势及功能解析! (qq.com)](https://mp.weixin.qq.com/s/1GBvTMXn16KQzNtWrVzTKw)
* [仓库管理 系列知识](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU2MTkzMDgyNQ==&action=getalbum&album_id=3017348520368160769&subscene=159&subscene=189&scenenote=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU2MTkzMDgyNQ%3D%3D%26mid%3D2247493206%26idx%3D1%26sn%3Dd61f3c3cc6d5a61645f914797638bb6a%26chksm%3Dfc739170cb0418666762f420a9430edcf126ab8b6941b596e4e3d6c5c558a1c8765b2fd88e45%26cur_album_id%3D3017348520368160769%26scene%3D189%23wechat_redirect&nolastread=1#wechat_redirect)
## 第三方WMS体验
* [点狮后台管理系统](http://admin.dianshixinxi.com:90/login?redirect=%2Findex)
## 黑盒测试与白盒测试
在软件测试领域,**黑盒测试**和**白盒测试**是两种最基础且常用的测试方法,它们从不同角度验证软件质量,适用于不同的测试场景。以下是对两者的详细解析:
### 一、黑盒测试(Black Box Testing)
黑盒测试又称 “功能测试” 或 “数据驱动测试”,测试时不关注软件内部的代码结构、逻辑或实现细节,仅通过输入数据和输出结果来验证软件是否符合需求规格。
#### 核心特点:
- **测试视角**:将软件视为一个 “黑盒子”,只关注外部功能是否正常,不涉及内部逻辑。
- **测试依据**:主要基于需求文档、用户手册等外部规格说明。
- **测试人员**:通常由不了解代码的测试工程师或用户执行。
#### 常用方法:
- **等价类划分**:将输入数据划分为若干等价类(有效等价类和无效等价类),从每个类中选取代表性数据测试,减少冗余用例。
例:测试登录功能时,“有效用户名 + 有效密码”“无效用户名 + 有效密码” 等可作为等价类。
- **边界值分析**:针对输入输出的边界条件设计用例(如数值的最大值、最小值、空值等),因为边界往往是错误高发区。
例:测试年龄输入框(要求 1-120 岁)时,需验证 0、1、120、121 等边界值。
- **场景法**:模拟用户实际使用场景,覆盖多个功能点的交互流程。
例:电商平台的 “下单 - 支付 - 发货” 完整流程测试。
- **错误推测法**:基于经验猜测可能出现的错误,设计针对性用例(如网络中断、数据格式错误等)。
#### 优点:
- 更贴近用户实际使用场景,能发现用户可见的功能缺陷。
- 不依赖代码知识,测试人员无需了解编程语言。
- 适合对整个系统或模块进行验证,尤其在集成测试、系统测试阶段。
#### 缺点:
- 无法覆盖内部逻辑漏洞(如代码中的死循环、冗余判断等)。
- 部分用例可能重复或遗漏,测试覆盖率难以量化。
- 难以定位错误根源(只知结果错,不知代码哪部分错)。
### 二、白盒测试(White Box Testing)
白盒测试又称 “结构测试” 或 “逻辑驱动测试”,测试时需了解软件的内部代码结构、逻辑流程和算法,通过直接检查代码或执行路径来验证其正确性。
#### 核心特点:
- **测试视角**:将软件视为 “透明盒子”,关注内部逻辑是否符合设计要求。
- **测试依据**:基于源代码、流程图、伪代码等内部文档。
- **测试人员**:通常由开发工程师或熟悉代码的测试工程师执行。
#### 常用方法:
- **语句覆盖**:设计用例确保每行代码至少执行一次。
- **分支覆盖(判定覆盖)**:确保每个条件判断的 “真”“假” 分支都被执行(如 if-else、switch-case 的所有分支)。
- **条件覆盖**:针对判断中的每个子条件(如`a>0 && b<5`中的`a>0`和`b<5`),确保其真假值都被覆盖。
- **路径覆盖**:覆盖所有可能的代码执行路径(如循环的 0 次、1 次、多次执行)。
- **基本路径测试**:通过控制流图分析,找出独立的基本路径并设计用例覆盖。
#### 优点:
- 能深入代码底层,发现逻辑错误、语法错误、内存泄漏等内部缺陷。
- 测试覆盖率可量化(如语句覆盖率、路径覆盖率),便于评估测试完整性。
- 可在开发早期(单元测试阶段)执行,提前修复缺陷,降低后期修改成本。
#### 缺点:
- 依赖代码知识,测试人员需掌握编程语言和代码结构。
- 当代码频繁变更时,维护测试用例的成本高。
- 可能过度关注细节,忽略整体功能的用户体验。
### 三、黑盒测试与白盒测试的对比
| **维度** | **黑盒测试** | **白盒测试** |
| ---------- | ---------------------------- | --------------------------- |
| 测试对象 | 软件外部功能 | 软件内部代码结构 |
| 测试依据 | 需求文档、用户手册 | 源代码、流程图 |
| 测试阶段 | 集成测试、系统测试、验收测试 | 单元测试、组件测试 |
| 核心目标 | 验证功能是否符合需求 | 验证代码逻辑是否正确 |
| 覆盖率衡量 | 较难量化 | 可通过语句 / 路径覆盖率量化 |
| 对人员要求 | 无需代码知识 | 需熟悉编程和代码结构 |
### 四、实际应用:两者结合
在软件测试流程中,黑盒测试和白盒测试并非对立,而是互补的:
- **单元测试**:以白盒测试为主,验证函数、类的内部逻辑。
- **集成测试**:结合两者,用白盒测试验证模块接口的代码逻辑,用黑盒测试验证模块交互的功能。
- **系统测试 / 验收测试**:以黑盒测试为主,模拟用户场景验证整体功能。
例如:测试一个登录模块时,白盒测试会检查 “密码加密算法是否正确”“用户名非空判断的代码逻辑”;黑盒测试则会验证 “输入错误密码时是否提示正确”“连续输错 3 次是否锁定账户” 等用户可见的功能。
通过合理搭配两种方法,可最大化测试覆盖率,既保证用户可见的功能正常,又确保代码内部逻辑的健壮性。
## 冒烟测试与回归测试
在软件测试领域,**冒烟测试**和**回归测试**是两种重要的测试类型,分别用于不同的测试阶段和目标。下面详细介绍两者的定义、特点、应用场景及区别:
### 一、冒烟测试(Smoke Testing)
**定义**:冒烟测试是一种初步的、快速的测试,旨在验证软件的核心功能是否正常运行,确保基本流程可通,避免在后续详细测试中浪费资源。其名称源于硬件测试中的 “冒烟测试”—— 开机后若设备冒烟(功能失效),则无需进一步测试。
#### 特点:
- **范围小而关键**:只测试核心功能(如登录、基本操作流程),不涉及细节或边缘场景。
- **执行快速**:通常在短时间内(如 1-2 小时)完成,多为自动化脚本执行。
- **门槛测试**:作为后续测试的 “准入条件”,若冒烟测试不通过,需先修复核心问题,再进行其他测试。
#### 应用场景:
- 新功能开发完成后,首次构建版本的初步验证。
- 每日构建(Daily Build)后,验证基本功能是否可用。
- 修复重大 bug 后,确认核心功能未受影响。
#### 示例:
- 对于电商 APP,冒烟测试可能包括:打开 APP、登录账号、浏览商品、加入购物车、提交订单(无需支付细节)。
### 二、回归测试(Regression Testing)
**定义**:回归测试是在软件发生变更(如修复 bug、新增功能)后,验证原有功能是否仍正常工作,确保变更未引入新的缺陷。
#### 特点:
- **范围广而全面**:覆盖已测试过的功能,包括核心功能和次要功能,甚至历史 bug 场景。
- **可自动化程度高**:由于需重复执行,通常会编写自动化脚本(如 Selenium、Jmeter)。
- **持续迭代**:每次变更后都需执行,随软件版本迭代不断更新测试用例。
#### 应用场景:
- 修复 bug 后,验证相关功能及关联模块是否正常。
- 新增功能上线前,确认旧功能未被破坏。
- 系统升级(如数据库、服务器变更)后,全面验证兼容性。
#### 示例:
- 电商 APP 新增 “优惠券” 功能后,回归测试需验证:原有的支付流程、订单查询、退款功能等是否仍正常,且优惠券功能的加入未导致其他模块出错。
### 三、两者的核心区别
| **维度** | **冒烟测试** | **回归测试** |
| ------------ | ------------------------------- | ------------------------------------------- |
| **目的** | 验证核心功能是否可运行(准入) | 验证变更后原有功能是否正常(防 regression) |
| **测试范围** | 小(仅核心功能) | 大(覆盖已测功能) |
| **执行时机** | 新构建 / 版本初期,作为测试前提 | 变更后(如修复 bug、新增功能后) |
| **执行频率** | 高频(如每日构建后) | 随变更频率执行(如每次迭代后) |
| **通过标准** | 核心功能无阻断性问题 | 原有功能无新增缺陷 |
### 四、总结
- 冒烟测试是 “快速把关”,确保软件具备基本可测性;
- 回归测试是 “全面复查”,确保变更未对原有功能造成负面影响。
在实际测试流程中,通常先执行冒烟测试,通过后再进行回归测试及其他详细测试(如集成测试、系统测试),两者共同保障软件质量。
## VO,BO,PO,DO,DTO区别
在软件开发中,VO、BO、PO、DO、DTO 是用于区分不同层数据对象的概念,它们帮助规范数据在各层之间的流转,降低耦合性。以下是详细解释:
### **1. PO(Persistent Object,持久化对象)**
- **定义**:与数据库表结构一一对应,用于 ORM(对象关系映射)框架(如 MyBatis、Hibernate)直接操作数据库。
- 特点
:
- 字段名通常与数据库表字段完全一致。
- 包含 getter/setter 方法,可能有简单的构造函数。
- 不包含复杂的业务逻辑,仅作为数据存储的载体。
- **示例**:若数据库有`user`表(字段:id、name、age),则 PO 类`UserPO`会有对应的`id`、`name`、`age`字段。
### **2. DO(Domain Object,领域对象)**
- **定义**:对应业务领域的实体,封装了核心业务逻辑和属性,是业务层的核心对象。
- 特点
:
- 可能与 PO 有对应关系,但更侧重业务含义(如 PO 中的`user_name`在 DO 中可能为`userName`,并增加业务相关字段)。
- 包含业务方法(如计算、校验等),体现领域模型的行为。
- 独立于数据库设计,更贴近业务场景。
- **示例**:`UserDO`可能包含`id`、`userName`、`age`,以及方法`isAdult()`(判断是否成年)。
### **3. DTO(Data Transfer Object,数据传输对象)**
- **定义**:用于不同层(如服务层与客户端、服务间)的数据传输,解决数据冗余或隐私问题。
- 特点
:
- 按需封装数据,可能包含多个 PO/DO 的部分字段,或排除敏感信息(如密码)。
- 仅用于数据传输,不包含业务逻辑。
- 可根据传输场景定义不同 DTO(如`UserQueryDTO`用于查询,`UserCreateDTO`用于创建)。
- **示例**:客户端请求用户信息时,`UserDTO`可能只包含`id`、`userName`,不包含`password`。
### **4. VO(View Object,视图对象)**
- **定义**:专门用于展示层(如前端页面、APP 视图),与页面展示的数据结构一一对应。
- 特点
:
- 可能包含格式化后的字段(如日期转为`yyyy-MM-dd`字符串)、计算结果(如`totalPrice`)。
- 与 DTO 的区别:VO 更贴近视图需求,DTO 更侧重服务间传输。
- **示例**:订单详情页的`OrderVO`可能包含`orderId`、`formattedCreateTime`(格式化日期)、`productList`(商品列表)。
### **5. BO(Business Object,业务对象)**
- **定义**:封装复杂业务逻辑的对象,通常由多个 PO/DO 组合而成,用于业务层处理。
- 特点
:
- 聚合多个相关对象,处理跨实体的业务操作(如订单 BO 可能包含用户、商品、支付信息)。
- 包含核心业务逻辑,是业务处理的载体。
- **示例**:`OrderBO`可能包含`OrderDO`、`UserDO`、`ProductDO`,以及方法`calculateTotalAmount()`(计算订单总金额)。
### **总结:核心区别与关系**
| 类型 | 核心用途 | 常见场景 | 包含逻辑 |
| ---- | --------------------- | ----------------------- | ------------ |
| PO | 数据库映射 | ORM 操作 | 无(仅数据) |
| DO | 领域实体 | 业务核心模型 | 基础业务逻辑 |
| BO | 复杂业务处理 | 跨实体业务操作 | 复杂业务逻辑 |
| DTO | 层间 / 服务间数据传输 | API 接口请求 / 响应 | 无 |
| VO | 视图展示 | 前端页面 / APP 视图数据 | 格式化逻辑 |
**流转关系**:
数据库 → PO → DO → BO(业务处理)→ DTO(传输)→ VO(展示)。
实际开发中需根据场景灵活使用,避免过度设计。
## 如何在实际项目中选择使用VO、BO、PO、DO、DTO?
在实际项目中选择使用 VO、BO、PO、DO、DTO 等数据对象,核心原则是**根据数据的流转场景和职责边界来划分**,避免过度设计或滥用。以下是具体的选择策略和实践建议:
### **1. 先明确项目分层,再匹配对象类型**
数据对象的设计与系统分层强相关,典型的分层架构(从下到上)如下:
`数据库层 → 领域层 → 业务层 → 接口层 → 展示层`
不同层对应的数据对象选择:
- **数据库层**:用**PO**(与表结构一一对应,ORM 直接操作)。
- **领域层**:用**DO**(核心业务实体,封装领域逻辑)。
- **业务层**:用**BO**(处理跨领域 / 跨表的复杂业务,聚合多个 DO/PO)。
- **接口层**(服务间 / 前后端交互):用**DTO**(按需传输数据,控制权限和冗余)。
- **展示层**:用**VO**(适配前端视图,处理格式化、组合展示数据)。
### **2. 按场景决定是否使用,避免为了用而用**
#### **场景 1:简单 CRUD 项目(如管理后台)**
- 核心需求:快速实现数据增删改查,业务逻辑简单。
- 选择建议:
- 用**PO**直接映射数据库,简化 ORM 操作。
- 用**DTO**兼顾传输和展示(无需单独 VO),避免对象冗余。
- 可省略 DO 和 BO(业务逻辑简单时,无需额外抽象)。
例:用户管理模块,直接用`UserPO`操作数据库,`UserDTO`作为接口入参 / 出参(前端直接使用)。
#### **场景 2:中大型业务系统(如电商、支付)**
- 核心需求:业务逻辑复杂,多模块交互多,需解耦和复用。
- 选择建议:
- 必须用**PO**(数据库映射)和**DO**(领域核心)。
- 跨模块 / 跨表业务用**BO**(如订单 BO 聚合用户、商品、支付信息)。
- 接口层严格用**DTO**(隐藏内部结构,控制字段权限)。
- 前端展示用**VO**(处理格式化,如价格保留两位小数、日期转字符串)。
例:订单流程中,`OrderPO`对应订单表,`OrderDO`封装订单状态流转逻辑,`OrderBO`整合商品和用户信息计算总价,`OrderDTO`用于服务间传输,`OrderVO`格式化后给前端展示。
#### **场景 3:对外 API 服务(如开放平台)**
- 核心需求:接口稳定,数据安全,适配不同调用方。
- 选择建议:
- 内部用 PO/DO 处理业务,对外暴露**DTO**(严格定义字段,屏蔽内部变化)。
- 避免直接返回 PO/DO(防止数据库结构暴露,或字段变更影响外部)。
例:用户中心对外提供查询接口时,用`UserApiDTO`(只包含`id`、`nickname`等非敏感字段),而非内部的`UserDO`(可能包含密码哈希、内部状态等)。
### **3. 关键区分:容易混淆的对象**
#### **DTO vs VO**
- **DTO**:强调 “传输”,解决不同服务 / 模块间的数据交互,字段通常是原始数据(如时间戳)。
- **VO**:强调 “展示”,解决前端视图需求,可能包含格式化后的数据(如`createTime`转为`"2023-10-01"`)。
- 选择:若前端直接使用接口返回的 DTO 且无需格式化,可省略 VO;若有展示层特殊处理(如多语言、格式化),则必须用 VO。
#### **DO vs BO**
- **DO**:对应单一业务实体(如`UserDO`、`ProductDO`),包含自身的核心逻辑(如`UserDO.isVip()`)。
- **BO**:处理跨实体业务(如`OrderBO`需要`UserDO`和`ProductDO`协作计算),是 “业务操作的载体”。
- 选择:单一实体操作只用 DO;复杂业务(如订单创建需校验库存、扣减余额)必须用 BO。
#### **PO vs DO**
- **PO**:完全依赖数据库表结构,字段与表一一对应(如数据库`user`表有`user_name`,PO 就有`userName`)。
- **DO**:依赖业务领域,可能与 PO 字段不同(如 DO 中增加`fullName`字段,由 PO 的`first_name`和`last_name`组合而成)。
- 选择:PO 仅用于数据库操作;DO 是业务的 “真相来源”,PO 需转换为 DO 后进入业务逻辑。
### **4. 实践技巧:降低复杂度**
1. **对象转换工具化**:用 MapStruct、BeanUtils 等工具处理 PO→DO、DO→DTO 等转换,减少重复代码。
2. **避免多层嵌套**:DTO/VO 中尽量避免嵌套复杂对象(如 VO 里嵌套 BO),防止序列化问题和理解成本。
3. **命名清晰**:按 “前缀 + 类型” 命名(如`UserPO`、`OrderDTO`),明确对象职责。
4. **灵活取舍**:小型项目可简化(如用 DTO 代替 VO),大型项目必须严格区分(避免后期维护混乱)。
### **总结**
选择数据对象的核心是 **“让数据在合适的层做合适的事”**:
- 贴近数据库用**PO**,贴近业务用**DO/BO**,贴近传输用**DTO**,贴近展示用**VO**。
- 不要为了 “规范” 而引入不必要的对象,根据项目规模和复杂度动态调整,在 “灵活性” 和 “可维护性” 之间找平衡。