Files
qhmes/docs/MES-XSL-客户到仓库-当前实现说明.md

221 lines
10 KiB
Markdown
Raw Normal View History

# 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` 或表字段有调整,请以仓库内源码与数据库为准同步更新本文档。*