Commit 6993586c45c1236377c5aa76476cf1b8f09a8e4a
Merge branch 'ljl1207' into 'master'
refactor: 设备管理 See merge request huang/thingsboard3.3.2!5
Showing
18 changed files
with
523 additions
and
571 deletions
@@ -319,7 +319,7 @@ public abstract class BaseController { | @@ -319,7 +319,7 @@ public abstract class BaseController { | ||
319 | } | 319 | } |
320 | } | 320 | } |
321 | 321 | ||
322 | - <T> T checkNotNull(T reference) throws ThingsboardException { | 322 | + public <T> T checkNotNull(T reference) throws ThingsboardException { |
323 | return checkNotNull(reference, "Requested item wasn't found!"); | 323 | return checkNotNull(reference, "Requested item wasn't found!"); |
324 | } | 324 | } |
325 | 325 | ||
@@ -533,7 +533,7 @@ public abstract class BaseController { | @@ -533,7 +533,7 @@ public abstract class BaseController { | ||
533 | } | 533 | } |
534 | } | 534 | } |
535 | 535 | ||
536 | - Device checkDeviceId(DeviceId deviceId, Operation operation) throws ThingsboardException { | 536 | + public Device checkDeviceId(DeviceId deviceId, Operation operation) throws ThingsboardException { |
537 | try { | 537 | try { |
538 | validateId(deviceId, "Incorrect deviceId " + deviceId); | 538 | validateId(deviceId, "Incorrect deviceId " + deviceId); |
539 | Device device = deviceService.findDeviceById(getCurrentUser().getTenantId(), deviceId); | 539 | Device device = deviceService.findDeviceById(getCurrentUser().getTenantId(), deviceId); |
@@ -15,6 +15,7 @@ | @@ -15,6 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.controller; | 16 | package org.thingsboard.server.controller; |
17 | 17 | ||
18 | +import io.swagger.annotations.Api; | ||
18 | import io.swagger.annotations.ApiOperation; | 19 | import io.swagger.annotations.ApiOperation; |
19 | import io.swagger.annotations.ApiParam; | 20 | import io.swagger.annotations.ApiParam; |
20 | import lombok.extern.slf4j.Slf4j; | 21 | import lombok.extern.slf4j.Slf4j; |
@@ -186,62 +187,6 @@ public class DeviceProfileController extends BaseController { | @@ -186,62 +187,6 @@ public class DeviceProfileController extends BaseController { | ||
186 | } | 187 | } |
187 | } | 188 | } |
188 | 189 | ||
189 | - @ApiOperation(value = "Create Or Update Device Profile (saveDeviceProfile)", | ||
190 | - notes = "Create or update the Device Profile. When creating device profile, platform generates device profile id as " + UUID_WIKI_LINK + | ||
191 | - "The newly created device profile id will be present in the response. " + | ||
192 | - "Specify existing device profile id to update the device profile. " + | ||
193 | - "Referencing non-existing device profile Id will cause 'Not Found' error. " + NEW_LINE + | ||
194 | - "Device profile name is unique in the scope of tenant. Only one 'default' device profile may exist in scope of tenant." + DEVICE_PROFILE_DATA + | ||
195 | - TENANT_AUTHORITY_PARAGRAPH, | ||
196 | - produces = "application/json", | ||
197 | - consumes = "application/json") | ||
198 | - @PreAuthorize("hasAuthority('TENANT_ADMIN')") | ||
199 | - @RequestMapping(value = "/deviceProfile", method = RequestMethod.POST) | ||
200 | - @ResponseBody | ||
201 | - public DeviceProfile saveDeviceProfile( | ||
202 | - @ApiParam(value = "A JSON value representing the device profile.") | ||
203 | - @RequestBody DeviceProfile deviceProfile) throws ThingsboardException { | ||
204 | - try { | ||
205 | - boolean created = deviceProfile.getId() == null; | ||
206 | - deviceProfile.setTenantId(getTenantId()); | ||
207 | - | ||
208 | - checkEntity(deviceProfile.getId(), deviceProfile, Resource.DEVICE_PROFILE); | ||
209 | - | ||
210 | - boolean isFirmwareChanged = false; | ||
211 | - boolean isSoftwareChanged = false; | ||
212 | - | ||
213 | - if (!created) { | ||
214 | - DeviceProfile oldDeviceProfile = deviceProfileService.findDeviceProfileById(getTenantId(), deviceProfile.getId()); | ||
215 | - if (!Objects.equals(deviceProfile.getFirmwareId(), oldDeviceProfile.getFirmwareId())) { | ||
216 | - isFirmwareChanged = true; | ||
217 | - } | ||
218 | - if (!Objects.equals(deviceProfile.getSoftwareId(), oldDeviceProfile.getSoftwareId())) { | ||
219 | - isSoftwareChanged = true; | ||
220 | - } | ||
221 | - } | ||
222 | - | ||
223 | - DeviceProfile savedDeviceProfile = checkNotNull(deviceProfileService.saveDeviceProfile(deviceProfile)); | ||
224 | - | ||
225 | - tbClusterService.onDeviceProfileChange(savedDeviceProfile, null); | ||
226 | - tbClusterService.broadcastEntityStateChangeEvent(deviceProfile.getTenantId(), savedDeviceProfile.getId(), | ||
227 | - created ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED); | ||
228 | - | ||
229 | - logEntityAction(savedDeviceProfile.getId(), savedDeviceProfile, | ||
230 | - null, | ||
231 | - created ? ActionType.ADDED : ActionType.UPDATED, null); | ||
232 | - | ||
233 | - otaPackageStateService.update(savedDeviceProfile, isFirmwareChanged, isSoftwareChanged); | ||
234 | - | ||
235 | - sendEntityNotificationMsg(getTenantId(), savedDeviceProfile.getId(), | ||
236 | - deviceProfile.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED); | ||
237 | - return savedDeviceProfile; | ||
238 | - } catch (Exception e) { | ||
239 | - logEntityAction(emptyId(EntityType.DEVICE_PROFILE), deviceProfile, | ||
240 | - null, deviceProfile.getId() == null ? ActionType.ADDED : ActionType.UPDATED, e); | ||
241 | - throw handleException(e); | ||
242 | - } | ||
243 | - } | ||
244 | - | ||
245 | @ApiOperation(value = "Delete device profile (deleteDeviceProfile)", | 190 | @ApiOperation(value = "Delete device profile (deleteDeviceProfile)", |
246 | notes = "Deletes the device profile. Referencing non-existing device profile Id will cause an error. " + | 191 | notes = "Deletes the device profile. Referencing non-existing device profile Id will cause an error. " + |
247 | "Can't delete the device profile if it is referenced by existing devices." + TENANT_AUTHORITY_PARAGRAPH, | 192 | "Can't delete the device profile if it is referenced by existing devices." + TENANT_AUTHORITY_PARAGRAPH, |
@@ -337,6 +282,62 @@ public class DeviceProfileController extends BaseController { | @@ -337,6 +282,62 @@ public class DeviceProfileController extends BaseController { | ||
337 | } | 282 | } |
338 | } | 283 | } |
339 | 284 | ||
285 | + @ApiOperation(value = "Create Or Update Device Profile (saveDeviceProfile)", | ||
286 | + notes = "Create or update the Device Profile. When creating device profile, platform generates device profile id as " + UUID_WIKI_LINK + | ||
287 | + "The newly created device profile id will be present in the response. " + | ||
288 | + "Specify existing device profile id to update the device profile. " + | ||
289 | + "Referencing non-existing device profile Id will cause 'Not Found' error. " + NEW_LINE + | ||
290 | + "Device profile name is unique in the scope of tenant. Only one 'default' device profile may exist in scope of tenant." + DEVICE_PROFILE_DATA + | ||
291 | + TENANT_AUTHORITY_PARAGRAPH, | ||
292 | + produces = "application/json", | ||
293 | + consumes = "application/json") | ||
294 | + @PreAuthorize("hasAuthority('TENANT_ADMIN')") | ||
295 | + @RequestMapping(value = "/deviceProfile", method = RequestMethod.POST) | ||
296 | + @ResponseBody | ||
297 | + public DeviceProfile saveDeviceProfile( | ||
298 | + @ApiParam(value = "A JSON value representing the device profile.") | ||
299 | + @RequestBody DeviceProfile deviceProfile) throws ThingsboardException { | ||
300 | + try { | ||
301 | + boolean created = deviceProfile.getId() == null; | ||
302 | + deviceProfile.setTenantId(getTenantId()); | ||
303 | + | ||
304 | + checkEntity(deviceProfile.getId(), deviceProfile, Resource.DEVICE_PROFILE); | ||
305 | + | ||
306 | + boolean isFirmwareChanged = false; | ||
307 | + boolean isSoftwareChanged = false; | ||
308 | + | ||
309 | + if (!created) { | ||
310 | + DeviceProfile oldDeviceProfile = deviceProfileService.findDeviceProfileById(getTenantId(), deviceProfile.getId()); | ||
311 | + if (!Objects.equals(deviceProfile.getFirmwareId(), oldDeviceProfile.getFirmwareId())) { | ||
312 | + isFirmwareChanged = true; | ||
313 | + } | ||
314 | + if (!Objects.equals(deviceProfile.getSoftwareId(), oldDeviceProfile.getSoftwareId())) { | ||
315 | + isSoftwareChanged = true; | ||
316 | + } | ||
317 | + } | ||
318 | + | ||
319 | + DeviceProfile savedDeviceProfile = checkNotNull(deviceProfileService.saveDeviceProfile(deviceProfile)); | ||
320 | + | ||
321 | + tbClusterService.onDeviceProfileChange(savedDeviceProfile, null); | ||
322 | + tbClusterService.broadcastEntityStateChangeEvent(deviceProfile.getTenantId(), savedDeviceProfile.getId(), | ||
323 | + created ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED); | ||
324 | + | ||
325 | + logEntityAction(savedDeviceProfile.getId(), savedDeviceProfile, | ||
326 | + null, | ||
327 | + created ? ActionType.ADDED : ActionType.UPDATED, null); | ||
328 | + | ||
329 | + otaPackageStateService.update(savedDeviceProfile, isFirmwareChanged, isSoftwareChanged); | ||
330 | + | ||
331 | + sendEntityNotificationMsg(getTenantId(), savedDeviceProfile.getId(), | ||
332 | + deviceProfile.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED); | ||
333 | + return savedDeviceProfile; | ||
334 | + } catch (Exception e) { | ||
335 | + logEntityAction(emptyId(EntityType.DEVICE_PROFILE), deviceProfile, | ||
336 | + null, deviceProfile.getId() == null ? ActionType.ADDED : ActionType.UPDATED, e); | ||
337 | + throw handleException(e); | ||
338 | + } | ||
339 | + } | ||
340 | + | ||
340 | @ApiOperation(value = "Get Device Profiles for transport type (getDeviceProfileInfos)", | 341 | @ApiOperation(value = "Get Device Profiles for transport type (getDeviceProfileInfos)", |
341 | notes = "Returns a page of devices profile info objects owned by tenant. " + | 342 | notes = "Returns a page of devices profile info objects owned by tenant. " + |
342 | PAGE_DATA_PARAMETERS + DEVICE_PROFILE_INFO_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH, | 343 | PAGE_DATA_PARAMETERS + DEVICE_PROFILE_INFO_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH, |
1 | package org.thingsboard.server.controller.yunteng; | 1 | package org.thingsboard.server.controller.yunteng; |
2 | 2 | ||
3 | import io.jsonwebtoken.*; | 3 | import io.jsonwebtoken.*; |
4 | +import io.swagger.annotations.Api; | ||
4 | import lombok.RequiredArgsConstructor; | 5 | import lombok.RequiredArgsConstructor; |
5 | import lombok.extern.slf4j.Slf4j; | 6 | import lombok.extern.slf4j.Slf4j; |
6 | import org.springframework.security.authentication.BadCredentialsException; | 7 | import org.springframework.security.authentication.BadCredentialsException; |
@@ -26,6 +27,7 @@ import java.net.InetAddress; | @@ -26,6 +27,7 @@ import java.net.InetAddress; | ||
26 | @RequestMapping("/api/yt/notice") | 27 | @RequestMapping("/api/yt/notice") |
27 | @RequiredArgsConstructor | 28 | @RequiredArgsConstructor |
28 | @Slf4j | 29 | @Slf4j |
30 | +@Api(tags = {"告警通知"}) | ||
29 | public class YtAlarmNoticeController { | 31 | public class YtAlarmNoticeController { |
30 | 32 | ||
31 | private final YtNoticeService service; | 33 | private final YtNoticeService service; |
application/src/main/java/org/thingsboard/server/controller/yunteng/YtAlarmProfileController.java
deleted
100644 → 0
1 | -package org.thingsboard.server.controller.yunteng; | ||
2 | - | ||
3 | -import lombok.RequiredArgsConstructor; | ||
4 | -import org.springframework.http.ResponseEntity; | ||
5 | -import org.springframework.web.bind.annotation.*; | ||
6 | -import org.thingsboard.server.common.data.exception.ThingsboardException; | ||
7 | -import org.thingsboard.server.common.data.yunteng.dto.AlarmProfileDTO; | ||
8 | -import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; | ||
9 | -import org.thingsboard.server.controller.BaseController; | ||
10 | -import org.thingsboard.server.dao.yunteng.service.YtAlarmProfileService; | ||
11 | - | ||
12 | -@RestController | ||
13 | -@RequestMapping("/api/yt/alarmProfile") | ||
14 | -@RequiredArgsConstructor | ||
15 | -public class YtAlarmProfileController extends BaseController { | ||
16 | - private final YtAlarmProfileService alarmProfileService; | ||
17 | - | ||
18 | - @PostMapping | ||
19 | - public ResponseEntity<AlarmProfileDTO> saveAlarmProfile( | ||
20 | - @RequestBody AlarmProfileDTO alarmProfileDTO) throws ThingsboardException { | ||
21 | - return ResponseEntity.ok(alarmProfileService.saveOrUpdateAlarmProfile(getCurrentUser().getCurrentTenantId(), alarmProfileDTO)); | ||
22 | - } | ||
23 | - | ||
24 | - @DeleteMapping | ||
25 | - public ResponseEntity<Boolean> deleteAlarmProfile( | ||
26 | - @RequestBody DeleteDTO deleteDTO) { | ||
27 | - return ResponseEntity.ok(alarmProfileService.deleteAlarmProfile(deleteDTO.getIds())); | ||
28 | - } | ||
29 | -} |
1 | package org.thingsboard.server.controller.yunteng; | 1 | package org.thingsboard.server.controller.yunteng; |
2 | 2 | ||
3 | +import com.fasterxml.jackson.databind.JsonNode; | ||
4 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
5 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
6 | +import io.swagger.annotations.Api; | ||
3 | import lombok.RequiredArgsConstructor; | 7 | import lombok.RequiredArgsConstructor; |
8 | +import lombok.extern.slf4j.Slf4j; | ||
4 | import org.apache.commons.lang3.StringUtils; | 9 | import org.apache.commons.lang3.StringUtils; |
5 | import org.springframework.http.HttpStatus; | 10 | import org.springframework.http.HttpStatus; |
6 | import org.springframework.http.ResponseEntity; | 11 | import org.springframework.http.ResponseEntity; |
7 | import org.springframework.validation.annotation.Validated; | 12 | import org.springframework.validation.annotation.Validated; |
8 | import org.springframework.web.bind.annotation.*; | 13 | import org.springframework.web.bind.annotation.*; |
9 | -import org.springframework.web.servlet.support.ServletUriComponentsBuilder; | 14 | +import org.thingsboard.server.common.data.Device; |
15 | +import org.thingsboard.server.common.data.audit.ActionType; | ||
10 | import org.thingsboard.server.common.data.exception.ThingsboardException; | 16 | import org.thingsboard.server.common.data.exception.ThingsboardException; |
17 | +import org.thingsboard.server.common.data.id.DeviceId; | ||
18 | +import org.thingsboard.server.common.data.id.DeviceProfileId; | ||
19 | +import org.thingsboard.server.common.data.id.EdgeId; | ||
20 | +import org.thingsboard.server.common.data.id.TenantId; | ||
11 | import org.thingsboard.server.common.data.yunteng.common.AddGroup; | 21 | import org.thingsboard.server.common.data.yunteng.common.AddGroup; |
12 | import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; | 22 | import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; |
13 | import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; | 23 | import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; |
@@ -17,37 +27,71 @@ import org.thingsboard.server.common.data.yunteng.enums.DeviceTypeEnum; | @@ -17,37 +27,71 @@ import org.thingsboard.server.common.data.yunteng.enums.DeviceTypeEnum; | ||
17 | import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum; | 27 | import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum; |
18 | import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; | 28 | import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; |
19 | import org.thingsboard.server.controller.BaseController; | 29 | import org.thingsboard.server.controller.BaseController; |
30 | +import org.thingsboard.server.dao.device.DeviceService; | ||
20 | import org.thingsboard.server.dao.yunteng.service.YtDeviceService; | 31 | import org.thingsboard.server.dao.yunteng.service.YtDeviceService; |
32 | +import org.thingsboard.server.service.security.permission.Operation; | ||
33 | +import org.thingsboard.server.service.security.permission.Resource; | ||
21 | 34 | ||
22 | -import java.net.URI; | 35 | +import java.time.LocalDateTime; |
36 | +import java.time.ZoneOffset; | ||
23 | import java.util.HashMap; | 37 | import java.util.HashMap; |
38 | +import java.util.List; | ||
24 | import java.util.Optional; | 39 | import java.util.Optional; |
40 | +import java.util.UUID; | ||
25 | 41 | ||
26 | import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.*; | 42 | import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.*; |
27 | 43 | ||
28 | @RestController | 44 | @RestController |
29 | @RequiredArgsConstructor | 45 | @RequiredArgsConstructor |
30 | @RequestMapping("api/yt/device") | 46 | @RequestMapping("api/yt/device") |
47 | +@Api(tags = {"设备管理"}) | ||
48 | +@Slf4j | ||
31 | public class YtDeviceController extends BaseController { | 49 | public class YtDeviceController extends BaseController { |
32 | private final YtDeviceService deviceService; | 50 | private final YtDeviceService deviceService; |
51 | + private final DeviceService tbDeviceService; | ||
33 | 52 | ||
34 | @PostMapping | 53 | @PostMapping |
35 | public ResponseEntity<DeviceDTO> saveDevice(@Validated(AddGroup.class)@RequestBody DeviceDTO deviceDTO) | 54 | public ResponseEntity<DeviceDTO> saveDevice(@Validated(AddGroup.class)@RequestBody DeviceDTO deviceDTO) |
36 | throws ThingsboardException { | 55 | throws ThingsboardException { |
56 | + boolean enable = deviceService.validateFormdata(deviceDTO); | ||
57 | + if(!enable){ | ||
58 | + ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); | ||
59 | + } | ||
60 | + | ||
61 | + Device tbDevice = buildTbDeviceFromDeviceDTO(getCurrentUser().getTenantId(),deviceDTO); | ||
62 | + Device savedDevice = updateTbDevice(tbDevice,deviceDTO.getDeviceToken()); | ||
63 | + | ||
64 | + deviceDTO.setTbDeviceId(savedDevice.getId().getId().toString()); | ||
37 | DeviceDTO newDeviceDTO = deviceService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceDTO); | 65 | DeviceDTO newDeviceDTO = deviceService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceDTO); |
38 | return Optional.ofNullable(newDeviceDTO) | 66 | return Optional.ofNullable(newDeviceDTO) |
39 | .map( | 67 | .map( |
40 | dto -> { | 68 | dto -> { |
41 | - URI location = | ||
42 | - ServletUriComponentsBuilder.fromCurrentRequest() | ||
43 | - .path("/{id}") | ||
44 | - .buildAndExpand(newDeviceDTO.getId()) | ||
45 | - .toUri(); | ||
46 | - return ResponseEntity.created(location).body(newDeviceDTO); | 69 | + return ResponseEntity.ok(newDeviceDTO); |
47 | }) | 70 | }) |
48 | .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build()); | 71 | .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build()); |
49 | } | 72 | } |
50 | 73 | ||
74 | + private Device updateTbDevice( Device tbDevice,String deviceToken) throws ThingsboardException { | ||
75 | + Device oldDevice = null; | ||
76 | + boolean created = tbDevice.getId() == null; | ||
77 | + if (!created) { | ||
78 | + oldDevice = checkDeviceId(tbDevice.getId(), Operation.WRITE); | ||
79 | + } else { | ||
80 | + checkEntity(null, tbDevice, Resource.DEVICE); | ||
81 | + } | ||
82 | + | ||
83 | + Device savedDevice = checkNotNull(tbDeviceService.saveDeviceWithAccessToken(tbDevice, deviceToken)); | ||
84 | + tbClusterService.onDeviceUpdated(savedDevice, oldDevice); | ||
85 | + try { | ||
86 | + logEntityAction(getCurrentUser(), savedDevice.getId(), savedDevice, | ||
87 | + savedDevice.getCustomerId(), | ||
88 | + created ? ActionType.ADDED : ActionType.UPDATED, null); | ||
89 | + } catch (ThingsboardException e) { | ||
90 | + log.error("Failed to log entity action", e); | ||
91 | + } | ||
92 | + return savedDevice; | ||
93 | + } | ||
94 | + | ||
51 | @GetMapping("{id}") | 95 | @GetMapping("{id}") |
52 | public ResponseEntity<DeviceDTO> getDevice(@PathVariable("id") String id) throws ThingsboardException { | 96 | public ResponseEntity<DeviceDTO> getDevice(@PathVariable("id") String id) throws ThingsboardException { |
53 | return ResponseEntity.of(deviceService.getDevice(getCurrentUser().getCurrentTenantId(), id)); | 97 | return ResponseEntity.of(deviceService.getDevice(getCurrentUser().getCurrentTenantId(), id)); |
@@ -85,6 +129,62 @@ public class YtDeviceController extends BaseController { | @@ -85,6 +129,62 @@ public class YtDeviceController extends BaseController { | ||
85 | 129 | ||
86 | @DeleteMapping | 130 | @DeleteMapping |
87 | public void deleteDevices(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) throws ThingsboardException { | 131 | public void deleteDevices(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) throws ThingsboardException { |
88 | - deviceService.deleteDevices(getCurrentUser().getCurrentTenantId(), deleteDTO.getIds()); | 132 | + String currentTenantId = getCurrentUser().getCurrentTenantId(); |
133 | + List<String> tdIds = deviceService.findTbDeviceId(currentTenantId, deleteDTO.getIds()); | ||
134 | + for(String id:tdIds){ | ||
135 | + deleteTbDevice(id); | ||
136 | + } | ||
137 | + deviceService.deleteDevices(currentTenantId, deleteDTO.getIds()); | ||
138 | + } | ||
139 | + | ||
140 | + private void deleteTbDevice(String id) throws ThingsboardException { | ||
141 | + DeviceId deviceId = new DeviceId(toUUID(id)); | ||
142 | + Device device = checkDeviceId(deviceId, Operation.DELETE); | ||
143 | + | ||
144 | + List<EdgeId> relatedEdgeIds = findRelatedEdgeIds(getTenantId(), deviceId); | ||
145 | + | ||
146 | + tbDeviceService.deleteDevice(getCurrentUser().getTenantId(), deviceId); | ||
147 | + | ||
148 | + tbClusterService.onDeviceDeleted(device, null); | ||
149 | + | ||
150 | + logEntityAction(deviceId, device, | ||
151 | + device.getCustomerId(), | ||
152 | + ActionType.DELETED, null, id); | ||
153 | + | ||
154 | + sendDeleteNotificationMsg(getTenantId(), deviceId, relatedEdgeIds); | ||
155 | + } | ||
156 | + | ||
157 | + | ||
158 | + private final ObjectMapper objectMapper; | ||
159 | + private Device buildTbDeviceFromDeviceDTO(TenantId tenantId,DeviceDTO deviceDTO) { | ||
160 | + Device tbDevice = new Device(); | ||
161 | + String deviceId = deviceDTO.getTbDeviceId(); | ||
162 | + if (StringUtils.isNotBlank(deviceId)) { | ||
163 | + DeviceId id = new DeviceId(UUID.fromString(deviceId)); | ||
164 | + tbDevice.setId(id); | ||
165 | + } | ||
166 | + ObjectNode additionalInfo = objectMapper.createObjectNode(); | ||
167 | + additionalInfo.put("gateway",Optional.ofNullable(deviceDTO.getDeviceType()) | ||
168 | + .map(deviceType -> deviceType.equals(DeviceTypeEnum.GATEWAY)) | ||
169 | + .orElse(false)); | ||
170 | + additionalInfo.put("description",Optional.ofNullable(deviceDTO.getDeviceInfo()) | ||
171 | + .map(deviceInfo -> deviceInfo.get("description")) | ||
172 | + .map(JsonNode::asText) | ||
173 | + .orElse("")); | ||
174 | + additionalInfo.put("overwriteActivityTime",false); | ||
175 | + | ||
176 | + | ||
177 | + | ||
178 | + DeviceProfileId deviceProfileId = new DeviceProfileId(UUID.fromString(deviceDTO.getDeviceProfile().getTbProfileId())); | ||
179 | + | ||
180 | + | ||
181 | + tbDevice.setAdditionalInfo(additionalInfo); | ||
182 | + tbDevice.setCustomerId(null); | ||
183 | + tbDevice.setDeviceProfileId(deviceProfileId); | ||
184 | + tbDevice.setLabel(deviceDTO.getLabel()); | ||
185 | + tbDevice.setName(deviceDTO.getName()); | ||
186 | + tbDevice.setCreatedTime(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli()); | ||
187 | + tbDevice.setTenantId(tenantId); | ||
188 | + return tbDevice; | ||
89 | } | 189 | } |
90 | } | 190 | } |
1 | package org.thingsboard.server.controller.yunteng; | 1 | package org.thingsboard.server.controller.yunteng; |
2 | 2 | ||
3 | +import io.swagger.annotations.Api; | ||
3 | import lombok.RequiredArgsConstructor; | 4 | import lombok.RequiredArgsConstructor; |
5 | +import org.apache.commons.lang3.StringUtils; | ||
4 | import org.springframework.http.HttpStatus; | 6 | import org.springframework.http.HttpStatus; |
5 | import org.springframework.http.ResponseEntity; | 7 | import org.springframework.http.ResponseEntity; |
6 | import org.springframework.security.access.prepost.PreAuthorize; | 8 | import org.springframework.security.access.prepost.PreAuthorize; |
7 | import org.springframework.validation.annotation.Validated; | 9 | import org.springframework.validation.annotation.Validated; |
8 | import org.springframework.web.bind.annotation.*; | 10 | import org.springframework.web.bind.annotation.*; |
9 | import org.springframework.web.servlet.support.ServletUriComponentsBuilder; | 11 | import org.springframework.web.servlet.support.ServletUriComponentsBuilder; |
12 | +import org.thingsboard.common.util.JacksonUtil; | ||
13 | +import org.thingsboard.server.common.data.DeviceProfile; | ||
14 | +import org.thingsboard.server.common.data.DeviceProfileProvisionType; | ||
15 | +import org.thingsboard.server.common.data.DeviceProfileType; | ||
16 | +import org.thingsboard.server.common.data.DeviceTransportType; | ||
17 | +import org.thingsboard.server.common.data.audit.ActionType; | ||
18 | +import org.thingsboard.server.common.data.device.profile.*; | ||
19 | +import org.thingsboard.server.common.data.edge.EdgeEventActionType; | ||
10 | import org.thingsboard.server.common.data.exception.ThingsboardException; | 20 | import org.thingsboard.server.common.data.exception.ThingsboardException; |
21 | +import org.thingsboard.server.common.data.id.DeviceProfileId; | ||
22 | +import org.thingsboard.server.common.data.id.TenantId; | ||
23 | +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; | ||
11 | import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; | 24 | import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; |
12 | import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; | 25 | import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; |
13 | import org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO; | 26 | import org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO; |
14 | import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum; | 27 | import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum; |
15 | import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; | 28 | import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; |
29 | +import org.thingsboard.server.common.msg.queue.ServiceQueue; | ||
16 | import org.thingsboard.server.controller.BaseController; | 30 | import org.thingsboard.server.controller.BaseController; |
17 | import org.thingsboard.server.dao.yunteng.service.YtDeviceProfileService; | 31 | import org.thingsboard.server.dao.yunteng.service.YtDeviceProfileService; |
32 | +import org.thingsboard.server.service.security.permission.Operation; | ||
18 | 33 | ||
19 | import java.net.URI; | 34 | import java.net.URI; |
20 | -import java.util.HashMap; | ||
21 | -import java.util.List; | ||
22 | -import java.util.Optional; | 35 | +import java.time.LocalDateTime; |
36 | +import java.time.ZoneOffset; | ||
37 | +import java.util.*; | ||
23 | 38 | ||
24 | import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.*; | 39 | import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.*; |
25 | 40 | ||
26 | @RestController | 41 | @RestController |
27 | @RequiredArgsConstructor | 42 | @RequiredArgsConstructor |
28 | @RequestMapping("api/yt/deviceProfile") | 43 | @RequestMapping("api/yt/deviceProfile") |
44 | +@Api(tags = {"设备配置"}) | ||
29 | public class YtDeviceProfileController extends BaseController { | 45 | public class YtDeviceProfileController extends BaseController { |
30 | - private final YtDeviceProfileService deviceProfileService; | 46 | + private final YtDeviceProfileService ytDeviceProfileService; |
31 | 47 | ||
32 | @PostMapping | 48 | @PostMapping |
33 | - @PreAuthorize("hasRole('ROLE_TENANT_ADMIN')") | 49 | + @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") |
34 | public ResponseEntity<DeviceProfileDTO> saveDeviceProfile( | 50 | public ResponseEntity<DeviceProfileDTO> saveDeviceProfile( |
35 | @RequestBody DeviceProfileDTO deviceProfileDTO) throws ThingsboardException { | 51 | @RequestBody DeviceProfileDTO deviceProfileDTO) throws ThingsboardException { |
36 | - DeviceProfileDTO newDeviceProfileDTO = deviceProfileService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceProfileDTO); | 52 | + |
53 | + boolean created = deviceProfileDTO.getId() == null; | ||
54 | + | ||
55 | + /** | ||
56 | + * 业务流程 | ||
57 | + * 1/3.验证业务平台中表单数据的合法性 | ||
58 | + * 2/3.处理TB业务逻辑 | ||
59 | + * 3/3.处理业务平台的业务逻辑 | ||
60 | + */ | ||
61 | + //TODO 1/3.验证业务平台中表单数据的合法性 | ||
62 | + | ||
63 | + //TODO 2/3.处理TB业务逻辑 | ||
64 | + deviceProfileDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | ||
65 | + DeviceProfile tbDeviceProfile = buildTbDeviceProfileFromDeviceProfileDTO(deviceProfileDTO); | ||
66 | + DeviceProfile savedDeviceProfile = updateTbDeviceProfile(tbDeviceProfile,created); | ||
67 | + | ||
68 | + | ||
69 | + //TODO 3/3.处理业务平台的业务逻辑 | ||
70 | + | ||
71 | + DeviceProfileDTO newDeviceProfileDTO = ytDeviceProfileService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceProfileDTO); | ||
37 | return Optional.ofNullable(newDeviceProfileDTO) | 72 | return Optional.ofNullable(newDeviceProfileDTO) |
38 | .map( | 73 | .map( |
39 | dto -> { | 74 | dto -> { |
@@ -47,9 +82,45 @@ public class YtDeviceProfileController extends BaseController { | @@ -47,9 +82,45 @@ public class YtDeviceProfileController extends BaseController { | ||
47 | .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build()); | 82 | .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build()); |
48 | } | 83 | } |
49 | 84 | ||
85 | + /** | ||
86 | + * 更新thingsboard的设备配置信息 | ||
87 | + * @param deviceProfile 设备配置 | ||
88 | + * @param created 新建设备 | ||
89 | + * @throws ThingsboardException | ||
90 | + */ | ||
91 | + private DeviceProfile updateTbDeviceProfile(DeviceProfile deviceProfile,boolean created) throws ThingsboardException { | ||
92 | + boolean isFirmwareChanged = false; | ||
93 | + boolean isSoftwareChanged = false; | ||
94 | + if (!created) { | ||
95 | + DeviceProfile oldDeviceProfile = deviceProfileService.findDeviceProfileById(getTenantId(), deviceProfile.getId()); | ||
96 | + if (!Objects.equals(deviceProfile.getFirmwareId(), oldDeviceProfile.getFirmwareId())) { | ||
97 | + isFirmwareChanged = true; | ||
98 | + } | ||
99 | + if (!Objects.equals(deviceProfile.getSoftwareId(), oldDeviceProfile.getSoftwareId())) { | ||
100 | + isSoftwareChanged = true; | ||
101 | + } | ||
102 | + } | ||
103 | + | ||
104 | + DeviceProfile savedDeviceProfile = checkNotNull(deviceProfileService.saveDeviceProfile(deviceProfile)); | ||
105 | + | ||
106 | + tbClusterService.onDeviceProfileChange(savedDeviceProfile, null); | ||
107 | + tbClusterService.broadcastEntityStateChangeEvent(deviceProfile.getTenantId(), savedDeviceProfile.getId(), | ||
108 | + created ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED); | ||
109 | + | ||
110 | + logEntityAction(savedDeviceProfile.getId(), savedDeviceProfile, | ||
111 | + null, | ||
112 | + created ? ActionType.ADDED : ActionType.UPDATED, null); | ||
113 | + | ||
114 | + otaPackageStateService.update(savedDeviceProfile, isFirmwareChanged, isSoftwareChanged); | ||
115 | + | ||
116 | + sendEntityNotificationMsg(getTenantId(), savedDeviceProfile.getId(), | ||
117 | + deviceProfile.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED); | ||
118 | + return savedDeviceProfile; | ||
119 | + } | ||
120 | + | ||
50 | @GetMapping("{id}") | 121 | @GetMapping("{id}") |
51 | public ResponseEntity<DeviceProfileDTO> getDevice(@PathVariable("id") String id) throws ThingsboardException { | 122 | public ResponseEntity<DeviceProfileDTO> getDevice(@PathVariable("id") String id) throws ThingsboardException { |
52 | - return ResponseEntity.of(deviceProfileService.getDeviceProfile(getCurrentUser().getCurrentTenantId(), id)); | 123 | + return ResponseEntity.of(ytDeviceProfileService.getDeviceProfile(getCurrentUser().getCurrentTenantId(), id)); |
53 | } | 124 | } |
54 | 125 | ||
55 | @GetMapping(params = {PAGE_SIZE, PAGE}) | 126 | @GetMapping(params = {PAGE_SIZE, PAGE}) |
@@ -69,18 +140,72 @@ public class YtDeviceProfileController extends BaseController { | @@ -69,18 +140,72 @@ public class YtDeviceProfileController extends BaseController { | ||
69 | if (orderType != null) { | 140 | if (orderType != null) { |
70 | queryMap.put(ORDER_TYPE, orderType.name()); | 141 | queryMap.put(ORDER_TYPE, orderType.name()); |
71 | } | 142 | } |
72 | - return deviceProfileService.page(getCurrentUser().getCurrentTenantId(), queryMap); | 143 | + return ytDeviceProfileService.page(getCurrentUser().getCurrentTenantId(), queryMap); |
73 | } | 144 | } |
74 | 145 | ||
75 | @DeleteMapping | 146 | @DeleteMapping |
76 | public void deleteDevices(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) throws ThingsboardException { | 147 | public void deleteDevices(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) throws ThingsboardException { |
77 | - deviceProfileService.deleteDeviceProfiles(getCurrentUser().getCurrentTenantId(), deleteDTO.getIds()); | 148 | + for(String id:deleteDTO.getIds()){ |
149 | + deleteTbDeviceProfile(id); | ||
150 | + } | ||
151 | + ytDeviceProfileService.deleteDeviceProfiles(getCurrentUser().getCurrentTenantId(), deleteDTO.getIds()); | ||
152 | + } | ||
153 | + | ||
154 | + private void deleteTbDeviceProfile(String strDeviceProfileId) throws ThingsboardException { | ||
155 | + DeviceProfileId deviceProfileId = new DeviceProfileId(toUUID(strDeviceProfileId)); | ||
156 | + DeviceProfile deviceProfile = checkDeviceProfileId(deviceProfileId, Operation.DELETE); | ||
157 | + deviceProfileService.deleteDeviceProfile(getTenantId(), deviceProfileId); | ||
158 | + | ||
159 | + tbClusterService.onDeviceProfileDelete(deviceProfile, null); | ||
160 | + tbClusterService.broadcastEntityStateChangeEvent(deviceProfile.getTenantId(), deviceProfile.getId(), ComponentLifecycleEvent.DELETED); | ||
161 | + | ||
162 | + logEntityAction(deviceProfileId, deviceProfile, | ||
163 | + null, | ||
164 | + ActionType.DELETED, null, deviceProfileId); | ||
165 | + | ||
166 | + sendEntityNotificationMsg(getTenantId(), deviceProfile.getId(), EdgeEventActionType.DELETED); | ||
78 | } | 167 | } |
79 | 168 | ||
80 | @GetMapping("/me") | 169 | @GetMapping("/me") |
81 | public ResponseEntity<List<DeviceProfileDTO>> findCurrentTenantDeviceProfiles() throws ThingsboardException { | 170 | public ResponseEntity<List<DeviceProfileDTO>> findCurrentTenantDeviceProfiles() throws ThingsboardException { |
82 | - DeviceProfileDTO deviceProfileDTO = new DeviceProfileDTO(); | ||
83 | - deviceProfileDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | ||
84 | - return ResponseEntity.ok(deviceProfileService.findDeviceProfile(getCurrentUser().getCurrentTenantId(), deviceProfileDTO)); | 171 | + |
172 | + return ResponseEntity.ok(ytDeviceProfileService.findDeviceProfile(getCurrentUser().getCurrentTenantId())); | ||
173 | + } | ||
174 | + | ||
175 | + /** | ||
176 | + * 构造调用TBDeviceProfile需要的参数 | ||
177 | + * | ||
178 | + * @param deviceProfileDTO 页面接收的参数 | ||
179 | + * @return 封装好的TBDeviceProfile | ||
180 | + */ | ||
181 | + private DeviceProfile buildTbDeviceProfileFromDeviceProfileDTO(DeviceProfileDTO deviceProfileDTO) { | ||
182 | + DeviceProfile tbDeviceProfile = new DeviceProfile(); | ||
183 | + if (StringUtils.isNotBlank(deviceProfileDTO.getId())) { | ||
184 | + UUID profileId = UUID.fromString(deviceProfileDTO.getId()); | ||
185 | + tbDeviceProfile.setId(new DeviceProfileId(profileId)); | ||
186 | + } | ||
187 | + tbDeviceProfile.setName(deviceProfileDTO.getName()); | ||
188 | + tbDeviceProfile.setType(DeviceProfileType.DEFAULT); | ||
189 | + UUID tenantId = UUID.fromString(deviceProfileDTO.getTenantId()); | ||
190 | + tbDeviceProfile.setTenantId(new TenantId(tenantId)); | ||
191 | + // 传输类型默认都是Default | ||
192 | + tbDeviceProfile.setTransportType(DeviceTransportType.DEFAULT); | ||
193 | + // 获取当前租户的默认规则链 | ||
194 | +// tbDeviceProfile.setDefaultRuleChainId(new RuleChainId(getCurrentUserDefaultRuleChains())); | ||
195 | + tbDeviceProfile.setDefaultQueueName(ServiceQueue.MAIN); | ||
196 | + tbDeviceProfile.setProvisionType(DeviceProfileProvisionType.DISABLED); | ||
197 | + tbDeviceProfile.setCreatedTime(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli()); | ||
198 | + DeviceProfileData deviceProfileData = new DeviceProfileData(); | ||
199 | + deviceProfileData.setConfiguration(new DefaultDeviceProfileConfiguration()); | ||
200 | + deviceProfileData.setProvisionConfiguration(new DisabledDeviceProfileProvisionConfiguration(null)); | ||
201 | + deviceProfileData.setTransportConfiguration(new DefaultDeviceProfileTransportConfiguration()); | ||
202 | + if (null != deviceProfileDTO.getAlarms()) { | ||
203 | + List<DeviceProfileAlarm> list = new ArrayList<>(); | ||
204 | + DeviceProfileAlarm deviceProfileAlarm = JacksonUtil.convertValue(deviceProfileDTO.getAlarms(),DeviceProfileAlarm.class); | ||
205 | + list.add(deviceProfileAlarm); | ||
206 | + deviceProfileData.setAlarms(list); | ||
207 | + } | ||
208 | + tbDeviceProfile.setProfileData(deviceProfileData); | ||
209 | + return tbDeviceProfile; | ||
85 | } | 210 | } |
86 | } | 211 | } |
@@ -43,7 +43,7 @@ public class DeviceProfileInfo extends EntityInfo { | @@ -43,7 +43,7 @@ public class DeviceProfileInfo extends EntityInfo { | ||
43 | 43 | ||
44 | @JsonCreator | 44 | @JsonCreator |
45 | public DeviceProfileInfo(@JsonProperty("id") EntityId id, | 45 | public DeviceProfileInfo(@JsonProperty("id") EntityId id, |
46 | - @JsonProperty("name") String name, | 46 | + @JsonProperty("name") String name , |
47 | @JsonProperty("image") String image, | 47 | @JsonProperty("image") String image, |
48 | @JsonProperty("defaultDashboardId") DashboardId defaultDashboardId, | 48 | @JsonProperty("defaultDashboardId") DashboardId defaultDashboardId, |
49 | @JsonProperty("type") DeviceProfileType type, | 49 | @JsonProperty("type") DeviceProfileType type, |
@@ -25,6 +25,7 @@ public class DeviceProfileDTO extends TenantDTO { | @@ -25,6 +25,7 @@ public class DeviceProfileDTO extends TenantDTO { | ||
25 | @NotEmpty(message = "传输协议不能为空或者二空字符串") | 25 | @NotEmpty(message = "传输协议不能为空或者二空字符串") |
26 | private DeviceTransportType transportType; | 26 | private DeviceTransportType transportType; |
27 | /** TB的设备配置文件 */ | 27 | /** TB的设备配置文件 */ |
28 | + @Deprecated | ||
28 | private String tbProfileId; | 29 | private String tbProfileId; |
29 | 30 | ||
30 | private JsonNode alarms; | 31 | private JsonNode alarms; |
@@ -5,16 +5,17 @@ import com.baomidou.mybatisplus.annotation.TableField; | @@ -5,16 +5,17 @@ import com.baomidou.mybatisplus.annotation.TableField; | ||
5 | import com.baomidou.mybatisplus.annotation.TableName; | 5 | import com.baomidou.mybatisplus.annotation.TableName; |
6 | import lombok.Data; | 6 | import lombok.Data; |
7 | import lombok.EqualsAndHashCode; | 7 | import lombok.EqualsAndHashCode; |
8 | -import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; | ||
9 | import org.thingsboard.server.common.data.yunteng.enums.TransportTypeEnum; | 8 | import org.thingsboard.server.common.data.yunteng.enums.TransportTypeEnum; |
9 | +import org.thingsboard.server.dao.model.ModelConstants; | ||
10 | 10 | ||
11 | @Data | 11 | @Data |
12 | @EqualsAndHashCode(callSuper = true) | 12 | @EqualsAndHashCode(callSuper = true) |
13 | -@TableName(ModelConstants.Table.IOTFS_DEVICE_PROFILE_TABLE_NAME) | 13 | +@TableName(ModelConstants.DEVICE_PROFILE_COLUMN_FAMILY_NAME) |
14 | public class YtDeviceProfile extends TenantBaseEntity { | 14 | public class YtDeviceProfile extends TenantBaseEntity { |
15 | private String name; | 15 | private String name; |
16 | private String description; | 16 | private String description; |
17 | /** 转换脚本:TCP才会使用 */ | 17 | /** 转换脚本:TCP才会使用 */ |
18 | + @Deprecated | ||
18 | private String convertJs; | 19 | private String convertJs; |
19 | 20 | ||
20 | private TransportTypeEnum transportType; | 21 | private TransportTypeEnum transportType; |
dao/src/main/java/org/thingsboard/server/dao/yunteng/impl/YtAlarmProfileServiceImpl.java
deleted
100644 → 0
1 | -package org.thingsboard.server.dao.yunteng.impl; | ||
2 | - | ||
3 | -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||
4 | -import lombok.RequiredArgsConstructor; | ||
5 | -import lombok.extern.slf4j.Slf4j; | ||
6 | -import org.apache.commons.lang3.StringUtils; | ||
7 | -import org.springframework.stereotype.Service; | ||
8 | -import org.springframework.transaction.annotation.Transactional; | ||
9 | -import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException; | ||
10 | -import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | ||
11 | -import org.thingsboard.server.common.data.yunteng.dto.AlarmProfileDTO; | ||
12 | -import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; | ||
13 | -import org.thingsboard.server.dao.yunteng.entities.AlarmProfile; | ||
14 | -import org.thingsboard.server.dao.yunteng.mapper.AlarmProfileMapper; | ||
15 | -import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; | ||
16 | -import org.thingsboard.server.dao.yunteng.service.YtAlarmProfileService; | ||
17 | - | ||
18 | -import java.util.List; | ||
19 | -import java.util.Optional; | ||
20 | -import java.util.Set; | ||
21 | - | ||
22 | -@Service | ||
23 | -@RequiredArgsConstructor | ||
24 | -@Slf4j | ||
25 | -public class YtAlarmProfileServiceImpl extends AbstractBaseService<AlarmProfileMapper, AlarmProfile> | ||
26 | - implements YtAlarmProfileService { | ||
27 | - | ||
28 | - @Override | ||
29 | - @Transactional | ||
30 | - public AlarmProfileDTO saveOrUpdateAlarmProfile(String tenantId,AlarmProfileDTO alarmProfileDTO) { | ||
31 | - AlarmProfile alarmProfile = new AlarmProfile(); | ||
32 | - alarmProfileDTO.copyToEntity(alarmProfile); | ||
33 | - if (StringUtils.isEmpty(alarmProfileDTO.getId())) { | ||
34 | - alarmProfile.setTenantId(tenantId); | ||
35 | - baseMapper.insert(alarmProfile); | ||
36 | - } else { | ||
37 | - baseMapper.updateById(alarmProfile); | ||
38 | - } | ||
39 | - alarmProfile.copyToDTO(alarmProfileDTO); | ||
40 | - return alarmProfileDTO; | ||
41 | - } | ||
42 | - | ||
43 | - @Override | ||
44 | - @Transactional | ||
45 | - public boolean deleteAlarmProfile(Set<String> ids) { | ||
46 | - return baseMapper.deleteBatchIds(ids) > 0; | ||
47 | - } | ||
48 | - | ||
49 | - @Override | ||
50 | - public AlarmProfileDTO findAlarmProfileByDeviceProfileId(String tenantId,String deviceProfileId) { | ||
51 | - if (StringUtils.isEmpty(deviceProfileId)) { | ||
52 | - throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
53 | - } | ||
54 | - List<AlarmProfile> alarmProfileList = | ||
55 | - baseMapper.selectList( | ||
56 | - new QueryWrapper<AlarmProfile>() | ||
57 | - .lambda() | ||
58 | - .eq(AlarmProfile::getDeviceProfileId, deviceProfileId) | ||
59 | - .eq(AlarmProfile::getTenantId, tenantId)); | ||
60 | - return Optional.ofNullable(alarmProfileList) | ||
61 | - .filter(alarmProfiles -> alarmProfiles.size() > 0) | ||
62 | - .map( | ||
63 | - alarmProfiles -> | ||
64 | - ReflectUtils.sourceToTarget(alarmProfileList, AlarmProfileDTO.class).get(0)) | ||
65 | - .orElse(null); | ||
66 | - } | ||
67 | -} |
@@ -28,7 +28,7 @@ public class YtCommonServiceImpl implements YtCommonService { | @@ -28,7 +28,7 @@ public class YtCommonServiceImpl implements YtCommonService { | ||
28 | DeviceDTO deviceDTO = new DeviceDTO(); | 28 | DeviceDTO deviceDTO = new DeviceDTO(); |
29 | deviceDTO.setDeviceToken(deviceToken); | 29 | deviceDTO.setDeviceToken(deviceToken); |
30 | //检查数据库是否已存在对应的DeviceToken | 30 | //检查数据库是否已存在对应的DeviceToken |
31 | - if(deviceService.findDeviceInfo(tenantId,deviceDTO).size()>0){ | 31 | + if(deviceService.findTbDeviceId(tenantId,deviceDTO).size()>0){ |
32 | generateDeviceToken(tenantId); | 32 | generateDeviceToken(tenantId); |
33 | } | 33 | } |
34 | return deviceToken; | 34 | return deviceToken; |
1 | package org.thingsboard.server.dao.yunteng.impl; | 1 | package org.thingsboard.server.dao.yunteng.impl; |
2 | 2 | ||
3 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 4 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
4 | import com.baomidou.mybatisplus.core.metadata.IPage; | 5 | import com.baomidou.mybatisplus.core.metadata.IPage; |
5 | import lombok.RequiredArgsConstructor; | 6 | import lombok.RequiredArgsConstructor; |
6 | import lombok.extern.slf4j.Slf4j; | 7 | import lombok.extern.slf4j.Slf4j; |
7 | import org.apache.commons.lang3.StringUtils; | 8 | import org.apache.commons.lang3.StringUtils; |
9 | +import org.jetbrains.annotations.NotNull; | ||
10 | +import org.springframework.beans.BeanUtils; | ||
8 | import org.springframework.stereotype.Service; | 11 | import org.springframework.stereotype.Service; |
9 | import org.springframework.transaction.annotation.Transactional; | 12 | import org.springframework.transaction.annotation.Transactional; |
13 | +import org.thingsboard.server.common.data.DeviceProfile; | ||
14 | +import org.thingsboard.server.common.data.id.TenantId; | ||
15 | +import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; | ||
10 | import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils; | 16 | import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils; |
11 | import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException; | 17 | import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException; |
12 | import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | 18 | import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; |
@@ -15,12 +21,14 @@ import org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO; | @@ -15,12 +21,14 @@ import org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO; | ||
15 | import org.thingsboard.server.common.data.yunteng.enums.TransportTypeEnum; | 21 | import org.thingsboard.server.common.data.yunteng.enums.TransportTypeEnum; |
16 | import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; | 22 | import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; |
17 | import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; | 23 | import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; |
24 | +import org.thingsboard.server.dao.device.DeviceProfileDao; | ||
25 | +import org.thingsboard.server.dao.yunteng.entities.AlarmProfile; | ||
18 | import org.thingsboard.server.dao.yunteng.entities.YtDevice; | 26 | import org.thingsboard.server.dao.yunteng.entities.YtDevice; |
19 | import org.thingsboard.server.dao.yunteng.entities.YtDeviceProfile; | 27 | import org.thingsboard.server.dao.yunteng.entities.YtDeviceProfile; |
28 | +import org.thingsboard.server.dao.yunteng.mapper.AlarmProfileMapper; | ||
20 | import org.thingsboard.server.dao.yunteng.mapper.DeviceMapper; | 29 | import org.thingsboard.server.dao.yunteng.mapper.DeviceMapper; |
21 | import org.thingsboard.server.dao.yunteng.mapper.DeviceProfileMapper; | 30 | import org.thingsboard.server.dao.yunteng.mapper.DeviceProfileMapper; |
22 | import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; | 31 | import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; |
23 | -import org.thingsboard.server.dao.yunteng.service.YtAlarmProfileService; | ||
24 | import org.thingsboard.server.dao.yunteng.service.YtDeviceProfileService; | 32 | import org.thingsboard.server.dao.yunteng.service.YtDeviceProfileService; |
25 | 33 | ||
26 | import java.util.*; | 34 | import java.util.*; |
@@ -29,13 +37,15 @@ import java.util.*; | @@ -29,13 +37,15 @@ import java.util.*; | ||
29 | @RequiredArgsConstructor | 37 | @RequiredArgsConstructor |
30 | @Slf4j | 38 | @Slf4j |
31 | public class YtDeviceProfileServiceImpl | 39 | public class YtDeviceProfileServiceImpl |
32 | - extends AbstractBaseService<DeviceProfileMapper, org.thingsboard.server.dao.yunteng.entities.YtDeviceProfile> | ||
33 | - implements YtDeviceProfileService { | 40 | + extends AbstractBaseService<DeviceProfileMapper, YtDeviceProfile> |
41 | + implements YtDeviceProfileService { | ||
34 | 42 | ||
35 | private final DeviceMapper deviceMapper; | 43 | private final DeviceMapper deviceMapper; |
36 | - private final YtAlarmProfileService alarmProfileService; | 44 | + private final AlarmProfileMapper alarmProfileMapper; |
37 | private final CacheUtils cacheUtils; | 45 | private final CacheUtils cacheUtils; |
38 | 46 | ||
47 | + private final DeviceProfileDao deviceProfileDao; | ||
48 | + | ||
39 | @Override | 49 | @Override |
40 | @Transactional | 50 | @Transactional |
41 | public DeviceProfileDTO insertOrUpdate(String tenantId,DeviceProfileDTO deviceProfileDTO) { | 51 | public DeviceProfileDTO insertOrUpdate(String tenantId,DeviceProfileDTO deviceProfileDTO) { |
@@ -47,40 +57,80 @@ public class YtDeviceProfileServiceImpl | @@ -47,40 +57,80 @@ public class YtDeviceProfileServiceImpl | ||
47 | } | 57 | } |
48 | 58 | ||
49 | private DeviceProfileDTO update(String tenantId,DeviceProfileDTO deviceProfileDTO) { | 59 | private DeviceProfileDTO update(String tenantId,DeviceProfileDTO deviceProfileDTO) { |
50 | - YtDeviceProfile deviceProfile = baseMapper.selectById(deviceProfileDTO.getId()); | ||
51 | - if (!deviceProfile.getTenantId().equals(tenantId)) { | ||
52 | - return null; | ||
53 | - } | ||
54 | - deviceProfileDTO.copyToEntity(deviceProfile); | 60 | + |
55 | // 如果原来不是TCP或者更新也不是TCP 那就需要check | 61 | // 如果原来不是TCP或者更新也不是TCP 那就需要check |
56 | - if (!deviceProfile.getTransportType().equals(TransportTypeEnum.TCP) | ||
57 | - || !deviceProfileDTO.getTransportType().equals(TransportTypeEnum.TCP)) { | ||
58 | - checkDeviceProfile(deviceProfileDTO, deviceProfile); | 62 | +// if (!deviceProfile.getTransportType().equals(TransportTypeEnum.TCP) |
63 | +// || !deviceProfileDTO.getTransportType().equals(TransportTypeEnum.TCP)) { | ||
64 | +// checkDeviceProfile(deviceProfileDTO, deviceProfile); | ||
65 | +// } | ||
66 | + LambdaQueryWrapper<AlarmProfile> filter = new QueryWrapper<AlarmProfile>().lambda() | ||
67 | + .eq(AlarmProfile::getTenantId,deviceProfileDTO.getTenantId()) | ||
68 | + .eq(AlarmProfile::getDeviceProfileId,deviceProfileDTO.getId()); | ||
69 | + List<AlarmProfile> oldAlarms = alarmProfileMapper.selectList(filter); | ||
70 | + List<String> oldIds = new ArrayList<>(); | ||
71 | + for(AlarmProfile item: oldAlarms){ | ||
72 | + oldIds.add(item.getId()); | ||
59 | } | 73 | } |
60 | - baseMapper.updateById(deviceProfile); | 74 | + |
75 | + | ||
76 | + | ||
61 | Optional.ofNullable(deviceProfileDTO.getAlarmProfile()) | 77 | Optional.ofNullable(deviceProfileDTO.getAlarmProfile()) |
62 | - .filter(alarmProfileDTO -> StringUtils.isNotBlank(alarmProfileDTO.getId())) | ||
63 | - .map(alarmProfileDTO -> alarmProfileService.saveOrUpdateAlarmProfile(tenantId,alarmProfileDTO)); | ||
64 | - return deviceProfile.getDTO(DeviceProfileDTO.class); | 78 | +// .filter(alarmProfileDTO -> StringUtils.isNotBlank(alarmProfileDTO.getId())) |
79 | + .ifPresent(alarmProfileDTO -> { | ||
80 | + AlarmProfile alarmProfile = buildAlarmDto2Entity(deviceProfileDTO.getId(), deviceProfileDTO.getTenantId(), alarmProfileDTO); | ||
81 | + String alarmId = alarmProfileDTO.getId(); | ||
82 | + if(StringUtils.isNotBlank(alarmId)){ | ||
83 | + alarmProfileMapper.updateById(alarmProfile); | ||
84 | + oldIds.remove(alarmId); | ||
85 | + }{ | ||
86 | + alarmProfileMapper.insert(alarmProfile); | ||
87 | + } | ||
88 | + }); | ||
89 | + Optional.ofNullable(oldIds).ifPresent(item->alarmProfileMapper.deleteBatchIds(item)); | ||
90 | + return deviceProfileDTO; | ||
65 | } | 91 | } |
66 | 92 | ||
67 | - private DeviceProfileDTO insert(String tenantId,DeviceProfileDTO deviceProfileDTO) { | ||
68 | - YtDeviceProfile deviceProfile = new YtDeviceProfile(); | ||
69 | - // 判断数据库是否已存在名字相同的设备配置 | ||
70 | - if (findDeviceProfile(tenantId,deviceProfileDTO).size() > 0) { | ||
71 | - throw new YtDataValidationException(ErrorMessage.NAME_ALREADY_EXISTS.getMessage()); | ||
72 | - } | ||
73 | - deviceProfileDTO.copyToEntity(deviceProfile); | ||
74 | - deviceProfile.setTenantId(tenantId); | ||
75 | - saveOrUpdateTBDeviceProfile(deviceProfileDTO, deviceProfile); | ||
76 | - baseMapper.insert(deviceProfile); | 93 | + private DeviceProfileDTO insert(String deviceProfileId,DeviceProfileDTO deviceProfileDTO) { |
77 | Optional.ofNullable(deviceProfileDTO.getAlarmProfile()) | 94 | Optional.ofNullable(deviceProfileDTO.getAlarmProfile()) |
78 | .map( | 95 | .map( |
79 | alarmProfileDTO -> { | 96 | alarmProfileDTO -> { |
80 | - alarmProfileDTO.setDeviceProfileId(deviceProfile.getId()); | ||
81 | - return alarmProfileService.saveOrUpdateAlarmProfile(tenantId,alarmProfileDTO); | 97 | + AlarmProfile alarmProfile = buildAlarmDto2Entity(deviceProfileId, deviceProfileDTO.getTenantId(), alarmProfileDTO); |
98 | + alarmProfileMapper.insert(alarmProfile); | ||
99 | + alarmProfile.copyToDTO(alarmProfileDTO); | ||
100 | + return alarmProfileDTO; | ||
82 | }); | 101 | }); |
83 | - return deviceProfile.getDTO(DeviceProfileDTO.class); | 102 | + return deviceProfileDTO; |
103 | + } | ||
104 | + | ||
105 | + @NotNull | ||
106 | + private AlarmProfile buildAlarmDto2Entity(String deviceProfileId, String tenantId, AlarmProfileDTO alarmProfileDTO) { | ||
107 | + alarmProfileDTO.setDeviceProfileId(deviceProfileId); | ||
108 | + alarmProfileDTO.setTenantId(tenantId); | ||
109 | + AlarmProfile alarmProfile = new AlarmProfile(); | ||
110 | + alarmProfileDTO.copyToEntity(alarmProfile, ModelConstants.TablePropertyMapping.UPDATE_TIME, | ||
111 | + ModelConstants.TablePropertyMapping.UPDATER); | ||
112 | + return alarmProfile; | ||
113 | + } | ||
114 | + | ||
115 | + @Override | ||
116 | + public boolean validateFormdata(DeviceProfileDTO ytDeviceProfileDTO) { | ||
117 | + TenantId tenantId = new TenantId(UUID.fromString(ytDeviceProfileDTO.getTenantId())); | ||
118 | + if(StringUtils.isBlank(ytDeviceProfileDTO.getId())){ | ||
119 | + // 判断数据库是否已存在名字相同的设备配置 | ||
120 | + | ||
121 | + DeviceProfile profile = deviceProfileDao.findByName(tenantId, ytDeviceProfileDTO.getName()); | ||
122 | + if (profile != null) { | ||
123 | + throw new YtDataValidationException(ErrorMessage.NAME_ALREADY_EXISTS.getMessage()); | ||
124 | + } | ||
125 | + }else{ | ||
126 | + UUID profileId = UUID.fromString(ytDeviceProfileDTO.getId()); | ||
127 | + DeviceProfile profile = deviceProfileDao.findById(tenantId, profileId); | ||
128 | + if (profile == null) { | ||
129 | + throw new YtDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); | ||
130 | + } | ||
131 | + } | ||
132 | + | ||
133 | + return false; | ||
84 | } | 134 | } |
85 | 135 | ||
86 | @Override | 136 | @Override |
@@ -93,43 +143,29 @@ public class YtDeviceProfileServiceImpl | @@ -93,43 +143,29 @@ public class YtDeviceProfileServiceImpl | ||
93 | throw new YtDataValidationException("有设备使用待删除配置,请先删除设备或者修改设备配置"); | 143 | throw new YtDataValidationException("有设备使用待删除配置,请先删除设备或者修改设备配置"); |
94 | } | 144 | } |
95 | // TODO check if ids bind to iotfs_key_value_mapping | 145 | // TODO check if ids bind to iotfs_key_value_mapping |
96 | - // 删除本地时,先删除TB的DeviceProfile | ||
97 | - for (String id : ids) { | ||
98 | - YtDeviceProfile deviceProfile = baseMapper.selectById(id); | ||
99 | -// if (!tbConnectService.deleteDeviceProfile(deviceProfile.getTbProfileId()).get()) { | ||
100 | -// log.error("delete TBProfile error {}", deviceProfile.getTbProfileId()); | ||
101 | -// throw new FastIotException(ErrorMessage.INVALID_PARAMETER); | ||
102 | -// } | ||
103 | - // 删除设备配置同时需要删除对应的告警配置 | ||
104 | - AlarmProfileDTO alarmProfileDTO = alarmProfileService.findAlarmProfileByDeviceProfileId(tenantId,id); | ||
105 | - Optional.ofNullable(alarmProfileDTO) | ||
106 | - .filter(alarm -> StringUtils.isNotBlank(alarm.getId())) | ||
107 | - .map( | ||
108 | - alarm -> { | ||
109 | - Set<String> alarmList = new HashSet<>(); | ||
110 | - alarmList.add(alarm.getId()); | ||
111 | - return alarmProfileService.deleteAlarmProfile(alarmList); | ||
112 | - }); | 146 | + List<UUID> deletedIds = new ArrayList<>(); |
147 | + for(String id:ids){ | ||
148 | + deletedIds.add(UUID.fromString(id)); | ||
149 | + LambdaQueryWrapper filter = new QueryWrapper<AlarmProfile>() | ||
150 | + .lambda() | ||
151 | + .eq(AlarmProfile::getTenantId, tenantId) | ||
152 | + .in(AlarmProfile::getDeviceProfileId, id); | ||
153 | + alarmProfileMapper.delete(filter); | ||
113 | } | 154 | } |
114 | - baseMapper.delete( | ||
115 | - new QueryWrapper<YtDeviceProfile>() | ||
116 | - .lambda() | ||
117 | - .eq(YtDeviceProfile::getTenantId, tenantId) | ||
118 | - .in(YtDeviceProfile::getId, ids)); | 155 | + deviceProfileDao.removeAllByIds(deletedIds); |
156 | + | ||
119 | } | 157 | } |
120 | 158 | ||
121 | @Override | 159 | @Override |
122 | public Optional<DeviceProfileDTO> getDeviceProfile(String tenantId,String id) { | 160 | public Optional<DeviceProfileDTO> getDeviceProfile(String tenantId,String id) { |
123 | - return Optional.ofNullable( | ||
124 | - baseMapper.selectOne( | ||
125 | - new QueryWrapper<YtDeviceProfile>() | ||
126 | - .lambda() | ||
127 | - .eq( | ||
128 | - YtDeviceProfile::getTenantId, | ||
129 | - tenantId) | ||
130 | - .eq(YtDeviceProfile::getId, id))) | ||
131 | - .map(deviceProfile -> deviceProfile.getDTO(DeviceProfileDTO.class)); | ||
132 | - } | 161 | + TenantId tenant = new TenantId(UUID.fromString(tenantId)); |
162 | + DeviceProfile profile = deviceProfileDao.findById(tenant,UUID.fromString(id)); | ||
163 | + return Optional.ofNullable(profile).map(entity ->{ | ||
164 | + DeviceProfileDTO result = new DeviceProfileDTO(); | ||
165 | + BeanUtils.copyProperties(entity,result); | ||
166 | + return result; | ||
167 | + }); | ||
168 | + } | ||
133 | 169 | ||
134 | @Override | 170 | @Override |
135 | public PageData<DeviceProfileDTO> page(String tenantId,Map<String, Object> queryMap) { | 171 | public PageData<DeviceProfileDTO> page(String tenantId,Map<String, Object> queryMap) { |
@@ -156,139 +192,20 @@ public class YtDeviceProfileServiceImpl | @@ -156,139 +192,20 @@ public class YtDeviceProfileServiceImpl | ||
156 | return getPageData(deviceIPage, DeviceProfileDTO.class); | 192 | return getPageData(deviceIPage, DeviceProfileDTO.class); |
157 | } | 193 | } |
158 | 194 | ||
159 | - @Override | ||
160 | - public List<DeviceProfileDTO> findDeviceProfile(String tenantId,DeviceProfileDTO deviceProfileDTO) { | ||
161 | - List<YtDeviceProfile> deviceProfileList = | ||
162 | - baseMapper.selectList( | ||
163 | - new QueryWrapper<YtDeviceProfile>() | ||
164 | - .lambda() | ||
165 | - .eq(YtDeviceProfile::getTenantId, tenantId) | ||
166 | - .like( | ||
167 | - StringUtils.isNotBlank(deviceProfileDTO.getName()), | ||
168 | - YtDeviceProfile::getName, | ||
169 | - deviceProfileDTO.getName())); | ||
170 | - return ReflectUtils.sourceToTarget(deviceProfileList, DeviceProfileDTO.class); | ||
171 | - } | ||
172 | 195 | ||
173 | - /** | ||
174 | - * 构造调用TBDeviceProfile需要的参数 | ||
175 | - * | ||
176 | - * @param deviceProfileDTO 页面接收的参数 | ||
177 | - * @return 封装好的TBDeviceProfile | ||
178 | 196 | ||
179 | - private TBDeviceProfile buildTbDeviceProfileFromDeviceProfileDTO( | ||
180 | - DeviceProfileDTO deviceProfileDTO) { | ||
181 | - TBDeviceProfile tbDeviceProfile = new TBDeviceProfile(); | ||
182 | - if (StringUtils.isNotBlank(deviceProfileDTO.getId())) { | ||
183 | - List<DeviceProfileDTO> deviceProfile = baseMapper.getDeviceProfileInfo(deviceProfileDTO); | ||
184 | - tbDeviceProfile.setId( | ||
185 | - new Id(EntityType.DEVICE_PROFILE, deviceProfile.get(0).getTbProfileId())); | ||
186 | - } | ||
187 | - tbDeviceProfile.setName(deviceProfileDTO.getName()); | ||
188 | - // 传输类型默认都是Default | ||
189 | - tbDeviceProfile.setTransportType(TransportTypeEnum.DEFAULT.name()); | ||
190 | - // 获取当前租户的默认规则链 | ||
191 | - tbDeviceProfile.setDefaultRuleChainId( | ||
192 | - new Id(EntityType.RULE_CHAIN, getCurrentUserDefaultRuleChains())); | ||
193 | - tbDeviceProfile.setDefaultQueueName(TbConnectConstant.RuleEngine.MAIN); | ||
194 | - tbDeviceProfile.setProvisionType(ProvisionTypeEnum.DISABLED.name()); | ||
195 | - tbDeviceProfile.setCreatedTime( | ||
196 | - LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli()); | ||
197 | - TBDeviceProfile.DeviceProfileData deviceProfileData = new TBDeviceProfile.DeviceProfileData(); | ||
198 | - deviceProfileData.setConfiguration(new TBDeviceProfile.DeviceProfileConfiguration()); | ||
199 | - deviceProfileData.setProvisionConfiguration( | ||
200 | - new TBDeviceProfile.DeviceProfileProvisionConfiguration()); | ||
201 | - deviceProfileData.setTransportConfiguration( | ||
202 | - new TBDeviceProfile.DeviceProfileTransportConfiguration()); | ||
203 | - if (null != deviceProfileDTO.getAlarms()) { | ||
204 | - List<TBDeviceProfile.DeviceProfileAlarm> list = new ArrayList<>(); | ||
205 | - TBDeviceProfile.DeviceProfileAlarm deviceProfileAlarm = JacksonUtil.convertValue(deviceProfileDTO.getAlarms(),TBDeviceProfile.DeviceProfileAlarm.class); | ||
206 | - list.add(deviceProfileAlarm); | ||
207 | - deviceProfileData.setAlarms(list); | ||
208 | - } | ||
209 | - tbDeviceProfile.setProfileData(deviceProfileData); | ||
210 | - return tbDeviceProfile; | ||
211 | - } */ | ||
212 | 197 | ||
213 | - /** | ||
214 | - * 检查设备配置然后进行相应的操作 | ||
215 | - * | ||
216 | - * @param target 用户新选择的配置 | ||
217 | - * @param source 用户以前选择的配置 | ||
218 | - */ | ||
219 | - private void checkDeviceProfile(DeviceProfileDTO target, YtDeviceProfile source) { | ||
220 | - // 原来是TCP => Default、MQTT或其他 需要新增TB设备配置文件 | ||
221 | - if (source.getTransportType().equals(TransportTypeEnum.TCP) | ||
222 | - && !target.getTransportType().equals(TransportTypeEnum.TCP)) { | ||
223 | - saveOrUpdateTBDeviceProfile(target, source); | ||
224 | - } | ||
225 | - if (!source.getTransportType().equals(TransportTypeEnum.TCP)) { | ||
226 | - // 原来不是TCP => 更新值或者更换TB设备配置文件 | ||
227 | - if (!target.getTransportType().equals(TransportTypeEnum.TCP)) { | ||
228 | - // 目标不是TCP则进行修改名称 | ||
229 | - saveOrUpdateTBDeviceProfile(target, source); | ||
230 | - } else { | ||
231 | - // 目标是TCP则删除原来的TBDeviceProfile | ||
232 | -// tbConnectService.deleteDeviceProfile(source.getTbProfileId()); | ||
233 | - source.setTbProfileId(null); | ||
234 | - } | ||
235 | - } | ||
236 | - } | ||
237 | 198 | ||
238 | - /** | ||
239 | - * 调用TB保存设备配置 | ||
240 | - * | ||
241 | - * @param target 用户新选择的配置 | ||
242 | - * @param source 用户以前选择的配置 | ||
243 | - */ | ||
244 | - private void saveOrUpdateTBDeviceProfile(DeviceProfileDTO target, YtDeviceProfile source) { | ||
245 | -// if (tbConfig.isEnabled()) { | ||
246 | -// try { | ||
247 | -// TBDeviceProfile tbDeviceProfile = buildTbDeviceProfileFromDeviceProfileDTO(target); | ||
248 | -// tbDeviceProfile = tbConnectService.saveOrUpdateDeviceProfile(tbDeviceProfile).get(); | ||
249 | -// if (null == tbDeviceProfile) { | ||
250 | -// throw new FastIotException(ErrorMessage.INVALID_PARAMETER); | ||
251 | -// } | ||
252 | -// source.setTbProfileId(tbDeviceProfile.getId().getId()); | ||
253 | -// } catch (ExecutionException | InterruptedException e) { | ||
254 | -// log.error("create TBDeviceProfile error {}", e.getMessage()); | ||
255 | -// throw new FastIotException(ErrorMessage.CONNECT_TO_TB_ERROR); | ||
256 | -// } | ||
257 | -// } | ||
258 | - } | ||
259 | 199 | ||
260 | - private String getCurrentUserDefaultRuleChains() { | ||
261 | - String defaultId; | ||
262 | -// Optional<String> result = | ||
263 | -// cacheUtils | ||
264 | -// .get( | ||
265 | -// FastIotConstants.CacheConfigKey.DEFAULT_RULE_CHAIN, | ||
266 | -// SecurityContext.getCurrentUser().getTenantId()); | ||
267 | -// if (null != result && result.isPresent()) { | ||
268 | -// return result.get(); | ||
269 | -// } | ||
270 | -// try { | ||
271 | -// if (tbConfig.isEnabled()) { | ||
272 | -// TBPageData tbPageData = tbConnectService.getRuleChains(10, 0).get(); | ||
273 | -// if (null == tbPageData || null == tbPageData.getData()) { | ||
274 | -// throw new FastIotException(ErrorMessage.NONE_DEFAULT_RULE_CHAIN); | ||
275 | -// } | ||
276 | -// TBPageData convert = new TBPageData().getPageData(tbPageData,TBRuleChain.class); | ||
277 | -// List<TBRuleChain> data = (List<TBRuleChain>) convert.getData(); | ||
278 | -// for (TBRuleChain tbRuleChain : data) { | ||
279 | -// if (tbRuleChain.isRoot()) { | ||
280 | -// defaultId = tbRuleChain.getId().getId(); | ||
281 | -// cacheUtils.put( | ||
282 | -// FastIotConstants.CacheConfigKey.DEFAULT_RULE_CHAIN, | ||
283 | -// SecurityContext.getCurrentUser().getTenantId(), | ||
284 | -// defaultId); | ||
285 | -// return defaultId; | ||
286 | -// } | ||
287 | -// } | ||
288 | -// } | ||
289 | -// } catch (ExecutionException | InterruptedException e) { | ||
290 | -// throw new FastIotException(ErrorMessage.CONNECT_TO_TB_ERROR); | ||
291 | -// } | ||
292 | - return null; | 200 | + |
201 | + | ||
202 | + | ||
203 | + | ||
204 | + | ||
205 | + @Override | ||
206 | + public List<DeviceProfileDTO> findDeviceProfile(String tenantId) { | ||
207 | + UUID profileId = UUID.fromString(tenantId); | ||
208 | + List<DeviceProfile> profile =deviceProfileDao.find(new TenantId(profileId)); | ||
209 | + return ReflectUtils.sourceToTarget(profile,DeviceProfileDTO.class); | ||
293 | } | 210 | } |
294 | } | 211 | } |
@@ -9,6 +9,8 @@ import lombok.extern.slf4j.Slf4j; | @@ -9,6 +9,8 @@ import lombok.extern.slf4j.Slf4j; | ||
9 | import org.apache.commons.lang3.StringUtils; | 9 | import org.apache.commons.lang3.StringUtils; |
10 | import org.springframework.stereotype.Service; | 10 | import org.springframework.stereotype.Service; |
11 | import org.springframework.transaction.annotation.Transactional; | 11 | import org.springframework.transaction.annotation.Transactional; |
12 | +import org.thingsboard.server.common.data.id.TenantId; | ||
13 | +import org.thingsboard.server.common.data.security.DeviceCredentials; | ||
12 | import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; | 14 | import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; |
13 | import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; | 15 | import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; |
14 | import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException; | 16 | import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException; |
@@ -19,6 +21,8 @@ import org.thingsboard.server.common.data.yunteng.enums.DeviceState; | @@ -19,6 +21,8 @@ import org.thingsboard.server.common.data.yunteng.enums.DeviceState; | ||
19 | import org.thingsboard.server.common.data.yunteng.enums.DeviceTypeEnum; | 21 | import org.thingsboard.server.common.data.yunteng.enums.DeviceTypeEnum; |
20 | import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; | 22 | import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; |
21 | import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; | 23 | import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; |
24 | +import org.thingsboard.server.dao.device.DeviceCredentialsDao; | ||
25 | +import org.thingsboard.server.dao.device.DeviceProfileDao; | ||
22 | import org.thingsboard.server.dao.yunteng.entities.Organization; | 26 | import org.thingsboard.server.dao.yunteng.entities.Organization; |
23 | import org.thingsboard.server.dao.yunteng.entities.YtDevice; | 27 | import org.thingsboard.server.dao.yunteng.entities.YtDevice; |
24 | import org.thingsboard.server.dao.yunteng.entities.YtDeviceProfile; | 28 | import org.thingsboard.server.dao.yunteng.entities.YtDeviceProfile; |
@@ -40,77 +44,29 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | @@ -40,77 +44,29 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | ||
40 | // private final TBConfig tbConfig; | 44 | // private final TBConfig tbConfig; |
41 | // private final TBConnectService tbConnectService; | 45 | // private final TBConnectService tbConnectService; |
42 | // private final TbDBService tbDBService; | 46 | // private final TbDBService tbDBService; |
43 | - private final DeviceProfileMapper deviceProfileMapper; | ||
44 | - private final OrganizationMapper organizationMapper; | 47 | + private final DeviceProfileDao deviceProfileDao; |
48 | + private final DeviceCredentialsDao deviceCredentialsDao; | ||
45 | 49 | ||
50 | + | ||
51 | + private final OrganizationMapper ytOrganizationMapper; | ||
52 | + private final DeviceProfileMapper ytDeviceProfileMapper; | ||
46 | @Override | 53 | @Override |
47 | // @Transactional | 54 | // @Transactional |
48 | // 事务会导致 tbDBService 多数据源失效 | 55 | // 事务会导致 tbDBService 多数据源失效 |
49 | public DeviceDTO insertOrUpdate(String tenantId,DeviceDTO deviceDTO) { | 56 | public DeviceDTO insertOrUpdate(String tenantId,DeviceDTO deviceDTO) { |
57 | + | ||
50 | if (StringUtils.isBlank(deviceDTO.getId())) { | 58 | if (StringUtils.isBlank(deviceDTO.getId())) { |
51 | - return insert(tenantId,deviceDTO); | 59 | + return insert(deviceDTO); |
52 | } else { | 60 | } else { |
53 | return update(tenantId,deviceDTO); | 61 | return update(tenantId,deviceDTO); |
54 | } | 62 | } |
55 | } | 63 | } |
56 | 64 | ||
57 | private DeviceDTO update(String tenantId,DeviceDTO deviceDTO) { | 65 | private DeviceDTO update(String tenantId,DeviceDTO deviceDTO) { |
58 | - YtDevice device = baseMapper.selectById(deviceDTO.getId()); | ||
59 | - if (!device.getTenantId().equals(tenantId)) { | ||
60 | - return null; | ||
61 | - } | ||
62 | - validateDeviceDTO(tenantId,deviceDTO, false); | ||
63 | - List<YtDevice> devices = | ||
64 | - baseMapper.selectList( | ||
65 | - new QueryWrapper<YtDevice>() | ||
66 | - .lambda() | ||
67 | -// .eq(YtDevice::getDeviceToken, deviceDTO.getDeviceToken()) | ||
68 | - ); | ||
69 | - if (!devices.isEmpty()) { | ||
70 | - // 如果device token已经存在,那么必定只有一个,不会有多个 | ||
71 | - YtDevice deviceExistWithSameToken = devices.get(0); | ||
72 | - if (!deviceExistWithSameToken.getId().equals(deviceDTO.getId())) { | ||
73 | - throw new YtDataValidationException("设备Device Token已经存在!"); | ||
74 | - } | ||
75 | - } | ||
76 | - // 首先update tb, 需要更新的字段有 | ||
77 | - // name, tbDeviceProfileId, label, isGateway, deviceToken | ||
78 | - /*if (tbConfig.isEnabled()) { | ||
79 | - validateUpdate(deviceDTO); | ||
80 | - deviceDTO.setTbDeviceId(device.getTbDeviceId()); | ||
81 | - // 判断name, tbDeviceProfileId, label, isGateway是否有更新 | ||
82 | - boolean changed = detectDeviceChange(deviceDTO, device); | ||
83 | - if (changed) { | ||
84 | - Device tbDevice = buildTbDeviceFromDeviceDTO(deviceDTO); | ||
85 | - try { | ||
86 | - tbConnectService.saveDevice(tbDevice, deviceDTO.getDeviceToken()).get(); | ||
87 | - } catch (InterruptedException | ExecutionException e) { | ||
88 | - log.error("update device to tb error:{}", e.getMessage()); | ||
89 | - throw new FastIotException(ErrorMessage.CONNECT_TO_TB_ERROR); | ||
90 | - } | ||
91 | - } | ||
92 | - // update deviceToken | ||
93 | - if (!deviceDTO.getDeviceToken().equals(device.getDeviceToken())) { | ||
94 | - CredentialEntity credentialEntity = | ||
95 | - tbDBService.findDeviceCredentialsByDeviceId(deviceDTO.getTbDeviceId()); | ||
96 | - if (credentialEntity == null) { | ||
97 | - log.error("tb 无此设备信息->tbDeviceId[{}]", deviceDTO.getTbDeviceId()); | ||
98 | - throw new FastIotException(ErrorMessage.CONNECT_TO_TB_ERROR.setMessage("tb 无此设备信息")); | ||
99 | - } | ||
100 | - credentialEntity.setCredentialsId(deviceDTO.getDeviceToken()); | ||
101 | - TBCredential tbCredential = buildTBCredential(credentialEntity); | ||
102 | - try { | ||
103 | - TBCredential newTbCredentials = tbConnectService.saveDeviceCredential(tbCredential).get(); | ||
104 | - if (newTbCredentials == null) { | ||
105 | - throw new FastIotException( | ||
106 | - ErrorMessage.CONNECT_TO_TB_ERROR.setMessage("update tb credentials error")); | ||
107 | - } | ||
108 | - } catch (InterruptedException | ExecutionException e) { | ||
109 | - log.error("update device to tb error:{}", e.getMessage()); | ||
110 | - throw new FastIotException(ErrorMessage.CONNECT_TO_TB_ERROR); | ||
111 | - } | ||
112 | - } | ||
113 | - }*/ | 66 | + |
67 | + validateUpdate(deviceDTO); | ||
68 | + | ||
69 | + YtDevice device = new YtDevice(); | ||
114 | deviceDTO.copyToEntity( | 70 | deviceDTO.copyToEntity( |
115 | device, | 71 | device, |
116 | ModelConstants.TablePropertyMapping.ACTIVE_TIME, | 72 | ModelConstants.TablePropertyMapping.ACTIVE_TIME, |
@@ -126,22 +82,7 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | @@ -126,22 +82,7 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | ||
126 | return device.getDTO(DeviceDTO.class); | 82 | return device.getDTO(DeviceDTO.class); |
127 | } | 83 | } |
128 | 84 | ||
129 | -// private TBCredential buildTBCredential(CredentialEntity credentialEntity) { | ||
130 | -// Assert.notNull(credentialEntity, "credentialEntity cannot be null"); | ||
131 | -// TBCredential tbCredential = new TBCredential(); | ||
132 | -// tbCredential.setCredentialsId(credentialEntity.getCredentialsId()); | ||
133 | -// tbCredential.setCredentialsType(credentialEntity.getCredentialsType()); | ||
134 | -// tbCredential.setCreateTime(credentialEntity.getCreatedTime()); | ||
135 | -// tbCredential.setCredentialsValue(credentialEntity.getCredentialsValue()); | ||
136 | -// Id deviceId = new Id(); | ||
137 | -// deviceId.setEntityType(EntityType.DEVICE); | ||
138 | -// deviceId.setId(credentialEntity.getDeviceId()); | ||
139 | -// tbCredential.setDeviceId(deviceId); | ||
140 | -// Id id = new Id(); | ||
141 | -// id.setId(credentialEntity.getId()); | ||
142 | -// tbCredential.setId(id); | ||
143 | -// return tbCredential; | ||
144 | -// } | 85 | + |
145 | 86 | ||
146 | private void validateUpdate(DeviceDTO deviceDTO) { | 87 | private void validateUpdate(DeviceDTO deviceDTO) { |
147 | if (StringUtils.isAllBlank(deviceDTO.getName())) { | 88 | if (StringUtils.isAllBlank(deviceDTO.getName())) { |
@@ -188,86 +129,79 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | @@ -188,86 +129,79 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | ||
188 | return changed; | 129 | return changed; |
189 | } | 130 | } |
190 | 131 | ||
191 | - private void validateDeviceDTO(String tenantId,DeviceDTO deviceDTO, boolean insert) { | 132 | + @Override |
133 | + public boolean validateFormdata(DeviceDTO deviceDTO) { | ||
134 | + boolean insert = StringUtils.isBlank(deviceDTO.getId()); | ||
135 | + String tenantId = deviceDTO.getTenantId(); | ||
192 | if (StringUtils.isBlank(deviceDTO.getName())) { | 136 | if (StringUtils.isBlank(deviceDTO.getName())) { |
193 | - throw new YtDataValidationException("device name cannot be black"); | 137 | + throw new YtDataValidationException("device name cannot be blank"); |
194 | } | 138 | } |
195 | // validate IOT DB | 139 | // validate IOT DB |
196 | if (StringUtils.isBlank(deviceDTO.getProfileId())) { | 140 | if (StringUtils.isBlank(deviceDTO.getProfileId())) { |
197 | - throw new YtDataValidationException("device profile cannot be black"); | 141 | + throw new YtDataValidationException("device profile cannot be blank"); |
198 | } | 142 | } |
199 | if (StringUtils.isBlank(deviceDTO.getDeviceToken()) && !insert) { | 143 | if (StringUtils.isBlank(deviceDTO.getDeviceToken()) && !insert) { |
200 | - throw new YtDataValidationException("device token cannot be black"); | 144 | + throw new YtDataValidationException("device token cannot be blank"); |
201 | } | 145 | } |
202 | // 验证设备名称是否已经存在 如果此处直接使用deviceDTO 将有误 | 146 | // 验证设备名称是否已经存在 如果此处直接使用deviceDTO 将有误 |
203 | if (insert) { | 147 | if (insert) { |
204 | DeviceDTO check = new DeviceDTO(); | 148 | DeviceDTO check = new DeviceDTO(); |
205 | check.setName(deviceDTO.getName()); | 149 | check.setName(deviceDTO.getName()); |
206 | - if (findDeviceInfo(tenantId,check).size() > 0) { | 150 | + if (findTbDeviceId(tenantId,check).size() > 0) { |
207 | throw new YtDataValidationException(ErrorMessage.NAME_ALREADY_EXISTS.getMessage()); | 151 | throw new YtDataValidationException(ErrorMessage.NAME_ALREADY_EXISTS.getMessage()); |
208 | } | 152 | } |
153 | + | ||
154 | + if (StringUtils.isNotBlank(deviceDTO.getDeviceToken())) { | ||
155 | + List<YtDevice> devices = | ||
156 | + baseMapper.selectList( | ||
157 | + new QueryWrapper<YtDevice>() | ||
158 | + .lambda() | ||
159 | + .eq(YtDevice::getDeviceToken, deviceDTO.getDeviceToken())); | ||
160 | + if (!devices.isEmpty()) { | ||
161 | + throw new YtDataValidationException("设备Device Token已经存在!"); | ||
162 | + } | ||
163 | + } | ||
164 | + }else{ | ||
165 | + YtDevice device = baseMapper.selectById(deviceDTO.getId()); | ||
166 | + if (!device.getTenantId().equals(tenantId)) { | ||
167 | + return false; | ||
168 | + } | ||
209 | } | 169 | } |
210 | // 验证数据profileId的正确性 | 170 | // 验证数据profileId的正确性 |
211 | - YtDeviceProfile deviceProfile = deviceProfileMapper.selectById(deviceDTO.getProfileId()); | ||
212 | - Organization organization = organizationMapper.selectById(deviceDTO.getOrganizationId()); | 171 | + YtDeviceProfile deviceProfile = ytDeviceProfileMapper.selectById(deviceDTO.getProfileId()); |
172 | + Organization organization = ytOrganizationMapper.selectById(deviceDTO.getOrganizationId()); | ||
213 | if (null == deviceProfile || null == organization) { | 173 | if (null == deviceProfile || null == organization) { |
214 | throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | 174 | throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); |
215 | -// } else if (StringUtils.isEmpty(deviceProfile.getTbProfileId())) { | ||
216 | -// throw new DataValidationException("tb_device profile is nonexistent"); | ||
217 | - } else if (!deviceProfile | ||
218 | - .getTenantId() | ||
219 | - .equals(tenantId) | ||
220 | - || !organization.getTenantId().equals(tenantId)) { | 175 | + } else if (!organization.getTenantId().equals(tenantId)) { |
221 | throw new YtDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); | 176 | throw new YtDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); |
222 | } | 177 | } |
178 | + return true; | ||
223 | } | 179 | } |
224 | 180 | ||
225 | - private DeviceDTO insert(String tenantId,DeviceDTO deviceDTO) { | ||
226 | - validateDeviceDTO(tenantId,deviceDTO, true); | ||
227 | - if (StringUtils.isNotBlank(deviceDTO.getDeviceToken())) { | ||
228 | - List<YtDevice> devices = | ||
229 | - baseMapper.selectList( | ||
230 | - new QueryWrapper<YtDevice>() | ||
231 | - .lambda() | ||
232 | - .eq(YtDevice::getDeviceToken, deviceDTO.getDeviceToken())); | ||
233 | - if (!devices.isEmpty()) { | ||
234 | - throw new YtDataValidationException("设备Device Token已经存在!"); | ||
235 | - } | ||
236 | - } | 181 | + |
182 | + | ||
183 | + | ||
184 | + private DeviceDTO insert(DeviceDTO deviceDTO) { | ||
185 | + | ||
237 | YtDevice device = new YtDevice(); | 186 | YtDevice device = new YtDevice(); |
238 | deviceDTO.copyToEntity( | 187 | deviceDTO.copyToEntity( |
239 | device, | 188 | device, |
240 | ModelConstants.TablePropertyMapping.ACTIVE_TIME, | 189 | ModelConstants.TablePropertyMapping.ACTIVE_TIME, |
241 | ModelConstants.TablePropertyMapping.DEVICE_STATE, | 190 | ModelConstants.TablePropertyMapping.DEVICE_STATE, |
242 | - ModelConstants.TablePropertyMapping.TB_DEVICE_ID, | ||
243 | - ModelConstants.TablePropertyMapping.TENANT_CODE, | ||
244 | ModelConstants.TablePropertyMapping.CREATOR, | 191 | ModelConstants.TablePropertyMapping.CREATOR, |
245 | ModelConstants.TablePropertyMapping.UPDATER, | 192 | ModelConstants.TablePropertyMapping.UPDATER, |
246 | ModelConstants.TablePropertyMapping.CREATE_TIME, | 193 | ModelConstants.TablePropertyMapping.CREATE_TIME, |
247 | ModelConstants.TablePropertyMapping.UPDATE, | 194 | ModelConstants.TablePropertyMapping.UPDATE, |
248 | ModelConstants.TablePropertyMapping.UPDATE_TIME); | 195 | ModelConstants.TablePropertyMapping.UPDATE_TIME); |
249 | - device.setTenantId(tenantId); | ||
250 | - // First insert into TB | ||
251 | -// if (tbConfig.isEnabled()) { | ||
252 | -// Device tbDevice = buildTbDeviceFromDeviceDTO(deviceDTO); | ||
253 | -// try { | ||
254 | -// Device insertedTbDevice = | ||
255 | -// tbConnectService.saveDevice(tbDevice, deviceDTO.getDeviceToken()).get(); | ||
256 | -// if (insertedTbDevice == null) { | ||
257 | -// throw new FastIotException(ErrorMessage.CONNECT_TO_TB_ERROR); | ||
258 | -// } | ||
259 | -// // 判断插入的DTO是否设置了deviceToken,如果不存在,获取Tb的deviceToken存入DB | ||
260 | -// if (StringUtils.isAllBlank(device.getDeviceToken())) { | ||
261 | -// String deviceTokenFromDB = | ||
262 | -// tbDBService.getDeviceTokenFromDB(insertedTbDevice.getId().getId()); | ||
263 | -// device.setDeviceToken(deviceTokenFromDB); | ||
264 | -// } | ||
265 | -// device.setTbDeviceId(insertedTbDevice.getId().getId()); | ||
266 | -// } catch (InterruptedException | ExecutionException e) { | ||
267 | -// log.error("insert device into tb error:{}", e.getMessage()); | ||
268 | -// throw new FastIotException(ErrorMessage.CONNECT_TO_TB_ERROR); | ||
269 | -// } | ||
270 | -// } | 196 | + |
197 | + // 判断插入的DTO是否设置了deviceToken,如果不存在,获取Tb的deviceToken存入DB | ||
198 | + if (StringUtils.isAllBlank(device.getDeviceToken())) { | ||
199 | + TenantId tenantId = new TenantId(UUID.fromString(deviceDTO.getTenantId())); | ||
200 | + UUID credentialsId = UUID.fromString(deviceDTO.getTbDeviceId()); | ||
201 | + DeviceCredentials deviceTokenFromDB = deviceCredentialsDao.findById(tenantId,credentialsId); | ||
202 | + device.setDeviceToken(deviceTokenFromDB.getCredentialsId()); | ||
203 | + } | ||
204 | + | ||
271 | device.setAlarmStatus(0); | 205 | device.setAlarmStatus(0); |
272 | /** 默认待激活状态 */ | 206 | /** 默认待激活状态 */ |
273 | device.setDeviceState(DeviceState.INACTIVE); | 207 | device.setDeviceState(DeviceState.INACTIVE); |
@@ -275,40 +209,20 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | @@ -275,40 +209,20 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | ||
275 | return device.getDTO(DeviceDTO.class); | 209 | return device.getDTO(DeviceDTO.class); |
276 | } | 210 | } |
277 | 211 | ||
278 | -// private Device buildTbDeviceFromDeviceDTO(DeviceDTO deviceDTO) { | ||
279 | -// Device tbDevice = new Device(); | ||
280 | -// if (StringUtils.isNotBlank(deviceDTO.getTbDeviceId())) { | ||
281 | -// Id id = new Id(); | ||
282 | -// id.setId(deviceDTO.getTbDeviceId()); | ||
283 | -// id.setEntityType(EntityType.DEVICE); | ||
284 | -// tbDevice.setId(id); | ||
285 | -// } | ||
286 | -// Device.AdditionalInfo additionalInfo = new Device.AdditionalInfo(); | ||
287 | -// additionalInfo.setGateway( | ||
288 | -// Optional.ofNullable(deviceDTO.getDeviceType()) | ||
289 | -// .map(deviceType -> deviceType.equals(DeviceTypeEnum.GATEWAY)) | ||
290 | -// .orElse(false)); | ||
291 | -// | ||
292 | -// additionalInfo.setDescription( | ||
293 | -// Optional.ofNullable(deviceDTO.getDeviceInfo()) | ||
294 | -// .map(deviceInfo -> deviceInfo.get("description")) | ||
295 | -// .map(JsonNode::asText) | ||
296 | -// .orElse("")); | ||
297 | -// additionalInfo.setOverwriteActivityTime(false); | ||
298 | -// | ||
299 | -// Id deviceProfileId = new Id(); | ||
300 | -// deviceProfileId.setEntityType(EntityType.DEVICE_PROFILE); | ||
301 | -// DeviceProfile deviceProfile = deviceProfileMapper.selectById(deviceDTO.getProfileId()); | ||
302 | -// deviceProfileId.setId(deviceProfile != null ? deviceProfile.getTbProfileId() : null); | ||
303 | -// | ||
304 | -// tbDevice.setAdditionalInfo(additionalInfo); | ||
305 | -// tbDevice.setCustomerId(null); | ||
306 | -// tbDevice.setDeviceProfileId(deviceProfileId); | ||
307 | -// tbDevice.setLabel(deviceDTO.getLabel()); | ||
308 | -// tbDevice.setName(deviceDTO.getName()); | ||
309 | -// tbDevice.setCreatedTime(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli()); | ||
310 | -// return tbDevice; | ||
311 | -// } | 212 | + @Override |
213 | + public List<String> findTbDeviceId(String tenantId, Set<String> ids) { | ||
214 | + LambdaQueryWrapper<YtDevice> queryWrapper = | ||
215 | + new QueryWrapper<YtDevice>() | ||
216 | + .lambda() | ||
217 | + .eq(YtDevice::getTenantId, tenantId) | ||
218 | + .in(YtDevice::getId, ids); | ||
219 | + | ||
220 | + List<String> tbDeviceIds = | ||
221 | + baseMapper.selectList(queryWrapper).stream() | ||
222 | + .map(YtDevice::getTbDeviceId) | ||
223 | + .collect(Collectors.toList()); | ||
224 | + return tbDeviceIds; | ||
225 | + } | ||
312 | 226 | ||
313 | @Override | 227 | @Override |
314 | @Transactional | 228 | @Transactional |
@@ -319,15 +233,8 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | @@ -319,15 +233,8 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | ||
319 | .eq(YtDevice::getTenantId, tenantId) | 233 | .eq(YtDevice::getTenantId, tenantId) |
320 | .in(YtDevice::getId, ids); | 234 | .in(YtDevice::getId, ids); |
321 | 235 | ||
322 | - List<String> tbDeviceIds = | ||
323 | - baseMapper.selectList(queryWrapper).stream() | ||
324 | - .map(YtDevice::getTbDeviceId) | ||
325 | - .collect(Collectors.toList()); | ||
326 | baseMapper.delete(queryWrapper); | 236 | baseMapper.delete(queryWrapper); |
327 | - // 忽略删除进度,也不管是否删除了 | ||
328 | -/* if (tbConfig.isEnabled()) { | ||
329 | - tbDeviceIds.forEach(tbConnectService::deleteDevice); | ||
330 | - }*/ | 237 | + |
331 | } | 238 | } |
332 | 239 | ||
333 | @Override | 240 | @Override |
@@ -350,7 +257,7 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | @@ -350,7 +257,7 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | ||
350 | organizationIds.add(organizationId); | 257 | organizationIds.add(organizationId); |
351 | // 查询该组织的所有子类 | 258 | // 查询该组织的所有子类 |
352 | List<OrganizationDTO> organizationDTOS = | 259 | List<OrganizationDTO> organizationDTOS = |
353 | - organizationMapper.findOrganizationTreeList( | 260 | + ytOrganizationMapper.findOrganizationTreeList( |
354 | tenantId, organizationIds); | 261 | tenantId, organizationIds); |
355 | List<String> queryOrganizationIds = new ArrayList<>(); | 262 | List<String> queryOrganizationIds = new ArrayList<>(); |
356 | organizationDTOS.forEach( | 263 | organizationDTOS.forEach( |
@@ -365,7 +272,7 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | @@ -365,7 +272,7 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | ||
365 | } | 272 | } |
366 | 273 | ||
367 | @Override | 274 | @Override |
368 | - public List<DeviceDTO> findDeviceInfo(String tenantId,DeviceDTO deviceDTO) { | 275 | + public List<DeviceDTO> findTbDeviceId(String tenantId, DeviceDTO deviceDTO) { |
369 | List<YtDevice> deviceList = | 276 | List<YtDevice> deviceList = |
370 | baseMapper.selectList( | 277 | baseMapper.selectList( |
371 | new QueryWrapper<YtDevice>() | 278 | new QueryWrapper<YtDevice>() |
@@ -375,7 +282,7 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | @@ -375,7 +282,7 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev | ||
375 | YtDevice::getDeviceToken, | 282 | YtDevice::getDeviceToken, |
376 | deviceDTO.getDeviceToken()) | 283 | deviceDTO.getDeviceToken()) |
377 | .eq(true, YtDevice::getTenantId, tenantId) | 284 | .eq(true, YtDevice::getTenantId, tenantId) |
378 | - .like( | 285 | + .eq( |
379 | StringUtils.isNotBlank(deviceDTO.getName()), | 286 | StringUtils.isNotBlank(deviceDTO.getName()), |
380 | YtDevice::getName, | 287 | YtDevice::getName, |
381 | deviceDTO.getName())); | 288 | deviceDTO.getName())); |
@@ -15,6 +15,7 @@ import org.apache.ibatis.session.SqlSession; | @@ -15,6 +15,7 @@ import org.apache.ibatis.session.SqlSession; | ||
15 | import org.mybatis.spring.SqlSessionUtils; | 15 | import org.mybatis.spring.SqlSessionUtils; |
16 | import org.springframework.beans.factory.annotation.Autowired; | 16 | import org.springframework.beans.factory.annotation.Autowired; |
17 | import org.springframework.transaction.annotation.Transactional; | 17 | import org.springframework.transaction.annotation.Transactional; |
18 | +import org.thingsboard.server.cluster.TbClusterService; | ||
18 | import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; | 19 | import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; |
19 | import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum; | 20 | import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum; |
20 | import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; | 21 | import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; |
@@ -32,7 +33,7 @@ public abstract class AbstractBaseService<M extends BaseMapper<T>, T extends Bas | @@ -32,7 +33,7 @@ public abstract class AbstractBaseService<M extends BaseMapper<T>, T extends Bas | ||
32 | implements BaseService<T> { | 33 | implements BaseService<T> { |
33 | 34 | ||
34 | @Autowired protected M baseMapper; | 35 | @Autowired protected M baseMapper; |
35 | - | 36 | + @Autowired protected TbClusterService tbClusterService; |
36 | @Override | 37 | @Override |
37 | public List<T> findAllByTenant(String tenantId) { | 38 | public List<T> findAllByTenant(String tenantId) { |
38 | QueryWrapper<T> wrapper = new QueryWrapper<>(); | 39 | QueryWrapper<T> wrapper = new QueryWrapper<>(); |
@@ -136,4 +137,6 @@ public abstract class AbstractBaseService<M extends BaseMapper<T>, T extends Bas | @@ -136,4 +137,6 @@ public abstract class AbstractBaseService<M extends BaseMapper<T>, T extends Bas | ||
136 | return (Class<T>) | 137 | return (Class<T>) |
137 | ReflectionKit.getSuperClassGenericType(getClass(), 1); | 138 | ReflectionKit.getSuperClassGenericType(getClass(), 1); |
138 | } | 139 | } |
140 | + | ||
141 | + | ||
139 | } | 142 | } |
dao/src/main/java/org/thingsboard/server/dao/yunteng/service/YtAlarmProfileService.java
deleted
100644 → 0
1 | -package org.thingsboard.server.dao.yunteng.service; | ||
2 | - | ||
3 | -import org.thingsboard.server.common.data.yunteng.dto.AlarmProfileDTO; | ||
4 | - | ||
5 | -import java.util.Set; | ||
6 | - | ||
7 | -public interface YtAlarmProfileService { | ||
8 | - /** | ||
9 | - * 保存告警设置 | ||
10 | - * @param alarmProfileDTO 告警设置相关信息 | ||
11 | - * @return AlarmProfileDTO | ||
12 | - */ | ||
13 | - AlarmProfileDTO saveOrUpdateAlarmProfile(String tenantId,AlarmProfileDTO alarmProfileDTO); | ||
14 | - | ||
15 | - /** | ||
16 | - * 删除告警配置 | ||
17 | - * @param ids 删除的ids | ||
18 | - * @return 删除结果:true 成功 false 失败 | ||
19 | - */ | ||
20 | - boolean deleteAlarmProfile(Set<String> ids); | ||
21 | - | ||
22 | - /** | ||
23 | - * 根据设备配置ID查询告警配置信息 | ||
24 | - * @param deviceProfileId 设备配置ID | ||
25 | - * @return 告警配置信息 | ||
26 | - */ | ||
27 | - AlarmProfileDTO findAlarmProfileByDeviceProfileId(String tenantId,String deviceProfileId); | ||
28 | -} |
1 | package org.thingsboard.server.dao.yunteng.service; | 1 | package org.thingsboard.server.dao.yunteng.service; |
2 | 2 | ||
3 | +import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO; | ||
3 | import org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO; | 4 | import org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO; |
4 | import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; | 5 | import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; |
5 | 6 | ||
@@ -17,5 +18,14 @@ public interface YtDeviceProfileService { | @@ -17,5 +18,14 @@ public interface YtDeviceProfileService { | ||
17 | 18 | ||
18 | PageData<DeviceProfileDTO> page(String tenantId, Map<String, Object> queryMap); | 19 | PageData<DeviceProfileDTO> page(String tenantId, Map<String, Object> queryMap); |
19 | 20 | ||
20 | - List<DeviceProfileDTO> findDeviceProfile(String tenantId,DeviceProfileDTO deviceProfileDTO); | 21 | + List<DeviceProfileDTO> findDeviceProfile(String tenantId); |
22 | + | ||
23 | + | ||
24 | + | ||
25 | + /** | ||
26 | + * 验证表单数据有效性 | ||
27 | + * @param ytDeviceProfileDTO | ||
28 | + * @return | ||
29 | + */ | ||
30 | + boolean validateFormdata(DeviceProfileDTO ytDeviceProfileDTO); | ||
21 | } | 31 | } |
@@ -18,9 +18,17 @@ public interface YtDeviceService { | @@ -18,9 +18,17 @@ public interface YtDeviceService { | ||
18 | PageData<DeviceDTO> page(String tenantId,Map<String, Object> queryMap); | 18 | PageData<DeviceDTO> page(String tenantId,Map<String, Object> queryMap); |
19 | 19 | ||
20 | /** | 20 | /** |
21 | + * 验证表单数据有效性 | ||
22 | + * @param ytDevice | ||
23 | + * @return | ||
24 | + */ | ||
25 | + boolean validateFormdata(DeviceDTO ytDevice); | ||
26 | + /** | ||
21 | * 查询所有的设备信息 | 27 | * 查询所有的设备信息 |
22 | * @param deviceDTO 过滤参数 | 28 | * @param deviceDTO 过滤参数 |
23 | * @return List<DeviceDTO> | 29 | * @return List<DeviceDTO> |
24 | */ | 30 | */ |
25 | - List<DeviceDTO> findDeviceInfo(String tenantId,DeviceDTO deviceDTO); | 31 | + List<DeviceDTO> findTbDeviceId(String tenantId, DeviceDTO deviceDTO); |
32 | + | ||
33 | + List<String> findTbDeviceId(String tenantId, Set<String> ids); | ||
26 | } | 34 | } |
@@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
5 | <resultMap type="org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO" id="deviceProfileMap"> | 5 | <resultMap type="org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO" id="deviceProfileMap"> |
6 | <result property="id" column="id"/> | 6 | <result property="id" column="id"/> |
7 | <result property="name" column="name"/> | 7 | <result property="name" column="name"/> |
8 | - <result property="convertJs" column="convert_js"/> | 8 | +<!-- <result property="convertJs" column="convert_js"/>--> |
9 | <result property="description" column="description"/> | 9 | <result property="description" column="description"/> |
10 | <result property="transportType" column="transport_type" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/> | 10 | <result property="transportType" column="transport_type" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/> |
11 | <result property="tbProfileId" column="tb_profile_id"/> | 11 | <result property="tbProfileId" column="tb_profile_id"/> |
@@ -17,7 +17,8 @@ | @@ -17,7 +17,8 @@ | ||
17 | </resultMap> | 17 | </resultMap> |
18 | <select id="getDeviceProfileInfo" resultMap="deviceProfileMap"> | 18 | <select id="getDeviceProfileInfo" resultMap="deviceProfileMap"> |
19 | SELECT id,name | 19 | SELECT id,name |
20 | - ,convert_js,description,transport_type,tb_profile_id,tenant_id,create_time,update_time,creator,updater FROM | 20 | +-- ,convert_js |
21 | + ,description,transport_type,tb_profile_id,tenant_id,create_time,update_time,creator,updater FROM | ||
21 | iotfs_device_profile | 22 | iotfs_device_profile |
22 | <where> | 23 | <where> |
23 | <if test="id !=null and id!=''"> | 24 | <if test="id !=null and id!=''"> |