更新VSCode配置,启用Maven支持,设置Java 17环境,调整MybatisPlusSaasConfig以开启系统租户控制并添加新租户表。更新pom.xml以包含新模块jeecg-module-xslmes,优化Vue3环境配置以统一API路径,增强代理设置以支持完整的后端路径。修复useForm钩子中的字段重置逻辑,改进axios配置以处理相对URL的上下文路径问题。

This commit is contained in:
geht
2026-04-21 13:41:05 +08:00
parent 73426a7af3
commit 1b06e987dc
114 changed files with 8249 additions and 17 deletions

View File

@@ -0,0 +1,220 @@
# MES XSL「客户到仓库」当前实现说明
本文档只描述**当前设计与实现**:数据表、字段含义、后端与前端逻辑、实体间关系、约束与使用方式,不涉及历史变更过程。
---
## 一、涉及的数据表
| 表名 | 作用 |
|------|------|
| `mes_xsl_customer` | 客户主数据 |
| `mes_xsl_warehouse` | 仓库主数据(通过分类 + 客户/供应商字段实现「客户库 / 供应商库」) |
| `mes_xsl_supplier` | 供应商主数据 |
| `mes_xsl_unit` | 单位主数据(分类挂在系统分类字典上) |
| `sys_category` | 系统「分类字典」:仓库分类树根编码 `XSLMES_WH`,单位分类树根编码 `XSLMES_UNIT` |
---
## 二、字段说明
### 2.1 `mes_xsl_customer`
| 字段 | 说明 |
|------|------|
| `id` | 主键 |
| `customer_code` | 客户编码 |
| `customer_name` | 客户名称 |
| `customer_short_name` | 客户简称 |
| `customer_region` | 区域,数据字典 `xslmes_customer_region` |
| `erp_code` | ERP 编码 |
| `status` | 业务状态,字典 `xslmes_customer_status` |
| `del_flag` | 逻辑删除0 正常 1 已删除) |
| `customer_desc` | 描述 |
| `iz_enable` | 是否启用(与状态等业务规则配合) |
| `create_by` / `create_time` / `update_by` / `update_time` | 审计字段(继承 Jeecg 基类) |
| `tenant_id` | 租户 ID |
### 2.2 `mes_xsl_warehouse`(客户 / 供应商与仓库的衔接点)
| 字段 | 说明 |
|------|------|
| `id` | 主键 |
| `warehouse_code` | 仓库编码 |
| `warehouse_name` | 仓库名称 |
| `warehouse_category` | **仓库分类**:存储 **`sys_category.id`**;该分类必须属于根编码 **`XSLMES_WH`** 下的子树 |
| `erp_code` | ERP 编码 |
| `status` | 启用/停用,字典 **`xslmes_unit_status`** |
| `customer_id` | 客户主键;**仅当**分类节点 `code = XSLMES_WH_F2_KH`(客户库)时必填且有意义 |
| `customer_short_name` | 客户简称(展示/冗余) |
| `supplier_id` | 供应商主键;**仅当**分类节点 `code = XSLMES_WH_F2_GYS`(供应商库)时必填且有意义 |
| `supplier_short_name` | 供应商简称(展示/冗余) |
| `del_flag` | 逻辑删除 |
| 审计字段、`tenant_id` | 同 Jeecg 惯例 |
**索引:** `warehouse_code``warehouse_category`
### 2.3 `sys_category`(与仓库、单位相关的用法)
- **仓库**:根节点 `code = XSLMES_WH`(常量 `MesXslWarehouseCategory.ROOT_CODE`)。`mes_xsl_warehouse.warehouse_category` 存任意该树下的 **`id`**(通常选叶子节点)。
- **单位**:根节点 `code = XSLMES_UNIT``mes_xsl_unit.category_id` 存对应 **`id`**。
**与仓库校验相关的分类编码(后端写死):**
| `sys_category.code` | 含义 | 业务规则 |
|---------------------|------|----------|
| `XSLMES_WH_F2_KH` | 客户库 | 保存仓库时 **必须**`customer_id` |
| `XSLMES_WH_F2_GYS` | 供应商库 | 保存仓库时 **必须**`supplier_id` |
当前种子树结构为:**根 `XSLMES_WH` → 一楼库 / 二楼仓库 → 各叶子**(成品库、待检库、客户库、供应商库等);运维可在该根下扩展子节点(需具备分类维护权限)。
### 2.4 `mes_xsl_supplier`
| 字段 | 说明 |
|------|------|
| `id` | 主键 |
| `supplier_code` | 编码 |
| `supplier_name` | 名称 |
| `supplier_short_name` | 简称 |
| `erp_code` | ERP 编码 |
| `remark` | 备注 |
| `status` | 状态,字典 `xslmes_supplier_status` |
| `del_flag` | 逻辑删除 |
| 审计字段、`tenant_id` | 同 Jeecg 惯例 |
### 2.5 `mes_xsl_unit`
| 字段 | 说明 |
|------|------|
| `id` | 主键 |
| `unit_code` / `unit_name` | 单位编码、名称 |
| `erp_code` | ERP 编码 |
| `category_id` | **所属分类**`sys_category.id`,且属于根 **`XSLMES_UNIT`** 子树 |
| `unit_desc` | 描述 |
| `status` | 字典 `xslmes_unit_status` |
| `del_flag` | 逻辑删除 |
| 审计字段、`tenant_id` | 同 Jeecg 惯例 |
---
## 三、实现逻辑
### 3.1 仓库保存与更新(后端)
实现类:`MesXslWarehouseServiceImpl`,在 `save` / `updateById` 时统一处理。
1. **按分类清理客户 / 供应商(`normalizePartners`**
- 未选分类:清空 `customer_id``customer_short_name``supplier_id``supplier_short_name`
- 已选分类:根据 `warehouse_category` 查询 `sys_category.code`
- 若不是 **客户库**`XSLMES_WH_F2_KH`):清空客户相关两字段。
- 若不是 **供应商库**`XSLMES_WH_F2_GYS`):清空供应商相关两字段。
- 目的:切换仓库类型后不留错误的客户或供应商数据。
2. **按分类校验(`validatePartners`**
- **客户库**`customer_id` 为空则抛出业务异常:「仓库分类为客户库时,请选择客户」。
- **供应商库**`supplier_id` 为空则抛出类似提示。
3. **分类编码查询**
- `MesXslWarehouseMapper.queryCategoryCodeById``SELECT code FROM sys_category WHERE id = ?`
### 3.2 字典与展示
- `MesXslWarehouse.warehouse_category` 使用 `@Dict(dictTable = "sys_category", dicText = "name", dicCode = "id")`,列表/详情按 **分类名称** 展示。
- `MesXslUnit.category_id` 同样指向 `sys_category`
### 3.3 前端(仓库)
- 菜单路由:`/xslmes/mesXslWarehouse`,列表组件:`MesXslWarehouseList`
- 左侧分类树:加载根编码 **`XSLMES_WH`** 的分类树(系统分类字典接口,与 `JCategorySelect``pcode` 一致)。
- 列表筛选与查询参数需与后端 `QueryGenerator` 约定一致(如 `warehouseCategory`、多选场景下的 `warehouseCategory_MultiString` 等)。
- 侧栏 **新增 / 编辑 / 删除分类**:调用 `/sys/category` 下标准增删改接口;按钮权限为 `xslmes:mes_xsl_warehouse_category:add|edit|delete`
### 3.4 前端(单位)
- 分类选择:`JCategorySelect``pcode: XSLMES_UNIT`
- 按左侧分类筛选列表时,后端通过 **递归查询子分类 id**`MesXslUnitService.listDescendantCategoryIds` / `MesXslUnitMapper`)过滤数据;依赖 **MySQL 8** 递归 CTE。
### 3.5 接口前缀REST
| 模块 | 路径前缀 |
|------|----------|
| 客户 | `/xslmes/mesXslCustomer` |
| 仓库 | `/xslmes/mesXslWarehouse` |
| 供应商 | `/xslmes/mesXslSupplier` |
| 单位 | `/xslmes/mesXslUnit` |
具体方法为 Jeecg 标准 CRUD如列表、新增、编辑、删除、导入导出等见各 `Controller`
---
## 四、关联关系
数据库层**不强制外键**时,由应用与数据约定保证引用有效。
```mermaid
erDiagram
sys_category_WH["sys_category根 XSLMES_WH"] ||--o{ mes_xsl_warehouse : "warehouse_category = id"
mes_xsl_customer ||--o{ mes_xsl_warehouse : "customer_id = id客户库"
mes_xsl_supplier ||--o{ mes_xsl_warehouse : "supplier_id = id供应商库"
sys_category_UNIT["sys_category根 XSLMES_UNIT"] ||--o{ mes_xsl_unit : "category_id = id"
```
**语义说明:**
- 一条仓库记录对应 **一个** `warehouse_category``sys_category` 的一行)。
- **客户库**:该仓库在业务上绑定 **一个** 客户(`customer_id``mes_xsl_customer.id`)。
- **供应商库**:绑定 **一个** 供应商(`supplier_id``mes_xsl_supplier.id`)。
- 其它分类:客户、供应商字段应在保存时被清空,不参与当前分类下的业务含义。
---
## 五、功能限制与注意点
1. **`warehouse_category` 必须是有效的 `sys_category.id`**,且业务上应选用 `XSLMES_WH` 树下节点;若 id 不存在或 `code` 查询不到,客户库/供应商库校验可能无法按预期触发。
2. **客户库与供应商库互斥**:非客户库会自动清空客户字段,非供应商库会自动清空供应商字段;不应依赖「改分类后仍保留另一侧 ID」。
3. **每条仓库仅一个客户、一个供应商字段**:与车辆等业务里「多客户 id 逗号拼接」等模型不同,仓库行是单值引用。
4. **多租户**:若启用 SaaS 租户隔离,`mes_xsl_*` 等表需在 MyBatis 租户配置中注册,否则会出现串租或查不到数据。
5. **单位分类树筛选**:依赖 MySQL 8 递归语法;低于 8.0 的环境需调整实现。
6. **前端联调**`VITE_GLOB_API_URL` 必须与后端 `context-path`(如 `/jeecg-boot`)一致,否则接口路径错误。
---
## 六、使用方法
### 6.1 环境
- 后端:`jeecg-system-start` 启动,数据库脚本由项目 **Flyway** 随应用升级自动执行,保证上述表与 `sys_category` 种子存在。
- 浏览器访问前端,使用已配置 **MES XSL** 菜单及仓库、客户、供应商、单位等权限的账号。
### 6.2 维护主数据
1. **客户**:菜单「客户管理」,维护 `mes_xsl_customer`
2. **供应商**:菜单「供应商管理」,维护 `mes_xsl_supplier`
3. **单位**:菜单「单位管理」,分类从 **`XSLMES_UNIT`** 树选择;可在侧栏维护分类(与仓库侧栏模式类似,权限依项目配置)。
### 6.3 维护仓库分类树
1. 打开 **仓库管理**
2. 在左侧分类区域使用新增/编辑/删除(需 `xslmes:mes_xsl_warehouse_category:*` 权限)。
3. 新建分类应挂在 **`XSLMES_WH`** 根之下,避免与其它业务根混淆。
### 6.4 新建「客户库」仓库
1. 新增仓库,**仓库分类** 选择 **客户库**`code``XSLMES_WH_F2_KH` 的节点)。
2. **必须** 选择客户并保存。
3. 若之后改为非客户库分类,保存后客户相关字段会被后端清空。
### 6.5 新建「供应商库」仓库
将分类选为 **供应商库**`XSLMES_WH_F2_GYS`**必须** 选择供应商;改为其它分类时供应商字段会被清空。
### 6.6 权限说明(仓库相关示例)
- 仓库 CRUD 等:`xslmes:mes_xsl_warehouse:add``edit``delete``deleteBatch``exportXls``importExcel``updateStatus` 等。
- 仓库分类维护:`xslmes:mes_xsl_warehouse_category:add``edit``delete`
实际以系统「菜单管理 / 角色授权」中配置为准。
---
*文档描述与当前代码、表结构一致;若常量 `MesXslWarehouseCategory` 或表字段有调整,请以仓库内源码与数据库为准同步更新本文档。*

View File

@@ -0,0 +1,309 @@
# MES XSL「客户到仓库」功能模块说明
本文档说明 Git 分支 **`客户到仓库功能模块`** 所承载的 MES XSL 业务能力,重点覆盖 **客户主数据**、**仓库管理(含客户库 / 供应商库)**、以及配套的 **单位分类改造**。文中表结构以 Flyway 脚本与实体类为准;实现逻辑以当前工作区代码为准。
---
## 1. 分支与代码范围说明
### 1.1 相对 `main` 已提交的内容
在当前仓库中执行 `git diff main --stat` 可见:分支相对 `main` **已提交**的改动主要集中在 **工程脚手架与环境**,例如:
- 后端:`jeecg-boot-module/pom.xml` 引入子模块、`jeecg-system-start/pom.xml` 依赖、`MybatisPlusSaasConfig` 租户表配置等。
- 前端:`jeecgboot-vue3``.env.*``vite` 代理、`axios`、表单 `useForm` 等。
**结论:** 若仅看「已提交到 Git 的差异」,并不会完整反映「客户、仓库、单位」等 MES 业务表与前后端页面;这些能力的**主要交付物**位于工作区中的:
| 区域 | 路径(仓库根下) |
|------|------------------|
| 后端模块 | `jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/` |
| 数据库迁移 | `jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_*__mes_xsl_*.sql` |
| 前端页面 | `jeecgboot-vue3/src/views/xslmes/` |
文档以下章节按**完整业务能力**描述;合并到 `main` 或发版前请确保上述目录已 **add / commit**,并与 Flyway 版本一致。
### 1.2 运行与依赖提示
- **MySQL**:建议 **8.0+**(单位列表按分类树筛选时使用递归 CTE`MesXslUnitMapper`)。
- **Flyway**:按版本号顺序执行;仓库分类以 **`V3.9.2_27`** 为界,由字典 `item_value` 迁移为 **`sys_category.id`**(见下文)。
- **API 前缀**:前端 `VITE_GLOB_API_URL` 需与后端 `context-path`(如 `/jeecg-boot`)一致,否则接口 404。
---
## 2. 数据表与字段
### 2.1 `mes_xsl_customer`(客户主数据)
客户是「客户库」仓库行的关联目标。
| 字段 | 类型(约) | 说明 |
|------|------------|------|
| `id` | varchar(36) | 主键 |
| `customer_code` | varchar(100) | 客户编码 |
| `customer_name` | varchar(200) | 客户名称 |
| `customer_short_name` | varchar(…) | 客户简称(后续脚本扩展,与实体一致) |
| `customer_region` | varchar(32) | 区域,字典 `xslmes_customer_region` |
| `erp_code` | varchar(100) | ERP 编码 |
| `status` | varchar(10) | 业务状态,字典 `xslmes_customer_status`0 启用 1 停用等) |
| `del_flag` | tinyint | 逻辑删除MyBatis-Plus `@TableLogic` |
| `customer_desc` | varchar(500) | 描述 |
| `iz_enable` | tinyint | 是否启用(与服务端状态同步) |
| `create_by` / `create_time` / `update_by` / `update_time` | 审计字段 | Jeecg 标准 |
| `tenant_id` | int | 租户 |
**初始化脚本:** `V3.9.2_4__mes_xsl_customer.sql` 及后续 `V3.9.2_5/6/20/21/23` 等补丁。
---
### 2.2 `mes_xsl_warehouse`(仓库,**客户到仓库的核心表**
| 字段 | 类型(约) | 说明 |
|------|------------|------|
| `id` | varchar(36) | 主键 |
| `warehouse_code` | varchar(100) | 仓库编码 |
| `warehouse_name` | varchar(200) | 仓库名称 |
| `warehouse_category` | varchar(36) | **仓库分类**:存 **`sys_category.id`**,根节点编码为 **`XSLMES_WH`**`V3.9.2_27` 后) |
| `erp_code` | varchar(100) | ERP 编码 |
| `status` | varchar(10) | 状态,字典 **`xslmes_unit_status`**0 启用 1 停用) |
| `customer_id` | varchar(36) | **客户主键**,仅在分类为 **客户库**`code = XSLMES_WH_F2_KH`)时有意义 |
| `customer_short_name` | varchar(200) | 客户简称展示 |
| `supplier_id` | varchar(36) | **供应商主键**,仅在分类为 **供应商库**`code = XSLMES_WH_F2_GYS`)时有意义 |
| `supplier_short_name` | varchar(100) | 供应商简称展示 |
| `del_flag` | tinyint | 逻辑删除 |
| 审计字段、`tenant_id` | | 同 Jeecg 惯例 |
**历史说明:** `V3.9.2_26` 建表时 `warehouse_category` 注释为字典 `xslmes_warehouse_category``item_value`**`V3.9.2_27` 执行后**,该列已批量 `UPDATE` 为对应 **`sys_category` 主键**,列类型改为 `varchar(36)`。字典 `xslmes_warehouse_category` 可能仍存在于库中,**业务应以 `sys_category` 为准**,避免混用。
**索引:** `warehouse_code``warehouse_category`
---
### 2.3 `sys_category`(系统分类字典,仓库与单位共用机制)
仓库与单位分类均挂在 **`sys_category`** 树上,通过根节点 **`code`** 区分业务域:
| 根编码 | 业务含义 | 典型脚本 |
|--------|----------|----------|
| **`XSLMES_WH`** | MES 仓库分类整棵树 | `V3.9.2_27__mes_xsl_warehouse_sys_category.sql` |
| **`XSLMES_UNIT`** | MES 单位分类整棵树 | `V3.9.2_29__mes_xsl_unit_sys_category.sql` |
**仓库侧关键叶子节点编码(业务常量硬编码校验):**
| `code` | 名称(种子数据) | 用途 |
|--------|------------------|------|
| `XSLMES_WH_F2_KH` | 客户库 | 必须绑定 **`customer_id`** |
| `XSLMES_WH_F2_GYS` | 供应商库 | 必须绑定 **`supplier_id`** |
其它叶子(如一楼成品库、二楼原材料库等)**不要求**填写客户或供应商;后端在保存前会 **清空** 无关的客户/供应商字段,防止切换分类后残留脏数据。
**树结构(种子):**`XSLMES_WH` → 一楼库 `XSLMES_WH_F1` / 二楼仓库 `XSLMES_WH_F2` → 各叶子分类(成品库、待检库、客户库、供应商库等),详见 `V3.9.2_27``INSERT`
---
### 2.4 `mes_xsl_supplier`(供应商)
供应商主数据,供「供应商库」类型仓库引用。
主要字段:`supplier_code``supplier_name``supplier_short_name``erp_code``remark``status``xslmes_supplier_status`)、`del_flag``tenant_id` 及 Jeecg 基类字段。脚本见 `V3.9.2_11` 等。
---
### 2.5 `mes_xsl_unit`(单位)
| 字段 | 说明 |
|------|------|
| `category_id` | **`sys_category.id`**,根编码 **`XSLMES_UNIT`**`V3.9.2_29` 后) |
**`mes_xsl_unit_category`** `V3.9.2_29` 将数据迁入 `sys_category`**已 `DROP`**,单位侧栏维护方式与仓库侧一致(分类字典 API
---
### 2.6 其它相关表(同一 MES 模块,扩展阅读)
- **`mes_xsl_vehicle`**:车辆;含 `customer_ids`(多选逗号)、`supplier_id` 等,与主数据客户/供应商有关联,但不改变「仓库行绑定单一客户/供应商」的规则。
- **`mes_xsl_instrument`**:仪器等独立主数据。
---
## 3. 实现逻辑
### 3.1 仓库保存 / 更新(客户库、供应商库)
类:`MesXslWarehouseServiceImpl`
1. **`normalizePartners`**(保存前规范化)
- 若未选分类:清空客户、供应商相关字段。
- 否则根据 `warehouse_category``sys_category.id`)查询 **`code`**
-**客户库**`XSLMES_WH_F2_KH`):清空 `customer_id``customer_short_name`
-**供应商库**`XSLMES_WH_F2_GYS`):清空 `supplier_id``supplier_short_name`
- 目的:从「客户库」改成其它分类时,不保留旧客户信息。
2. **`validatePartners`**(校验)
- 分类为 **客户库**`customer_id` 不能为空,否则抛出 `JeecgBootException("仓库分类为客户库时,请选择客户")`
- 分类为 **供应商库**`supplier_id` 不能为空,否则抛出类似供应商提示。
3. **分类编码查询**
- `MesXslWarehouseMapper.queryCategoryCodeById``SELECT code FROM sys_category WHERE id = ?`
- 业务判断常量:`MesXslWarehouseCategory.CUSTOMER_CATEGORY_CODE` / `SUPPLIER_CATEGORY_CODE`
### 3.2 实体与字典翻译
- `MesXslWarehouse.warehouseCategory` 使用 `@Dict(dictTable = "sys_category", dicText = "name", dicCode = "id")`,列表/表单显示分类名称。
### 3.3 前端仓库页
- 列表路由:`/xslmes/mesXslWarehouse`(菜单 `V3.9.2_26` 种子)。
- 左侧分类树:调用系统接口加载根编码 **`XSLMES_WH`** 的子树(与 `/sys/category/loadTreeRoot` 等标准分类字典用法一致)。
- 列表查询字段与 `QueryGenerator` 规则一致:如 `warehouseCategory``warehouseCategory_MultiString` 等(用于叶子或父级筛选)。
- 侧栏 **新增 / 编辑 / 删除分类**:走 `/sys/category/add|edit|delete`,需按钮权限(见下节)。
### 3.4 前端单位页(与仓库同模式)
- `category_id` 使用 `JCategorySelect``pcode: XSLMES_UNIT`
- 列表树筛选使用 `MesXslUnitService.listDescendantCategoryIds`(递归子分类),依赖 MySQL 8 递归 CTE。
---
## 4. 关联关系(逻辑模型)
以下为 **逻辑关联**(脚本未强制数据库外键时,由应用层保证)。
```mermaid
erDiagram
sys_category_WH["sys_category (根 XSLMES_WH)"] ||--o{ mes_xsl_warehouse : "warehouse_category = id"
mes_xsl_customer ||--o{ mes_xsl_warehouse : "customer_id = id (仅客户库)"
mes_xsl_supplier ||--o{ mes_xsl_warehouse : "supplier_id = id (仅供应商库)"
sys_category_UNIT["sys_category (根 XSLMES_UNIT)"] ||--o{ mes_xsl_unit : "category_id = id"
```
**要点:**
- **多对一N:1**:多个仓库行可对应同一客户或同一供应商(视业务是否允许重复配置而定);每条仓库行 **最多一个** `customer_id` 与一个 `supplier_id`,且由分类决定哪一侧生效。
- **客户库**`mes_xsl_warehouse.customer_id``mes_xsl_customer.id`
- **供应商库**`mes_xsl_warehouse.supplier_id``mes_xsl_supplier.id`
---
## 5. 权限与菜单
### 5.1 仓库菜单(节选)
- 菜单 ID `1900000000000000380`:仓库管理,前端组件 `xslmes/mesXslWarehouse/MesXslWarehouseList`
- 按钮权限示例:
- `xslmes:mes_xsl_warehouse:add|edit|delete|deleteBatch|exportXls|importExcel|updateStatus`
- **分类维护按钮**`V3.9.2_28`
- `xslmes:mes_xsl_warehouse_category:add`
- `xslmes:mes_xsl_warehouse_category:edit`
- `xslmes:mes_xsl_warehouse_category:delete`
管理员角色在种子脚本中已授权一批 `sys_role_permission`(以脚本中 `role_id` 为准;生产环境需按实际角色分配)。
### 5.2 客户菜单
- 父模块「MES XSL」与客户列表、客户 CRUD 按钮权限见 `V3.9.2_4``V3.9.2_23/24/25` 等。
### 5.3 后端接口前缀
| 资源 | `@RequestMapping` 前缀 |
|------|-------------------------|
| 客户 | `/xslmes/mesXslCustomer` |
| 仓库 | `/xslmes/mesXslWarehouse` |
| 供应商 | `/xslmes/mesXslSupplier` |
| 单位 | `/xslmes/mesXslUnit` |
| 车辆 | `/xslmes/mesXslVehicle` |
Jeecg 标准 CRUD`/list``/add``/edit``/delete` 等,具体见各 `Controller`。)
---
## 6. 功能限制与注意点
1. **分类存储形态**
- 必须使用 **`sys_category.id`** 写入 `warehouse_category`。若手工写入旧字典值(如 `CUSTOMER`),字典翻译与后端 `code` 判断会不一致。
2. **客户库 / 供应商库互斥展示**
- 后端会清掉「当前分类不需要」的一方字段;**不能**指望在「客户库」下仍保留供应商 ID。
3. **单客户 / 单供应商 per 仓库行**
- 与车辆表 `customer_ids` 多选逗号不同,**仓库表为单值 `customer_id`**,表示该仓库行归属单一客户(业务设计如此)。
4. **分类 id 非法或缺失**
-`warehouse_category` 指向不存在的 `sys_category``queryCategoryCodeById` 可能返回 `null`,此时不会按客户库/供应商库做强校验;应避免脏数据,建议在界面只选合法分类。
5. **字典 `xslmes_warehouse_category`**
- `V3.9.2_26` 曾用于初始化;**`V3.9.2_27` 后业务以 `sys_category` 为准**。报表或旧报表若仍读字典需改造。
6. **租户**
- `MybatisPlusSaasConfig` 中需包含 `mes_xsl_*` 等业务表,否则多租户下数据隔离异常。
7. **单位分类迁移**
- 执行 `V3.9.2_29`**`mes_xsl_unit_category` 表删除**,旧代码中依赖该表的接口需已全部移除。
---
## 7. 使用方法(业务与运维)
### 7.1 初始化数据库
1. 启动带 Flyway 的 `jeecg-system-start`,确保 **`V3.9.2_26``V3.9.2_27``V3.9.2_28``V3.9.2_29`**(及客户相关 `V3.9.2_4` 等)按序成功执行。
2. 验证 `sys_category` 中存在 `code = 'XSLMES_WH'``'XSLMES_UNIT'` 的根节点及子节点。
3. 验证 `mes_xsl_warehouse.warehouse_category` 列为 `varchar(36)` 且存量数据已为 **36 位 id**(由 27 脚本迁移)。
### 7.2 配置客户与供应商主数据
1. 菜单 **MES XSL → 客户管理**:维护 `mes_xsl_customer`
2. **供应商管理**:维护 `mes_xsl_supplier`
3. 确保客户/供应商状态与业务规则一致(启用等),以便仓库弹窗可选。
### 7.3 维护仓库分类树
1. 进入 **仓库管理** 页面。
2. 在侧栏使用 **新增 / 编辑 / 删除分类**(需具备 `xslmes:mes_xsl_warehouse_category:*` 权限)。
3. 新增节点应挂在 **`XSLMES_WH`** 树下,避免与其它根混淆。
### 7.4 新建「客户库」仓库
1. 新增仓库,**仓库分类** 选择 **客户库**`XSLMES_WH_F2_KH` 对应节点)。
2. **必须选择客户**;保存后 `customer_id``customer_short_name` 写入。
3. 若改为非客户库分类,保存后客户字段会被后端清空。
### 7.5 新建「供应商库」仓库
与客户库对称:分类选 **供应商库****必须选择供应商**。
### 7.6 开发与联调
1. 后端引入模块:`jeecg-module-xslmes` 已被 `jeecg-system-start` 依赖(以当前 `pom` 为准)。
2. 修改接口后执行 **`mvn compile`** 并重启,避免 Controller 未编译导致 404。
3. 前端 `.env.development` 中 API 地址与后端 `context-path` 一致。
---
## 8. Flyway 脚本索引MES XSL 相关)
可按文件名在仓库中搜索;下列为当前常见的 `mes_xsl` 迁移(版本号以实际仓库为准):
| 脚本 | 主题 |
|------|------|
| `V3.9.2_4` | 客户表、字典、菜单 |
| `V3.9.2_5` ~ `V3.9.2_7` | 客户简称、同步状态、车辆 |
| `V3.9.2_8` ~ `V3.9.2_9` | 单位表、种子 |
| `V3.9.2_10` ~ `V3.9.2_18` | 车辆/单位/仪器/状态等补丁 |
| `V3.9.2_11` | 供应商 |
| `V3.9.2_20` ~ `V3.9.2_25` | 客户租户、字典、菜单按钮、is_leaf 等 |
| **`V3.9.2_26`** | **仓库表、仓库字典、菜单与按钮** |
| **`V3.9.2_27`** | **仓库分类 → sys_category数据迁移** |
| **`V3.9.2_28`** | **仓库分类维护按钮权限** |
| **`V3.9.2_29`** | **单位分类 → sys_category删除旧表** |
---
## 9. 文档维护
- 若表结构或常量编码变更,请同步修改:`MesXslWarehouseCategory``Flyway` 种子、`sys_category` 根/子节点编码。
- 合并分支前建议再执行一次:`git status` 确认 `jeecg-module-xslmes``V3.9.2_*` 脚本均已纳入版本控制。
---
*文档生成依据:分支 `客户到仓库功能模块` 工作区代码与 Flyway 脚本;相对 `main` 的 Git 提交差异请单独以 `git log` / `git diff` 为准。*