Commit 2785d40a2f059567822f126ddc80f44c07584a94

Authored by 云中非
1 parent 5f21f8be

fix: 网关子设备与网关设备的关联关系管理

1、网关子设备新增时关联网关设备
2、网关子设备新增时未关联网关设备
3、网关子设备编辑时切换网关子设备
4、网关子设备编辑时添加网关子设备
5、网关子设备编辑时解除与网关设备的关联
... ... @@ -50,6 +50,7 @@ import java.util.HashMap;
50 50 import java.util.List;
51 51 import java.util.Optional;
52 52 import java.util.UUID;
  53 +import java.util.concurrent.ExecutionException;
53 54
54 55 import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.*;
55 56
... ... @@ -66,7 +67,7 @@ public class YtDeviceController extends BaseController {
66 67 @ApiOperation("创建|编辑")
67 68 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
68 69 public ResponseEntity<DeviceDTO> saveDevice(
69   - @Validated(AddGroup.class) @RequestBody DeviceDTO deviceDTO) throws ThingsboardException {
  70 + @Validated(AddGroup.class) @RequestBody DeviceDTO deviceDTO) throws ThingsboardException, ExecutionException, InterruptedException {
70 71 String currentTenantId = getCurrentUser().getCurrentTenantId();
71 72 boolean enable = deviceService.validateFormdata(currentTenantId, deviceDTO);
72 73 if (!enable) {
... ... @@ -74,86 +75,85 @@ public class YtDeviceController extends BaseController {
74 75 }
75 76 DeviceDTO newDeviceDTO = null;
76 77 boolean isIncludeRelation = false;
77   - String gateWayDeviceId = deviceDTO.getGatewayId();
  78 +
  79 + String gatewayId = deviceDTO.getGatewayId();
78 80 DeviceDTO gateWayDevice = null;
79   - if (StringUtils.isNotEmpty(gateWayDeviceId)) {
  81 + if (StringUtils.isNotEmpty(gatewayId)) {
80 82 gateWayDevice =
81 83 deviceService.checkDeviceByTenantIdAndDeviceId(
82   - getCurrentUser().getCurrentTenantId(), gateWayDeviceId);
83   - }
84   - if (deviceDTO.getDeviceType().equals(DeviceTypeEnum.SENSOR)
85   - && StringUtils.isNotEmpty(gateWayDeviceId)
86   - && null == deviceDTO.getId()) {
  84 + getCurrentUser().getCurrentTenantId(), gatewayId);
  85 +
87 86 // 第一步判断该网关设备是否存在于该租户下面
88 87 if (null == gateWayDevice) {
89 88 throw new YtDataValidationException(
90   - ErrorMessage.DEVICE_NOT_EXISTENCE_IN_TENANT.getMessage());
  89 + ErrorMessage.DEVICE_NOT_EXISTENCE_IN_TENANT.getMessage());
91 90 }
92   - try {
93   - // 第二步判断网关的关联设备是否已包含该设备
94   - EntityId entityId = EntityIdFactory.getByTypeAndId("DEVICE", gateWayDevice.getTbDeviceId());
  91 + }
  92 +
  93 + /**子设备编辑时,TB中已经存在关联关系则值更新设备表信息*/
  94 + String selfTbDeviceIdStr = deviceDTO.getTbDeviceId();
  95 + if (selfTbDeviceIdStr != null
  96 + && deviceDTO.getDeviceType().equals(DeviceTypeEnum.SENSOR)
  97 + && StringUtils.isNotEmpty(gatewayId)) {
  98 +
  99 +
  100 + // 第二步判断网关子设备是否已关联到网关设备
  101 + EntityId entityId = EntityIdFactory.getByTypeAndId("DEVICE", selfTbDeviceIdStr);//gateWayDevice.getTbDeviceId()
95 102 List<EntityRelationInfo> list =
96 103 relationService.findInfoByTo(getTenantId(), entityId, RelationTypeGroup.COMMON).get();
97   - int count = 0;
98   - int exit = 0;
  104 +
99 105 for (EntityRelationInfo entityRelationInfo : list) {
100   - count++;
101   - if (entityRelationInfo.getToName().equals(deviceDTO.getName())) {
102   - exit = count;
  106 + if (entityRelationInfo.getTo().getId().equals(selfTbDeviceIdStr)
  107 + && entityRelationInfo.getFrom().getId().equals(gatewayId)) {
  108 + deviceDTO.setTbDeviceId(entityRelationInfo.getTo().toString());
  109 + newDeviceDTO =
  110 + deviceService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceDTO);
  111 + isIncludeRelation = true;
103 112 break;
104 113 }
105 114 }
106   - // 第三步如果包含,只需创建我方设备,不需调用TB创建设备,不包含,走正常逻辑,然后将关联关系创建
107   - if (count > 0) {
108   - EntityRelationInfo entityRelationInfo = list.get(exit);
109   - deviceDTO.setTbDeviceId(entityRelationInfo.getTo().toString());
110   - newDeviceDTO =
111   - deviceService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceDTO);
112   - isIncludeRelation = true;
113   - }
114   - } catch (Exception e) {
115   - handleException(e);
116   - }
117 115 }
  116 +
  117 +
  118 + /**需要更新设备表和关联关系表*/
118 119 if (!isIncludeRelation) {
119 120 Device tbDevice = buildTbDeviceFromDeviceDTO(getCurrentUser().getTenantId(), deviceDTO);
120 121
121   - DeviceId tbDeviceId = updateTbDevice(tbDevice, deviceDTO.getDeviceToken());
122   - String deviceId = tbDeviceId.getId().toString();
123   - deviceDTO.setTbDeviceId(deviceId);
  122 + DeviceId selfTbId = updateTbDevice(tbDevice, deviceDTO.getDeviceToken());
  123 + selfTbDeviceIdStr = selfTbId.getId().toString();
  124 + deviceDTO.setTbDeviceId( selfTbDeviceIdStr);
124 125 newDeviceDTO = deviceService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceDTO);
  126 +
125 127 if (deviceDTO.getDeviceType().equals(DeviceTypeEnum.SENSOR)
126   - && StringUtils.isNotEmpty(gateWayDeviceId)
127   - && gateWayDevice != null) {
128   - if (null != deviceDTO.getId()) {
129   - // 删除原來的关联关系
130   - List<DeviceDTO> list =
131   - deviceService.findGateWayDeviceByTbDeviceId(
132   - getCurrentUser().getCurrentTenantId(), deviceId);
133   - if (null == list || list.size() < 1) {
134   - throw new YtDataValidationException(ErrorMessage.DEVICE_RELATION_IS_ABSENT.getMessage());
135   - }
  128 + && StringUtils.isNotEmpty(selfTbDeviceIdStr)) {
  129 + // 删除原來的关联关系
  130 + List<DeviceDTO> list =
  131 + deviceService.findGateWayDeviceByTbDeviceId(
  132 + getCurrentUser().getCurrentTenantId(), selfTbDeviceIdStr);
  133 + if (null != list && list.size() > 0) {
136 134 DeviceId form = new DeviceId(UUID.fromString(list.get(0).getTbDeviceId()));
137   - DeviceId to = new DeviceId(UUID.fromString(deviceId));
138 135 EntityRelation relation =
139   - new EntityRelation(
140   - form, to, FastIotConstants.Relation.relationType, RelationTypeGroup.COMMON);
  136 + new EntityRelation(
  137 + form, selfTbId, FastIotConstants.Relation.relationType, RelationTypeGroup.COMMON);
141 138 boolean found =
142   - relationService.deleteRelation(
143   - getTenantId(),
144   - form,
145   - to,
146   - FastIotConstants.Relation.relationType,
147   - RelationTypeGroup.COMMON);
  139 + relationService.deleteRelation(
  140 + getTenantId(),
  141 + form,
  142 + selfTbId,
  143 + FastIotConstants.Relation.relationType,
  144 + RelationTypeGroup.COMMON);
148 145
149 146 if (!found) {
150 147 throw new ThingsboardException(
151   - "Requested item wasn't found!", ThingsboardErrorCode.ITEM_NOT_FOUND);
  148 + "Requested item wasn't found!", ThingsboardErrorCode.ITEM_NOT_FOUND);
152 149 }
153 150 sendRelationNotificationMsg(
154   - getTenantId(), relation, EdgeEventActionType.RELATION_DELETED);
  151 + getTenantId(), relation, EdgeEventActionType.RELATION_DELETED);
  152 + }
  153 +
  154 + if(gateWayDevice != null){
  155 + addRelation(getTenantId(), gateWayDevice.getTbDeviceId(), selfTbDeviceIdStr);
155 156 }
156   - addRelation(getTenantId(), gateWayDevice.getTbDeviceId(), deviceId);
157 157 }
158 158 }
159 159 return ResponseEntity.ok(newDeviceDTO);
... ...