Showing
7 changed files
with
64 additions
and
22 deletions
... | ... | @@ -181,11 +181,12 @@ public class TkDeviceProfileController extends BaseController { |
181 | 181 | @DeleteMapping |
182 | 182 | @ApiOperation("删除") |
183 | 183 | @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:deviceProfile:delete'})") |
184 | - public void deleteDevices(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) | |
184 | + public void deleteDeviceProfiles(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) | |
185 | 185 | throws ThingsboardException { |
186 | 186 | String tenantId = getCurrentUser().getCurrentTenantId(); |
187 | 187 | ytDeviceProfileService.checkDeviceProfiles(tenantId, deleteDTO.getIds()); |
188 | 188 | |
189 | + | |
189 | 190 | for (String id : deleteDTO.getIds()) { |
190 | 191 | deleteTbDeviceProfile(id); |
191 | 192 | } | ... | ... |
1 | 1 | package org.thingsboard.server.controller.yunteng; |
2 | 2 | |
3 | 3 | import lombok.RequiredArgsConstructor; |
4 | +import org.apache.commons.lang3.StringUtils; | |
4 | 5 | import org.springframework.security.access.prepost.PreAuthorize; |
5 | -import org.springframework.web.bind.annotation.GetMapping; | |
6 | -import org.springframework.web.bind.annotation.RequestMapping; | |
7 | -import org.springframework.web.bind.annotation.RequestParam; | |
8 | -import org.springframework.web.bind.annotation.RestController; | |
6 | +import org.springframework.web.bind.annotation.*; | |
9 | 7 | import org.thingsboard.server.common.data.TenantProfile; |
10 | 8 | import org.thingsboard.server.common.data.exception.ThingsboardException; |
11 | 9 | import org.thingsboard.server.common.data.id.TenantId; |
12 | 10 | import org.thingsboard.server.common.data.page.PageData; |
13 | 11 | import org.thingsboard.server.common.data.page.PageLink; |
12 | +import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; | |
13 | +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | |
14 | +import org.thingsboard.server.common.data.yunteng.dto.TenantDTO; | |
14 | 15 | import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum; |
15 | 16 | import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; |
17 | +import org.thingsboard.server.common.data.yunteng.utils.tools.ResponseResult; | |
16 | 18 | import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; |
17 | 19 | import org.thingsboard.server.controller.BaseController; |
20 | +import org.thingsboard.server.dao.yunteng.service.TkTenantService; | |
18 | 21 | |
19 | 22 | import java.util.List; |
20 | 23 | import java.util.UUID; |
... | ... | @@ -25,6 +28,7 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant. |
25 | 28 | @RequestMapping("/api/yt/tenant_profiles") |
26 | 29 | @RequiredArgsConstructor |
27 | 30 | public class TkTenantProfilesController extends BaseController { |
31 | + private final TkTenantService tkTenantService; | |
28 | 32 | |
29 | 33 | @PreAuthorize("@check.checkPermissions({'SYS_ADMIN','PLATFORM_ADMIN'},{})") |
30 | 34 | @GetMapping( |
... | ... | @@ -47,7 +51,7 @@ public class TkTenantProfilesController extends BaseController { |
47 | 51 | orderBy, |
48 | 52 | null == orderType ? OrderTypeEnum.DESC.name() : orderType.name()); |
49 | 53 | TenantId tenantId = getTenantId(); |
50 | - if(getCurrentUser().isPtAdmin()){ | |
54 | + if (getCurrentUser().isPtAdmin()) { | |
51 | 55 | tenantId = new TenantId(UUID.fromString(getCurrentUser().getCurrentTenantId())); |
52 | 56 | } |
53 | 57 | PageData<TenantProfile> tenantProfilePageData = |
... | ... | @@ -59,4 +63,23 @@ public class TkTenantProfilesController extends BaseController { |
59 | 63 | throw handleException(e); |
60 | 64 | } |
61 | 65 | } |
66 | + | |
67 | + @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'PLATFORM_ADMIN')") | |
68 | + @GetMapping("/allow/{tenantProfileId}/delete") | |
69 | + public ResponseResult<Boolean> deleteCheck( | |
70 | + @PathVariable("tenantProfileId") String tenantProfileId) { | |
71 | + if (StringUtils.isEmpty(tenantProfileId)) { | |
72 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | |
73 | + } | |
74 | + List<TenantDTO> dtoList = tkTenantService.checkTenantProfileIdUsedByTenants(tenantProfileId); | |
75 | + boolean result = null == dtoList || dtoList.isEmpty(); | |
76 | + String message = "OK"; | |
77 | + if (!result) { | |
78 | + message = | |
79 | + String.format( | |
80 | + ErrorMessage.TENANT_USED_THIS_TENANT_PROFILE_ID.getMessage(), | |
81 | + dtoList.get(0).getName()); | |
82 | + } | |
83 | + return ResponseResult.success(result, message); | |
84 | + } | |
62 | 85 | } | ... | ... |
... | ... | @@ -95,6 +95,9 @@ public enum ErrorMessage { |
95 | 95 | DATA_STATE_ENABLE_NOT_DELETE(400071,"【%s】数据为启用状态不能删除!!"), |
96 | 96 | EXECUTE_COMMAND_IS_NULL(400072,"执行命令不能为空"), |
97 | 97 | DEVICE_NAME_ALREADY_EXISTS(400073,"别名或设备名称已被使用"), |
98 | + TENANT_USED_THIS_TENANT_PROFILE_ID(400074,"【%s】正在使用该租户配置"), | |
99 | + DEVICE_PROFILE_USED_BY_DEVICE(400075,"有设备使用待删除配置,请先删除设备或者修改设备配置"), | |
100 | + TASK_CENTER_IS_DISABLED(400076,"【%s】任务是禁用状态,不能执行"), | |
98 | 101 | HAVE_NO_PERMISSION(500002,"没有修改权限"); |
99 | 102 | private final int code; |
100 | 103 | private String message; | ... | ... |
... | ... | @@ -146,9 +146,9 @@ public class TkDeviceProfileServiceImpl |
146 | 146 | // check if ids bind to device |
147 | 147 | int count = |
148 | 148 | deviceMapper.selectCount( |
149 | - new QueryWrapper<TkDeviceEntity>().lambda().in(TkDeviceEntity::getProfileId, ids)); | |
149 | + new QueryWrapper<TkDeviceEntity>().lambda().in(TkDeviceEntity::getDeviceProfileId, ids)); | |
150 | 150 | if (count > 0) { |
151 | - throw new TkDataValidationException("有设备使用待删除配置,请先删除设备或者修改设备配置"); | |
151 | + throw new TkDataValidationException(ErrorMessage.DEVICE_PROFILE_USED_BY_DEVICE.getMessage()); | |
152 | 152 | } |
153 | 153 | } |
154 | 154 | ... | ... |
... | ... | @@ -310,24 +310,22 @@ public class TkTaskCenterServiceImpl |
310 | 310 | @Override |
311 | 311 | public boolean immediateExecute(TaskImmediateExecuteDTO immediateExecuteDTO, String tenantId) |
312 | 312 | throws SchedulerException { |
313 | - // 放入缓存 | |
314 | 313 | String taskCenterId = immediateExecuteDTO.getId(); |
315 | - String key = FastIotConstants.CacheConfigKey.TASK_IMMEDIATE_EXECUTE + "_" + taskCenterId; | |
316 | - cacheUtils.put(cacheName, key, immediateExecuteDTO); | |
314 | + boolean result = false; | |
317 | 315 | // 直接调用任务中心任务执行 |
318 | 316 | SysJobDTO sysJobDTO = tkSysJobService.findSysJobBySourceId(taskCenterId); |
319 | - if (null == sysJobDTO) { | |
320 | - sysJobDTO = new SysJobDTO(); | |
321 | - sysJobDTO.setSourceId(taskCenterId); | |
322 | - sysJobDTO.setInvokeTarget("rpcCommandTask.process('" + taskCenterId + "')"); | |
323 | - sysJobDTO.setJobGroup(JobGroupEnum.TASK_CENTER.name()); | |
324 | - sysJobDTO.setTenantId(tenantId); | |
325 | - sysJobDTO.setCronExpression(immediateExecuteDTO.getCronExpression()); | |
326 | - sysJobDTO.setJobName(immediateExecuteDTO.getName()); | |
327 | - sysJobDTO.setStatus(StatusEnum.DISABLE.getIndex()); | |
328 | - tkSysJobService.saveOrUpdateJob(sysJobDTO); | |
317 | + if (null != sysJobDTO) { | |
318 | + if (Objects.equals(sysJobDTO.getStatus(), StatusEnum.DISABLE.getIndex())) { | |
319 | + throw new TkDataValidationException( | |
320 | + String.format( | |
321 | + ErrorMessage.TASK_CENTER_IS_DISABLED.getMessage(), sysJobDTO.getJobName())); | |
322 | + } | |
323 | + result = tkSysJobService.run(sysJobDTO); | |
324 | + // 放入缓存 | |
325 | + String key = FastIotConstants.CacheConfigKey.TASK_IMMEDIATE_EXECUTE + "_" + taskCenterId; | |
326 | + cacheUtils.put(cacheName, key, immediateExecuteDTO); | |
329 | 327 | } |
330 | - return tkSysJobService.run(sysJobDTO); | |
328 | + return result; | |
331 | 329 | } |
332 | 330 | |
333 | 331 | private void updateTaskCenterCache(TkTaskCenterEntity entity) { | ... | ... |
... | ... | @@ -334,6 +334,21 @@ public class TkTenantServiceImpl extends AbstractBaseService<TenantMapper, SysTe |
334 | 334 | return CompletableFuture.supplyAsync(() -> new TsValue(ts, String.valueOf(tenants.size()))); |
335 | 335 | } |
336 | 336 | |
337 | + @Override | |
338 | + public List<TenantDTO> checkTenantProfileIdUsedByTenants(String tenantProfileId) { | |
339 | + List<SysTenantEntity> entities = | |
340 | + baseMapper.selectList( | |
341 | + new LambdaQueryWrapper<SysTenantEntity>() | |
342 | + .eq(SysTenantEntity::getTenantProfileId, tenantProfileId)); | |
343 | + return Optional.ofNullable(entities) | |
344 | + .map( | |
345 | + list -> | |
346 | + list.stream() | |
347 | + .map(entity -> entity.getDTO(TenantDTO.class)) | |
348 | + .collect(Collectors.toList())) | |
349 | + .orElse(null); | |
350 | + } | |
351 | + | |
337 | 352 | /** |
338 | 353 | * 保存租户与菜单、角色的映射关系 |
339 | 354 | * | ... | ... |
... | ... | @@ -34,4 +34,6 @@ public interface TkTenantService { |
34 | 34 | List<TenantDTO> getAllTenant(); |
35 | 35 | |
36 | 36 | CompletableFuture<TsValue> findTenantsByTs(LocalDateTime startTs, LocalDateTime endTs,long ts); |
37 | + | |
38 | + List<TenantDTO> checkTenantProfileIdUsedByTenants(String tenantProfileId); | |
37 | 39 | } | ... | ... |