Commit 89779871b82df2892fe9c03fe74e9d448105c2f0

Authored by 云中非
2 parents ac2152b2 f1665c4a

Merge branch 'master' into 20220920

... ... @@ -55,415 +55,443 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.
55 55 @Api(tags = {"设备管理"})
56 56 @Slf4j
57 57 public class YtDeviceController extends BaseController {
58   - private final YtDeviceService deviceService;
59   - private final DeviceService tbDeviceService;
60   - String sePL = new Date().toString();
61   -
62   - @PostMapping
63   - @ApiOperation("创建|编辑")
64   - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:device:post','api:yt:device:update'})")
65   - public ResponseEntity<DeviceDTO> saveDevice(
66   - @Validated(AddGroup.class) @RequestBody DeviceDTO deviceDTO) throws ThingsboardException, ExecutionException, InterruptedException {
67   - String currentTenantId = getCurrentUser().getCurrentTenantId();
68   - boolean enable = deviceService.validateFormdata(currentTenantId, deviceDTO);
69   - if (!enable) {
70   - ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
71   - }
72   - DeviceDTO newDeviceDTO = null;
73   - boolean isIncludeRelation = false;
74   -
75   - String gatewayId = deviceDTO.getGatewayId();
76   - DeviceDTO gateWayDevice = null;
77   - if (StringUtils.isNotEmpty(gatewayId)) {
78   - gateWayDevice =
79   - deviceService.checkDeviceByTenantIdAndDeviceId(
80   - getCurrentUser().getCurrentTenantId(), gatewayId);
81   -
82   - // 第一步判断该网关设备是否存在于该租户下面
83   - if (null == gateWayDevice) {
84   - throw new YtDataValidationException(
85   - ErrorMessage.DEVICE_NOT_EXISTENCE_IN_TENANT.getMessage());
86   - }
87   - }
88   -
89   - /**子设备编辑时,TB中已经存在关联关系则值更新设备表信息*/
90   - String selfTbDeviceIdStr = deviceDTO.getTbDeviceId();
91   - if (selfTbDeviceIdStr != null
92   - && deviceDTO.getDeviceType().equals(DeviceTypeEnum.SENSOR)
93   - && StringUtils.isNotEmpty(gatewayId)) {
94   -
95   -
96   - // 第二步判断网关子设备是否已关联到网关设备
97   - EntityId entityId = EntityIdFactory.getByTypeAndId("DEVICE", selfTbDeviceIdStr);//gateWayDevice.getTbDeviceId()
98   - List<EntityRelationInfo> list =
99   - relationService.findInfoByTo(getTenantId(), entityId, RelationTypeGroup.COMMON).get();
100   -
101   - for (EntityRelationInfo entityRelationInfo : list) {
102   - if (entityRelationInfo.getTo().getId().equals(selfTbDeviceIdStr)
103   - && entityRelationInfo.getFrom().getId().equals(gatewayId)) {
104   - deviceDTO.setTbDeviceId(entityRelationInfo.getTo().toString());
105   - newDeviceDTO =
106   - deviceService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceDTO);
107   - isIncludeRelation = true;
108   - break;
109   - }
110   - }
111   - }
112   -
113   -
114   - /**需要更新设备表和关联关系表*/
115   - if (!isIncludeRelation) {
116   - Device tbDevice = buildTbDeviceFromDeviceDTO(getCurrentUser().getTenantId(), deviceDTO);
117   -
118   - DeviceId selfTbId = updateTbDevice(tbDevice, deviceDTO.getDeviceToken());
119   - selfTbDeviceIdStr = selfTbId.getId().toString();
120   - deviceDTO.setTbDeviceId(selfTbDeviceIdStr);
121   - newDeviceDTO = deviceService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceDTO);
122   -
123   - if (deviceDTO.getDeviceType().equals(DeviceTypeEnum.SENSOR)
124   - && StringUtils.isNotEmpty(selfTbDeviceIdStr)) {
125   - // 删除原來的关联关系
126   - List<DeviceDTO> list =
127   - deviceService.findGateWayDeviceByTbDeviceId(
128   - getCurrentUser().getCurrentTenantId(), selfTbDeviceIdStr);
129   - if (null != list && list.size() > 0) {
130   - DeviceId form = new DeviceId(UUID.fromString(list.get(0).getTbDeviceId()));
131   - EntityRelation relation =
132   - new EntityRelation(
133   - form, selfTbId, FastIotConstants.Relation.relationType, RelationTypeGroup.COMMON);
134   - boolean found =
135   - relationService.deleteRelation(
136   - getTenantId(),
137   - form,
138   - selfTbId,
139   - FastIotConstants.Relation.relationType,
140   - RelationTypeGroup.COMMON);
141   -
142   - if (!found) {
143   - throw new ThingsboardException(
144   - "Requested item wasn't found!", ThingsboardErrorCode.ITEM_NOT_FOUND);
145   - }
146   - sendRelationNotificationMsg(
147   - getTenantId(), relation, EdgeEventActionType.RELATION_DELETED);
148   - }
149   -
150   - if (gateWayDevice != null) {
151   - addRelation(getTenantId(), gateWayDevice.getTbDeviceId(), selfTbDeviceIdStr);
152   - }
153   - }
154   - }
155   - return ResponseEntity.ok(newDeviceDTO);
  58 + private final YtDeviceService deviceService;
  59 + private final DeviceService tbDeviceService;
  60 + private final ObjectMapper objectMapper;
  61 + String sePL = new Date().toString();
  62 +
  63 + @PostMapping
  64 + @ApiOperation("创建|编辑")
  65 + @PreAuthorize(
  66 + "@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:device:post','api:yt:device:update'})")
  67 + public ResponseEntity<DeviceDTO> saveDevice(
  68 + @Validated(AddGroup.class) @RequestBody DeviceDTO deviceDTO)
  69 + throws ThingsboardException, ExecutionException, InterruptedException {
  70 + String currentTenantId = getCurrentUser().getCurrentTenantId();
  71 + boolean enable = deviceService.validateFormdata(currentTenantId, deviceDTO);
  72 + if (!enable) {
  73 + ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
156 74 }
157   -
158   - @GetMapping({"sn"})
159   - @ApiOperation("自动生成设备SN")
160   - public ResponseEntity<String> generate() {
161   - String result = deviceService.generateSn();
162   - return ResponseEntity.ok(result);
  75 + DeviceDTO newDeviceDTO = null;
  76 + boolean isIncludeRelation = false;
  77 +
  78 + String gatewayId = deviceDTO.getGatewayId();
  79 + DeviceDTO gateWayDevice = null;
  80 + if (StringUtils.isNotEmpty(gatewayId)) {
  81 + gateWayDevice =
  82 + deviceService.checkDeviceByTenantIdAndDeviceId(
  83 + getCurrentUser().getCurrentTenantId(), gatewayId);
  84 +
  85 + // 第一步判断该网关设备是否存在于该租户下面
  86 + if (null == gateWayDevice) {
  87 + throw new YtDataValidationException(
  88 + ErrorMessage.DEVICE_NOT_EXISTENCE_IN_TENANT.getMessage());
  89 + }
163 90 }
164 91
165   - private DeviceId updateTbDevice(Device tbDevice, YtCredentialsDto formCredentials)
166   - throws ThingsboardException {
167   - Device oldDevice = null;
168   - boolean created = tbDevice.getId() == null;
169   - if (!created) {
170   - oldDevice = checkDeviceId(tbDevice.getId(), Operation.WRITE);
171   - } else {
172   - checkEntity(null, tbDevice, Resource.DEVICE);
173   - }
174   -
175   - Device savedDevice = checkNotNull(tbDeviceService.saveDeviceWithAccessToken(tbDevice, null));
176   - tbClusterService.onDeviceUpdated(savedDevice, oldDevice);
177   - DeviceId tbDeviceId = savedDevice.getId();
178   - try {
179   - logEntityAction(
180   - getCurrentUser(),
181   - savedDevice.getId(),
182   - savedDevice,
183   - savedDevice.getCustomerId(),
184   - created ? ActionType.ADDED : ActionType.UPDATED,
185   - null);
186   -
187   - if (formCredentials != null && formCredentials.getCredentialsType() != null) {
188   - DeviceCredentials deviceCredentials =
189   - checkNotNull(
190   - deviceCredentialsService.findDeviceCredentialsByDeviceId(
191   - getCurrentUser().getTenantId(), tbDeviceId));
192   - deviceCredentials.setCredentialsId(formCredentials.getCredentialsId());
193   - deviceCredentials.setCredentialsType(formCredentials.getCredentialsType());
194   - deviceCredentials.setCredentialsValue(formCredentials.getCredentialsValue());
195   -
196   - DeviceCredentials result =
197   - checkNotNull(
198   - deviceCredentialsService.updateDeviceCredentials(
199   - getCurrentUser().getTenantId(), deviceCredentials));
200   - tbClusterService.pushMsgToCore(
201   - new DeviceCredentialsUpdateNotificationMsg(
202   - getCurrentUser().getTenantId(), deviceCredentials.getDeviceId(), result),
203   - null);
204   -
205   - sendEntityNotificationMsg(
206   - getTenantId(), tbDeviceId, EdgeEventActionType.CREDENTIALS_UPDATED);
207   -
208   - logEntityAction(
209   - tbDeviceId,
210   - savedDevice,
211   - savedDevice.getCustomerId(),
212   - ActionType.CREDENTIALS_UPDATED,
213   - null,
214   - deviceCredentials);
215   - }
216   - } catch (ThingsboardException e) {
217   - log.error("Failed to log entity action", e);
  92 + /** 子设备编辑时,TB中已经存在关联关系则值更新设备表信息 */
  93 + String selfTbDeviceIdStr = deviceDTO.getTbDeviceId();
  94 + if (selfTbDeviceIdStr != null
  95 + && deviceDTO.getDeviceType().equals(DeviceTypeEnum.SENSOR)
  96 + && StringUtils.isNotEmpty(gatewayId)) {
  97 +
  98 + // 第二步判断网关子设备是否已关联到网关设备
  99 + EntityId entityId =
  100 + EntityIdFactory.getByTypeAndId(
  101 + "DEVICE", selfTbDeviceIdStr); // gateWayDevice.getTbDeviceId()
  102 + List<EntityRelationInfo> list =
  103 + relationService.findInfoByTo(getTenantId(), entityId, RelationTypeGroup.COMMON).get();
  104 +
  105 + for (EntityRelationInfo entityRelationInfo : list) {
  106 + if (entityRelationInfo.getTo().getId().equals(selfTbDeviceIdStr)
  107 + && entityRelationInfo.getFrom().getId().equals(gatewayId)) {
  108 + deviceDTO.setTbDeviceId(entityRelationInfo.getTo().toString());
  109 + newDeviceDTO =
  110 + deviceService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceDTO);
  111 + isIncludeRelation = true;
  112 + break;
218 113 }
219   - return tbDeviceId;
  114 + }
220 115 }
221 116
222   - @GetMapping("{id}")
223   - @ApiOperation("详情")
224   - @PreAuthorize("@check.checkPermissions({},{'api:yt:device:get'})")
225   - public ResponseEntity<DeviceDTO> getDevice(@PathVariable("id") String id)
226   - throws ThingsboardException {
227   - return ResponseEntity.of(deviceService.getDevice(getCurrentUser().getCurrentTenantId(), id));
228   - }
  117 + /** 需要更新设备表和关联关系表 */
  118 + if (!isIncludeRelation) {
  119 + Device tbDevice = buildTbDeviceFromDeviceDTO(getCurrentUser().getTenantId(), deviceDTO);
229 120
230   - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})")
231   - @GetMapping(params = {PAGE_SIZE, PAGE})
232   - @ApiOperation("查询")
233   - public YtPageData<DeviceDTO> pageDevice(
234   - @RequestParam(PAGE_SIZE) int pageSize,
235   - @RequestParam(PAGE) int page,
236   - @RequestParam(value = "name", required = false) String name,
237   - @RequestParam(value = "deviceState", required = false) DeviceState deviceState,
238   - @RequestParam(value = "deviceType", required = false) DeviceTypeEnum deviceType,
239   - @RequestParam(value = "organizationId", required = false) String organizationId,
240   - @RequestParam(value = "alarmStatus", required = false) Integer alarmStatus,
241   - @RequestParam(value = "profileId", required = false) String profileId,
242   - @RequestParam(value = ORDER_FILED, required = false) String orderBy,
243   - @RequestParam(value = ORDER_TYPE, required = false) OrderTypeEnum orderType)
244   - throws ThingsboardException {
245   - HashMap<String, Object> queryMap = new HashMap<>();
246   - queryMap.put(PAGE_SIZE, pageSize);
247   - queryMap.put(PAGE, page);
248   - queryMap.put(ORDER_FILED, orderBy);
249   - queryMap.put("name", name);
250   - queryMap.put("alarmStatus", alarmStatus);
251   - queryMap.put("profileId", profileId);
252   - if (deviceState != null) {
253   - if (deviceState != DeviceState.INACTIVE) {
254   - queryMap.put("deviceState", deviceState == DeviceState.ONLINE);
255   - } else {
256   - queryMap.put("activeState", DeviceState.INACTIVE);
257   - }
258   - }
259   - if (deviceType != null) {
260   - queryMap.put("deviceType", deviceType.name());
261   - }
262   - if (!StringUtils.isEmpty(organizationId)) {
263   - queryMap.put("organizationId", organizationId);
264   - }
265   - if (orderType != null) {
266   - queryMap.put(ORDER_TYPE, orderType.name());
267   - }
268   - // 如果当前用户是客户
269   - if (getCurrentUser().isCustomerUser()) {
270   - queryMap.put("customerId", getCurrentUser().getCustomerId().toString());
271   - }
272   - return deviceService.page(getCurrentUser().getCurrentTenantId(), queryMap);
273   - }
  121 + DeviceId selfTbId = updateTbDevice(tbDevice, deviceDTO.getDeviceToken());
  122 + selfTbDeviceIdStr = selfTbId.getId().toString();
  123 + deviceDTO.setTbDeviceId(selfTbDeviceIdStr);
  124 + newDeviceDTO = deviceService.insertOrUpdate(getCurrentUser().getCurrentTenantId(), deviceDTO);
274 125
275   - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})")
276   - @GetMapping(path = {"/relation"}, params = {PAGE_SIZE, PAGE})
277   - @ApiOperation("子设备查询")
278   - public YtPageData<RelationDeviceDTO> pageRelationDevice(
279   - @RequestParam(PAGE_SIZE) int pageSize,
280   - @RequestParam(PAGE) int page,
281   - @RequestParam(value = "name", required = false) String name,
282   - @RequestParam(value = "deviceState", required = false) DeviceState deviceState,
283   - @RequestParam(value = "fromId") String fromId,
284   - @RequestParam(value = ORDER_FILED, required = false) String orderBy,
285   - @RequestParam(value = ORDER_TYPE, required = false) OrderTypeEnum orderType) throws ThingsboardException {
286   - HashMap<String, Object> queryMap = new HashMap<>();
287   - queryMap.put(PAGE_SIZE, pageSize);
288   - queryMap.put(PAGE, page);
289   - queryMap.put(ORDER_FILED, orderBy);
290   - queryMap.put("name", name);
291   - queryMap.put("fromId", fromId);
292   - queryMap.put("tenantId", getCurrentUser().getCurrentTenantId());
293   - if (deviceState != null) {
294   - if (deviceState != DeviceState.INACTIVE) {
295   - queryMap.put("deviceState", deviceState == DeviceState.ONLINE);
296   - } else {
297   - queryMap.put("activeState", DeviceState.INACTIVE);
298   - }
299   - }
300   - if (orderType != null) {
301   - queryMap.put(ORDER_TYPE, orderType.name());
  126 + if (deviceDTO.getDeviceType().equals(DeviceTypeEnum.SENSOR)
  127 + && StringUtils.isNotEmpty(selfTbDeviceIdStr)) {
  128 + // 删除原來的关联关系
  129 + List<DeviceDTO> list =
  130 + deviceService.findGateWayDeviceByTbDeviceId(
  131 + getCurrentUser().getCurrentTenantId(), selfTbDeviceIdStr);
  132 + if (null != list && list.size() > 0) {
  133 + DeviceId form = new DeviceId(UUID.fromString(list.get(0).getTbDeviceId()));
  134 + EntityRelation relation =
  135 + new EntityRelation(
  136 + form, selfTbId, FastIotConstants.Relation.relationType, RelationTypeGroup.COMMON);
  137 + boolean found =
  138 + relationService.deleteRelation(
  139 + getTenantId(),
  140 + form,
  141 + selfTbId,
  142 + FastIotConstants.Relation.relationType,
  143 + RelationTypeGroup.COMMON);
  144 +
  145 + if (!found) {
  146 + throw new ThingsboardException(
  147 + "Requested item wasn't found!", ThingsboardErrorCode.ITEM_NOT_FOUND);
  148 + }
  149 + sendRelationNotificationMsg(
  150 + getTenantId(), relation, EdgeEventActionType.RELATION_DELETED);
302 151 }
303   - // 如果当前用户是客户
304   - if (getCurrentUser().isCustomerUser()) {
305   - queryMap.put("customerId", getCurrentUser().getCustomerId().toString());
  152 +
  153 + if (gateWayDevice != null) {
  154 + addRelation(getTenantId(), gateWayDevice.getTbDeviceId(), selfTbDeviceIdStr);
306 155 }
307   - return deviceService.pageRelation(queryMap);
  156 + }
308 157 }
309   -
310   - @PostMapping("/import")
311   - @ApiOperation("导入配置")
312   - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:device:import'})")
313   - public ResponseEntity<String> importDeviceProfile() {
314   - // TODO 实现的业务功能
315   - return ResponseEntity.ok("");
  158 + return ResponseEntity.ok(newDeviceDTO);
  159 + }
  160 +
  161 + @GetMapping({"sn"})
  162 + @ApiOperation("自动生成设备SN")
  163 + public ResponseEntity<String> generate() {
  164 + String result = deviceService.generateSn();
  165 + return ResponseEntity.ok(result);
  166 + }
  167 +
  168 + private DeviceId updateTbDevice(Device tbDevice, YtCredentialsDto formCredentials)
  169 + throws ThingsboardException {
  170 + Device oldDevice = null;
  171 + boolean created = tbDevice.getId() == null;
  172 + if (!created) {
  173 + oldDevice = checkDeviceId(tbDevice.getId(), Operation.WRITE);
  174 + } else {
  175 + checkEntity(null, tbDevice, Resource.DEVICE);
316 176 }
317 177
318   - @PostMapping("/export")
319   - @ApiOperation("导出")
320   - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:device:export'})")
321   - public ResponseEntity<String> exportDeviceProfile() {
322   - // TODO 实现的业务功能
323   - return ResponseEntity.ok("");
  178 + Device savedDevice = checkNotNull(tbDeviceService.saveDeviceWithAccessToken(tbDevice, null));
  179 + tbClusterService.onDeviceUpdated(savedDevice, oldDevice);
  180 + DeviceId tbDeviceId = savedDevice.getId();
  181 + try {
  182 + logEntityAction(
  183 + getCurrentUser(),
  184 + savedDevice.getId(),
  185 + savedDevice,
  186 + savedDevice.getCustomerId(),
  187 + created ? ActionType.ADDED : ActionType.UPDATED,
  188 + null);
  189 +
  190 + if (formCredentials != null && formCredentials.getCredentialsType() != null) {
  191 + DeviceCredentials deviceCredentials =
  192 + checkNotNull(
  193 + deviceCredentialsService.findDeviceCredentialsByDeviceId(
  194 + getCurrentUser().getTenantId(), tbDeviceId));
  195 + deviceCredentials.setCredentialsId(formCredentials.getCredentialsId());
  196 + deviceCredentials.setCredentialsType(formCredentials.getCredentialsType());
  197 + deviceCredentials.setCredentialsValue(formCredentials.getCredentialsValue());
  198 +
  199 + DeviceCredentials result =
  200 + checkNotNull(
  201 + deviceCredentialsService.updateDeviceCredentials(
  202 + getCurrentUser().getTenantId(), deviceCredentials));
  203 + tbClusterService.pushMsgToCore(
  204 + new DeviceCredentialsUpdateNotificationMsg(
  205 + getCurrentUser().getTenantId(), deviceCredentials.getDeviceId(), result),
  206 + null);
  207 +
  208 + sendEntityNotificationMsg(
  209 + getTenantId(), tbDeviceId, EdgeEventActionType.CREDENTIALS_UPDATED);
  210 +
  211 + logEntityAction(
  212 + tbDeviceId,
  213 + savedDevice,
  214 + savedDevice.getCustomerId(),
  215 + ActionType.CREDENTIALS_UPDATED,
  216 + null,
  217 + deviceCredentials);
  218 + }
  219 + } catch (ThingsboardException e) {
  220 + log.error("Failed to log entity action", e);
324 221 }
325   -
326   - @DeleteMapping
327   - @ApiOperation("删除")
328   - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:device:delete'})")
329   - public void deleteDevices(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO)
330   - throws ThingsboardException {
331   - String currentTenantId = getCurrentUser().getCurrentTenantId();
332   - List<String> tdIds = deviceService.findTbDeviceId(currentTenantId, deleteDTO.getIds());
333   - for (String id : tdIds) {
334   - deleteTbDevice(id);
335   - }
336   - deviceService.deleteDevices(currentTenantId, deleteDTO.getIds());
  222 + return tbDeviceId;
  223 + }
  224 +
  225 + @GetMapping("{id}")
  226 + @ApiOperation("详情")
  227 + @PreAuthorize("@check.checkPermissions({},{'api:yt:device:get'})")
  228 + public ResponseEntity<DeviceDTO> getDevice(@PathVariable("id") String id)
  229 + throws ThingsboardException {
  230 + return ResponseEntity.of(deviceService.getDevice(getCurrentUser().getCurrentTenantId(), id));
  231 + }
  232 +
  233 + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})")
  234 + @GetMapping(params = {PAGE_SIZE, PAGE})
  235 + @ApiOperation("查询")
  236 + public YtPageData<DeviceDTO> pageDevice(
  237 + @RequestParam(PAGE_SIZE) int pageSize,
  238 + @RequestParam(PAGE) int page,
  239 + @RequestParam(value = "name", required = false) String name,
  240 + @RequestParam(value = "deviceState", required = false) DeviceState deviceState,
  241 + @RequestParam(value = "deviceType", required = false) DeviceTypeEnum deviceType,
  242 + @RequestParam(value = "organizationId", required = false) String organizationId,
  243 + @RequestParam(value = "alarmStatus", required = false) Integer alarmStatus,
  244 + @RequestParam(value = "profileId", required = false) String profileId,
  245 + @RequestParam(value = ORDER_FILED, required = false) String orderBy,
  246 + @RequestParam(value = ORDER_TYPE, required = false) OrderTypeEnum orderType)
  247 + throws ThingsboardException {
  248 + HashMap<String, Object> queryMap = new HashMap<>();
  249 + queryMap.put(PAGE_SIZE, pageSize);
  250 + queryMap.put(PAGE, page);
  251 + queryMap.put(ORDER_FILED, orderBy);
  252 + queryMap.put("name", name);
  253 + queryMap.put("alarmStatus", alarmStatus);
  254 + queryMap.put("profileId", profileId);
  255 + if (deviceState != null) {
  256 + if (deviceState != DeviceState.INACTIVE) {
  257 + queryMap.put("deviceState", deviceState == DeviceState.ONLINE);
  258 + } else {
  259 + queryMap.put("activeState", DeviceState.INACTIVE);
  260 + }
337 261 }
338   -
339   - private void deleteTbDevice(String id) throws ThingsboardException {
340   - DeviceId deviceId = new DeviceId(toUUID(id));
341   - Device device = checkDeviceId(deviceId, Operation.DELETE);
342   -
343   - List<EdgeId> relatedEdgeIds = findRelatedEdgeIds(getTenantId(), deviceId);
344   -
345   - tbDeviceService.deleteDevice(getCurrentUser().getTenantId(), deviceId);
346   -
347   - tbClusterService.onDeviceDeleted(device, null);
348   -
349   - logEntityAction(deviceId, device, device.getCustomerId(), ActionType.DELETED, null, id);
350   -
351   - sendDeleteNotificationMsg(getTenantId(), deviceId, relatedEdgeIds);
  262 + if (deviceType != null) {
  263 + queryMap.put("deviceType", deviceType.name());
352 264 }
353   -
354   - @GetMapping("/list/{deviceType}")
355   - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{})")
356   - @ApiOperation("获取该组织的所有设备")
357   - public List<DeviceDTO> getGatewayDevices(
358   - @ApiParam(value = "组织ID") @RequestParam("organizationId") String organizationId,
359   - @ApiParam(value = "设备类型") @PathVariable("deviceType") DeviceTypeEnum deviceType) throws ThingsboardException {
360   - return deviceService.findDevicesByDeviceTypeAndOrganizationId(deviceType,getCurrentUser().getCurrentTenantId(), organizationId);
  265 + if (!StringUtils.isEmpty(organizationId)) {
  266 + queryMap.put("organizationId", organizationId);
361 267 }
362   -
363   - @GetMapping("/list/master/{organizationId}")
364   - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})")
365   - @ApiOperation("主设备列表")
366   - public List<SelectItemDTO> getMasterDevices(
367   - @ApiParam(value = "组织ID") @PathVariable("organizationId") String organizationId) throws ThingsboardException {
368   - return deviceService.findMasterDevices(getCurrentUser().getCurrentTenantId()
369   - ,getCurrentUser().isCustomerUser()?getCurrentUser().getCustomerId().toString():null
370   - , organizationId);
  268 + if (orderType != null) {
  269 + queryMap.put(ORDER_TYPE, orderType.name());
371 270 }
372   - @GetMapping("/list/slave/{organizationId}")
373   - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})")
374   - @ApiOperation("从设备列表")
375   - public List<SelectItemDTO> getSlaveDevices(
376   - @ApiParam(value = "组织ID") @PathVariable("organizationId") String organizationId,
377   - @ApiParam(value = "主设备ID") @RequestParam(value = "masterId",required = false) String masterId) throws ThingsboardException {
378   - return deviceService.findSlaveDevices(masterId,getCurrentUser().getCurrentTenantId()
379   - ,getCurrentUser().isCustomerUser()?getCurrentUser().getCurrentUserId():null
380   - , organizationId);
  271 + // 如果当前用户是客户
  272 + if (getCurrentUser().isCustomerUser()) {
  273 + queryMap.put("customerId", getCurrentUser().getCustomerId().toString());
381 274 }
382   -
383   - @GetMapping("/keys/{organizationId}")
384   - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})")
385   - @ApiOperation("设备遥测指标名称")
386   - public List<String> listKeys(
387   - @ApiParam(value = "组织ID") @PathVariable("organizationId") String organizationId,
388   - @ApiParam(value = "设备ID") @RequestParam(value = "deviceIds",required = false) List<String> deviceIds) throws ThingsboardException {
389   - return deviceService.findDeviceKeys(getCurrentUser().getCurrentTenantId()
390   - ,getCurrentUser().isCustomerUser()?getCurrentUser().getCustomerId().toString():null
391   - , organizationId,deviceIds);
  275 + return deviceService.page(getCurrentUser().getCurrentTenantId(), queryMap);
  276 + }
  277 +
  278 + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})")
  279 + @GetMapping(
  280 + path = {"/relation"},
  281 + params = {PAGE_SIZE, PAGE})
  282 + @ApiOperation("子设备查询")
  283 + public YtPageData<RelationDeviceDTO> pageRelationDevice(
  284 + @RequestParam(PAGE_SIZE) int pageSize,
  285 + @RequestParam(PAGE) int page,
  286 + @RequestParam(value = "name", required = false) String name,
  287 + @RequestParam(value = "deviceState", required = false) DeviceState deviceState,
  288 + @RequestParam(value = "fromId") String fromId,
  289 + @RequestParam(value = ORDER_FILED, required = false) String orderBy,
  290 + @RequestParam(value = ORDER_TYPE, required = false) OrderTypeEnum orderType)
  291 + throws ThingsboardException {
  292 + HashMap<String, Object> queryMap = new HashMap<>();
  293 + queryMap.put(PAGE_SIZE, pageSize);
  294 + queryMap.put(PAGE, page);
  295 + queryMap.put(ORDER_FILED, orderBy);
  296 + queryMap.put("name", name);
  297 + queryMap.put("fromId", fromId);
  298 + queryMap.put("tenantId", getCurrentUser().getCurrentTenantId());
  299 + if (deviceState != null) {
  300 + if (deviceState != DeviceState.INACTIVE) {
  301 + queryMap.put("deviceState", deviceState == DeviceState.ONLINE);
  302 + } else {
  303 + queryMap.put("activeState", DeviceState.INACTIVE);
  304 + }
392 305 }
393   -
394   - @GetMapping("/gateway/{tbDeviceId}")
395   - @ApiOperation("获取网关设备")
396   - public DeviceDTO findGateWayDeviceByTbDeviceId(
397   - @ApiParam(value = "tb设备Id") @PathVariable("tbDeviceId") String tbDeviceId)
398   - throws ThingsboardException {
399   - List<DeviceDTO> list =
400   - deviceService.findGateWayDeviceByTbDeviceId(
401   - getCurrentUser().getCurrentTenantId(), tbDeviceId);
402   - return null != list && list.size() > FastIotConstants.MagicNumber.ZERO
403   - ? list.get(FastIotConstants.MagicNumber.ZERO)
404   - : null;
  306 + if (orderType != null) {
  307 + queryMap.put(ORDER_TYPE, orderType.name());
405 308 }
406   -
407   - private final ObjectMapper objectMapper;
408   -
409   - private Device buildTbDeviceFromDeviceDTO(TenantId tenantId, DeviceDTO deviceDTO) {
410   - Device tbDevice = new Device();
411   - String deviceId = deviceDTO.getTbDeviceId();
412   - if (StringUtils.isNotBlank(deviceId)) {
413   - DeviceId id = new DeviceId(UUID.fromString(deviceId));
414   - tbDevice.setId(id);
415   - }
416   - ObjectNode additionalInfo = objectMapper.createObjectNode();
417   - additionalInfo.put(
418   - "gateway",
419   - Optional.ofNullable(deviceDTO.getDeviceType())
420   - .map(deviceType -> deviceType.equals(DeviceTypeEnum.GATEWAY))
421   - .orElse(false));
422   - additionalInfo.put(
423   - "description",
424   - Optional.ofNullable(deviceDTO.getDeviceInfo())
425   - .map(deviceInfo -> deviceInfo.get("description"))
426   - .map(JsonNode::asText)
427   - .orElse(""));
428   - additionalInfo.put("overwriteActivityTime", false);
429   -
430   - DeviceProfileId deviceProfileId =
431   - new DeviceProfileId(UUID.fromString(deviceDTO.getProfileId()));
432   -
433   - tbDevice.setAdditionalInfo(additionalInfo);
434   - tbDevice.setCustomerId(null);
435   - tbDevice.setDeviceProfileId(deviceProfileId);
436   - tbDevice.setLabel(deviceDTO.getLabel());
437   - tbDevice.setName(deviceDTO.getName());
438   - tbDevice.setCreatedTime(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
439   - tbDevice.setTenantId(tenantId);
440   - return tbDevice;
  309 + // 如果当前用户是客户
  310 + if (getCurrentUser().isCustomerUser()) {
  311 + queryMap.put("customerId", getCurrentUser().getCustomerId().toString());
441 312 }
442   -
443   - /**
444   - * 添加关联关系
445   - *
446   - * @param tenantId 租户ID
447   - * @param gateWayTbDeviceId 网关设备Tb的设备ID
448   - * @param deviceId 设备的tbDeviceId
449   - */
450   - private void addRelation(TenantId tenantId, String gateWayTbDeviceId, String deviceId)
451   - throws ThingsboardException {
452   - EntityRelation relation = new EntityRelation();
453   - relation.setFrom(new DeviceId(UUID.fromString(gateWayTbDeviceId)));
454   - relation.setTypeGroup(RelationTypeGroup.COMMON);
455   - relation.setTo(new DeviceId(UUID.fromString(deviceId)));
456   - relation.setType(FastIotConstants.Relation.relationType);
457   - relationService.saveRelation(tenantId, relation);
458   - sendRelationNotificationMsg(
459   - getTenantId(), relation, EdgeEventActionType.RELATION_ADD_OR_UPDATE);
  313 + return deviceService.pageRelation(queryMap);
  314 + }
  315 +
  316 + @PostMapping("/import")
  317 + @ApiOperation("导入配置")
  318 + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:device:import'})")
  319 + public ResponseEntity<String> importDeviceProfile() {
  320 + // TODO 实现的业务功能
  321 + return ResponseEntity.ok("");
  322 + }
  323 +
  324 + @PostMapping("/export")
  325 + @ApiOperation("导出")
  326 + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:device:export'})")
  327 + public ResponseEntity<String> exportDeviceProfile() {
  328 + // TODO 实现的业务功能
  329 + return ResponseEntity.ok("");
  330 + }
  331 +
  332 + @DeleteMapping
  333 + @ApiOperation("删除")
  334 + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:device:delete'})")
  335 + public void deleteDevices(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO)
  336 + throws ThingsboardException {
  337 + String currentTenantId = getCurrentUser().getCurrentTenantId();
  338 + List<String> tdIds = deviceService.findTbDeviceId(currentTenantId, deleteDTO.getIds());
  339 + for (String id : tdIds) {
  340 + deleteTbDevice(id);
460 341 }
461   - @GetMapping({"used/{id}"})
462   - @ApiOperation("设备是否被占用")
463   - public ResponseResult<Boolean> otherUsing(@PathVariable("id") String deviceId) throws ThingsboardException {
464   - String str = deviceService.otherUsing(deviceId, getCurrentUser().getCurrentTenantId());
465   - ResponseResult result =ResponseResult.success(StringUtils.isEmpty(str)?true:false);
466   - result.setMessage(str);
467   - return result;
  342 + deviceService.deleteDevices(currentTenantId, deleteDTO.getIds());
  343 + }
  344 +
  345 + private void deleteTbDevice(String id) throws ThingsboardException {
  346 + DeviceId deviceId = new DeviceId(toUUID(id));
  347 + Device device = checkDeviceId(deviceId, Operation.DELETE);
  348 +
  349 + List<EdgeId> relatedEdgeIds = findRelatedEdgeIds(getTenantId(), deviceId);
  350 +
  351 + tbDeviceService.deleteDevice(getCurrentUser().getTenantId(), deviceId);
  352 +
  353 + tbClusterService.onDeviceDeleted(device, null);
  354 +
  355 + logEntityAction(deviceId, device, device.getCustomerId(), ActionType.DELETED, null, id);
  356 +
  357 + sendDeleteNotificationMsg(getTenantId(), deviceId, relatedEdgeIds);
  358 + }
  359 +
  360 + @GetMapping("/list/{deviceType}")
  361 + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{})")
  362 + @ApiOperation("获取该组织的所有设备")
  363 + public List<DeviceDTO> getGatewayDevices(
  364 + @ApiParam(value = "组织ID") @RequestParam("organizationId") String organizationId,
  365 + @ApiParam(value = "设备类型") @PathVariable("deviceType") DeviceTypeEnum deviceType)
  366 + throws ThingsboardException {
  367 + return deviceService.findDevicesByDeviceTypeAndOrganizationId(
  368 + deviceType, getCurrentUser().getCurrentTenantId(), organizationId);
  369 + }
  370 +
  371 + @GetMapping("/list/master/{organizationId}")
  372 + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})")
  373 + @ApiOperation("主设备列表")
  374 + public List<SelectItemDTO> getMasterDevices(
  375 + @ApiParam(value = "组织ID") @PathVariable("organizationId") String organizationId)
  376 + throws ThingsboardException {
  377 + return deviceService.findMasterDevices(
  378 + getCurrentUser().getCurrentTenantId(),
  379 + getCurrentUser().isCustomerUser() ? getCurrentUser().getCustomerId().toString() : null,
  380 + organizationId);
  381 + }
  382 +
  383 + @GetMapping("/list/slave/{organizationId}")
  384 + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})")
  385 + @ApiOperation("从设备列表")
  386 + public List<SelectItemDTO> getSlaveDevices(
  387 + @ApiParam(value = "组织ID") @PathVariable("organizationId") String organizationId,
  388 + @ApiParam(value = "主设备ID") @RequestParam(value = "masterId", required = false)
  389 + String masterId)
  390 + throws ThingsboardException {
  391 + return deviceService.findSlaveDevices(
  392 + masterId,
  393 + getCurrentUser().getCurrentTenantId(),
  394 + getCurrentUser().isCustomerUser() ? getCurrentUser().getCurrentUserId() : null,
  395 + organizationId);
  396 + }
  397 +
  398 + @GetMapping("/keys/{organizationId}")
  399 + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})")
  400 + @ApiOperation("设备遥测指标名称")
  401 + public List<String> listKeys(
  402 + @ApiParam(value = "组织ID") @PathVariable("organizationId") String organizationId,
  403 + @ApiParam(value = "设备ID") @RequestParam(value = "deviceIds", required = false)
  404 + List<String> deviceIds)
  405 + throws ThingsboardException {
  406 + return deviceService.findDeviceKeys(
  407 + getCurrentUser().getCurrentTenantId(),
  408 + getCurrentUser().isCustomerUser() ? getCurrentUser().getCustomerId().toString() : null,
  409 + organizationId,
  410 + deviceIds);
  411 + }
  412 +
  413 + @GetMapping("/gateway/{tbDeviceId}")
  414 + @ApiOperation("获取网关设备")
  415 + public DeviceDTO findGateWayDeviceByTbDeviceId(
  416 + @ApiParam(value = "tb设备Id") @PathVariable("tbDeviceId") String tbDeviceId)
  417 + throws ThingsboardException {
  418 + List<DeviceDTO> list =
  419 + deviceService.findGateWayDeviceByTbDeviceId(
  420 + getCurrentUser().getCurrentTenantId(), tbDeviceId);
  421 + return null != list && list.size() > FastIotConstants.MagicNumber.ZERO
  422 + ? list.get(FastIotConstants.MagicNumber.ZERO)
  423 + : null;
  424 + }
  425 +
  426 + @GetMapping("/get_subset/{tbDeviceId}")
  427 + @ApiOperation("获取网关子设备信息")
  428 + public DeviceDTO getSubsetDeviceByTbDeviceId(
  429 + @ApiParam(value = "tb设备Id") @PathVariable("tbDeviceId") String tbDeviceId)
  430 + throws ThingsboardException {
  431 + return deviceService.getSubsetDeviceByTbDeviceId(
  432 + getCurrentUser().getCurrentTenantId(), tbDeviceId);
  433 + }
  434 +
  435 + private Device buildTbDeviceFromDeviceDTO(TenantId tenantId, DeviceDTO deviceDTO) {
  436 + Device tbDevice = new Device();
  437 + String deviceId = deviceDTO.getTbDeviceId();
  438 + if (StringUtils.isNotBlank(deviceId)) {
  439 + DeviceId id = new DeviceId(UUID.fromString(deviceId));
  440 + tbDevice.setId(id);
468 441 }
  442 + ObjectNode additionalInfo = objectMapper.createObjectNode();
  443 + additionalInfo.put(
  444 + "gateway",
  445 + Optional.ofNullable(deviceDTO.getDeviceType())
  446 + .map(deviceType -> deviceType.equals(DeviceTypeEnum.GATEWAY))
  447 + .orElse(false));
  448 + additionalInfo.put(
  449 + "description",
  450 + Optional.ofNullable(deviceDTO.getDeviceInfo())
  451 + .map(deviceInfo -> deviceInfo.get("description"))
  452 + .map(JsonNode::asText)
  453 + .orElse(""));
  454 + additionalInfo.put("overwriteActivityTime", false);
  455 +
  456 + DeviceProfileId deviceProfileId =
  457 + new DeviceProfileId(UUID.fromString(deviceDTO.getProfileId()));
  458 +
  459 + tbDevice.setAdditionalInfo(additionalInfo);
  460 + tbDevice.setCustomerId(null);
  461 + tbDevice.setDeviceProfileId(deviceProfileId);
  462 + tbDevice.setLabel(deviceDTO.getLabel());
  463 + tbDevice.setName(deviceDTO.getName());
  464 + tbDevice.setCreatedTime(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
  465 + tbDevice.setTenantId(tenantId);
  466 + return tbDevice;
  467 + }
  468 +
  469 + /**
  470 + * 添加关联关系
  471 + *
  472 + * @param tenantId 租户ID
  473 + * @param gateWayTbDeviceId 网关设备Tb的设备ID
  474 + * @param deviceId 设备的tbDeviceId
  475 + */
  476 + private void addRelation(TenantId tenantId, String gateWayTbDeviceId, String deviceId)
  477 + throws ThingsboardException {
  478 + EntityRelation relation = new EntityRelation();
  479 + relation.setFrom(new DeviceId(UUID.fromString(gateWayTbDeviceId)));
  480 + relation.setTypeGroup(RelationTypeGroup.COMMON);
  481 + relation.setTo(new DeviceId(UUID.fromString(deviceId)));
  482 + relation.setType(FastIotConstants.Relation.relationType);
  483 + relationService.saveRelation(tenantId, relation);
  484 + sendRelationNotificationMsg(
  485 + getTenantId(), relation, EdgeEventActionType.RELATION_ADD_OR_UPDATE);
  486 + }
  487 +
  488 + @GetMapping({"used/{id}"})
  489 + @ApiOperation("设备是否被占用")
  490 + public ResponseResult<Boolean> otherUsing(@PathVariable("id") String deviceId)
  491 + throws ThingsboardException {
  492 + String str = deviceService.otherUsing(deviceId, getCurrentUser().getCurrentTenantId());
  493 + ResponseResult result = ResponseResult.success(StringUtils.isEmpty(str) ? true : false);
  494 + result.setMessage(str);
  495 + return result;
  496 + }
469 497 }
... ...
... ... @@ -44,461 +44,497 @@ import java.util.stream.Collectors;
44 44 @RequiredArgsConstructor
45 45 @Slf4j
46 46 public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDevice>
47   - implements YtDeviceService {
  47 + implements YtDeviceService {
48 48
49   - private final DeviceProfileDao deviceProfileDao;
  49 + private final DeviceProfileDao deviceProfileDao;
50 50
51   - private final OrganizationMapper ytOrganizationMapper;
52   - private final SceneLinkageMapper sceneLinkageMapper;
53   - private final TriggerMapper triggerMapper;
54   - private final DoConditionMapper conditionMapper;
55   - private final DoActionMapper actionMapper;
  51 + private final OrganizationMapper ytOrganizationMapper;
  52 + private final SceneLinkageMapper sceneLinkageMapper;
  53 + private final TriggerMapper triggerMapper;
  54 + private final DoConditionMapper conditionMapper;
  55 + private final DoActionMapper actionMapper;
56 56
57   - @Override
58   - @Transactional
59   - public DeviceDTO insertOrUpdate(String tenantId, DeviceDTO deviceDTO) {
  57 + @Override
  58 + @Transactional
  59 + public DeviceDTO insertOrUpdate(String tenantId, DeviceDTO deviceDTO) {
60 60
61   - if (StringUtils.isBlank(deviceDTO.getId())) {
62   - return insert(deviceDTO);
63   - } else {
64   - return update(deviceDTO);
65   - }
  61 + if (StringUtils.isBlank(deviceDTO.getId())) {
  62 + return insert(deviceDTO);
  63 + } else {
  64 + return update(deviceDTO);
66 65 }
67   -
68   - private DeviceDTO update(DeviceDTO deviceDTO) {
69   -
70   - validateUpdate(deviceDTO);
71   -
72   - YtDevice device = new YtDevice();
73   - deviceDTO.copyToEntity(
74   - device,
75   - ModelConstants.TablePropertyMapping.ACTIVE_TIME,
76   - ModelConstants.TablePropertyMapping.DEVICE_STATE,
77   - ModelConstants.TablePropertyMapping.TB_DEVICE_ID,
78   - ModelConstants.TablePropertyMapping.TENANT_CODE,
79   - ModelConstants.TablePropertyMapping.CREATOR,
80   - ModelConstants.TablePropertyMapping.UPDATER,
81   - ModelConstants.TablePropertyMapping.CREATE_TIME,
82   - ModelConstants.TablePropertyMapping.UPDATE,
83   - ModelConstants.TablePropertyMapping.UPDATE_TIME);
84   - baseMapper.updateById(device);
85   - return device.getDTO(DeviceDTO.class);
86   - }
87   -
88   - private void validateUpdate(DeviceDTO deviceDTO) {
89   - if (StringUtils.isEmpty(deviceDTO.getName())) {
90   - throw new YtDataValidationException("device name must be specific");
91   - }
92   - }
93   -
94   - @Override
95   - public boolean validateFormdata(String currentTenantId, DeviceDTO deviceDTO) {
96   - boolean insert = StringUtils.isBlank(deviceDTO.getId());
97   - String deviceTenantId = deviceDTO.getTenantId();
98   - if (StringUtils.isBlank(deviceDTO.getName())) {
99   - throw new YtDataValidationException("device name cannot be blank");
100   - }
101   - // validate IOT DB
102   - if (StringUtils.isBlank(deviceDTO.getProfileId())) {
103   - throw new YtDataValidationException("device profile cannot be blank");
104   - }
105   -
106   - // 验证设备名称是否已经存在 如果此处直接使用deviceDTO 将有误
107   - if (insert) {
108   - DeviceDTO check = new DeviceDTO();
109   - check.setName(deviceDTO.getName());
110   - if (findTbDeviceId(deviceTenantId, check).size() > 0) {
111   - throw new YtDataValidationException(ErrorMessage.NAME_ALREADY_EXISTS.getMessage());
112   - }
113   -
114   - deviceTenantId = currentTenantId;
115   - deviceDTO.setTenantId(currentTenantId);
116   - } else {
117   - deviceTenantId = deviceDTO.getTenantId();
118   - YtDevice device = baseMapper.selectById(deviceDTO.getId());
119   - if (device == null) {
120   - throw new YtDataValidationException("设备不存在!");
121   - }
122   - if (!device.getTenantId().equals(currentTenantId)) {
123   - throw new YtDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage());
124   - }
125   - String oldOrganizationId = device.getOrganizationId();
126   - if (!oldOrganizationId.equals(deviceDTO.getOrganizationId())) {
127   - sceneNotUsed(currentTenantId, deviceDTO.getTbDeviceId(), oldOrganizationId);
128   - }
129   - }
130   - // 验证数据profileId的正确性
131   - TenantId id = TenantId.fromUUID(UUID.fromString(deviceTenantId));
132   - DeviceProfile deviceProfile =
133   - deviceProfileDao.findById(id, UUID.fromString(deviceDTO.getProfileId()));
134   - Organization organization = ytOrganizationMapper.selectById(deviceDTO.getOrganizationId());
135   - if (null == deviceProfile || null == organization) {
136   - throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
137   - } else if (!organization.getTenantId().equals(deviceTenantId)) {
138   - throw new YtDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage());
139   - }
140   - return true;
  66 + }
  67 +
  68 + private DeviceDTO update(DeviceDTO deviceDTO) {
  69 +
  70 + validateUpdate(deviceDTO);
  71 +
  72 + YtDevice device = new YtDevice();
  73 + deviceDTO.copyToEntity(
  74 + device,
  75 + ModelConstants.TablePropertyMapping.ACTIVE_TIME,
  76 + ModelConstants.TablePropertyMapping.DEVICE_STATE,
  77 + ModelConstants.TablePropertyMapping.TB_DEVICE_ID,
  78 + ModelConstants.TablePropertyMapping.TENANT_CODE,
  79 + ModelConstants.TablePropertyMapping.CREATOR,
  80 + ModelConstants.TablePropertyMapping.UPDATER,
  81 + ModelConstants.TablePropertyMapping.CREATE_TIME,
  82 + ModelConstants.TablePropertyMapping.UPDATE,
  83 + ModelConstants.TablePropertyMapping.UPDATE_TIME);
  84 + baseMapper.updateById(device);
  85 + return device.getDTO(DeviceDTO.class);
  86 + }
  87 +
  88 + private void validateUpdate(DeviceDTO deviceDTO) {
  89 + if (StringUtils.isEmpty(deviceDTO.getName())) {
  90 + throw new YtDataValidationException("device name must be specific");
141 91 }
142   -
143   - /**
144   - * 场景联动是否在使用该设备
145   - *
146   - * @param tbDeviceId 设备接入平台的设备主键
147   - * @param organizationId 组织主键
148   - * @return
149   - */
150   - private boolean sceneNotUsed(String tenantId, String tbDeviceId, String organizationId) {
151   - boolean result = true;
152   - /**激活的场景联动使用了设备,例如:触发器、自行条件、动作等。*/
153   - List<SceneLinkage> scenes = sceneLinkageMapper.selectList(new QueryWrapper<SceneLinkage>().lambda()
154   - .eq(SceneLinkage::getTenantId, tenantId)
155   - .eq(StringUtils.isNotEmpty(organizationId), SceneLinkage::getOrganizationId, organizationId)
156   - );
157   - if (scenes == null || scenes.isEmpty()) {
158   - return true;
159   - }
160   - Set<String> sceneNames = new HashSet<>();
161   - for (SceneLinkage scene : scenes) {
162   - List<Trigger> triggers = triggerMapper.selectList(new QueryWrapper<Trigger>().lambda()
163   - .eq(Trigger::getSceneLinkageId, scene.getId())
164   - .eq(scene.getStatus() == FastIotConstants.StateValue.DISABLE, Trigger::getTriggerType, ScopeEnum.PART)
165   - .like(Trigger::getEntityId, tbDeviceId));
166   - if (triggers != null && triggers.size() > 0) {
167   - sceneNames.add(scene.getName());
168   - }
169   - List<DoCondition> conditions = conditionMapper.selectList(new QueryWrapper<DoCondition>().lambda()
170   - .eq(DoCondition::getSceneLinkageId, scene.getId())
171   - .eq(scene.getStatus() == FastIotConstants.StateValue.DISABLE, DoCondition::getEntityType, ScopeEnum.PART)
172   - .like(DoCondition::getEntityId, tbDeviceId));
173   - if (conditions != null && conditions.size() > 0) {
174   - sceneNames.add(scene.getName());
175   - }
176   - List<DoAction> actions = actionMapper.selectList(new QueryWrapper<DoAction>().lambda()
177   - .eq(DoAction::getSceneLinkageId, scene.getId())
178   - .eq(scene.getStatus() == FastIotConstants.StateValue.DISABLE, DoAction::getEntityType, ScopeEnum.PART)
179   - .like(DoAction::getDeviceId, tbDeviceId));
180   - if (actions != null && actions.size() > 0) {
181   - sceneNames.add(scene.getName());
182   - }
183   -
184   - }
185   - if(sceneNames.size()>0){
186   - throw new YtDataValidationException(String.format(ErrorMessage.DEVICE_USED_SCENE_REACT.getMessage(), sceneNames));
187   - }
188   -
189   -
190   - return result;
191   -
192   - }
193   -
194   - private DeviceDTO insert(DeviceDTO deviceDTO) {
195   -
196   - YtDevice device = new YtDevice();
197   - deviceDTO.copyToEntity(
198   - device,
199   - ModelConstants.TablePropertyMapping.ACTIVE_TIME,
200   - ModelConstants.TablePropertyMapping.DEVICE_STATE,
201   - ModelConstants.TablePropertyMapping.CREATOR,
202   - ModelConstants.TablePropertyMapping.UPDATER,
203   - ModelConstants.TablePropertyMapping.CREATE_TIME,
204   - ModelConstants.TablePropertyMapping.UPDATE,
205   - ModelConstants.TablePropertyMapping.UPDATE_TIME);
206   -
207   - device.setAlarmStatus(0);
208   - baseMapper.insert(device);
209   - return device.getDTO(DeviceDTO.class);
  92 + }
  93 +
  94 + @Override
  95 + public boolean validateFormdata(String currentTenantId, DeviceDTO deviceDTO) {
  96 + boolean insert = StringUtils.isBlank(deviceDTO.getId());
  97 + String deviceTenantId = deviceDTO.getTenantId();
  98 + if (StringUtils.isBlank(deviceDTO.getName())) {
  99 + throw new YtDataValidationException("device name cannot be blank");
210 100 }
211   -
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   - for (String tbDeviceId : tbDeviceIds) {
225   - sceneNotUsed(tenantId, tbDeviceId, null);
226   - }
227   - return tbDeviceIds;
  101 + // validate IOT DB
  102 + if (StringUtils.isBlank(deviceDTO.getProfileId())) {
  103 + throw new YtDataValidationException("device profile cannot be blank");
228 104 }
229 105
230   - @Override
231   - public List<DeviceDTO> findDevicesByDeviceTypeAndOrganizationId(
232   - DeviceTypeEnum deviceType, String tenantId, String organizationId) {
233   - List<String> orgIds = organizationAllIds(tenantId,organizationId);
234   - return ReflectUtils.sourceToTarget(
235   - baseMapper.selectList(
236   - new LambdaQueryWrapper<YtDevice>()
237   - .eq(YtDevice::getDeviceType, deviceType)
238   - .in(YtDevice::getOrganizationId, orgIds)),
239   - DeviceDTO.class);
  106 + // 验证设备名称是否已经存在 如果此处直接使用deviceDTO 将有误
  107 + if (insert) {
  108 + DeviceDTO check = new DeviceDTO();
  109 + check.setName(deviceDTO.getName());
  110 + if (findTbDeviceId(deviceTenantId, check).size() > 0) {
  111 + throw new YtDataValidationException(ErrorMessage.NAME_ALREADY_EXISTS.getMessage());
  112 + }
  113 +
  114 + deviceTenantId = currentTenantId;
  115 + deviceDTO.setTenantId(currentTenantId);
  116 + } else {
  117 + deviceTenantId = deviceDTO.getTenantId();
  118 + YtDevice device = baseMapper.selectById(deviceDTO.getId());
  119 + if (device == null) {
  120 + throw new YtDataValidationException("设备不存在!");
  121 + }
  122 + if (!device.getTenantId().equals(currentTenantId)) {
  123 + throw new YtDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage());
  124 + }
  125 + String oldOrganizationId = device.getOrganizationId();
  126 + if (!oldOrganizationId.equals(deviceDTO.getOrganizationId())) {
  127 + sceneNotUsed(currentTenantId, deviceDTO.getTbDeviceId(), oldOrganizationId);
  128 + }
240 129 }
241   -
242   - @Override
243   - public DeviceDTO checkDeviceByTenantIdAndDeviceId(String tenantId, String deviceId) {
244   - if (StringUtils.isEmpty(tenantId) || StringUtils.isEmpty(deviceId)) {
245   - throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
246   - }
247   - return baseMapper
248   - .selectOne(
249   - new LambdaQueryWrapper<YtDevice>()
250   - .eq(YtDevice::getTenantId, tenantId)
251   - .eq(YtDevice::getId, deviceId))
252   - .getDTO(DeviceDTO.class);
  130 + // 验证数据profileId的正确性
  131 + TenantId id = TenantId.fromUUID(UUID.fromString(deviceTenantId));
  132 + DeviceProfile deviceProfile =
  133 + deviceProfileDao.findById(id, UUID.fromString(deviceDTO.getProfileId()));
  134 + Organization organization = ytOrganizationMapper.selectById(deviceDTO.getOrganizationId());
  135 + if (null == deviceProfile || null == organization) {
  136 + throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
  137 + } else if (!organization.getTenantId().equals(deviceTenantId)) {
  138 + throw new YtDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage());
253 139 }
254   -
255   - @Override
256   - public List<DeviceDTO> findGateWayDeviceByTbDeviceId(String tenantId, String tbDeviceId) {
257   - checkDeviceByTenantIdAndId(tenantId, tbDeviceId, true);
258   - return baseMapper.findGateWayDeviceByTbDeviceId(tbDeviceId);
  140 + return true;
  141 + }
  142 +
  143 + /**
  144 + * 场景联动是否在使用该设备
  145 + *
  146 + * @param tbDeviceId 设备接入平台的设备主键
  147 + * @param organizationId 组织主键
  148 + * @return
  149 + */
  150 + private boolean sceneNotUsed(String tenantId, String tbDeviceId, String organizationId) {
  151 + boolean result = true;
  152 + /** 激活的场景联动使用了设备,例如:触发器、自行条件、动作等。 */
  153 + List<SceneLinkage> scenes =
  154 + sceneLinkageMapper.selectList(
  155 + new QueryWrapper<SceneLinkage>()
  156 + .lambda()
  157 + .eq(SceneLinkage::getTenantId, tenantId)
  158 + .eq(
  159 + StringUtils.isNotEmpty(organizationId),
  160 + SceneLinkage::getOrganizationId,
  161 + organizationId));
  162 + if (scenes == null || scenes.isEmpty()) {
  163 + return true;
259 164 }
260   -
261   - @Override
262   - public DeviceDTO checkDeviceByTenantIdAndId(
263   - String tenantId, String deviceId, boolean isTbDeviceId) {
264   - if (StringUtils.isEmpty(deviceId) || StringUtils.isEmpty(tenantId)) {
265   - throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
266   - }
267   - YtDevice device =
268   - baseMapper.selectOne(
269   - new LambdaQueryWrapper<YtDevice>()
270   - .eq(YtDevice::getTenantId, tenantId)
271   - .eq(isTbDeviceId, YtDevice::getTbDeviceId, deviceId)
272   - .eq(!isTbDeviceId, YtDevice::getId, deviceId));
273   - DeviceDTO deviceDTO = null != device ? device.getDTO(DeviceDTO.class) : null;
274   - if (null == deviceDTO) {
275   - throw new YtDataValidationException(ErrorMessage.DEVICE_NOT_EXISTENCE_IN_TENANT.getMessage());
276   - }
277   - return deviceDTO;
  165 + Set<String> sceneNames = new HashSet<>();
  166 + for (SceneLinkage scene : scenes) {
  167 + List<Trigger> triggers =
  168 + triggerMapper.selectList(
  169 + new QueryWrapper<Trigger>()
  170 + .lambda()
  171 + .eq(Trigger::getSceneLinkageId, scene.getId())
  172 + .eq(
  173 + scene.getStatus() == FastIotConstants.StateValue.DISABLE,
  174 + Trigger::getTriggerType,
  175 + ScopeEnum.PART)
  176 + .like(Trigger::getEntityId, tbDeviceId));
  177 + if (triggers != null && triggers.size() > 0) {
  178 + sceneNames.add(scene.getName());
  179 + }
  180 + List<DoCondition> conditions =
  181 + conditionMapper.selectList(
  182 + new QueryWrapper<DoCondition>()
  183 + .lambda()
  184 + .eq(DoCondition::getSceneLinkageId, scene.getId())
  185 + .eq(
  186 + scene.getStatus() == FastIotConstants.StateValue.DISABLE,
  187 + DoCondition::getEntityType,
  188 + ScopeEnum.PART)
  189 + .like(DoCondition::getEntityId, tbDeviceId));
  190 + if (conditions != null && conditions.size() > 0) {
  191 + sceneNames.add(scene.getName());
  192 + }
  193 + List<DoAction> actions =
  194 + actionMapper.selectList(
  195 + new QueryWrapper<DoAction>()
  196 + .lambda()
  197 + .eq(DoAction::getSceneLinkageId, scene.getId())
  198 + .eq(
  199 + scene.getStatus() == FastIotConstants.StateValue.DISABLE,
  200 + DoAction::getEntityType,
  201 + ScopeEnum.PART)
  202 + .like(DoAction::getDeviceId, tbDeviceId));
  203 + if (actions != null && actions.size() > 0) {
  204 + sceneNames.add(scene.getName());
  205 + }
278 206 }
279   -
280   - @Override
281   - @Transactional
282   - public void deleteDevices(String tenantId, Set<String> ids) {
283   - LambdaQueryWrapper<YtDevice> queryWrapper =
284   - new QueryWrapper<YtDevice>()
285   - .lambda()
286   - .eq(YtDevice::getTenantId, tenantId)
287   - .in(YtDevice::getId, ids);
288   -
289   - baseMapper.delete(queryWrapper);
  207 + if (sceneNames.size() > 0) {
  208 + throw new YtDataValidationException(
  209 + String.format(ErrorMessage.DEVICE_USED_SCENE_REACT.getMessage(), sceneNames));
290 210 }
291 211
292   - @Override
293   - public Optional<DeviceDTO> getDevice(String tenantId, String id) {
294   - return Optional.ofNullable(baseMapper.selectDetail(tenantId, id));
  212 + return result;
  213 + }
  214 +
  215 + private DeviceDTO insert(DeviceDTO deviceDTO) {
  216 +
  217 + YtDevice device = new YtDevice();
  218 + deviceDTO.copyToEntity(
  219 + device,
  220 + ModelConstants.TablePropertyMapping.ACTIVE_TIME,
  221 + ModelConstants.TablePropertyMapping.DEVICE_STATE,
  222 + ModelConstants.TablePropertyMapping.CREATOR,
  223 + ModelConstants.TablePropertyMapping.UPDATER,
  224 + ModelConstants.TablePropertyMapping.CREATE_TIME,
  225 + ModelConstants.TablePropertyMapping.UPDATE,
  226 + ModelConstants.TablePropertyMapping.UPDATE_TIME);
  227 +
  228 + device.setAlarmStatus(0);
  229 + baseMapper.insert(device);
  230 + return device.getDTO(DeviceDTO.class);
  231 + }
  232 +
  233 + @Override
  234 + public List<String> findTbDeviceId(String tenantId, Set<String> ids) {
  235 + LambdaQueryWrapper<YtDevice> queryWrapper =
  236 + new QueryWrapper<YtDevice>()
  237 + .lambda()
  238 + .eq(YtDevice::getTenantId, tenantId)
  239 + .in(YtDevice::getId, ids);
  240 +
  241 + List<String> tbDeviceIds =
  242 + baseMapper.selectList(queryWrapper).stream()
  243 + .map(YtDevice::getTbDeviceId)
  244 + .collect(Collectors.toList());
  245 + for (String tbDeviceId : tbDeviceIds) {
  246 + sceneNotUsed(tenantId, tbDeviceId, null);
295 247 }
296   -
297   - @Override
298   - public YtPageData<DeviceDTO> page(String tenantId, Map<String, Object> queryMap) {
299   - queryMap.put("tenantId", tenantId);
300   - String organizationId = (String) queryMap.get("organizationId");
301   - if (!StringUtils.isEmpty(organizationId)) {
302   - List<String> queryOrganizationIds = organizationAllIds(tenantId, organizationId);
303   - queryMap.put("organizationIds", queryOrganizationIds);
304   - }
305   - IPage<YtDevice> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
306   - IPage<DeviceDTO> deviceIPage = baseMapper.getDevicePage(page, queryMap);
307   - List<DeviceDTO> records = deviceIPage.getRecords();
308   - records.forEach(
309   - deviceDTO -> {
310   - if (null != deviceDTO.getCustomerId()
311   - && deviceDTO.getCustomerId().equals(EntityId.NULL_UUID.toString())) {
312   - deviceDTO.setCustomerId(null);
313   - }
314   - });
315   - return new YtPageData<>(records, deviceIPage.getTotal());
  248 + return tbDeviceIds;
  249 + }
  250 +
  251 + @Override
  252 + public List<DeviceDTO> findDevicesByDeviceTypeAndOrganizationId(
  253 + DeviceTypeEnum deviceType, String tenantId, String organizationId) {
  254 + List<String> orgIds = organizationAllIds(tenantId, organizationId);
  255 + return ReflectUtils.sourceToTarget(
  256 + baseMapper.selectList(
  257 + new LambdaQueryWrapper<YtDevice>()
  258 + .eq(YtDevice::getDeviceType, deviceType)
  259 + .in(YtDevice::getOrganizationId, orgIds)),
  260 + DeviceDTO.class);
  261 + }
  262 +
  263 + @Override
  264 + public DeviceDTO checkDeviceByTenantIdAndDeviceId(String tenantId, String deviceId) {
  265 + if (StringUtils.isEmpty(tenantId) || StringUtils.isEmpty(deviceId)) {
  266 + throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
316 267 }
317   -
318   - /**
319   - * 组织结构下的所有组织ID
320   - * @param tenantId 租户ID
321   - * @param organizationId 组织ID
322   - * @return
323   - */
324   - @NotNull
325   - private List<String> organizationAllIds(String tenantId, String organizationId) {
326   - List<String> organizationIds = new ArrayList<>();
327   - organizationIds.add(organizationId);
328   - // 查询该组织的所有子类
329   - List<OrganizationDTO> organizationDTOS =
330   - ytOrganizationMapper.findOrganizationTreeList(tenantId, organizationIds);
331   - List<String> queryOrganizationIds = new ArrayList<>();
332   - organizationDTOS.forEach(
333   - item -> {
334   - queryOrganizationIds.add(item.getId());
335   - });
336   - return queryOrganizationIds;
  268 + return baseMapper
  269 + .selectOne(
  270 + new LambdaQueryWrapper<YtDevice>()
  271 + .eq(YtDevice::getTenantId, tenantId)
  272 + .eq(YtDevice::getId, deviceId))
  273 + .getDTO(DeviceDTO.class);
  274 + }
  275 +
  276 + @Override
  277 + public List<DeviceDTO> findGateWayDeviceByTbDeviceId(String tenantId, String tbDeviceId) {
  278 + checkDeviceByTenantIdAndId(tenantId, tbDeviceId, true);
  279 + return baseMapper.findGateWayDeviceByTbDeviceId(tbDeviceId);
  280 + }
  281 +
  282 + @Override
  283 + public DeviceDTO checkDeviceByTenantIdAndId(
  284 + String tenantId, String deviceId, boolean isTbDeviceId) {
  285 + if (StringUtils.isEmpty(deviceId) || StringUtils.isEmpty(tenantId)) {
  286 + throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
337 287 }
338   -
339   - @Override
340   - public YtPageData<RelationDeviceDTO> pageRelation(Map<String, Object> queryMap) {
341   - IPage<YtDevice> page = getPage(queryMap, "last_online_time", false);
342   - IPage<RelationDeviceDTO> deviceIPage = baseMapper.getRelationDevicePage(page, queryMap);
343   - List<RelationDeviceDTO> records = deviceIPage.getRecords();
344   - return new YtPageData<>(records, deviceIPage.getTotal());
  288 + YtDevice device =
  289 + baseMapper.selectOne(
  290 + new LambdaQueryWrapper<YtDevice>()
  291 + .eq(YtDevice::getTenantId, tenantId)
  292 + .eq(isTbDeviceId, YtDevice::getTbDeviceId, deviceId)
  293 + .eq(!isTbDeviceId, YtDevice::getId, deviceId));
  294 + DeviceDTO deviceDTO = null != device ? device.getDTO(DeviceDTO.class) : null;
  295 + if (null == deviceDTO) {
  296 + throw new YtDataValidationException(ErrorMessage.DEVICE_NOT_EXISTENCE_IN_TENANT.getMessage());
345 297 }
346   -
347   - @Override
348   - public List<DeviceDTO> findTbDeviceId(String tenantId, DeviceDTO deviceDTO) {
349   - List<YtDevice> deviceList =
350   - baseMapper.selectList(
351   - new QueryWrapper<YtDevice>()
352   - .lambda()
353   - .eq(true, YtDevice::getTenantId, tenantId)
354   - .eq(
355   - StringUtils.isNotBlank(deviceDTO.getName()),
356   - YtDevice::getName,
357   - deviceDTO.getName()));
358   - return ReflectUtils.sourceToTarget(deviceList, DeviceDTO.class);
  298 + return deviceDTO;
  299 + }
  300 +
  301 + @Override
  302 + @Transactional
  303 + public void deleteDevices(String tenantId, Set<String> ids) {
  304 + LambdaQueryWrapper<YtDevice> queryWrapper =
  305 + new QueryWrapper<YtDevice>()
  306 + .lambda()
  307 + .eq(YtDevice::getTenantId, tenantId)
  308 + .in(YtDevice::getId, ids);
  309 +
  310 + baseMapper.delete(queryWrapper);
  311 + }
  312 +
  313 + @Override
  314 + public Optional<DeviceDTO> getDevice(String tenantId, String id) {
  315 + return Optional.ofNullable(baseMapper.selectDetail(tenantId, id));
  316 + }
  317 +
  318 + @Override
  319 + public YtPageData<DeviceDTO> page(String tenantId, Map<String, Object> queryMap) {
  320 + queryMap.put("tenantId", tenantId);
  321 + String organizationId = (String) queryMap.get("organizationId");
  322 + if (!StringUtils.isEmpty(organizationId)) {
  323 + List<String> queryOrganizationIds = organizationAllIds(tenantId, organizationId);
  324 + queryMap.put("organizationIds", queryOrganizationIds);
359 325 }
360   -
361   - @Override
362   - public boolean freshAlarmStatus(EntityId tbDeviceId, Integer created) {
363   - return baseMapper.freshAlarmStatus(tbDeviceId.getId().toString(), created);
  326 + IPage<YtDevice> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
  327 + IPage<DeviceDTO> deviceIPage = baseMapper.getDevicePage(page, queryMap);
  328 + List<DeviceDTO> records = deviceIPage.getRecords();
  329 + records.forEach(
  330 + deviceDTO -> {
  331 + if (null != deviceDTO.getCustomerId()
  332 + && deviceDTO.getCustomerId().equals(EntityId.NULL_UUID.toString())) {
  333 + deviceDTO.setCustomerId(null);
  334 + }
  335 + });
  336 + return new YtPageData<>(records, deviceIPage.getTotal());
  337 + }
  338 +
  339 + /**
  340 + * 组织结构下的所有组织ID
  341 + *
  342 + * @param tenantId 租户ID
  343 + * @param organizationId 组织ID
  344 + * @return
  345 + */
  346 + @NotNull
  347 + private List<String> organizationAllIds(String tenantId, String organizationId) {
  348 + List<String> organizationIds = new ArrayList<>();
  349 + organizationIds.add(organizationId);
  350 + // 查询该组织的所有子类
  351 + List<OrganizationDTO> organizationDTOS =
  352 + ytOrganizationMapper.findOrganizationTreeList(tenantId, organizationIds);
  353 + List<String> queryOrganizationIds = new ArrayList<>();
  354 + organizationDTOS.forEach(
  355 + item -> {
  356 + queryOrganizationIds.add(item.getId());
  357 + });
  358 + return queryOrganizationIds;
  359 + }
  360 +
  361 + @Override
  362 + public YtPageData<RelationDeviceDTO> pageRelation(Map<String, Object> queryMap) {
  363 + IPage<YtDevice> page = getPage(queryMap, "last_online_time", false);
  364 + IPage<RelationDeviceDTO> deviceIPage = baseMapper.getRelationDevicePage(page, queryMap);
  365 + List<RelationDeviceDTO> records = deviceIPage.getRecords();
  366 + return new YtPageData<>(records, deviceIPage.getTotal());
  367 + }
  368 +
  369 + @Override
  370 + public List<DeviceDTO> findTbDeviceId(String tenantId, DeviceDTO deviceDTO) {
  371 + List<YtDevice> deviceList =
  372 + baseMapper.selectList(
  373 + new QueryWrapper<YtDevice>()
  374 + .lambda()
  375 + .eq(true, YtDevice::getTenantId, tenantId)
  376 + .eq(
  377 + StringUtils.isNotBlank(deviceDTO.getName()),
  378 + YtDevice::getName,
  379 + deviceDTO.getName()));
  380 + return ReflectUtils.sourceToTarget(deviceList, DeviceDTO.class);
  381 + }
  382 +
  383 + @Override
  384 + public boolean freshAlarmStatus(EntityId tbDeviceId, Integer created) {
  385 + return baseMapper.freshAlarmStatus(tbDeviceId.getId().toString(), created);
  386 + }
  387 +
  388 + @Override
  389 + public String generateSn() {
  390 + StringBuilder snBuilder = new StringBuilder();
  391 + for (int i = 0; i < 2; i++) {
  392 + // 生成uuid的hashCode值
  393 + int hashCode = UUID.randomUUID().toString().hashCode();
  394 + // 可能为负数
  395 + if (hashCode < 0) {
  396 + hashCode = -hashCode;
  397 + }
  398 + snBuilder.append(hashCode);
364 399 }
365 400
  401 + return snBuilder.substring(0, 16);
  402 + }
366 403
367   - @Override
368   - public String generateSn() {
369   - StringBuilder snBuilder = new StringBuilder();
370   - for (int i = 0; i < 2; i++) {
371   - //生成uuid的hashCode值
372   - int hashCode = UUID.randomUUID().toString().hashCode();
373   - //可能为负数
374   - if (hashCode < 0) {
375   - hashCode = -hashCode;
376   - }
377   - snBuilder.append(hashCode);
378   -
379   - }
380   -
381   - return snBuilder.substring(0, 16);
  404 + @Override
  405 + public String otherUsing(String deviceId, String tenantId) {
  406 + YtDevice device = baseMapper.selectById(deviceId);
  407 + if (device == null) {
  408 + throw new YtDataValidationException(ErrorMessage.DEVICE_NOT_EXTIED.getMessage());
382 409 }
383   -
384   -
385   - @Override
386   - public String otherUsing(String deviceId,String tenantId) {
387   - YtDevice device = baseMapper.selectById(deviceId);
388   - if(device == null){
389   - throw new YtDataValidationException(ErrorMessage.DEVICE_NOT_EXTIED.getMessage());
390   - }
391   - String tbDeviceId = device.getTbDeviceId();
392   -
393   - return usedBySceneLinkage(tenantId, tbDeviceId);
  410 + String tbDeviceId = device.getTbDeviceId();
  411 +
  412 + return usedBySceneLinkage(tenantId, tbDeviceId);
  413 + }
  414 +
  415 + @Nullable
  416 + private String usedBySceneLinkage(String tenantId, String tbDeviceId) {
  417 + LambdaQueryWrapper<SceneLinkage> sceneFilter =
  418 + new QueryWrapper<SceneLinkage>().lambda().eq(SceneLinkage::getTenantId, tenantId)
  419 + // .eq(SceneLinkage::getStatus, 1)
  420 + ;
  421 + Optional<List<SceneLinkage>> scenes =
  422 + Optional.ofNullable(sceneLinkageMapper.selectList(sceneFilter));
  423 + if (scenes.isEmpty()) {
  424 + return "";
394 425 }
395   -
396   - @Nullable
397   - private String usedBySceneLinkage(String tenantId, String tbDeviceId) {
398   - LambdaQueryWrapper<SceneLinkage> sceneFilter =
399   - new QueryWrapper<SceneLinkage>()
400   - .lambda()
401   - .eq(SceneLinkage::getTenantId, tenantId)
402   -// .eq(SceneLinkage::getStatus, 1)
403   - ;
404   - Optional<List<SceneLinkage>> scenes= Optional.ofNullable(sceneLinkageMapper.selectList(sceneFilter));
405   - if(scenes.isEmpty()){
406   - return "";
407   - }
408   - Set<String> usedIds = new HashSet<>();
409   - List<String> scenFilterIds = scenes.get().stream()
410   - .map(i -> i.getId()).collect(Collectors.toList());
411   - LambdaQueryWrapper<Trigger> triggerFilter =
412   - new QueryWrapper<Trigger>()
413   - .lambda()
414   - .in(scenFilterIds.size()>0,Trigger::getSceneLinkageId, scenFilterIds)
415   - .like(Trigger::getEntityId, tbDeviceId);
416   - List<Trigger> triggers = triggerMapper.selectList(triggerFilter);
417   - triggers.forEach(item ->{
418   - usedIds.add(item.getSceneLinkageId());
  426 + Set<String> usedIds = new HashSet<>();
  427 + List<String> scenFilterIds =
  428 + scenes.get().stream().map(i -> i.getId()).collect(Collectors.toList());
  429 + LambdaQueryWrapper<Trigger> triggerFilter =
  430 + new QueryWrapper<Trigger>()
  431 + .lambda()
  432 + .in(scenFilterIds.size() > 0, Trigger::getSceneLinkageId, scenFilterIds)
  433 + .like(Trigger::getEntityId, tbDeviceId);
  434 + List<Trigger> triggers = triggerMapper.selectList(triggerFilter);
  435 + triggers.forEach(
  436 + item -> {
  437 + usedIds.add(item.getSceneLinkageId());
419 438 });
420 439
421   - LambdaQueryWrapper<DoCondition> conditionFilter =
422   - new QueryWrapper<DoCondition>()
423   - .lambda()
424   - .in(scenFilterIds.size()>0,DoCondition::getSceneLinkageId, scenFilterIds)
425   - .eq(DoCondition::getEntityId, tbDeviceId);
426   - List<DoCondition> doConditions = conditionMapper.selectList(conditionFilter);
427   - doConditions.forEach(item ->{
428   - usedIds.add(item.getSceneLinkageId());
  440 + LambdaQueryWrapper<DoCondition> conditionFilter =
  441 + new QueryWrapper<DoCondition>()
  442 + .lambda()
  443 + .in(scenFilterIds.size() > 0, DoCondition::getSceneLinkageId, scenFilterIds)
  444 + .eq(DoCondition::getEntityId, tbDeviceId);
  445 + List<DoCondition> doConditions = conditionMapper.selectList(conditionFilter);
  446 + doConditions.forEach(
  447 + item -> {
  448 + usedIds.add(item.getSceneLinkageId());
429 449 });
430 450
431   - LambdaQueryWrapper<DoAction> actionFilter =
432   - new QueryWrapper<DoAction>()
433   - .lambda()
434   - .in(scenFilterIds.size()>0,DoAction::getSceneLinkageId, scenFilterIds)
435   - .eq(DoAction::getDeviceId, tbDeviceId);
436   - List<DoAction> doActions = actionMapper.selectList(actionFilter);
437   - doActions.forEach(item ->{
438   - usedIds.add(item.getSceneLinkageId());
  451 + LambdaQueryWrapper<DoAction> actionFilter =
  452 + new QueryWrapper<DoAction>()
  453 + .lambda()
  454 + .in(scenFilterIds.size() > 0, DoAction::getSceneLinkageId, scenFilterIds)
  455 + .eq(DoAction::getDeviceId, tbDeviceId);
  456 + List<DoAction> doActions = actionMapper.selectList(actionFilter);
  457 + doActions.forEach(
  458 + item -> {
  459 + usedIds.add(item.getSceneLinkageId());
439 460 });
440 461
441   - if(usedIds.isEmpty()){
442   - return "";
443   - }
444   - StringBuilder result= new StringBuilder();
445   - for(SceneLinkage item:scenes.get()){
446   - if(usedIds.contains(item.getId())){
447   - result.append(","+item.getName());
448   - }
449   - }
450   - return String.format(ErrorMessage.DEVICE_USED_SCENE_REACT.getMessage(), result.substring(1));
  462 + if (usedIds.isEmpty()) {
  463 + return "";
451 464 }
452   -
453   -
454   - @Override
455   - public List<SelectItemDTO> findMasterDevices(String tenantId, String customerId, String organizationId) {
456   - List<String> orgIds = organizationAllIds(tenantId,organizationId);
457   - List<SelectItemDTO> result = baseMapper.masterDevices(customerId,tenantId,orgIds);
458   - return result;
459   - }
460   -
461   - @Override
462   - public List<SelectItemDTO> findSlaveDevices(String masterId,String tenantId,String customerId, String organizationId){
463   - List<String> orgIds = organizationAllIds(tenantId,organizationId);
464   - List<SelectItemDTO> result = baseMapper.slaveDevices(customerId,tenantId,orgIds,masterId);
465   - return result;
466   - }
467   -
468   - @Override
469   - public List<String> findDeviceKeys(String tenantId, String customerId, String organizationId, List<String> deviceIds) {
470   - List<String> orgIds = organizationAllIds(tenantId,organizationId);
471   - List<String> result = baseMapper.findDeviceKeys(tenantId,customerId,orgIds,deviceIds);
472   - return result;
473   - }
474   -
475   - @Override
476   - public boolean saveSlaveDevice(String slaveId, String slaveName, String gatewayId, Long createTime) {
477   - LambdaQueryWrapper<YtDevice> deviceFilter =
478   - new QueryWrapper<YtDevice>()
479   - .lambda()
480   - .eq(YtDevice::getTbDeviceId, gatewayId);
481   - YtDevice gateway = baseMapper.selectOne(deviceFilter);
482   - YtDevice slaveDevice = new YtDevice();
483   - slaveDevice.setName(slaveName);
484   - slaveDevice.setTbDeviceId(slaveId);
485   - slaveDevice.setSn(generateSn());
486   - slaveDevice.setDeviceType(DeviceTypeEnum.SENSOR);
487   - slaveDevice.setCreateTime(LocalDateTime.now());
488   - slaveDevice.setDeviceInfo(JacksonUtil.toJsonNode("{\"avatar\": \"\",\"longitude\": \"\",\"latitude\": \"\",\"address\": \"\"}"));
489   -
490   - slaveDevice.setProfileId(gateway.getProfileId());
491   - slaveDevice.setGatewayId(gateway.getId());
492   - slaveDevice.setOrganizationId(gateway.getOrganizationId());
493   - slaveDevice.setTenantId(gateway.getTenantId());
494   - slaveDevice.setCreator(gateway.getCreator());
495   -
496   - baseMapper.insert(slaveDevice);
497   - return true;
498   - }
499   -
500   - @Override
501   - public List<DeviceDTO> findNumberAttributeDevicesByIds(String tenantId, List<String> ids) {
502   - return null;
  465 + StringBuilder result = new StringBuilder();
  466 + for (SceneLinkage item : scenes.get()) {
  467 + if (usedIds.contains(item.getId())) {
  468 + result.append("," + item.getName());
  469 + }
503 470 }
  471 + return String.format(ErrorMessage.DEVICE_USED_SCENE_REACT.getMessage(), result.substring(1));
  472 + }
  473 +
  474 + @Override
  475 + public List<SelectItemDTO> findMasterDevices(
  476 + String tenantId, String customerId, String organizationId) {
  477 + List<String> orgIds = organizationAllIds(tenantId, organizationId);
  478 + List<SelectItemDTO> result = baseMapper.masterDevices(customerId, tenantId, orgIds);
  479 + return result;
  480 + }
  481 +
  482 + @Override
  483 + public List<SelectItemDTO> findSlaveDevices(
  484 + String masterId, String tenantId, String customerId, String organizationId) {
  485 + List<String> orgIds = organizationAllIds(tenantId, organizationId);
  486 + List<SelectItemDTO> result = baseMapper.slaveDevices(customerId, tenantId, orgIds, masterId);
  487 + return result;
  488 + }
  489 +
  490 + @Override
  491 + public List<String> findDeviceKeys(
  492 + String tenantId, String customerId, String organizationId, List<String> deviceIds) {
  493 + List<String> orgIds = organizationAllIds(tenantId, organizationId);
  494 + List<String> result = baseMapper.findDeviceKeys(tenantId, customerId, orgIds, deviceIds);
  495 + return result;
  496 + }
  497 +
  498 + @Override
  499 + public boolean saveSlaveDevice(
  500 + String slaveId, String slaveName, String gatewayId, Long createTime) {
  501 + LambdaQueryWrapper<YtDevice> deviceFilter =
  502 + new QueryWrapper<YtDevice>().lambda().eq(YtDevice::getTbDeviceId, gatewayId);
  503 + YtDevice gateway = baseMapper.selectOne(deviceFilter);
  504 + YtDevice slaveDevice = new YtDevice();
  505 + slaveDevice.setName(slaveName);
  506 + slaveDevice.setTbDeviceId(slaveId);
  507 + slaveDevice.setSn(generateSn());
  508 + slaveDevice.setDeviceType(DeviceTypeEnum.SENSOR);
  509 + slaveDevice.setCreateTime(LocalDateTime.now());
  510 + slaveDevice.setDeviceInfo(
  511 + JacksonUtil.toJsonNode(
  512 + "{\"avatar\": \"\",\"longitude\": \"\",\"latitude\": \"\",\"address\": \"\"}"));
  513 +
  514 + slaveDevice.setProfileId(gateway.getProfileId());
  515 + slaveDevice.setGatewayId(gateway.getId());
  516 + slaveDevice.setOrganizationId(gateway.getOrganizationId());
  517 + slaveDevice.setTenantId(gateway.getTenantId());
  518 + slaveDevice.setCreator(gateway.getCreator());
  519 +
  520 + baseMapper.insert(slaveDevice);
  521 + return true;
  522 + }
  523 +
  524 + @Override
  525 + public List<DeviceDTO> findNumberAttributeDevicesByIds(String tenantId, List<String> ids) {
  526 + return null;
  527 + }
  528 +
  529 + @Override
  530 + public DeviceDTO getSubsetDeviceByTbDeviceId(String tenantId, String tbDeviceId) {
  531 + YtDevice device =
  532 + baseMapper.selectOne(
  533 + new LambdaQueryWrapper<YtDevice>()
  534 + .eq(YtDevice::getTbDeviceId, tbDeviceId)
  535 + .eq(YtDevice::getTenantId, tenantId));
  536 + return Optional.ofNullable(device).map(obj -> obj.getDTO(DeviceDTO.class)).orElseThrow(()->{
  537 + throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
  538 + });
  539 + }
504 540 }
... ...
... ... @@ -151,4 +151,12 @@ public interface YtDeviceService extends BaseService<YtDevice> {
151 151 */
152 152 List<DeviceDTO> findNumberAttributeDevicesByIds(String tenantId,List<String> ids);
153 153
  154 + /**
  155 + * 通过tb设备ID获取平台设备信息
  156 + * @param tenantId
  157 + * @param tbDeviceId
  158 + * @return
  159 + */
  160 + DeviceDTO getSubsetDeviceByTbDeviceId(String tenantId,String tbDeviceId);
  161 +
154 162 }
... ...