Browse Source

Merge remote-tracking branch 'origin/master'

lipenghui 2 months ago
parent
commit
18eb001b6d
11 changed files with 170 additions and 39 deletions
  1. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicebom/IotDeviceBomController.java
  2. 10 5
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicematerial/IotDeviceMaterialController.java
  3. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotcommonbommaterial/IotCommonBomMaterialMapper.java
  4. 17 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicebom/IotDeviceBomMapper.java
  5. 17 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicematerial/IotDeviceMaterialMapper.java
  6. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotbom/IotBomService.java
  7. 47 30
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotbom/IotBomServiceImpl.java
  8. 17 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcommonbommaterial/IotCommonBomMaterialServiceImpl.java
  9. 9 3
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicebom/IotDeviceBomServiceImpl.java
  10. 9 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicematerial/IotDeviceMaterialService.java
  11. 34 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicematerial/IotDeviceMaterialServiceImpl.java

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicebom/IotDeviceBomController.java

@@ -119,7 +119,7 @@ public class IotDeviceBomController {
 
 
     @GetMapping("/list")
     @GetMapping("/list")
     @Operation(summary = "获取 设备BOM 列表 树")
     @Operation(summary = "获取 设备BOM 列表 树")
-    @PreAuthorize("@ss.hasPermission('rq:iot-material-group:query')")
+    @PreAuthorize("@ss.hasPermission('pms:iot-device-bom:query')")
     public CommonResult<List<IotDeviceBomRespVO>> getDeviceBomList(IotDeviceBomListReqVO reqVO) {
     public CommonResult<List<IotDeviceBomRespVO>> getDeviceBomList(IotDeviceBomListReqVO reqVO) {
         List<IotDeviceBomDO> list = iotDeviceBomService.getDeviceBomList(reqVO);
         List<IotDeviceBomDO> list = iotDeviceBomService.getDeviceBomList(reqVO);
         if (CollUtil.isEmpty(list)) {
         if (CollUtil.isEmpty(list)) {

+ 10 - 5
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicematerial/IotDeviceMaterialController.java

@@ -7,15 +7,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-import cn.iocoder.yudao.module.pms.controller.admin.iotdevicecategorytemplateattrs.vo.IotDeviceCategoryTemplateAttrsRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotmaterial.vo.IotMaterialPageReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotmaterial.vo.IotMaterialRespVO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecategorytemplateattrs.IotDeviceCategoryTemplateAttrsDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterial.IotMaterialDO;
 import cn.iocoder.yudao.module.pms.service.iotdevicematerial.IotDeviceMaterialService;
 import cn.iocoder.yudao.module.pms.service.iotdevicematerial.IotDeviceMaterialService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -66,6 +61,16 @@ public class IotDeviceMaterialController {
         return success(true);
         return success(true);
     }
     }
 
 
+    @DeleteMapping("/deleteDeviceMaterial")
+    @Operation(summary = "删除PMS 设备BOM挂载物料关联")
+    @Parameter(name = "bomNodeId", description = "BOM节点id", required = true)
+    @Parameter(name = "code", description = "物料编码", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-device-material:delete')")
+    public CommonResult<Boolean> deleteDeviceMaterial(@RequestParam("bomNodeId") Long bomNodeId, @RequestParam("code") String code) {
+        iotDeviceMaterialService.deleteDeviceMaterial(bomNodeId, code);
+        return success(true);
+    }
+
     @GetMapping("/get")
     @GetMapping("/get")
     @Operation(summary = "获得PMS 设备BOM物料关联")
     @Operation(summary = "获得PMS 设备BOM物料关联")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotcommonbommaterial/IotCommonBomMaterialMapper.java

@@ -40,6 +40,7 @@ public interface IotCommonBomMaterialMapper extends BaseMapperX<IotCommonBomMate
         return selectList(new LambdaQueryWrapperX<IotCommonBomMaterialDO>()
         return selectList(new LambdaQueryWrapperX<IotCommonBomMaterialDO>()
                 .eqIfPresent(IotCommonBomMaterialDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())
                 .eqIfPresent(IotCommonBomMaterialDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())
                 .eqIfPresent(IotCommonBomMaterialDO::getBomNodeId, reqVO.getBomNodeId())
                 .eqIfPresent(IotCommonBomMaterialDO::getBomNodeId, reqVO.getBomNodeId())
+                .eqIfPresent(IotCommonBomMaterialDO::getCode, reqVO.getCode())
                 .inIfPresent(IotCommonBomMaterialDO::getBomNodeId, reqVO.getBomNodeIds())
                 .inIfPresent(IotCommonBomMaterialDO::getBomNodeId, reqVO.getBomNodeIds())
                 .eqIfPresent(IotCommonBomMaterialDO::getMaterialId, reqVO.getMaterialId()));
                 .eqIfPresent(IotCommonBomMaterialDO::getMaterialId, reqVO.getMaterialId()));
     }
     }

+ 17 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicebom/IotDeviceBomMapper.java

@@ -7,7 +7,9 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotdevicebom.vo.IotDeviceBom
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicebom.vo.IotDeviceBomPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicebom.vo.IotDeviceBomPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicebom.vo.IotDeviceBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicebom.vo.IotDeviceBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicebom.IotDeviceBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicebom.IotDeviceBomDO;
+import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -49,4 +51,19 @@ public interface IotDeviceBomMapper extends BaseMapperX<IotDeviceBomDO> {
         return selectOne(IotDeviceBomDO::getId, reqVO.getParentId());
         return selectOne(IotDeviceBomDO::getId, reqVO.getParentId());
     }
     }
 
 
+    /**
+     * 删除指定 deviceId 集合的设备BOM
+     *
+     * @param deviceIds 设备id集合
+     * @return 删除条数
+     */
+    @Delete("<script>" +
+            "DELETE FROM rq_iot_device_bom " +
+            "WHERE device_id IN " +
+            "<foreach collection=\"deviceIds\" item=\"id\" open=\"(\" separator=\",\" close=\")\">" +
+            "#{id}" +
+            "</foreach>" +
+            "</script>")
+    Integer deleteByDeviceIds(@Param("deviceIds") List<Long> deviceIds);
+
 }
 }

+ 17 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicematerial/IotDeviceMaterialMapper.java

@@ -10,7 +10,9 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDevi
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterial.IotMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterial.IotMaterialDO;
+import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -51,4 +53,19 @@ public interface IotDeviceMaterialMapper extends BaseMapperX<IotDeviceMaterialDO
                 .in(CollUtil.isNotEmpty(reqVO.getBomNodeIds()), IotDeviceMaterialDO::getBomNodeId, reqVO.getBomNodeIds());
                 .in(CollUtil.isNotEmpty(reqVO.getBomNodeIds()), IotDeviceMaterialDO::getBomNodeId, reqVO.getBomNodeIds());
         return selectJoinList(IotDeviceMaterialDO.class, query);
         return selectJoinList(IotDeviceMaterialDO.class, query);
     }
     }
+
+    /**
+     * 删除指定 deviceId 集合的设备BOM 挂载的物料
+     *
+     * @param deviceIds 设备id集合
+     * @return 删除条数
+     */
+    @Delete("<script>" +
+            "DELETE FROM rq_iot_device_material " +
+            "WHERE device_id IN " +
+            "<foreach collection=\"deviceIds\" item=\"id\" open=\"(\" separator=\",\" close=\")\">" +
+            "#{id}" +
+            "</foreach>" +
+            "</script>")
+    Integer deleteByDeviceIds(@Param("deviceIds") List<Long> deviceIds);
 }
 }

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotbom/IotBomService.java

@@ -100,4 +100,12 @@ public interface IotBomService {
      * @return bom 信息数组
      * @return bom 信息数组
      */
      */
     void copyBomByCategory(Long deviceCategoryId, Long deviceId);
     void copyBomByCategory(Long deviceCategoryId, Long deviceId);
+
+    /**
+     * 修改设备分类BOM时将设备分类BOM及BOM节点挂载的物料同步到 设备BOM
+     *
+     * @param deviceCategoryId 设备分类id
+     * @return bom 信息数组
+     */
+    void syncDeviceBomAndMaterials(Long deviceCategoryId);
 }
 }

+ 47 - 30
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotbom/IotBomServiceImpl.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pms.service.iotbom;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomListReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomListReqVO;
@@ -84,20 +85,48 @@ public class IotBomServiceImpl implements IotBomService {
         // 更新
         // 更新
         IotBomDO updateObj = BeanUtils.toBean(updateReqVO, IotBomDO.class);
         IotBomDO updateObj = BeanUtils.toBean(updateReqVO, IotBomDO.class);
         iotBomMapper.updateById(updateObj);
         iotBomMapper.updateById(updateObj);
+        syncDeviceBomAndMaterials(updateObj.getDeviceCategoryId());
+    }
+
+    /**
+     * 批量更新设备的 bom_sync_status = 1
+     * @param ids
+     */
+    private void batchUpdateBomSyncStatus(List<Long> ids) {
+        LambdaUpdateWrapper<IotDeviceDO> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.in(IotDeviceDO::getId, ids) // WHERE id IN (ids)
+                .set(IotDeviceDO::getBomSyncStatus, 1); // SET bom_sync_status = 1
+        iotDeviceMapper.update(wrapper);
+    }
+
+    @Override
+    public void deleteIotBom(Long id) {
+        // 校验存在
+        IotBomDO bom = validateIotBomExists(id);
+        // 删除
+        iotBomMapper.deleteById(id);
+        // 将设备分类BOM同步到 关联了当前设备分类的 设备 BOM
+        syncDeviceBomAndMaterials(bom.getDeviceCategoryId());
+    }
+
+    /**
+     * 将设备分类BOM及bom节点挂载的物料同步到 设备bom
+     */
+    public void syncDeviceBomAndMaterials (Long deviceCategoryId){
         // 选择了相同设备分类的设备,如果未同步过设备分类BOM, 应该将设备分类BOM同步复制到设备BOM。
         // 选择了相同设备分类的设备,如果未同步过设备分类BOM, 应该将设备分类BOM同步复制到设备BOM。
         // 设备分类BOM已经挂载的物料 也要拷贝到 设备BOM关联物料表
         // 设备分类BOM已经挂载的物料 也要拷贝到 设备BOM关联物料表
         // 1. 根据当前BOM节点关联的设备分类查询所有已经关联了此分类但是未同步过 设备分类BOM 的设备
         // 1. 根据当前BOM节点关联的设备分类查询所有已经关联了此分类但是未同步过 设备分类BOM 的设备
         IotDevicePageReqVO reqVO = new IotDevicePageReqVO();
         IotDevicePageReqVO reqVO = new IotDevicePageReqVO();
-        reqVO.setAssetClass(updateObj.getDeviceCategoryId());
+        reqVO.setAssetClass(deviceCategoryId);
         reqVO.setBomSyncStatus(0);
         reqVO.setBomSyncStatus(0);
         List<IotDeviceDO> devices = iotDeviceMapper.selectList(reqVO);
         List<IotDeviceDO> devices = iotDeviceMapper.selectList(reqVO);
         if (CollUtil.isNotEmpty(devices)) {
         if (CollUtil.isNotEmpty(devices)) {
             // 2. 批量将当前设备分类BOM复制到每个设备
             // 2. 批量将当前设备分类BOM复制到每个设备
-            List<IotBomDO> bomList = deviceCategoryBom(updateObj.getDeviceCategoryId());
+            List<IotBomDO> bomList = deviceCategoryBom(deviceCategoryId);
             // 3. 构建树形结构并获取层级顺序
             // 3. 构建树形结构并获取层级顺序
-            List<IotBomDO> orderedBoms = buildHierarchyOrder(bomList);
+            List<IotBomDO> orderedBomS = buildHierarchyOrder(bomList);
             // 当前设备分类下所有bom节点id
             // 当前设备分类下所有bom节点id
-            List<Long> bomIds = convertListByFlatMap(orderedBoms, bom -> Stream.of(bom.getId()));
+            List<Long> bomIds = convertListByFlatMap(orderedBomS, bom -> Stream.of(bom.getId()));
             IotCommonBomMaterialSaveReqVO saveReqVO = new IotCommonBomMaterialSaveReqVO();
             IotCommonBomMaterialSaveReqVO saveReqVO = new IotCommonBomMaterialSaveReqVO();
             saveReqVO.setBomNodeIds(bomIds);
             saveReqVO.setBomNodeIds(bomIds);
             List<IotCommonBomMaterialDO> bomMaterials = iotCommonBomMaterialMapper.selectList(saveReqVO);
             List<IotCommonBomMaterialDO> bomMaterials = iotCommonBomMaterialMapper.selectList(saveReqVO);
@@ -115,15 +144,18 @@ public class IotBomServiceImpl implements IotBomService {
                 deviceIds.add(device.getId());
                 deviceIds.add(device.getId());
                 // 4. 生成ID映射关系
                 // 4. 生成ID映射关系
                 Map<Long, Long> idMapping = new LinkedHashMap<>();
                 Map<Long, Long> idMapping = new LinkedHashMap<>();
-                orderedBoms.forEach(bom -> idMapping.put(bom.getId(), IdGenerator.nextId()));
+                orderedBomS.forEach(bom -> idMapping.put(bom.getId(), IdGenerator.nextId()));
                 // 5. 转换目标对象
                 // 5. 转换目标对象
-                List<IotDeviceBomDO> targetBoms = convertBoms(orderedBoms, idMapping, device.getId());
+                List<IotDeviceBomDO> targetBoms = convertBoms(orderedBomS, idMapping, device.getId());
                 // 转换 bom关联的物料 目标对象
                 // 转换 bom关联的物料 目标对象
                 List<IotDeviceMaterialDO> targetDeviceMaterials = convertBomMaterials(idMapping, device.getAssetClass(), device.getId(), bomNodeMaterialMap);
                 List<IotDeviceMaterialDO> targetDeviceMaterials = convertBomMaterials(idMapping, device.getAssetClass(), device.getId(), bomNodeMaterialMap);
                 resultDeviceBomList.addAll(targetBoms);
                 resultDeviceBomList.addAll(targetBoms);
                 deviceMaterialList.addAll(targetDeviceMaterials);
                 deviceMaterialList.addAll(targetDeviceMaterials);
             });
             });
             if (CollUtil.isNotEmpty(resultDeviceBomList)) {
             if (CollUtil.isNotEmpty(resultDeviceBomList)) {
+                // 先删除相关设备的BOM 及 BOM节点已经关联的物料 (如果存在)
+                Integer count = iotDeviceBomMapper.deleteByDeviceIds(deviceIds);
+                Integer materialCount = iotDeviceMaterialMapper.deleteByDeviceIds(deviceIds);
                 // 批量插入设备BOM
                 // 批量插入设备BOM
                 iotDeviceBomMapper.insertBatch(resultDeviceBomList);
                 iotDeviceBomMapper.insertBatch(resultDeviceBomList);
                 if (CollUtil.isNotEmpty(deviceMaterialList)) {
                 if (CollUtil.isNotEmpty(deviceMaterialList)) {
@@ -131,34 +163,18 @@ public class IotBomServiceImpl implements IotBomService {
                     iotDeviceMaterialMapper.insertBatch(deviceMaterialList);
                     iotDeviceMaterialMapper.insertBatch(deviceMaterialList);
                 }
                 }
                 // 批量设置 设备 的BOM同步标识 bom_sync_status = 1
                 // 批量设置 设备 的BOM同步标识 bom_sync_status = 1
-                batchUpdateBomSyncStatus(deviceIds);
+                // 单独修改设备BOM后再将 bom_sync_status 设置为 1
+                // batchUpdateBomSyncStatus(deviceIds);
             }
             }
         }
         }
     }
     }
 
 
-    /**
-     * 批量更新设备的 bom_sync_status = 1
-     * @param ids
-     */
-    private void batchUpdateBomSyncStatus(List<Long> ids) {
-        LambdaUpdateWrapper<IotDeviceDO> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.in(IotDeviceDO::getId, ids) // WHERE id IN (ids)
-                .set(IotDeviceDO::getBomSyncStatus, 1); // SET bom_sync_status = 1
-        iotDeviceMapper.update(wrapper);
-    }
-
-    @Override
-    public void deleteIotBom(Long id) {
-        // 校验存在
-        validateIotBomExists(id);
-        // 删除
-        iotBomMapper.deleteById(id);
-    }
-
-    private void validateIotBomExists(Long id) {
-        if (iotBomMapper.selectById(id) == null) {
+    private IotBomDO validateIotBomExists(Long id) {
+        IotBomDO bom = iotBomMapper.selectById(id);
+        if (ObjUtil.isEmpty(bom)) {
             throw exception(IOT_BOM_NOT_EXISTS);
             throw exception(IOT_BOM_NOT_EXISTS);
         }
         }
+        return bom;
     }
     }
 
 
     @Override
     @Override
@@ -226,8 +242,9 @@ public class IotBomServiceImpl implements IotBomService {
             iotDeviceMaterialMapper.insertBatch(targetDeviceMaterials);
             iotDeviceMaterialMapper.insertBatch(targetDeviceMaterials);
             // 批量插入设备BOM
             // 批量插入设备BOM
             iotDeviceBomMapper.insertBatch(targetBoms);
             iotDeviceBomMapper.insertBatch(targetBoms);
-            // 拷贝BOM成功后 设置设备 bom_sync_status 字段 为 1已同步
-            iotDeviceMapper.updateBomSyncStatus(deviceId);
+            // 拷贝BOM成功后 设置设备 bom_sync_status 字段 为 1 已同步
+            // 只有在修改 设备BOM后才会将 关联设备的 bom_sync_status 设置为 1
+            // iotDeviceMapper.updateBomSyncStatus(deviceId);
         }
         }
     }
     }
 
 

+ 17 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcommonbommaterial/IotCommonBomMaterialServiceImpl.java

@@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotcommonbommaterial.vo.IotC
 import cn.iocoder.yudao.module.pms.controller.admin.iotcommonbommaterial.vo.IotCommonBomMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotcommonbommaterial.vo.IotCommonBomMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcommonbommaterial.IotCommonBomMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcommonbommaterial.IotCommonBomMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotcommonbommaterial.IotCommonBomMaterialMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotcommonbommaterial.IotCommonBomMaterialMapper;
+import cn.iocoder.yudao.module.pms.service.iotbom.IotBomService;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
@@ -36,6 +37,8 @@ public class IotCommonBomMaterialServiceImpl implements IotCommonBomMaterialServ
 
 
     @Resource
     @Resource
     private IotCommonBomMaterialMapper iotCommonBomMaterialMapper;
     private IotCommonBomMaterialMapper iotCommonBomMaterialMapper;
+    @Resource
+    private IotBomService iotBomService;
 
 
     @Override
     @Override
     public Long createIotCommonBomMaterial(IotCommonBomMaterialSaveReqVO createReqVO) {
     public Long createIotCommonBomMaterial(IotCommonBomMaterialSaveReqVO createReqVO) {
@@ -47,6 +50,8 @@ public class IotCommonBomMaterialServiceImpl implements IotCommonBomMaterialServ
             throw exception(IOT_COMMON_BOM_MATERIAL_EXISTS);
             throw exception(IOT_COMMON_BOM_MATERIAL_EXISTS);
         }
         }
         iotCommonBomMaterialMapper.insert(iotCommonBomMaterial);
         iotCommonBomMaterialMapper.insert(iotCommonBomMaterial);
+        // 将设备分类BOM及BOM节点挂载的物料同步到设备BOM
+        iotBomService.syncDeviceBomAndMaterials(iotCommonBomMaterial.getDeviceCategoryId());
         // 返回
         // 返回
         return iotCommonBomMaterial.getId();
         return iotCommonBomMaterial.getId();
     }
     }
@@ -94,10 +99,20 @@ public class IotCommonBomMaterialServiceImpl implements IotCommonBomMaterialServ
         if (ObjUtil.isEmpty(bomNodeId) || StrUtil.isBlank(code)) {
         if (ObjUtil.isEmpty(bomNodeId) || StrUtil.isBlank(code)) {
             throw exception(IOT_COMMON_BOM_MATERIAL_NOT_EXISTS);
             throw exception(IOT_COMMON_BOM_MATERIAL_NOT_EXISTS);
         }
         }
+        // 查询指定 bomNodeId code 的记录是否存在
+        IotCommonBomMaterialSaveReqVO reqVO = new IotCommonBomMaterialSaveReqVO();
+        reqVO.setBomNodeId(bomNodeId);
+        reqVO.setCode(code);
+        List<IotCommonBomMaterialDO> bomMaterials = iotCommonBomMaterialMapper.selectList(reqVO);
+        if (CollUtil.isEmpty(bomMaterials)) {
+            throw exception(IOT_COMMON_BOM_MATERIAL_NOT_EXISTS);
+        }
         int count = iotCommonBomMaterialMapper.deleteByMap(ImmutableMap.of(
         int count = iotCommonBomMaterialMapper.deleteByMap(ImmutableMap.of(
                 "bom_node_id", bomNodeId,
                 "bom_node_id", bomNodeId,
                 "code", code
                 "code", code
         ));
         ));
+        // 将设备分类BOM及BOM节点挂载的物料同步到设备BOM
+        iotBomService.syncDeviceBomAndMaterials(bomMaterials.get(0).getDeviceCategoryId());
     }
     }
 
 
     @Override
     @Override
@@ -135,6 +150,8 @@ public class IotCommonBomMaterialServiceImpl implements IotCommonBomMaterialServ
                 tobeAddedMaterials.add(iotCommonBomMaterial);
                 tobeAddedMaterials.add(iotCommonBomMaterial);
             });
             });
             iotCommonBomMaterialMapper.insertBatch(tobeAddedMaterials);
             iotCommonBomMaterialMapper.insertBatch(tobeAddedMaterials);
+            // 将设备分类BOM及BOM节点挂载的物料同步到设备BOM
+            iotBomService.syncDeviceBomAndMaterials(tobeAddedMaterials.get(0).getDeviceCategoryId());
         }
         }
         return 1L;
         return 1L;
     }
     }

+ 9 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicebom/IotDeviceBomServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.service.iotdevicebom;
 package cn.iocoder.yudao.module.pms.service.iotdevicebom;
 
 
+import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicebom.vo.IotDeviceBomListReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicebom.vo.IotDeviceBomListReqVO;
@@ -66,20 +67,25 @@ public class IotDeviceBomServiceImpl implements IotDeviceBomService {
         // 更新
         // 更新
         IotDeviceBomDO updateObj = BeanUtils.toBean(updateReqVO, IotDeviceBomDO.class);
         IotDeviceBomDO updateObj = BeanUtils.toBean(updateReqVO, IotDeviceBomDO.class);
         iotDeviceBomMapper.updateById(updateObj);
         iotDeviceBomMapper.updateById(updateObj);
+        // 设置设备BOM关联的设备的 bom_sync_status = 1
+        iotDeviceMapper.updateBomSyncStatus(updateObj.getDeviceId());
     }
     }
 
 
     @Override
     @Override
     public void deleteIotDeviceBom(Long id) {
     public void deleteIotDeviceBom(Long id) {
         // 校验存在
         // 校验存在
-        validateIotDeviceBomExists(id);
+        IotDeviceBomDO deviceBom = validateIotDeviceBomExists(id);
         // 删除
         // 删除
         iotDeviceBomMapper.deleteById(id);
         iotDeviceBomMapper.deleteById(id);
+        iotDeviceMapper.updateBomSyncStatus(deviceBom.getDeviceId());
     }
     }
 
 
-    private void validateIotDeviceBomExists(Long id) {
-        if (iotDeviceBomMapper.selectById(id) == null) {
+    private IotDeviceBomDO validateIotDeviceBomExists(Long id) {
+        IotDeviceBomDO deviceBom = iotDeviceBomMapper.selectById(id);
+        if (ObjUtil.isEmpty(deviceBom)) {
             throw exception(IOT_DEVICE_BOM_NOT_EXISTS);
             throw exception(IOT_DEVICE_BOM_NOT_EXISTS);
         }
         }
+        return deviceBom;
     }
     }
 
 
     @Override
     @Override

+ 9 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicematerial/IotDeviceMaterialService.java

@@ -68,4 +68,13 @@ public interface IotDeviceMaterialService {
      * @return PMS 设备BOM挂载物料关联列表
      * @return PMS 设备BOM挂载物料关联列表
      */
      */
     List<IotDeviceMaterialDO> getIotDeviceMaterials(IotDeviceMaterialSaveReqVO saveReqVO);
     List<IotDeviceMaterialDO> getIotDeviceMaterials(IotDeviceMaterialSaveReqVO saveReqVO);
+
+    /**
+     * 删除设备BOM关联的物料
+     *
+     * @param bomNodeId bom节点id
+     * @param code  物料编码
+     * @return PMS 设备BOM挂载物料关联列表
+     */
+    void deleteDeviceMaterial(Long bomNodeId, String code);
 }
 }

+ 34 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicematerial/IotDeviceMaterialServiceImpl.java

@@ -1,11 +1,17 @@
 package cn.iocoder.yudao.module.pms.service.iotdevicematerial;
 package cn.iocoder.yudao.module.pms.service.iotdevicematerial;
 
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicematerial.IotDeviceMaterialMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicematerial.IotDeviceMaterialMapper;
+import cn.iocoder.yudao.module.pms.service.iotbom.IotBomService;
+import com.google.common.collect.ImmutableMap;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 
 
@@ -27,12 +33,18 @@ public class IotDeviceMaterialServiceImpl implements IotDeviceMaterialService {
 
 
     @Resource
     @Resource
     private IotDeviceMaterialMapper iotDeviceMaterialMapper;
     private IotDeviceMaterialMapper iotDeviceMaterialMapper;
+    @Resource
+    private IotDeviceMapper iotDeviceMapper;
+    @Resource
+    private IotBomService iotBomService;
 
 
     @Override
     @Override
     public Long createIotDeviceMaterial(IotDeviceMaterialSaveReqVO createReqVO) {
     public Long createIotDeviceMaterial(IotDeviceMaterialSaveReqVO createReqVO) {
         // 插入
         // 插入
         IotDeviceMaterialDO iotDeviceMaterial = BeanUtils.toBean(createReqVO, IotDeviceMaterialDO.class);
         IotDeviceMaterialDO iotDeviceMaterial = BeanUtils.toBean(createReqVO, IotDeviceMaterialDO.class);
         iotDeviceMaterialMapper.insert(iotDeviceMaterial);
         iotDeviceMaterialMapper.insert(iotDeviceMaterial);
+        // 设置 设备BOM所属 设备的 bom_sync_status = 1
+        iotDeviceMapper.updateBomSyncStatus(iotDeviceMaterial.getDeviceId());
         // 返回
         // 返回
         return iotDeviceMaterial.getId();
         return iotDeviceMaterial.getId();
     }
     }
@@ -80,4 +92,26 @@ public class IotDeviceMaterialServiceImpl implements IotDeviceMaterialService {
         return iotDeviceMaterialMapper.selectList(saveReqVO);
         return iotDeviceMaterialMapper.selectList(saveReqVO);
     }
     }
 
 
+    @Override
+    public void deleteDeviceMaterial(Long bomNodeId, String code) {
+        if (ObjUtil.isEmpty(bomNodeId) || StrUtil.isBlank(code)) {
+            throw exception(IOT_DEVICE_MATERIAL_NOT_EXISTS);
+        }
+        // 查询指定 bomNodeId code 的记录是否存在
+        IotDeviceMaterialSaveReqVO reqVO = new IotDeviceMaterialSaveReqVO();
+        reqVO.setBomNodeId(bomNodeId);
+        reqVO.setCode(code);
+        List<IotDeviceMaterialDO> deviceMaterials = iotDeviceMaterialMapper.selectList(reqVO);
+        if (CollUtil.isEmpty(deviceMaterials)) {
+            throw exception(IOT_DEVICE_MATERIAL_NOT_EXISTS);
+        }
+        int count = iotDeviceMaterialMapper.deleteByMap(ImmutableMap.of(
+                "bom_node_id", bomNodeId,
+                "code", code
+        ));
+        // 设置关联设备的 bom_sync_status = 1
+        // 将设备分类BOM及BOM节点挂载的物料同步到设备BOM
+        iotBomService.syncDeviceBomAndMaterials(deviceMaterials.get(0).getDeviceCategoryId());
+    }
+
 }
 }