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

221 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 或表字段有调整,请以仓库内源码与数据库为准同步更新本文档。*