648540858 1 vuosi sitten
vanhempi
commit
3f2c9f6451

+ 17 - 0
src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java

@@ -325,4 +325,21 @@ public class CommonGBChannel {
         return content.toString();
     }
 
+    public static CommonGBChannel build(Group group) {
+        GbCode gbCode = GbCode.decode(group.getDeviceId());
+        CommonGBChannel channel = new CommonGBChannel();
+        if (gbCode.getTypeCode().equals("215")) {
+            // 业务分组
+            channel.setGbName(group.getName());
+            channel.setGbDeviceId(group.getDeviceId());
+        }else {
+            // 虚拟组织
+            channel.setGbName(group.getName());
+            channel.setGbDeviceId(group.getDeviceId());
+            channel.setGbParentId(group.getParentDeviceId());
+            channel.setGbBusinessGroupId(group.getBusinessGroup());
+        }
+        return channel;
+    }
+
 }

+ 1 - 1
src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java

@@ -14,7 +14,7 @@ public interface GroupMapper {
     @Insert("INSERT INTO wvp_common_group (device_id, name, parent_device_id, business_group, create_time, update_time) " +
             "VALUES (#{deviceId}, #{name}, #{parentDeviceId}, #{businessGroup}, #{createTime}, #{updateTime})")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
-    void add(Group group);
+    int add(Group group);
 
     @Delete("DELETE FROM wvp_common_group WHERE id=#{id}")
     int delete(@Param("id") int id);

+ 60 - 9
src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GroupServiceImpl.java

@@ -3,6 +3,9 @@ package com.genersoft.iot.vmp.gb28181.service.impl;
 import com.genersoft.iot.vmp.gb28181.bean.*;
 import com.genersoft.iot.vmp.gb28181.dao.CommonGBChannelMapper;
 import com.genersoft.iot.vmp.gb28181.dao.GroupMapper;
+import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
+import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
+import com.genersoft.iot.vmp.gb28181.service.IGbChannelService;
 import com.genersoft.iot.vmp.gb28181.service.IGroupService;
 import com.genersoft.iot.vmp.utils.DateUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -27,6 +30,12 @@ public class GroupServiceImpl implements IGroupService {
     @Autowired
     private CommonGBChannelMapper commonGBChannelMapper;
 
+    @Autowired
+    private IGbChannelService gbChannelService;
+
+    @Autowired
+    private EventPublisher eventPublisher;
+
     @Override
     public void add(Group group) {
         Assert.notNull(group, "参数不可为NULL");
@@ -35,21 +44,21 @@ public class GroupServiceImpl implements IGroupService {
         Assert.isTrue(group.getParentDeviceId().trim().length() == 20, "父级编号错误");
         Assert.notNull(group.getName(), "设备编号不可为NULL");
 
-        GbCode decode = GbCode.decode(group.getDeviceId());
-        Assert.notNull(decode, "设备编号不满足国标定义");
+        GbCode gbCode = GbCode.decode(group.getDeviceId());
+        Assert.notNull(gbCode, "设备编号不满足国标定义");
         // 根据字段判断此处应使用什么规则校验
         if (ObjectUtils.isEmpty(group.getParentDeviceId())) {
             if (ObjectUtils.isEmpty(group.getBusinessGroup())) {
                 // 如果是建立业务分组,那么编号必须20位,且10-13必须为215,
-                Assert.isTrue("215".equals(decode.getTypeCode()), "创建业务分组时设备编号11-13位应使用215");
+                Assert.isTrue("215".equals(gbCode.getTypeCode()), "创建业务分组时设备编号11-13位应使用215");
                 group.setBusinessGroup(group.getDeviceId());
             }else {
                 // 建立第一个虚拟组织
-                Assert.isTrue("216".equals(decode.getTypeCode()), "创建虚拟组织时设备编号11-13位应使用216");
+                Assert.isTrue("216".equals(gbCode.getTypeCode()), "创建虚拟组织时设备编号11-13位应使用216");
             }
         }else {
             // 建立第一个虚拟组织
-            Assert.isTrue("216".equals(decode.getTypeCode()), "创建虚拟组织时设备编号11-13位应使用216");
+            Assert.isTrue("216".equals(gbCode.getTypeCode()), "创建虚拟组织时设备编号11-13位应使用216");
         }
         if (!ObjectUtils.isEmpty(group.getBusinessGroup())) {
             // 校验业务分组是否存在
@@ -57,17 +66,27 @@ public class GroupServiceImpl implements IGroupService {
             Assert.notNull(businessGroup, "所属的业务分组分组不存在");
         }
         if (!ObjectUtils.isEmpty(group.getParentDeviceId())) {
-            Group groupInDb = groupManager.queryOneByDeviceId(group.getParentDeviceId(), group.getBusinessGroup());
-            Assert.notNull(groupInDb, "所属的上级分组分组不存在");
+            Group parentGroup = groupManager.queryOneByDeviceId(group.getParentDeviceId(), group.getBusinessGroup());
+            Assert.notNull(parentGroup, "所属的上级分组分组不存在");
         }
         group.setCreateTime(DateUtil.getNow());
         group.setUpdateTime(DateUtil.getNow());
         groupManager.add(group);
+        // 添加新的虚拟组织需要发起同志
+        if (gbCode.getTypeCode().equals("216")) {
+            CommonGBChannel channel = CommonGBChannel.build(group);
+            try {
+                // 发送catalog
+                eventPublisher.catalogEventPublish(null, channel, CatalogEvent.ADD);
+            }catch (Exception e) {
+                log.warn("[添加虚拟组织] 发送失败, {}-{}", channel.getGbName(), channel.getGbDeviceDbId(), e);
+            }
+        }
     }
 
     @Override
     public boolean deleteByDeviceId(String deviceId, String groupId) {
-        Assert.notNull(deviceId, "设备编号不可为NULL");
+        Assert.notNull(deviceId, "编号不可为NULL");
         Assert.notNull(groupId, "业务分组不可为NULL");
         GbCode gbCode = GbCode.decode(deviceId);
 
@@ -102,6 +121,9 @@ public class GroupServiceImpl implements IGroupService {
 
         // TODO 待定 是否需要发送catalog事件,还是等分配的时候发送UPDATE事件
         groupManager.batchDelete(groupList);
+
+
+
         return true;
     }
 
@@ -118,11 +140,40 @@ public class GroupServiceImpl implements IGroupService {
 
     @Override
     public void update(Group group) {
+        Assert.isTrue(group.getId()> 0, "更新必须携带分组ID");
+        Assert.notNull(group.getDeviceId(), "编号不可为NULL");
+        Assert.notNull(group.getBusinessGroup(), "业务分组不可为NULL");
+        Group groupInDb = groupManager.queryOne(group.getId());
+        Assert.notNull(groupInDb, "分组不存在");
+        // 由于编号变化,会需要处理太多内容以及可能发送大量消息,所以目前更新只只支持重命名
+        groupInDb.setName(group.getName());
+        groupInDb.setUpdateTime(DateUtil.getNow());
+        groupManager.update(groupInDb);
+
+
+        // 名称变化-- 直接通知上级分组本身变化
+        // 编号变化-- 通知:1.分组删除, 2.分组新增, 3.所有的所属通道parentId变化
+        // 本身是业务分组,如果编号变化,相当于重建,需要做大量通知
+        //
+
+
+        GbCode decode = GbCode.decode(group.getDeviceId());
+        if (decode.getTypeCode().equals("215")) {
+            // 业务分组变化。需要将其下的所有业务分组修改
+        }else {
+            // 虚拟组织修改,需要把其下的子节点修改父节点ID
+        }
+
+        int update = groupManager.update(group);
+        if (update == 1) {
+            // TODO 查看此业务分组是否关联了国标设备,发送更新消息
+
+        }
 
     }
 
     @Override
-    public List<Group> getAllChild(String parent) {
+    public List<Group> getAllChild(String parentDeviceId) {
         return Collections.emptyList();
     }