diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RedisGroupMessage.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RedisGroupMessage.java index 2691dc1b2..75fefc3c8 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RedisGroupMessage.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RedisGroupMessage.java @@ -5,10 +5,6 @@ import lombok.Data; @Data public class RedisGroupMessage { - /** - * 分组国标ID - */ - private String groupGbId; /** * 分组别名 @@ -20,26 +16,12 @@ public class RedisGroupMessage { */ private String groupName; - /** - * 分组所属的行政区划 - */ - private String groupCivilCode; - - /** - * 分组所属父分组国标ID - */ - private String parentGroupGbId; /** * 分组所属父分组别名 */ private String parentGAlias; - /** - * 分组所属业务分组国标ID - */ - private String topGroupGbId; - /** * 分组所属业务分组别名 */ @@ -54,13 +36,9 @@ public class RedisGroupMessage { @Override public String toString() { return "RedisGroupMessage{" + - "groupGbId='" + groupGbId + '\'' + ", groupAlias='" + groupAlias + '\'' + ", groupName='" + groupName + '\'' + - ", groupCivilCode='" + groupCivilCode + '\'' + - ", parentGroupGbId='" + parentGroupGbId + '\'' + ", parentGAlias='" + parentGAlias + '\'' + - ", topGroupGbId='" + topGroupGbId + '\'' + ", topGroupGAlias='" + topGroupGAlias + '\'' + '}'; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java index 1edee0166..2600fd699 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java @@ -320,4 +320,19 @@ public interface GroupMapper { " GROUP BY coalesce(wdc.gb_parent_id, wdc.parent_id)" + "") List queryCountWithChild(List groupList); + + @Select("SELECT * from wvp_common_group where alias is not null") + @MapKey("alias") + Map queryGroupByAliasMap(); + + @Delete("DELETE FROM wvp_common_group where alias is not null") + void deleteHasAlias(); + + @Update(" UPDATE wvp_common_group g1" + + " JOIN wvp_common_group g2" + + " ON g1.parent_device_id = g2.device_id" + + " SET g1.parent_id = g2.id" + + " WHERE g1.alias IS NOT NULL;") + void fixParentId(); + } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGroupService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGroupService.java index 7b5825632..d862378e6 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGroupService.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGroupService.java @@ -4,7 +4,9 @@ import com.genersoft.iot.vmp.gb28181.bean.Group; import com.genersoft.iot.vmp.gb28181.bean.GroupTree; import com.github.pagehelper.PageInfo; +import java.util.Collection; import java.util.List; +import java.util.Map; public interface IGroupService { @@ -31,4 +33,7 @@ public interface IGroupService { void sync(); + Map queryGroupByAliasMap(); + + void saveByAlias(Collection groups); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GroupServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GroupServiceImpl.java index fbbc1dacf..8733cd3b2 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GroupServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GroupServiceImpl.java @@ -331,4 +331,20 @@ public class GroupServiceImpl implements IGroupService, CommandLineRunner { throw new ControllerException(ErrorCode.ERROR100.getCode(), "同步失败: " + e.getMessage()); } } + + @Override + public Map queryGroupByAliasMap() { + return groupManager.queryGroupByAliasMap(); + } + + @Override + @Transactional + public void saveByAlias(Collection groups) { + // 清空别名数据 + groupManager.deleteHasAlias(); + // 写入新数据 + groupManager.batchAdd(new ArrayList<>(groups)); + // 修复数据丢失的parentID + groupManager.fixParentId(); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGroupChangeListener.java b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGroupChangeListener.java index d6e8e4af2..8d4356942 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGroupChangeListener.java +++ b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGroupChangeListener.java @@ -76,154 +76,95 @@ public class RedisGroupChangeListener implements MessageListener { for (int i = 0; i < groupMessages.size(); i++) { RedisGroupMessage groupMessage = groupMessages.get(i); log.info("[REDIS消息-分组信息更新] {}", groupMessage.toString()); + Group group = groupService.queryGroupByAlias(groupMessage.getGroupAlias()); switch (groupMessage.getMessageType()){ case "add": - if (!userSetting.isUseAliasForGroupSync()) { - if (groupMessage.getGroupGbId() == null) { - log.info("[REDIS消息-分组信息新增] 分组编号未设置,{}", groupMessage.toString()); - continue; - } - Group group = groupService.queryGroupByDeviceId(groupMessage.getGroupGbId()); - if (group != null) { - log.info("[REDIS消息-分组信息新增] 失败 {},编号已经存在", groupMessage.getGroupGbId()); - continue; - } - if (ObjectUtils.isEmpty(groupMessage.getGroupName()) - || ObjectUtils.isEmpty(groupMessage.getTopGroupGbId()) ){ - log.info("[REDIS消息-分组信息新增] 消息关键字段缺失, {}", groupMessage.toString()); - continue; - } - group = new Group(); - group.setDeviceId(groupMessage.getGroupGbId()); - group.setAlias(groupMessage.getGroupAlias()); - group.setParentDeviceId(groupMessage.getParentGroupGbId()); - group.setBusinessGroup(groupMessage.getTopGroupGbId()); - group.setCreateTime(DateUtil.getNow()); - group.setUpdateTime(DateUtil.getNow()); - groupService.add(group); - - }else { - // 此处使用别名作为判断依据,别名此处常常是分组在第三方系统里的唯一ID - if (groupMessage.getGroupAlias() == null || ObjectUtils.isEmpty(groupMessage.getGroupName()) - || ObjectUtils.isEmpty(groupMessage.getTopGroupGAlias())) { - log.info("[REDIS消息-分组信息新增] 消息关键字段缺失, {}", groupMessage.toString()); - continue; - } - Group group = groupService.queryGroupByAlias(groupMessage.getGroupAlias()); - if (group != null) { - log.info("[REDIS消息-分组信息新增] 失败 {},别名已经存在", groupMessage.getGroupGbId()); - continue; - } - group = new Group(); - boolean isTop = groupMessage.getTopGroupGAlias().equals(groupMessage.getGroupAlias()); - String deviceId = buildGroupDeviceId(isTop); - group.setDeviceId(deviceId); - group.setAlias(groupMessage.getGroupAlias()); - group.setName(groupMessage.getGroupName()); - if (!isTop) { - if (ObjectUtils.isEmpty(groupMessage.getTopGroupGAlias()) ) { - log.info("[REDIS消息-分组信息新增] 消息缺失业务分组别名或者父节点别名, {}", groupMessage.toString()); - continue; - } - - Group topGroup = groupService.queryGroupByAlias(groupMessage.getTopGroupGAlias()); - if (topGroup == null) { - log.info("[REDIS消息-分组信息新增] 业务分组信息未入库, {}", groupMessage.toString()); - continue; - } - group.setBusinessGroup(topGroup.getDeviceId()); - group.setParentId(topGroup.getId()); - } - if (groupMessage.getParentGAlias() != null) { - Group parentGroup = groupService.queryGroupByAlias(groupMessage.getParentGAlias()); - if (parentGroup == null) { - log.info("[REDIS消息-分组信息新增] 虚拟组织父节点信息未入库, {}", groupMessage.toString()); - continue; - } - group.setParentId(parentGroup.getId()); - group.setParentDeviceId(parentGroup.getDeviceId()); - } - group.setCreateTime(DateUtil.getNow()); - group.setUpdateTime(DateUtil.getNow()); - groupService.add(group); + // 此处使用别名作为判断依据,别名此处常常是分组在第三方系统里的唯一ID + if (groupMessage.getGroupAlias() == null || ObjectUtils.isEmpty(groupMessage.getGroupName()) + || ObjectUtils.isEmpty(groupMessage.getTopGroupGAlias())) { + log.info("[REDIS消息-分组信息新增] 消息关键字段缺失, {}", groupMessage.toString()); + continue; } + if (group != null) { + log.info("[REDIS消息-分组信息新增] 失败 {},别名已经存在", groupMessage.getGroupAlias()); + continue; + } + group = new Group(); + boolean isTop = groupMessage.getTopGroupGAlias().equals(groupMessage.getGroupAlias()); + String deviceId = buildGroupDeviceId(isTop); + group.setDeviceId(deviceId); + group.setAlias(groupMessage.getGroupAlias()); + group.setName(groupMessage.getGroupName()); + if (!isTop) { + if (ObjectUtils.isEmpty(groupMessage.getTopGroupGAlias()) ) { + log.info("[REDIS消息-分组信息新增] 消息缺失业务分组别名或者父节点别名, {}", groupMessage.toString()); + continue; + } + + Group topGroup = groupService.queryGroupByAlias(groupMessage.getTopGroupGAlias()); + if (topGroup == null) { + log.info("[REDIS消息-分组信息新增] 业务分组信息未入库, {}", groupMessage.toString()); + continue; + } + group.setBusinessGroup(topGroup.getDeviceId()); + group.setParentId(topGroup.getId()); + } + if (groupMessage.getParentGAlias() != null) { + Group parentGroup = groupService.queryGroupByAlias(groupMessage.getParentGAlias()); + if (parentGroup == null) { + log.info("[REDIS消息-分组信息新增] 虚拟组织父节点信息未入库, {}", groupMessage.toString()); + continue; + } + group.setParentId(parentGroup.getId()); + group.setParentDeviceId(parentGroup.getDeviceId()); + } + group.setCreateTime(DateUtil.getNow()); + group.setUpdateTime(DateUtil.getNow()); + groupService.add(group); break; case "update": - if (!userSetting.isUseAliasForGroupSync()) { - if (groupMessage.getGroupGbId() == null) { - log.info("[REDIS消息-分组信息更新] 分组编号未设置,{}", groupMessage.toString()); - continue; - } - Group group = groupService.queryGroupByDeviceId(groupMessage.getGroupGbId()); - if (group == null) { - log.info("[REDIS消息-分组信息更新] 失败 {},编号不存在", groupMessage.getGroupGbId()); - continue; - } - group.setDeviceId(groupMessage.getGroupGbId()); - group.setAlias(groupMessage.getGroupAlias()); - group.setParentDeviceId(groupMessage.getParentGroupGbId()); - group.setBusinessGroup(groupMessage.getTopGroupGbId()); - group.setUpdateTime(DateUtil.getNow()); - groupService.update(group); - }else { - // 此处使用别名作为判断依据,别名此处常常是分组在第三方系统里的唯一ID - if (groupMessage.getGroupAlias() == null) { - log.info("[REDIS消息-分组信息更新] 消息关键字段缺失, {}", groupMessage.toString()); - continue; - } - Group group = groupService.queryGroupByAlias(groupMessage.getGroupAlias()); - if (group == null ) { - log.info("[REDIS消息-分组信息更新] 失败 {},别名不存在", groupMessage.getGroupAlias()); - continue; - } - group.setName(groupMessage.getGroupName()); - group.setUpdateTime(DateUtil.getNow()); - if (groupMessage.getParentGAlias() != null) { - Group parentGroup = groupService.queryGroupByAlias(groupMessage.getParentGAlias()); - if (parentGroup == null) { - log.info("[REDIS消息-分组信息更新] 虚拟组织父节点信息未入库, {}", groupMessage.toString()); - continue; - } - group.setParentId(parentGroup.getId()); - group.setParentDeviceId(parentGroup.getDeviceId()); - }else { - Group businessGroup = groupService.queryGroupByDeviceId(group.getBusinessGroup()); - if (businessGroup == null ) { - log.info("[REDIS消息-分组信息更新] 失败 {},业务分组不存在", groupMessage.getGroupAlias()); - continue; - } - group.setParentId(businessGroup.getId()); - group.setParentDeviceId(null); - } - groupService.update(group); + // 此处使用别名作为判断依据,别名此处常常是分组在第三方系统里的唯一ID + if (groupMessage.getGroupAlias() == null) { + log.info("[REDIS消息-分组信息更新] 消息关键字段缺失, {}", groupMessage.toString()); + continue; } + if (group == null ) { + log.info("[REDIS消息-分组信息更新] 失败 {},别名不存在", groupMessage.getGroupAlias()); + continue; + } + group.setName(groupMessage.getGroupName()); + group.setUpdateTime(DateUtil.getNow()); + if (groupMessage.getParentGAlias() != null) { + Group parentGroup = groupService.queryGroupByAlias(groupMessage.getParentGAlias()); + if (parentGroup == null) { + log.info("[REDIS消息-分组信息更新] 虚拟组织父节点信息未入库, {}", groupMessage.toString()); + continue; + } + group.setParentId(parentGroup.getId()); + group.setParentDeviceId(parentGroup.getDeviceId()); + }else { + Group businessGroup = groupService.queryGroupByDeviceId(group.getBusinessGroup()); + if (businessGroup == null ) { + log.info("[REDIS消息-分组信息更新] 失败 {},业务分组不存在", groupMessage.getGroupAlias()); + continue; + } + group.setParentId(businessGroup.getId()); + group.setParentDeviceId(null); + } + groupService.update(group); break; case "delete": - if (!userSetting.isUseAliasForGroupSync()) { - if (groupMessage.getGroupGbId() == null) { - log.info("[REDIS消息-分组信息删除] 分组编号未设置,{}", groupMessage.toString()); - continue; - } - Group group = groupService.queryGroupByDeviceId(groupMessage.getGroupGbId()); - if (group == null) { - log.info("[REDIS消息-分组信息删除] 失败 {},编号不存在", groupMessage.getGroupGbId()); - continue; - } - groupService.delete(group.getId()); - }else { - // 此处使用别名作为判断依据,别名此处常常是分组在第三方系统里的唯一ID - if (groupMessage.getGroupAlias() == null) { - log.info("[REDIS消息-分组信息删除] 消息关键字段缺失, {}", groupMessage.toString()); - continue; - } - Group group = groupService.queryGroupByAlias(groupMessage.getGroupAlias()); - if (group == null) { - log.info("[REDIS消息-分组信息删除] 失败 {},别名不存在", groupMessage.getGroupAlias()); - continue; - } - groupService.delete(group.getId()); + // 此处使用别名作为判断依据,别名此处常常是分组在第三方系统里的唯一ID + if (groupMessage.getGroupAlias() == null) { + log.info("[REDIS消息-分组信息删除] 消息关键字段缺失, {}", groupMessage.toString()); + continue; } + if (group == null) { + log.info("[REDIS消息-分组信息删除] 失败 {},别名不存在", groupMessage.getGroupAlias()); + continue; + } + groupService.delete(group.getId()); break; default: log.info("[REDIS消息-分组信息改变] 未识别的消息类型 {},目前支持的消息类型为 add、update、delete", groupMessage.getMessageType()); diff --git a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGroupMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGroupMsgListener.java index 9be35ac71..14d56e1ee 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGroupMsgListener.java +++ b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGroupMsgListener.java @@ -21,8 +21,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; /** @@ -74,101 +73,73 @@ public class RedisGroupMsgListener implements MessageListener { if (messageDataList.isEmpty()) { return; } - if (userSetting.isUseAliasForGroupSync()) { - log.info("[REDIS消息-业务分组同步回复] 使用别名作为唯一ID解析分组消息"); - } + // 按照别名获取所有业务分组 + Map aliasGroupMap = groupService.queryGroupByAliasMap(); + Map aliasGroupToSave = new LinkedHashMap<>(); for (Message msg : messageDataList) { try { List groupMessages = JSON.parseArray(new String(msg.getBody()), RedisGroupMessage.class); for (int i = 0; i < groupMessages.size(); i++) { RedisGroupMessage groupMessage = groupMessages.get(i); log.info("[REDIS消息-业务分组同步回复] 处理数据: {}", groupMessage.toString()); - if (!userSetting.isUseAliasForGroupSync()) { - if (groupMessage.getGroupGbId() == null) { - log.warn("[REDIS消息-业务分组同步回复] 分组编号未设置,{}", groupMessage.toString()); + // 此处使用别名作为判断依据,别名此处常常是分组在第三方系统里的唯一ID + if (groupMessage.getGroupAlias() == null || ObjectUtils.isEmpty(groupMessage.getGroupName()) + || ObjectUtils.isEmpty(groupMessage.getTopGroupGAlias())) { + log.info("[REDIS消息-业务分组同步回复] 消息关键字段缺失, {}", groupMessage.toString()); + continue; + } + boolean isTop = groupMessage.getTopGroupGAlias().equals(groupMessage.getGroupAlias()); + Group group = aliasGroupMap.get(groupMessage.getGroupAlias()); + if (group == null ) { + group = new Group(); + String deviceId = buildGroupDeviceId(isTop); + group.setDeviceId(deviceId); + group.setAlias(groupMessage.getGroupAlias()); + group.setName(groupMessage.getGroupName()); + group.setCreateTime(DateUtil.getNow()); + } + + if (!isTop) { + if (ObjectUtils.isEmpty(groupMessage.getTopGroupGAlias())) { + log.info("[REDIS消息-业务分组同步回复] 消息缺失业务分组别名, {}", groupMessage.toString()); continue; } - Group group = groupService.queryGroupByDeviceId(groupMessage.getGroupGbId()); - if (group == null ) { - if (ObjectUtils.isEmpty(groupMessage.getGroupName()) - || ObjectUtils.isEmpty(groupMessage.getTopGroupGbId()) ){ - log.info("[REDIS消息-业务分组同步回复] 消息关键字段缺失, {}", groupMessage.toString()); - continue; - } - group = new Group(); - group.setDeviceId(groupMessage.getGroupGbId()); - group.setAlias(groupMessage.getGroupAlias()); - group.setParentDeviceId(groupMessage.getParentGroupGbId()); - group.setBusinessGroup(groupMessage.getTopGroupGbId()); - group.setCreateTime(DateUtil.getNow()); - group.setUpdateTime(DateUtil.getNow()); - groupService.add(group); - }else { - group.setDeviceId(groupMessage.getGroupGbId()); - group.setAlias(groupMessage.getGroupAlias()); - group.setParentDeviceId(groupMessage.getParentGroupGbId()); - group.setBusinessGroup(groupMessage.getTopGroupGbId()); - group.setUpdateTime(DateUtil.getNow()); - groupService.update(group); + Group topGroup = aliasGroupMap.get(groupMessage.getTopGroupGAlias()); + if (topGroup == null) { + topGroup = aliasGroupToSave.get(groupMessage.getTopGroupGAlias()); } - }else { - // 此处使用别名作为判断依据,别名此处常常是分组在第三方系统里的唯一ID - if (groupMessage.getGroupAlias() == null || ObjectUtils.isEmpty(groupMessage.getGroupName()) - || ObjectUtils.isEmpty(groupMessage.getTopGroupGAlias())) { - log.info("[REDIS消息-业务分组同步回复] 消息关键字段缺失, {}", groupMessage.toString()); + if (topGroup == null) { + log.info("[REDIS消息-业务分组同步回复] 业务分组信息未发送或者未首先发送, {}", groupMessage.toString()); continue; } - boolean isTop = groupMessage.getTopGroupGAlias().equals(groupMessage.getGroupAlias()); - Group group = groupService.queryGroupByAlias(groupMessage.getGroupAlias()); - if (group == null ) { - group = new Group(); - String deviceId = buildGroupDeviceId(isTop); - group.setDeviceId(deviceId); - group.setAlias(groupMessage.getGroupAlias()); - group.setName(groupMessage.getGroupName()); - group.setCreateTime(DateUtil.getNow()); - } - - if (!isTop) { - if (ObjectUtils.isEmpty(groupMessage.getTopGroupGAlias())) { - log.info("[REDIS消息-业务分组同步回复] 消息缺失业务分组别名, {}", groupMessage.toString()); + group.setBusinessGroup(topGroup.getDeviceId()); + if (groupMessage.getParentGAlias() != null) { + Group parentGroup = aliasGroupMap.get(groupMessage.getParentGAlias()); + if (parentGroup == null) { + parentGroup = aliasGroupToSave.get(groupMessage.getParentGAlias()); + } + if (parentGroup == null) { + log.info("[REDIS消息-业务分组同步回复] 虚拟组织父节点未发送或者未首先发送, {}", groupMessage.toString()); continue; } - - Group topGroup = groupService.queryGroupByAlias(groupMessage.getTopGroupGAlias()); - if (topGroup == null) { - log.info("[REDIS消息-业务分组同步回复] 业务分组信息未入库, {}", groupMessage.toString()); - continue; - } - group.setBusinessGroup(topGroup.getDeviceId()); - if (groupMessage.getParentGAlias() != null) { - Group parentGroup = groupService.queryGroupByAlias(groupMessage.getParentGAlias()); - if (parentGroup == null) { - log.info("[REDIS消息-业务分组同步回复] 虚拟组织父节点信息未入库, {}", groupMessage.toString()); - continue; - } - group.setParentId(parentGroup.getId()); - group.setParentDeviceId(parentGroup.getDeviceId()); - }else { - group.setParentId(topGroup.getId()); - group.setParentDeviceId(null); - } + group.setParentId(null); + group.setParentDeviceId(parentGroup.getDeviceId()); }else { group.setParentId(null); - group.setParentDeviceId(null); - } - - group.setUpdateTime(DateUtil.getNow()); - if (group.getId() > 0) { - log.info("[REDIS消息-业务分组同步回复] 更新入库, {}", JSON.toJSONString(group)); - groupService.update(group); - }else { - log.info("[REDIS消息-业务分组同步回复] 新增入库, {}", JSON.toJSONString(group)); - groupService.add(group); + group.setParentDeviceId(topGroup.getDeviceId()); } + }else { + group.setParentId(null); + group.setBusinessGroup(group.getDeviceId()); + group.setParentDeviceId(null); } + + group.setUpdateTime(DateUtil.getNow()); + aliasGroupToSave.put(group.getAlias(), group); } + // 存储分组数据 + groupService.saveByAlias(aliasGroupToSave.values()); } catch (ControllerException e) { log.warn("[REDIS消息-业务分组同步回复] 失败, \r\n{}", e.getMsg()); @@ -178,6 +149,8 @@ public class RedisGroupMsgListener implements MessageListener { } } + + } /**