Compare commits
4 Commits
c31b925c93
...
f9a0ccf4d9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f9a0ccf4d9 | ||
|
|
3e48ef4b0d | ||
|
|
05098c8172 | ||
|
|
6aebc410bf |
208
docs/superpowers/plans/2026-08-08-lms-stocking-area.md
Normal file
208
docs/superpowers/plans/2026-08-08-lms-stocking-area.md
Normal file
@@ -0,0 +1,208 @@
|
||||
# LMS 备货区域查询与维护实现计划
|
||||
|
||||
> **面向 AI 代理的工作者:** 必需子技能:使用 superpowers:subagent-driven-development(推荐)或 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(`- [ ]`)语法来跟踪进度。
|
||||
|
||||
**目标:** 在 LMS 管理端提供备货区域分页查询、受控修改,以及托盘库存 5×5 网格查看。
|
||||
|
||||
**架构:** 后端为两张业务表建立独立 `stockingivt` 包,查询 SQL 全部写入 MyBatis XML;前端采用现有 Vben Grid 与 Modal 模式,托盘库存点击后按需加载。点位类型和状态由系统字典驱动,初始化 SQL 保持幂等。
|
||||
|
||||
**技术栈:** Java 17、Spring Boot、MyBatis、Vue 3、TypeScript、Vben Admin、Ant Design Vue。
|
||||
|
||||
---
|
||||
|
||||
## 文件结构
|
||||
|
||||
### 后端新增
|
||||
|
||||
- `nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/stockingivt/StockingIvtController.java`:分页、详情、修改、托盘库存接口。
|
||||
- `.../stockingivt/vo/StockingIvtPageReqVO.java`:分页筛选条件。
|
||||
- `.../stockingivt/vo/StockingIvtUpdateReqVO.java`:受控修改字段。
|
||||
- `.../stockingivt/vo/StockingIvtRespVO.java`:点位响应。
|
||||
- `.../stockingivt/vo/PaperVehicleInventoryRespVO.java`:托盘格位响应。
|
||||
- `.../dal/dataobject/stockingivt/StockingIvtDO.java`:备货点位表映射。
|
||||
- `.../dal/dataobject/stockingivt/PaperVehicleDO.java`:托盘库存表映射。
|
||||
- `.../dal/mysql/stockingivt/StockingIvtMapper.java`:Mapper 方法。
|
||||
- `nl-module-lms/nl-module-lms-server/src/main/resources/mapper/stockingivt/StockingIvtMapper.xml`:全部查询和更新 SQL。
|
||||
- `.../service/stockingivt/StockingIvtService.java`、`StockingIvtServiceImpl.java`:业务服务。
|
||||
|
||||
### 后端修改
|
||||
|
||||
- `nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/ErrorCodeConstants.java`:新增点位和托盘格位错误码。
|
||||
|
||||
### 数据库新增
|
||||
|
||||
- `sql/mysql/lms_stocking_ivt_dict.sql`:两个字典类型和五条字典数据。
|
||||
|
||||
### 前端新增与修改
|
||||
|
||||
- `.../src/api/lms/stockingivt/index.ts`:类型与四个 API。
|
||||
- `.../src/views/lms/stockingivt/data.ts`:查询、修改和列表 Schema。
|
||||
- `.../src/views/lms/stockingivt/index.vue`:主列表。
|
||||
- `.../src/views/lms/stockingivt/modules/form.vue`:修改弹窗。
|
||||
- `.../src/views/lms/stockingivt/modules/pallet-inventory.vue`:5×5 网格弹窗。
|
||||
- `nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/packages/constants/src/dict-enum.ts`:两个字典编码。
|
||||
|
||||
---
|
||||
|
||||
### 任务 1:系统字典初始化
|
||||
|
||||
- [ ] **步骤 1:创建幂等字典 SQL**
|
||||
|
||||
使用 `INSERT ... SELECT ... WHERE NOT EXISTS` 写入:
|
||||
|
||||
```text
|
||||
lms_stocking_ivt_point_type: 1=绑定位, 2=缓存位, 3=对接位
|
||||
lms_stocking_ivt_status: 1=空, 2=有托盘
|
||||
```
|
||||
|
||||
字典类型写入 `system_dict_type`,数据写入 `system_dict_data`;ID 使用新的雪花 ID,状态启用。
|
||||
|
||||
- [ ] **步骤 2:静态检查 SQL**
|
||||
|
||||
```bash
|
||||
rg -n "lms_stocking_ivt_(point_type|status)|NOT EXISTS" sql/mysql/lms_stocking_ivt_dict.sql
|
||||
```
|
||||
|
||||
预期:两个类型和五条数据均存在,所有插入均幂等。
|
||||
|
||||
### 任务 2:后端数据模型与 XML
|
||||
|
||||
- [ ] **步骤 1:创建两个 DO**
|
||||
|
||||
`StockingIvtDO` 映射点位字段并继承 `BaseDO`;`PaperVehicleDO` 映射字符串主键、托盘号、行列、物料编码、名称和数量。
|
||||
|
||||
- [ ] **步骤 2:创建 VO**
|
||||
|
||||
分页字段:
|
||||
|
||||
```java
|
||||
private String pointCode;
|
||||
private String pointName;
|
||||
private String vehicleCode;
|
||||
private String pointType;
|
||||
private String ivtStatus;
|
||||
private String isUsed;
|
||||
```
|
||||
|
||||
修改 VO 使用注解校验 `ivtId/pointType/ivtStatus/sortSeq/isUsed`,只接收托盘号、类型、状态、位置、顺序号、启用、备注;不接收点位编码和名称。托盘响应包含 `rowNum/colNum/materialCode/materialName/qty`。
|
||||
|
||||
- [ ] **步骤 3:创建 Mapper 与 XML**
|
||||
|
||||
分页 SQL 选取列表全部字段;编码、名称、托盘号使用模糊查询,类型、状态、启用使用等值查询,默认 `ORDER BY ivt_id DESC`。详情按主键查询。更新 SQL 只设置七个可编辑字段。托盘库存按托盘号查询并按数字行列排序。
|
||||
|
||||
- [ ] **步骤 4:编译 Mapper**
|
||||
|
||||
```bash
|
||||
./mvnw -pl nl-module-lms/nl-module-lms-server -am -DskipTests compile
|
||||
```
|
||||
|
||||
预期:`BUILD SUCCESS`。
|
||||
|
||||
### 任务 3:后端服务与接口
|
||||
|
||||
- [ ] **步骤 1:增加错误码**
|
||||
|
||||
使用未占用编号增加:备货区域点位不存在、托盘格位重复、托盘格位超出 5×5。
|
||||
|
||||
- [ ] **步骤 2:实现 Service**
|
||||
|
||||
```java
|
||||
PageResult<StockingIvtRespVO> getStockingIvtPage(StockingIvtPageReqVO reqVO);
|
||||
StockingIvtRespVO getStockingIvt(Long ivtId);
|
||||
void updateStockingIvt(StockingIvtUpdateReqVO reqVO);
|
||||
List<PaperVehicleInventoryRespVO> getPaperVehicleInventory(String vehicleCode);
|
||||
```
|
||||
|
||||
修改前校验存在,再 new 更新对象调用 Mapper。托盘数据校验行列为 1 至 5,并以 `rowNum + ":" + colNum` 检查重复;空列表正常返回。
|
||||
|
||||
- [ ] **步骤 3:实现 Controller**
|
||||
|
||||
```text
|
||||
GET /lms/stocking-ivt/page lms:stocking-ivt:query
|
||||
GET /lms/stocking-ivt/get lms:stocking-ivt:query
|
||||
PUT /lms/stocking-ivt/update lms:stocking-ivt:update
|
||||
GET /lms/stocking-ivt/paperVehicleList lms:stocking-ivt:query
|
||||
```
|
||||
|
||||
分页返回 `CommonResult<PageResult<...>>`,其他接口统一返回 `CommonResult`。
|
||||
|
||||
- [ ] **步骤 4:编译后端**
|
||||
|
||||
运行任务 2 的 Maven 命令,预期 `BUILD SUCCESS` 且 XML 可加载。
|
||||
|
||||
### 任务 4:前端字典与 API
|
||||
|
||||
- [ ] **步骤 1:注册字典常量**
|
||||
|
||||
```ts
|
||||
LMS_STOCKING_IVT_POINT_TYPE: 'lms_stocking_ivt_point_type',
|
||||
LMS_STOCKING_IVT_STATUS: 'lms_stocking_ivt_status',
|
||||
```
|
||||
|
||||
- [ ] **步骤 2:创建 API**
|
||||
|
||||
定义 `StockingIvt`、`StockingIvtUpdateReq`、`PaperVehicleInventory`,实现 page/get/update/paperVehicleList 四个请求。
|
||||
|
||||
- [ ] **步骤 3:类型检查**
|
||||
|
||||
先读取前端 `package.json` 确定实际脚本,再运行对应应用 typecheck;预期新增 API 和常量无类型错误。
|
||||
|
||||
### 任务 5:列表和修改弹窗
|
||||
|
||||
- [ ] **步骤 1:创建 `data.ts`**
|
||||
|
||||
查询表单包含点位编码、名称、托盘号、类型、状态、是否启用。列表列严格按规格顺序;类型、状态、启用显示字典标签,托盘列与操作列使用插槽。
|
||||
|
||||
- [ ] **步骤 2:创建修改弹窗**
|
||||
|
||||
打开时按 `ivtId` 拉取最新详情。点位编码和名称只读;编辑其余七个字段。确认时只调用 update API,成功后关闭并刷新。
|
||||
|
||||
- [ ] **步骤 3:创建列表页**
|
||||
|
||||
使用 `useVbenVxeGrid`;不提供勾选、新增、删除和导出。操作列只有修改。托盘号非空时显示链接并打开库存弹窗。
|
||||
|
||||
- [ ] **步骤 4:运行类型检查**
|
||||
|
||||
运行任务 4 确认的命令,预期无新增错误。
|
||||
|
||||
### 任务 6:5×5 托盘库存弹窗
|
||||
|
||||
- [ ] **步骤 1:构建固定网格**
|
||||
|
||||
初始化 25 格,用 `(rowNum - 1) * 5 + (colNum - 1)` 填入接口数据;占用数为记录数,空位数为 `25 - occupiedCount`。
|
||||
|
||||
- [ ] **步骤 2:渲染网格**
|
||||
|
||||
显示列 1 至 5、行 1 至 5。有料格展示编码、名称并高亮,空格显示“空”。Tooltip 展示行列、物料编码、名称和原始数量,标题包含托盘号。
|
||||
|
||||
- [ ] **步骤 3:验证空托盘逻辑**
|
||||
|
||||
托盘号为空不渲染链接;接口空数组展示 25 个空格和“已占用 0 / 25”。
|
||||
|
||||
- [ ] **步骤 4:运行类型检查**
|
||||
|
||||
运行任务 4 确认的命令,预期无新增错误。
|
||||
|
||||
### 任务 7:最终验证
|
||||
|
||||
- [ ] **步骤 1:检查边界**
|
||||
|
||||
```bash
|
||||
git status --short
|
||||
git diff --check
|
||||
git diff --stat
|
||||
```
|
||||
|
||||
确认不覆盖原有 `RpcConfiguration.java`、`application-dev.yaml` 和 `nl-module-wms/img.png` 用户改动。
|
||||
|
||||
- [ ] **步骤 2:编译后端**
|
||||
|
||||
运行 Maven compile,预期 `BUILD SUCCESS`。
|
||||
|
||||
- [ ] **步骤 3:检查前端**
|
||||
|
||||
运行实际可用的 typecheck,预期退出码 0;若存在仓库基线错误,记录与本次文件无关的证据。
|
||||
|
||||
- [ ] **步骤 4:需求核对**
|
||||
|
||||
确认:无新增删除;无“规划”;编码与名称只读;七个字段可改;字典值正确;托盘号可点击;库存为 5×5;每格一根;空托盘显示正确。
|
||||
@@ -0,0 +1,99 @@
|
||||
# LMS 备货区域查询与维护设计
|
||||
|
||||
## 目标
|
||||
|
||||
在 LMS 管理端新增“备货区域”功能,基于 `lms_ivt_stockingivt` 提供分页查询和修改能力;点击托盘号后,基于 `lms_base_papervehicle` 以 5×5 俯视网格展示该托盘库存。
|
||||
|
||||
## 范围
|
||||
|
||||
- 提供分页查询、详情查询、修改和托盘库存查询。
|
||||
- 不提供新增、删除、批量删除、导出。
|
||||
- 不展示截图中的“规划”列。
|
||||
- 不修改业务表结构;新增系统字典类型和字典数据初始化 SQL。
|
||||
- 页面权限拆分为 `lms:stocking-ivt:query` 与 `lms:stocking-ivt:update`。
|
||||
- 菜单由系统菜单配置挂载到 LMS 下,前端页面路径为 `lms/stockingivt/index`。
|
||||
|
||||
## 主列表
|
||||
|
||||
查询条件采用现有 Vben 响应式表单布局,桌面端一行多项,空间不足时自动换行。查询项为:
|
||||
|
||||
- 点位编码:模糊匹配。
|
||||
- 点位名称:模糊匹配。
|
||||
- 托盘号:模糊匹配。
|
||||
- 点位类型:精确匹配,选项为“绑定位、缓存位、对接位”。
|
||||
- 点位状态:精确匹配,选项为“空、有托盘”。
|
||||
- 是否启用:精确匹配,显示“启用、停用”。
|
||||
|
||||
列表按 `ivt_id` 倒序分页,展示:点位编码、点位名称、托盘号、点位类型、点位状态、位置、顺序号、是否启用、备注、修改人、修改时间、操作。
|
||||
|
||||
托盘号非空时显示为可点击链接;为空时显示 `-`。操作列只提供“修改”。
|
||||
|
||||
## 修改
|
||||
|
||||
修改弹窗按 `ivt_id` 查询最新记录。点位编码、点位名称只读;可修改字段为:
|
||||
|
||||
- 托盘号 `vehicle_code`
|
||||
- 点位类型 `point_type`
|
||||
- 点位状态 `ivt_status`
|
||||
- 位置 `point_location`
|
||||
- 顺序号 `sort_seq`
|
||||
- 是否启用 `is_used`
|
||||
- 备注 `remark`
|
||||
|
||||
`product_area` 不在截图字段中,本功能不展示也不修改。更新对象仅包含主键及上述可编辑字段,防止覆盖点位编码、点位名称和审计字段。记录不存在时返回业务异常。
|
||||
|
||||
点位类型和点位状态使用系统字典,业务表存储字典编码:
|
||||
|
||||
- `lms_stocking_ivt_point_type`:`1=绑定位`、`2=缓存位`、`3=对接位`。
|
||||
- `lms_stocking_ivt_status`:`1=空`、`2=有托盘`。
|
||||
|
||||
新增幂等初始化脚本 `sql/mysql/lms_stocking_ivt_dict.sql`,向 `system_dict_type` 和 `system_dict_data` 写入上述对照关系。前端在 `DICT_TYPE` 中注册两个编码,查询表单、列表字典标签和修改表单统一通过 `getDictOptions`、字典格式化组件读取,不在页面重复维护选项。
|
||||
|
||||
## 托盘库存 5×5 网格
|
||||
|
||||
点击托盘号后按 `vehicle_code` 查询 `lms_base_papervehicle`,按 `row_num`、`col_num` 升序返回库存。弹窗固定渲染 5 行 × 5 列:
|
||||
|
||||
- `row_num`、`col_num` 为 1 至 5 的记录填入对应格子。
|
||||
- 每格代表 1 根物料;有库存时展示物料编码和物料名称,不额外展示数量。
|
||||
- 无记录的格子显示“空”。
|
||||
- 顶部显示“已占用 N / 25”和“空位 25-N”。
|
||||
- 单格悬停或点击可查看完整的行号、列号、物料编码、物料名称和数据库数量。
|
||||
- 同一托盘同一行列若存在多条记录,接口返回明确业务异常,避免页面静默覆盖脏数据。
|
||||
- 超出 1 至 5 的行列记录不进入网格,并在接口侧返回业务异常,避免库存位置被隐藏。
|
||||
|
||||
## 后端结构
|
||||
|
||||
新增独立业务包 `stockingivt`:
|
||||
|
||||
- `StockingIvtController`:提供 `/page`、`/get`、`/update`、`/paper-vehicle-list` 四个接口。
|
||||
- 请求与响应 VO:隔离分页条件、修改字段、列表数据及托盘格位数据。
|
||||
- `StockingIvtService`:负责存在性校验、受控更新及托盘行列完整性校验。
|
||||
- `StockingIvtMapper.xml`:所有查询 SQL 写入 XML;分页查询不联查托盘明细。
|
||||
- `StockingIvtDO` 与 `PaperVehicleDO`:分别映射两张现有表。
|
||||
|
||||
托盘明细采用点击时按需查询,避免主列表分页请求加载最多 25 倍的库存行。
|
||||
|
||||
## 前端结构
|
||||
|
||||
新增:
|
||||
|
||||
- `src/api/lms/stockingivt/index.ts`:类型及四个接口。
|
||||
- `src/views/lms/stockingivt/index.vue`:分页表格、托盘链接和两个弹窗入口。
|
||||
- `src/views/lms/stockingivt/data.ts`:查询项、列表列和修改表单配置。
|
||||
- `src/views/lms/stockingivt/modules/form.vue`:修改弹窗。
|
||||
- `src/views/lms/stockingivt/modules/pallet-inventory.vue`:5×5 托盘库存弹窗。
|
||||
- `packages/constants/src/dict-enum.ts`:注册 `LMS_STOCKING_IVT_POINT_TYPE` 和 `LMS_STOCKING_IVT_STATUS`。
|
||||
|
||||
## 错误处理
|
||||
|
||||
- 修改不存在的点位时返回“备货区域点位不存在”。
|
||||
- 托盘无库存时正常返回空列表,前端展示 25 个空格。
|
||||
- 行列越界、重复格位时返回业务异常并提示数据异常。
|
||||
- 请求失败沿用全局请求拦截与消息提示,不在页面吞掉异常。
|
||||
|
||||
## 验证
|
||||
|
||||
- 后端编译验证新增 Java、MyBatis XML 和接口签名。
|
||||
- 前端运行类型检查,确认页面、API 类型和插槽正确。
|
||||
- 人工核对查询条件、列表字段、只读字段、可编辑字段及权限。
|
||||
- 使用空托盘、部分占用托盘、满托盘三类数据核对 5×5 坐标、占用统计和空位显示。
|
||||
@@ -7,12 +7,12 @@ spring:
|
||||
username: nacos
|
||||
password: nacos
|
||||
discovery: # 【配置中心】配置项
|
||||
namespace: dev # 命名空间。这里使用 dev 开发环境
|
||||
namespace: 91c8ac41-7fb0-423b-947e-2caad4c87d41 # 命名空间。这里使用 dev 开发环境
|
||||
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
|
||||
metadata:
|
||||
version: 1.0.0 # 服务实例的版本号,可用于灰度发布
|
||||
config: # 【注册中心】配置项
|
||||
namespace: dev # 命名空间。这里使用 dev 开发环境
|
||||
namespace: 91c8ac41-7fb0-423b-947e-2caad4c87d41 # 命名空间。这里使用 dev 开发环境
|
||||
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
|
||||
|
||||
--- #################### 数据库相关配置 ####################
|
||||
@@ -57,12 +57,12 @@ spring:
|
||||
primary: master
|
||||
datasource:
|
||||
master:
|
||||
url: jdbc:mysql://192.168.81.193:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
|
||||
url: jdbc:mysql://127.0.0.1:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
|
||||
username: root
|
||||
password: root
|
||||
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
|
||||
lazy: true # 开启懒加载,保证启动速度
|
||||
url: jdbc:mysql://192.168.81.193:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
|
||||
url: jdbc:mysql://127.0.0.1:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
|
||||
username: root
|
||||
password: root
|
||||
|
||||
|
||||
Reference in New Issue
Block a user