diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialCategoryController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialCategoryController.java index c94e20ce..aa49a6e7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialCategoryController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialCategoryController.java @@ -33,6 +33,10 @@ public class BizMaterialCategoryController extends BaseController { @DeleteMapping("/{categoryId}") public AjaxResult remove(@PathVariable Long categoryId) { - return toAjax(service.deleteCategory(categoryId)); + try { + return toAjax(service.deleteCategory(categoryId)); + } catch (Exception e) { + return AjaxResult.error(e.getMessage()); + } } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialCategoryMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialCategoryMapper.java index b0a4ab90..47a3960b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialCategoryMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialCategoryMapper.java @@ -7,6 +7,12 @@ import java.util.List; public interface BizMaterialCategoryMapper { List selectCategoryList(); BizMaterialCategory selectCategoryById(@Param("categoryId") Long categoryId); + /** 查询子分类数量 */ + int countChildren(@Param("parentId") Long parentId); + /** 查询关联该分类的物料数量 */ + int countMaterials(@Param("categoryId") Long categoryId); + /** 查询所有后代分类ID(通过ancestors LIKE) */ + List selectDescendantIds(@Param("ancestors") String ancestors); int insertCategory(BizMaterialCategory category); int updateCategory(BizMaterialCategory category); int deleteCategory(@Param("categoryId") Long categoryId); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialCategoryService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialCategoryService.java index 20e6756c..3eb398c4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialCategoryService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialCategoryService.java @@ -7,5 +7,6 @@ public interface IBizMaterialCategoryService { List selectCategoryList(); int insertCategory(BizMaterialCategory category); int updateCategory(BizMaterialCategory category); - int deleteCategory(Long categoryId); + /** 删除分类(含子分类和物料校验) */ + int deleteCategory(Long categoryId) throws Exception; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialCategoryServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialCategoryServiceImpl.java index 05606d40..8f8567e2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialCategoryServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialCategoryServiceImpl.java @@ -36,7 +36,19 @@ public class BizMaterialCategoryServiceImpl implements IBizMaterialCategoryServi public int updateCategory(BizMaterialCategory cat) { return mapper.updateCategory(cat); } @Override - public int deleteCategory(Long categoryId) { return mapper.deleteCategory(categoryId); } + public int deleteCategory(Long categoryId) throws Exception { + // 校验子分类 + int childCount = mapper.countChildren(categoryId); + if (childCount > 0) { + throw new Exception("该分类下存在子分类,无法删除"); + } + // 校验关联物料 + int materialCount = mapper.countMaterials(categoryId); + if (materialCount > 0) { + throw new Exception("该分类下存在物料,无法删除"); + } + return mapper.deleteCategory(categoryId); + } private List buildTree(List all) { Map map = new LinkedHashMap<>(); diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizMaterialCategoryMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizMaterialCategoryMapper.xml index 978ced5e..00ab9613 100644 --- a/ruoyi-system/src/main/resources/mapper/bid/BizMaterialCategoryMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/bid/BizMaterialCategoryMapper.xml @@ -16,6 +16,20 @@ FROM biz_material_category WHERE category_id = #{categoryId} + + + + + + INSERT INTO biz_material_category (tenant_id,category_name,parent_id,ancestors,sort,status,create_by,create_time) VALUES (1,#{categoryName},#{parentId},#{ancestors},#{sort},#{status},#{createBy},NOW()) diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml index 0fcec711..78da41a5 100644 --- a/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml @@ -29,7 +29,16 @@ LEFT JOIN biz_material_category c ON m.category_id = c.category_id AND m.tenant_id = #{tenantId} - AND m.category_id = #{categoryId} + AND ( + m.category_id = #{categoryId} + OR m.category_id IN ( + SELECT category_id FROM biz_material_category + WHERE ancestors LIKE CONCAT( + (SELECT ancestors FROM biz_material_category WHERE category_id = #{categoryId}), + ',%' + ) + ) + ) AND m.material_code LIKE CONCAT('%',#{materialCode},'%') AND m.material_name LIKE CONCAT('%',#{materialName},'%') AND m.brand LIKE CONCAT('%',#{brand},'%') diff --git a/ruoyi-ui/src/views/bid/material/detail.vue b/ruoyi-ui/src/views/bid/material/detail.vue index c88606ae..f11b3bcb 100644 --- a/ruoyi-ui/src/views/bid/material/detail.vue +++ b/ruoyi-ui/src/views/bid/material/detail.vue @@ -75,7 +75,16 @@
所属分类
- + {{ material.categoryName || '' }}
@@ -142,6 +151,7 @@ diff --git a/sql/init_material_category.sql b/sql/init_material_category.sql new file mode 100644 index 00000000..1f99daba --- /dev/null +++ b/sql/init_material_category.sql @@ -0,0 +1,219 @@ +-- ============================================================ +-- 物料分类体系初始化脚本 +-- 1. 插入标准分类数据(三级层级) +-- 2. 批量更新现有物料的分类关联 +-- ============================================================ + +SET NAMES utf8mb4; + +-- ============================================================ +-- 第一部分:插入标准分类数据 +-- ============================================================ + +-- 一级分类 +INSERT INTO biz_material_category (tenant_id, category_name, parent_id, ancestors, sort, status, create_by, create_time) +VALUES +(1, '电气控制', 0, '0', 1, '0', 'admin', NOW()), +(1, '传感器', 0, '0', 2, '0', 'admin', NOW()), +(1, '机械传动', 0, '0', 3, '0', 'admin', NOW()), +(1, '气动液压', 0, '0', 4, '0', 'admin', NOW()), +(1, '辅材耗材', 0, '0', 5, '0', 'admin', NOW()); + +-- 获取一级分类ID并插入二级分类 +-- 电气控制 -> PLC控制器, 变频器, 低压电器, 人机界面 +INSERT INTO biz_material_category (tenant_id, category_name, parent_id, ancestors, sort, status, create_by, create_time) +SELECT 1, t.sub_name, t.pid, CONCAT(p.ancestors, ',', p.category_id), t.sort, '0', 'admin', NOW() +FROM ( + SELECT 'PLC控制器' AS sub_name, category_id AS pid, 1 AS sort FROM biz_material_category WHERE category_name='电气控制' AND parent_id=0 + UNION ALL + SELECT '变频器', category_id, 2 FROM biz_material_category WHERE category_name='电气控制' AND parent_id=0 + UNION ALL + SELECT '低压电器', category_id, 3 FROM biz_material_category WHERE category_name='电气控制' AND parent_id=0 + UNION ALL + SELECT '人机界面', category_id, 4 FROM biz_material_category WHERE category_name='电气控制' AND parent_id=0 +) t +JOIN biz_material_category p ON t.pid = p.category_id; + +-- 传感器 -> 接近开关, 光电传感器, 温度传感器 +INSERT INTO biz_material_category (tenant_id, category_name, parent_id, ancestors, sort, status, create_by, create_time) +SELECT 1, t.sub_name, t.pid, CONCAT(p.ancestors, ',', p.category_id), t.sort, '0', 'admin', NOW() +FROM ( + SELECT '接近开关' AS sub_name, category_id AS pid, 1 AS sort FROM biz_material_category WHERE category_name='传感器' AND parent_id=0 + UNION ALL + SELECT '光电传感器', category_id, 2 FROM biz_material_category WHERE category_name='传感器' AND parent_id=0 + UNION ALL + SELECT '温度传感器', category_id, 3 FROM biz_material_category WHERE category_name='传感器' AND parent_id=0 +) t +JOIN biz_material_category p ON t.pid = p.category_id; + +-- 机械传动 -> 电机, 减速机, 联轴器 +INSERT INTO biz_material_category (tenant_id, category_name, parent_id, ancestors, sort, status, create_by, create_time) +SELECT 1, t.sub_name, t.pid, CONCAT(p.ancestors, ',', p.category_id), t.sort, '0', 'admin', NOW() +FROM ( + SELECT '电机' AS sub_name, category_id AS pid, 1 AS sort FROM biz_material_category WHERE category_name='机械传动' AND parent_id=0 + UNION ALL + SELECT '减速机', category_id, 2 FROM biz_material_category WHERE category_name='机械传动' AND parent_id=0 + UNION ALL + SELECT '联轴器', category_id, 3 FROM biz_material_category WHERE category_name='机械传动' AND parent_id=0 +) t +JOIN biz_material_category p ON t.pid = p.category_id; + +-- 气动液压 -> 气缸, 阀岛, 管接头 +INSERT INTO biz_material_category (tenant_id, category_name, parent_id, ancestors, sort, status, create_by, create_time) +SELECT 1, t.sub_name, t.pid, CONCAT(p.ancestors, ',', p.category_id), t.sort, '0', 'admin', NOW() +FROM ( + SELECT '气缸' AS sub_name, category_id AS pid, 1 AS sort FROM biz_material_category WHERE category_name='气动液压' AND parent_id=0 + UNION ALL + SELECT '阀岛', category_id, 2 FROM biz_material_category WHERE category_name='气动液压' AND parent_id=0 + UNION ALL + SELECT '管接头', category_id, 3 FROM biz_material_category WHERE category_name='气动液压' AND parent_id=0 +) t +JOIN biz_material_category p ON t.pid = p.category_id; + +-- 辅材耗材 -> 线缆, 紧固件, 标签标识 +INSERT INTO biz_material_category (tenant_id, category_name, parent_id, ancestors, sort, status, create_by, create_time) +SELECT 1, t.sub_name, t.pid, CONCAT(p.ancestors, ',', p.category_id), t.sort, '0', 'admin', NOW() +FROM ( + SELECT '线缆' AS sub_name, category_id AS pid, 1 AS sort FROM biz_material_category WHERE category_name='辅材耗材' AND parent_id=0 + UNION ALL + SELECT '紧固件', category_id, 2 FROM biz_material_category WHERE category_name='辅材耗材' AND parent_id=0 + UNION ALL + SELECT '标签标识', category_id, 3 FROM biz_material_category WHERE category_name='辅材耗材' AND parent_id=0 +) t +JOIN biz_material_category p ON t.pid = p.category_id; + +-- 三级分类:PLC控制器 -> 西门子系列, 三菱系列, 欧姆龙系列 +INSERT INTO biz_material_category (tenant_id, category_name, parent_id, ancestors, sort, status, create_by, create_time) +SELECT 1, t.sub_name, t.pid, CONCAT(p.ancestors, ',', p.category_id), t.sort, '0', 'admin', NOW() +FROM ( + SELECT '西门子系列' AS sub_name, category_id AS pid, 1 AS sort FROM biz_material_category WHERE category_name='PLC控制器' AND parent_id!=0 + UNION ALL + SELECT '三菱系列', category_id, 2 FROM biz_material_category WHERE category_name='PLC控制器' AND parent_id!=0 + UNION ALL + SELECT '欧姆龙系列', category_id, 3 FROM biz_material_category WHERE category_name='PLC控制器' AND parent_id!=0 +) t +JOIN biz_material_category p ON t.pid = p.category_id; + +-- 三级分类:低压电器 -> 断路器, 接触器, 继电器 +INSERT INTO biz_material_category (tenant_id, category_name, parent_id, ancestors, sort, status, create_by, create_time) +SELECT 1, t.sub_name, t.pid, CONCAT(p.ancestors, ',', p.category_id), t.sort, '0', 'admin', NOW() +FROM ( + SELECT '断路器' AS sub_name, category_id AS pid, 1 AS sort FROM biz_material_category WHERE category_name='低压电器' AND parent_id!=0 + UNION ALL + SELECT '接触器', category_id, 2 FROM biz_material_category WHERE category_name='低压电器' AND parent_id!=0 + UNION ALL + SELECT '继电器', category_id, 3 FROM biz_material_category WHERE category_name='低压电器' AND parent_id!=0 +) t +JOIN biz_material_category p ON t.pid = p.category_id; + + +-- ============================================================ +-- 第二部分:批量更新现有物料的分类关联 +-- 根据物料名称关键词自动匹配分类 +-- ============================================================ + +-- PLC相关 -> PLC控制器 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='PLC控制器' AND parent_id!=0 LIMIT 1 +) WHERE (material_name LIKE '%PLC%' OR material_name LIKE '%可编程%') AND (category_id = 0 OR category_id IS NULL); + +-- 变频器相关 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='变频器' AND parent_id!=0 LIMIT 1 +) WHERE (material_name LIKE '%变频%' OR material_name LIKE '%VFD%' OR material_name LIKE '%inverter%') + AND (category_id = 0 OR category_id IS NULL); + +-- 断路器 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='断路器' LIMIT 1 +) WHERE (material_name LIKE '%断路%' OR material_name LIKE '%空开%') + AND (category_id = 0 OR category_id IS NULL); + +-- 接触器 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='接触器' LIMIT 1 +) WHERE material_name LIKE '%接触%' AND (category_id = 0 OR category_id IS NULL); + +-- 继电器 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='继电器' LIMIT 1 +) WHERE material_name LIKE '%继电%' AND (category_id = 0 OR category_id IS NULL); + +-- 接近开关 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='接近开关' LIMIT 1 +) WHERE material_name LIKE '%接近开关%' AND (category_id = 0 OR category_id IS NULL); + +-- 光电传感器 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='光电传感器' LIMIT 1 +) WHERE (material_name LIKE '%光电%' OR material_name LIKE '%光电传感%') + AND (category_id = 0 OR category_id IS NULL); + +-- 温度传感器 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='温度传感器' LIMIT 1 +) WHERE (material_name LIKE '%温度传感%' OR material_name LIKE '%热电偶%' OR material_name LIKE '%热电阻%') + AND (category_id = 0 OR category_id IS NULL); + +-- 电机 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='电机' LIMIT 1 +) WHERE (material_name LIKE '%电机%' OR material_name LIKE '%马达%') + AND (category_id = 0 OR category_id IS NULL); + +-- 减速机 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='减速机' LIMIT 1 +) WHERE material_name LIKE '%减速%' AND (category_id = 0 OR category_id IS NULL); + +-- 联轴器 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='联轴器' LIMIT 1 +) WHERE material_name LIKE '%联轴%' AND (category_id = 0 OR category_id IS NULL); + +-- 气缸 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='气缸' LIMIT 1 +) WHERE material_name LIKE '%气缸%' AND (category_id = 0 OR category_id IS NULL); + +-- 阀岛/电磁阀 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='阀岛' LIMIT 1 +) WHERE (material_name LIKE '%阀岛%' OR material_name LIKE '%电磁阀%') + AND (category_id = 0 OR category_id IS NULL); + +-- 线缆 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='线缆' LIMIT 1 +) WHERE (material_name LIKE '%线缆%' OR material_name LIKE '%电缆%' OR material_name LIKE '%导线%') + AND (category_id = 0 OR category_id IS NULL); + +-- 人机界面/触摸屏 +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='人机界面' LIMIT 1 +) WHERE (material_name LIKE '%触摸屏%' OR material_name LIKE '%HMI%' OR material_name LIKE '%人机%') + AND (category_id = 0 OR category_id IS NULL); + +-- 未匹配的物料归入"辅材耗材" +UPDATE biz_material SET category_id = ( + SELECT category_id FROM biz_material_category WHERE category_name='辅材耗材' AND parent_id=0 LIMIT 1 +) WHERE (category_id = 0 OR category_id IS NULL); + +-- ============================================================ +-- 验证结果 +-- ============================================================ +SELECT '=== 分类数据统计 ===' AS info; +SELECT COUNT(*) AS total_categories FROM biz_material_category; + +SELECT '=== 各分类物料数量 ===' AS info; +SELECT + c.category_name, + COUNT(m.material_id) AS material_count +FROM biz_material_category c +LEFT JOIN biz_material m ON c.category_id = m.category_id +GROUP BY c.category_id, c.category_name +ORDER BY c.sort; + +SELECT '=== 未分类物料数量 ===' AS info; +SELECT COUNT(*) AS uncategorized FROM biz_material WHERE category_id = 0 OR category_id IS NULL;