Showing
30 changed files
with
821 additions
and
264 deletions
@@ -57,8 +57,11 @@ import org.thingsboard.server.common.data.rule.RuleNode; | @@ -57,8 +57,11 @@ import org.thingsboard.server.common.data.rule.RuleNode; | ||
57 | import org.thingsboard.server.common.data.widget.WidgetTypeDetails; | 57 | import org.thingsboard.server.common.data.widget.WidgetTypeDetails; |
58 | import org.thingsboard.server.common.data.widget.WidgetsBundle; | 58 | import org.thingsboard.server.common.data.widget.WidgetsBundle; |
59 | import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; | 59 | import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; |
60 | +import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils; | ||
60 | import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; | 61 | import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; |
61 | import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | 62 | import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; |
63 | +import org.thingsboard.server.common.data.yunteng.dto.PublicCustomerDTO; | ||
64 | +import org.thingsboard.server.common.data.yunteng.enums.ViewType; | ||
62 | import org.thingsboard.server.dao.asset.AssetService; | 65 | import org.thingsboard.server.dao.asset.AssetService; |
63 | import org.thingsboard.server.dao.attributes.AttributesService; | 66 | import org.thingsboard.server.dao.attributes.AttributesService; |
64 | import org.thingsboard.server.dao.audit.AuditLogService; | 67 | import org.thingsboard.server.dao.audit.AuditLogService; |
@@ -242,6 +245,10 @@ public abstract class BaseController { | @@ -242,6 +245,10 @@ public abstract class BaseController { | ||
242 | @Getter | 245 | @Getter |
243 | protected boolean edgesEnabled; | 246 | protected boolean edgesEnabled; |
244 | 247 | ||
248 | + //thingskit | ||
249 | + @Autowired | ||
250 | + private CacheUtils cacheUtils; | ||
251 | + | ||
245 | @ExceptionHandler(ThingsboardException.class) | 252 | @ExceptionHandler(ThingsboardException.class) |
246 | public void handleThingsboardException(ThingsboardException ex, HttpServletResponse response) { | 253 | public void handleThingsboardException(ThingsboardException ex, HttpServletResponse response) { |
247 | errorResponseHandler.handle(ex, response); | 254 | errorResponseHandler.handle(ex, response); |
@@ -950,4 +957,27 @@ public abstract class BaseController { | @@ -950,4 +957,27 @@ public abstract class BaseController { | ||
950 | getTenantId(), savedDeviceProfile.getId(), EdgeEventActionType.UPDATED); | 957 | getTenantId(), savedDeviceProfile.getId(), EdgeEventActionType.UPDATED); |
951 | return savedDeviceProfile; | 958 | return savedDeviceProfile; |
952 | } | 959 | } |
960 | + | ||
961 | + /** | ||
962 | + * 获取租户的公共ID并设置缓存 | ||
963 | + * @param tenantId 租户ID | ||
964 | + * @return 公共ID | ||
965 | + */ | ||
966 | + private String findPublicCustomerId(TenantId tenantId){ | ||
967 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | ||
968 | + String cacheKey = | ||
969 | + FastIotConstants.CacheConfigKey.PUBLIC_ID + tenantId.getId().toString(); | ||
970 | + Optional<String> publicId = cacheUtils.get(cacheKey); | ||
971 | + return publicId.orElseGet( | ||
972 | + () -> Optional.ofNullable(customerService.findOrCreatePublicCustomer(tenantId)). | ||
973 | + map(customer -> customer.getId().getId().toString()).orElse(null)); | ||
974 | + } | ||
975 | + | ||
976 | + protected void setPublicCustomerIdToCache(PublicCustomerDTO dto) throws ThingsboardException { | ||
977 | + String publicCustomerId = findPublicCustomerId(getTenantId()); | ||
978 | + if (Objects.equals(dto.getViewType(), ViewType.PUBLIC_VIEW) | ||
979 | + && !StringUtils.isEmpty(publicCustomerId)) { | ||
980 | + dto.setPublicId(publicCustomerId); | ||
981 | + } | ||
982 | + } | ||
953 | } | 983 | } |
@@ -8,10 +8,13 @@ import org.springframework.http.ResponseEntity; | @@ -8,10 +8,13 @@ import org.springframework.http.ResponseEntity; | ||
8 | import org.springframework.security.access.prepost.PreAuthorize; | 8 | import org.springframework.security.access.prepost.PreAuthorize; |
9 | import org.springframework.validation.annotation.Validated; | 9 | import org.springframework.validation.annotation.Validated; |
10 | import org.springframework.web.bind.annotation.*; | 10 | import org.springframework.web.bind.annotation.*; |
11 | +import org.thingsboard.server.common.data.Customer; | ||
11 | import org.thingsboard.server.common.data.exception.ThingsboardException; | 12 | import org.thingsboard.server.common.data.exception.ThingsboardException; |
12 | import org.thingsboard.server.common.data.yunteng.common.AddGroup; | 13 | import org.thingsboard.server.common.data.yunteng.common.AddGroup; |
13 | import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; | 14 | import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; |
14 | import org.thingsboard.server.common.data.yunteng.common.UpdateGroup; | 15 | import org.thingsboard.server.common.data.yunteng.common.UpdateGroup; |
16 | +import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; | ||
17 | +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | ||
15 | import org.thingsboard.server.common.data.yunteng.dto.ConfigurationCenterDTO; | 18 | import org.thingsboard.server.common.data.yunteng.dto.ConfigurationCenterDTO; |
16 | import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; | 19 | import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; |
17 | import org.thingsboard.server.common.data.yunteng.dto.request.ConfigurationContentInfoDTO; | 20 | import org.thingsboard.server.common.data.yunteng.dto.request.ConfigurationContentInfoDTO; |
@@ -31,7 +34,7 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant. | @@ -31,7 +34,7 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant. | ||
31 | @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})") | 34 | @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})") |
32 | public class TkConfigurationCenterController extends BaseController { | 35 | public class TkConfigurationCenterController extends BaseController { |
33 | 36 | ||
34 | - private final TkConfigurationCenterService ytConfigurationCenterService; | 37 | + private final TkConfigurationCenterService tkConfigurationCenterService; |
35 | 38 | ||
36 | @GetMapping(params = {PAGE_SIZE, PAGE}) | 39 | @GetMapping(params = {PAGE_SIZE, PAGE}) |
37 | @ApiOperation("分页") | 40 | @ApiOperation("分页") |
@@ -62,8 +65,15 @@ public class TkConfigurationCenterController extends BaseController { | @@ -62,8 +65,15 @@ public class TkConfigurationCenterController extends BaseController { | ||
62 | if (null != orderType) { | 65 | if (null != orderType) { |
63 | queryMap.put(ORDER_TYPE, orderType.name()); | 66 | queryMap.put(ORDER_TYPE, orderType.name()); |
64 | } | 67 | } |
65 | - queryMap.put("userId",getCurrentUser().getCurrentUserId()); | ||
66 | - return ytConfigurationCenterService.page(queryMap, getCurrentUser().isTenantAdmin()); | 68 | + queryMap.put("userId", getCurrentUser().getCurrentUserId()); |
69 | + TkPageData<ConfigurationCenterDTO> pageData = | ||
70 | + tkConfigurationCenterService.page(queryMap, getCurrentUser().isTenantAdmin()); | ||
71 | + if (!pageData.getItems().isEmpty()) { | ||
72 | + for (ConfigurationCenterDTO dto : pageData.getItems()) { | ||
73 | + setPublicCustomerIdToCache(dto); | ||
74 | + } | ||
75 | + } | ||
76 | + return pageData; | ||
67 | } | 77 | } |
68 | 78 | ||
69 | @PostMapping | 79 | @PostMapping |
@@ -75,7 +85,7 @@ public class TkConfigurationCenterController extends BaseController { | @@ -75,7 +85,7 @@ public class TkConfigurationCenterController extends BaseController { | ||
75 | throws ThingsboardException { | 85 | throws ThingsboardException { |
76 | configurationCenterDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | 86 | configurationCenterDTO.setTenantId(getCurrentUser().getCurrentTenantId()); |
77 | return ResponseEntity.ok( | 87 | return ResponseEntity.ok( |
78 | - ytConfigurationCenterService.saveConfiguration(configurationCenterDTO)); | 88 | + tkConfigurationCenterService.saveConfiguration(configurationCenterDTO)); |
79 | } | 89 | } |
80 | 90 | ||
81 | @PutMapping | 91 | @PutMapping |
@@ -87,7 +97,7 @@ public class TkConfigurationCenterController extends BaseController { | @@ -87,7 +97,7 @@ public class TkConfigurationCenterController extends BaseController { | ||
87 | throws ThingsboardException { | 97 | throws ThingsboardException { |
88 | configurationCenterDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | 98 | configurationCenterDTO.setTenantId(getCurrentUser().getCurrentTenantId()); |
89 | return ResponseEntity.ok( | 99 | return ResponseEntity.ok( |
90 | - ytConfigurationCenterService.updateConfiguration(configurationCenterDTO)); | 100 | + tkConfigurationCenterService.updateConfiguration(configurationCenterDTO)); |
91 | } | 101 | } |
92 | 102 | ||
93 | @DeleteMapping | 103 | @DeleteMapping |
@@ -98,17 +108,34 @@ public class TkConfigurationCenterController extends BaseController { | @@ -98,17 +108,34 @@ public class TkConfigurationCenterController extends BaseController { | ||
98 | @Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) | 108 | @Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) |
99 | throws ThingsboardException { | 109 | throws ThingsboardException { |
100 | deleteDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | 110 | deleteDTO.setTenantId(getCurrentUser().getCurrentTenantId()); |
101 | - return ResponseEntity.ok(ytConfigurationCenterService.deleteConfigurationCenter(deleteDTO)); | 111 | + return ResponseEntity.ok(tkConfigurationCenterService.deleteConfigurationCenter(deleteDTO)); |
102 | } | 112 | } |
103 | 113 | ||
104 | @GetMapping("/get_configuration_info/{id}") | 114 | @GetMapping("/get_configuration_info/{id}") |
105 | @ApiOperation("获取组态信息") | 115 | @ApiOperation("获取组态信息") |
106 | @PreAuthorize( | 116 | @PreAuthorize( |
107 | - "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:configuration:center:get_configuration_info:design','api:yt:configuration:center:get_configuration_info:preview'})") | 117 | + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:configuration:center:get_configuration_info:design'" |
118 | + + ",'api:yt:configuration:center:get_configuration_info:preview'})") | ||
108 | public ResponseEntity<ConfigurationContentInfoDTO> getConfigurationInfos( | 119 | public ResponseEntity<ConfigurationContentInfoDTO> getConfigurationInfos( |
109 | @PathVariable("id") String id) throws ThingsboardException { | 120 | @PathVariable("id") String id) throws ThingsboardException { |
110 | return ResponseEntity.ok( | 121 | return ResponseEntity.ok( |
111 | - ytConfigurationCenterService.getConfigurationInfos( | 122 | + tkConfigurationCenterService.getConfigurationInfos( |
112 | id, getCurrentUser().getCurrentTenantId())); | 123 | id, getCurrentUser().getCurrentTenantId())); |
113 | } | 124 | } |
125 | + | ||
126 | + @PostMapping("share/{id}") | ||
127 | + @ApiOperation("分享") | ||
128 | + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:configuration:center:share'})") | ||
129 | + public ResponseEntity<Boolean> share( | ||
130 | + @PathVariable("id") String id, | ||
131 | + @RequestParam(value = "accessCredentials", required = false) String accessCredentials, | ||
132 | + @RequestParam(value = "isShare") boolean isShare) | ||
133 | + throws ThingsboardException { | ||
134 | + if (StringUtils.isEmpty(id)) { | ||
135 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
136 | + } | ||
137 | + return ResponseEntity.ok( | ||
138 | + tkConfigurationCenterService.shareOrMonopolyConfigurationCenter( | ||
139 | + isShare, id, accessCredentials, getCurrentUser().getCurrentTenantId())); | ||
140 | + } | ||
114 | } | 141 | } |
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiOperation; | @@ -5,6 +5,7 @@ import io.swagger.annotations.ApiOperation; | ||
5 | import lombok.RequiredArgsConstructor; | 5 | import lombok.RequiredArgsConstructor; |
6 | import org.apache.commons.lang3.StringUtils; | 6 | import org.apache.commons.lang3.StringUtils; |
7 | import org.quartz.SchedulerException; | 7 | import org.quartz.SchedulerException; |
8 | +import org.springframework.http.ResponseEntity; | ||
8 | import org.springframework.security.access.prepost.PreAuthorize; | 9 | import org.springframework.security.access.prepost.PreAuthorize; |
9 | import org.springframework.validation.annotation.Validated; | 10 | import org.springframework.validation.annotation.Validated; |
10 | import org.springframework.web.bind.annotation.*; | 11 | import org.springframework.web.bind.annotation.*; |
@@ -23,9 +24,7 @@ import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; | @@ -23,9 +24,7 @@ import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; | ||
23 | import org.thingsboard.server.controller.BaseController; | 24 | import org.thingsboard.server.controller.BaseController; |
24 | import org.thingsboard.server.dao.yunteng.service.TkDataBoardService; | 25 | import org.thingsboard.server.dao.yunteng.service.TkDataBoardService; |
25 | 26 | ||
26 | -import java.util.HashMap; | ||
27 | -import java.util.List; | ||
28 | -import java.util.Map; | 27 | +import java.util.*; |
29 | 28 | ||
30 | import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.*; | 29 | import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.*; |
31 | 30 | ||
@@ -35,7 +34,7 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant. | @@ -35,7 +34,7 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant. | ||
35 | @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})") | 34 | @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})") |
36 | @Api(tags = {"数据看板"}) | 35 | @Api(tags = {"数据看板"}) |
37 | public class TkDataBoardController extends BaseController { | 36 | public class TkDataBoardController extends BaseController { |
38 | - private final TkDataBoardService ytDataBoardService; | 37 | + private final TkDataBoardService tkDataBoardService; |
39 | 38 | ||
40 | @GetMapping(params = {PAGE_SIZE, PAGE}) | 39 | @GetMapping(params = {PAGE_SIZE, PAGE}) |
41 | @ApiOperation("分页查询") | 40 | @ApiOperation("分页查询") |
@@ -59,22 +58,31 @@ public class TkDataBoardController extends BaseController { | @@ -59,22 +58,31 @@ public class TkDataBoardController extends BaseController { | ||
59 | if (StringUtils.isNotBlank(name)) { | 58 | if (StringUtils.isNotBlank(name)) { |
60 | queryMap.put("name", name); | 59 | queryMap.put("name", name); |
61 | } | 60 | } |
62 | - queryMap.put("userId",getCurrentUser().getCurrentUserId()); | ||
63 | - return ytDataBoardService.dataBoardPage(queryMap, getCurrentUser().isTenantAdmin()); | 61 | + queryMap.put("userId", getCurrentUser().getCurrentUserId()); |
62 | + TkPageData<DataBoardDTO> pageData = | ||
63 | + tkDataBoardService.dataBoardPage(queryMap, getCurrentUser().isTenantAdmin()); | ||
64 | + if(!pageData.getItems().isEmpty()){ | ||
65 | + for (DataBoardDTO dto : pageData.getItems()) { | ||
66 | + setPublicCustomerIdToCache(dto); | ||
67 | + } | ||
68 | + } | ||
69 | + return pageData; | ||
64 | } | 70 | } |
65 | 71 | ||
66 | @DeleteMapping | 72 | @DeleteMapping |
67 | @ApiOperation(value = "删除数据看板") | 73 | @ApiOperation(value = "删除数据看板") |
68 | - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:data_board:delete'})") | 74 | + @PreAuthorize( |
75 | + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:data_board:delete'})") | ||
69 | public ResponseResult<Boolean> deleteDataBoard( | 76 | public ResponseResult<Boolean> deleteDataBoard( |
70 | @Validated(DeleteGroup.class) @RequestBody DeleteDTO deleteDTO) throws ThingsboardException { | 77 | @Validated(DeleteGroup.class) @RequestBody DeleteDTO deleteDTO) throws ThingsboardException { |
71 | deleteDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | 78 | deleteDTO.setTenantId(getCurrentUser().getCurrentTenantId()); |
72 | - return ResponseResult.success(ytDataBoardService.deleteDataBoard(deleteDTO)); | 79 | + return ResponseResult.success(tkDataBoardService.deleteDataBoard(deleteDTO)); |
73 | } | 80 | } |
74 | 81 | ||
75 | @PostMapping("/add") | 82 | @PostMapping("/add") |
76 | @ApiOperation(value = "新增数据看板") | 83 | @ApiOperation(value = "新增数据看板") |
77 | - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:data_board:add:post'})") | 84 | + @PreAuthorize( |
85 | + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:data_board:add:post'})") | ||
78 | public ResponseResult<DataBoardDTO> save( | 86 | public ResponseResult<DataBoardDTO> save( |
79 | @RequestBody @Validated(AddGroup.class) DataBoardDTO dataBoard) | 87 | @RequestBody @Validated(AddGroup.class) DataBoardDTO dataBoard) |
80 | throws SchedulerException, ThingsboardException { | 88 | throws SchedulerException, ThingsboardException { |
@@ -85,7 +93,8 @@ public class TkDataBoardController extends BaseController { | @@ -85,7 +93,8 @@ public class TkDataBoardController extends BaseController { | ||
85 | } | 93 | } |
86 | 94 | ||
87 | @PostMapping("/update") | 95 | @PostMapping("/update") |
88 | - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:data_board:update:update'})") | 96 | + @PreAuthorize( |
97 | + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:data_board:update:update'})") | ||
89 | @ApiOperation(value = "编辑数据看板") | 98 | @ApiOperation(value = "编辑数据看板") |
90 | public ResponseResult<DataBoardDTO> update( | 99 | public ResponseResult<DataBoardDTO> update( |
91 | @RequestBody @Validated(UpdateGroup.class) DataBoardDTO dataBoard) | 100 | @RequestBody @Validated(UpdateGroup.class) DataBoardDTO dataBoard) |
@@ -102,13 +111,29 @@ public class TkDataBoardController extends BaseController { | @@ -102,13 +111,29 @@ public class TkDataBoardController extends BaseController { | ||
102 | @PathVariable("boardId") String boardId, @RequestBody List<ComponentLayoutDTO> layoutDTOList) | 111 | @PathVariable("boardId") String boardId, @RequestBody List<ComponentLayoutDTO> layoutDTOList) |
103 | throws ThingsboardException { | 112 | throws ThingsboardException { |
104 | return ResponseResult.success( | 113 | return ResponseResult.success( |
105 | - ytDataBoardService.saveComponentLayout( | 114 | + tkDataBoardService.saveComponentLayout( |
106 | layoutDTOList, boardId, getCurrentUser().getCurrentTenantId())); | 115 | layoutDTOList, boardId, getCurrentUser().getCurrentTenantId())); |
107 | } | 116 | } |
108 | 117 | ||
118 | + @PostMapping("share/{id}") | ||
119 | + @ApiOperation("分享") | ||
120 | + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:data_board:share'})") | ||
121 | + public ResponseEntity<Boolean> share( | ||
122 | + @PathVariable("id") String id, | ||
123 | + @RequestParam(value = "accessCredentials", required = false) String accessCredentials, | ||
124 | + @RequestParam(value = "isShare") boolean isShare) | ||
125 | + throws ThingsboardException { | ||
126 | + if (StringUtils.isEmpty(id)) { | ||
127 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
128 | + } | ||
129 | + return ResponseEntity.ok( | ||
130 | + tkDataBoardService.shareOrMonopolyDataBoard( | ||
131 | + isShare, id, accessCredentials, getCurrentUser().getCurrentTenantId())); | ||
132 | + } | ||
133 | + | ||
109 | private ResponseResult<DataBoardDTO> saveOrUpdate(DataBoardDTO dataBoard) | 134 | private ResponseResult<DataBoardDTO> saveOrUpdate(DataBoardDTO dataBoard) |
110 | throws ThingsboardException { | 135 | throws ThingsboardException { |
111 | dataBoard.setTenantId(getCurrentUser().getCurrentTenantId()); | 136 | dataBoard.setTenantId(getCurrentUser().getCurrentTenantId()); |
112 | - return ResponseResult.success(ytDataBoardService.saveOrUpdateDataBoard(dataBoard)); | 137 | + return ResponseResult.success(tkDataBoardService.saveOrUpdateDataBoard(dataBoard)); |
113 | } | 138 | } |
114 | } | 139 | } |
@@ -12,6 +12,8 @@ import org.thingsboard.server.common.data.exception.ThingsboardException; | @@ -12,6 +12,8 @@ import org.thingsboard.server.common.data.exception.ThingsboardException; | ||
12 | import org.thingsboard.server.common.data.yunteng.common.AddGroup; | 12 | import org.thingsboard.server.common.data.yunteng.common.AddGroup; |
13 | import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; | 13 | import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; |
14 | import org.thingsboard.server.common.data.yunteng.common.UpdateGroup; | 14 | import org.thingsboard.server.common.data.yunteng.common.UpdateGroup; |
15 | +import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; | ||
16 | +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | ||
15 | import org.thingsboard.server.common.data.yunteng.dto.TkDataViewDTO; | 17 | import org.thingsboard.server.common.data.yunteng.dto.TkDataViewDTO; |
16 | import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; | 18 | import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; |
17 | import org.thingsboard.server.common.data.yunteng.dto.request.TkDataViewContentInfoDTO; | 19 | import org.thingsboard.server.common.data.yunteng.dto.request.TkDataViewContentInfoDTO; |
@@ -31,103 +33,125 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant. | @@ -31,103 +33,125 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant. | ||
31 | @RequestMapping("/api/yt/data_view") | 33 | @RequestMapping("/api/yt/data_view") |
32 | @RequiredArgsConstructor | 34 | @RequiredArgsConstructor |
33 | @Api(tags = "大屏设计器") | 35 | @Api(tags = "大屏设计器") |
34 | -@PreAuthorize("@check.checkPermissions({},{})") | 36 | +@PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{})") |
35 | public class TkDataViewController extends BaseController { | 37 | public class TkDataViewController extends BaseController { |
36 | 38 | ||
37 | - private final TkDataViewService tkDataViewService; | 39 | + private final TkDataViewService tkDataViewService; |
38 | 40 | ||
39 | - @GetMapping(params = {PAGE_SIZE, PAGE}) | ||
40 | - @ApiOperation("分页") | ||
41 | - public TkPageData<TkDataViewDTO> page( | ||
42 | - @RequestParam(PAGE_SIZE) int pageSize, | ||
43 | - @RequestParam(PAGE) int page, | ||
44 | - @RequestParam(value = "name", required = false) String name, | ||
45 | - @RequestParam(value = "state", required = false) String state, | ||
46 | - @RequestParam(value = "organizationId", required = false) String organizationId, | ||
47 | - @RequestParam(value = ORDER_FILED, required = false) String orderBy, | ||
48 | - @RequestParam(value = ORDER_TYPE, required = false) OrderTypeEnum orderType) | ||
49 | - throws ThingsboardException { | 41 | + @GetMapping(params = {PAGE_SIZE, PAGE}) |
42 | + @ApiOperation("分页") | ||
43 | + public TkPageData<TkDataViewDTO> page( | ||
44 | + @RequestParam(PAGE_SIZE) int pageSize, | ||
45 | + @RequestParam(PAGE) int page, | ||
46 | + @RequestParam(value = "name", required = false) String name, | ||
47 | + @RequestParam(value = "state", required = false) String state, | ||
48 | + @RequestParam(value = "organizationId", required = false) String organizationId, | ||
49 | + @RequestParam(value = ORDER_FILED, required = false) String orderBy, | ||
50 | + @RequestParam(value = ORDER_TYPE, required = false) OrderTypeEnum orderType) | ||
51 | + throws ThingsboardException { | ||
50 | 52 | ||
51 | - HashMap<String, Object> queryMap = new HashMap<>(); | ||
52 | - queryMap.put(PAGE_SIZE, pageSize); | ||
53 | - queryMap.put(PAGE, page); | ||
54 | - queryMap.put(ORDER_FILED, orderBy); | ||
55 | - queryMap.put("tenantId", getCurrentUser().getCurrentTenantId()); | ||
56 | - if (StringUtils.isNotBlank(name)) { | ||
57 | - queryMap.put("name", name); | ||
58 | - } | ||
59 | - if (StringUtils.isNotBlank(organizationId)) { | ||
60 | - queryMap.put("organizationId", organizationId); | ||
61 | - } | ||
62 | - if (StringUtils.isNotBlank(state)) { | ||
63 | - queryMap.put("state", state); | ||
64 | - } | ||
65 | - if (null != orderType) { | ||
66 | - queryMap.put(ORDER_TYPE, orderType.name()); | ||
67 | - } | ||
68 | - queryMap.put("userId", getCurrentUser().getCurrentUserId()); | ||
69 | - return tkDataViewService.page(queryMap, getCurrentUser().isTenantAdmin()); | 53 | + HashMap<String, Object> queryMap = new HashMap<>(); |
54 | + queryMap.put(PAGE_SIZE, pageSize); | ||
55 | + queryMap.put(PAGE, page); | ||
56 | + queryMap.put(ORDER_FILED, orderBy); | ||
57 | + queryMap.put("tenantId", getCurrentUser().getCurrentTenantId()); | ||
58 | + if (StringUtils.isNotBlank(name)) { | ||
59 | + queryMap.put("name", name); | ||
70 | } | 60 | } |
71 | - | ||
72 | - @PostMapping | ||
73 | - @ApiOperation("新增") | ||
74 | - @PreAuthorize( | ||
75 | - "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:dataview:center:post'})") | ||
76 | - public ResponseEntity<TkDataViewDTO> save( | ||
77 | - @Validated({AddGroup.class}) @RequestBody TkDataViewDTO TkDataViewDTO) | ||
78 | - throws ThingsboardException { | ||
79 | - TkDataViewDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | ||
80 | - return ResponseEntity.ok( | ||
81 | - tkDataViewService.saveDataView(TkDataViewDTO)); | 61 | + if (StringUtils.isNotBlank(organizationId)) { |
62 | + queryMap.put("organizationId", organizationId); | ||
82 | } | 63 | } |
83 | - | ||
84 | - @PutMapping | ||
85 | - @ApiOperation("修改") | ||
86 | - @PreAuthorize( | ||
87 | - "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:dataview:center:update'})") | ||
88 | - public ResponseEntity<TkDataViewDTO> update( | ||
89 | - @Validated({UpdateGroup.class}) @RequestBody TkDataViewDTO TkDataViewDTO) | ||
90 | - throws ThingsboardException { | ||
91 | - TkDataViewDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | ||
92 | - return ResponseEntity.ok( | ||
93 | - tkDataViewService.updateDataView(TkDataViewDTO)); | 64 | + if (StringUtils.isNotBlank(state)) { |
65 | + queryMap.put("state", state); | ||
94 | } | 66 | } |
95 | - | ||
96 | - @DeleteMapping | ||
97 | - @ApiOperation("删除") | ||
98 | - @PreAuthorize( | ||
99 | - "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:dataview:center:delete'})") | ||
100 | - public ResponseEntity<Boolean> delete( | ||
101 | - @Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) | ||
102 | - throws ThingsboardException { | ||
103 | - deleteDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | ||
104 | - return ResponseEntity.ok(tkDataViewService.deleteDataView(deleteDTO)); | 67 | + if (null != orderType) { |
68 | + queryMap.put(ORDER_TYPE, orderType.name()); | ||
105 | } | 69 | } |
106 | - | ||
107 | - @GetMapping("/get_configuration_info/{id}") | ||
108 | - @ApiOperation("获取大屏信息") | ||
109 | - @PreAuthorize( | ||
110 | - "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:dataview:center:get_dataview_info:design','api:yt:dataview:center:get_dataview_info:preview'})") | ||
111 | - public ResponseEntity<TkDataViewContentInfoDTO> getConfigurationInfos( | ||
112 | - @PathVariable("id") String id) throws ThingsboardException { | ||
113 | - return ResponseEntity.ok( | ||
114 | - tkDataViewService.getDataViewInfos( | ||
115 | - id, getCurrentUser().getCurrentTenantId())); | 70 | + queryMap.put("userId", getCurrentUser().getCurrentUserId()); |
71 | + TkPageData<TkDataViewDTO> pageData = tkDataViewService.page(queryMap, getCurrentUser().isTenantAdmin()); | ||
72 | + if(!pageData.getItems().isEmpty()){ | ||
73 | + for(TkDataViewDTO dto : pageData.getItems()){ | ||
74 | + setPublicCustomerIdToCache(dto); | ||
75 | + } | ||
116 | } | 76 | } |
77 | + return pageData; | ||
78 | + } | ||
117 | 79 | ||
118 | - @GetMapping("/publish/{id}") | ||
119 | - @ApiOperation("发布") | ||
120 | - @PreAuthorize("@check.checkPermissions({},{})") | ||
121 | - public ResponseEntity<Boolean> publishDataView(@PathVariable("id") String id) throws ThingsboardException { | ||
122 | - return ResponseEntity.ok( | ||
123 | - tkDataViewService.publishDataView(id, getCurrentUser().getCurrentTenantId())); | ||
124 | - } | 80 | + @PostMapping |
81 | + @ApiOperation("新增") | ||
82 | + @PreAuthorize( | ||
83 | + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:dataview:center:post'})") | ||
84 | + public ResponseEntity<TkDataViewDTO> save( | ||
85 | + @Validated({AddGroup.class}) @RequestBody TkDataViewDTO TkDataViewDTO) | ||
86 | + throws ThingsboardException { | ||
87 | + TkDataViewDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | ||
88 | + return ResponseEntity.ok(tkDataViewService.saveDataView(TkDataViewDTO)); | ||
89 | + } | ||
90 | + | ||
91 | + @PutMapping | ||
92 | + @ApiOperation("修改") | ||
93 | + @PreAuthorize( | ||
94 | + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:dataview:center:update'})") | ||
95 | + public ResponseEntity<TkDataViewDTO> update( | ||
96 | + @Validated({UpdateGroup.class}) @RequestBody TkDataViewDTO TkDataViewDTO) | ||
97 | + throws ThingsboardException { | ||
98 | + TkDataViewDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | ||
99 | + return ResponseEntity.ok(tkDataViewService.updateDataView(TkDataViewDTO)); | ||
100 | + } | ||
101 | + | ||
102 | + @DeleteMapping | ||
103 | + @ApiOperation("删除") | ||
104 | + @PreAuthorize( | ||
105 | + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:dataview:center:delete'})") | ||
106 | + public ResponseEntity<Boolean> delete( | ||
107 | + @Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) | ||
108 | + throws ThingsboardException { | ||
109 | + deleteDTO.setTenantId(getCurrentUser().getCurrentTenantId()); | ||
110 | + return ResponseEntity.ok(tkDataViewService.deleteDataView(deleteDTO)); | ||
111 | + } | ||
112 | + | ||
113 | + @GetMapping("/get_configuration_info/{id}") | ||
114 | + @ApiOperation("获取大屏信息") | ||
115 | + @PreAuthorize( | ||
116 | + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:dataview:center:get_dataview_info:design'," | ||
117 | + + "'api:yt:dataview:center:get_dataview_info:preview'})") | ||
118 | + public ResponseEntity<TkDataViewContentInfoDTO> getConfigurationInfos( | ||
119 | + @PathVariable("id") String id) throws ThingsboardException { | ||
120 | + return ResponseEntity.ok( | ||
121 | + tkDataViewService.getDataViewInfos(id, getCurrentUser().getCurrentTenantId())); | ||
122 | + } | ||
123 | + | ||
124 | + @GetMapping("/publish/{id}") | ||
125 | + @ApiOperation("发布") | ||
126 | + @PreAuthorize("@check.checkPermissions({},{})") | ||
127 | + public ResponseEntity<Boolean> publishDataView(@PathVariable("id") String id) | ||
128 | + throws ThingsboardException { | ||
129 | + return ResponseEntity.ok( | ||
130 | + tkDataViewService.publishDataView(id, getCurrentUser().getCurrentTenantId())); | ||
131 | + } | ||
132 | + | ||
133 | + @GetMapping("/cancel_publish/{id}") | ||
134 | + @ApiOperation("取消发布") | ||
135 | + @PreAuthorize("@check.checkPermissions({},{})") | ||
136 | + public ResponseEntity<Boolean> cancelPublishDataView(@PathVariable("id") String id) | ||
137 | + throws ThingsboardException { | ||
138 | + return ResponseEntity.ok( | ||
139 | + tkDataViewService.cancelPublishDataView(id, getCurrentUser().getCurrentTenantId())); | ||
140 | + } | ||
125 | 141 | ||
126 | - @GetMapping("/cancel_publish/{id}") | ||
127 | - @ApiOperation("取消发布") | ||
128 | - @PreAuthorize("@check.checkPermissions({},{})") | ||
129 | - public ResponseEntity<Boolean> cancelPublishDataView(@PathVariable("id") String id) throws ThingsboardException { | ||
130 | - return ResponseEntity.ok( | ||
131 | - tkDataViewService.cancelPublishDataView(id, getCurrentUser().getCurrentTenantId())); | 142 | + @PostMapping("share/{id}") |
143 | + @ApiOperation("分享") | ||
144 | + @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN'},{'api:yt:dataview:center:share'})") | ||
145 | + public ResponseEntity<Boolean> share( | ||
146 | + @PathVariable("id") String id, | ||
147 | + @RequestParam(value = "accessCredentials", required = false) String accessCredentials, | ||
148 | + @RequestParam(value = "isShare") boolean isShare) | ||
149 | + throws ThingsboardException { | ||
150 | + if (StringUtils.isEmpty(id)) { | ||
151 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
132 | } | 152 | } |
153 | + return ResponseEntity.ok( | ||
154 | + tkDataViewService.shareOrMonopolyDataViewCenter( | ||
155 | + isShare, id, accessCredentials, getCurrentUser().getCurrentTenantId())); | ||
156 | + } | ||
133 | } | 157 | } |
application/src/main/java/org/thingsboard/server/controller/yunteng/TkShareViewController.java
0 → 100644
1 | +package org.thingsboard.server.controller.yunteng; | ||
2 | + | ||
3 | +import io.swagger.annotations.Api; | ||
4 | +import io.swagger.annotations.ApiOperation; | ||
5 | +import lombok.RequiredArgsConstructor; | ||
6 | +import org.springframework.web.bind.annotation.*; | ||
7 | +import org.thingsboard.server.common.data.StringUtils; | ||
8 | +import org.thingsboard.server.common.data.exception.ThingsboardException; | ||
9 | +import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; | ||
10 | +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | ||
11 | +import org.thingsboard.server.common.data.yunteng.enums.ShareViewType; | ||
12 | +import org.thingsboard.server.common.data.yunteng.utils.tools.ResponseResult; | ||
13 | +import org.thingsboard.server.controller.BaseController; | ||
14 | +import org.thingsboard.server.dao.yunteng.service.TkShareViewService; | ||
15 | + | ||
16 | +@RestController | ||
17 | +@RequiredArgsConstructor | ||
18 | +@RequestMapping("api/yt/share") | ||
19 | +@Api(tags = {"分享的视图"}) | ||
20 | +public class TkShareViewController extends BaseController { | ||
21 | + private final TkShareViewService tkShareViewService; | ||
22 | + | ||
23 | + @GetMapping("/check/{type}/{viewId}") | ||
24 | + @ApiOperation(value = "检查分享视图是否需要访问凭证") | ||
25 | + public ResponseResult<Boolean> checkPublicViewNeedCredentials( | ||
26 | + @PathVariable("type") ShareViewType type, @PathVariable("viewId") String viewId) | ||
27 | + throws ThingsboardException { | ||
28 | + if (StringUtils.isEmpty(viewId)) { | ||
29 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
30 | + } | ||
31 | + return ResponseResult.success( | ||
32 | + tkShareViewService.checkPublicViewNeedCredentials( | ||
33 | + type, viewId, getCurrentUser().getCurrentTenantId())); | ||
34 | + } | ||
35 | + | ||
36 | + @GetMapping("/{share_view_type}/share_data/{id}") | ||
37 | + @ApiOperation(value = "查看分享的数据") | ||
38 | + public ResponseResult<Object> viewDataComponentsByBoardId( | ||
39 | + @PathVariable("id") String id, | ||
40 | + @PathVariable("share_view_type") ShareViewType shareViewType, | ||
41 | + @RequestParam(value = "accessCredentials",required = false) String accessCredentials) | ||
42 | + throws ThingsboardException { | ||
43 | + if (StringUtils.isEmpty(id) || null == shareViewType) { | ||
44 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
45 | + } | ||
46 | + return ResponseResult.success( | ||
47 | + tkShareViewService.viewShareDataById( | ||
48 | + shareViewType, id, accessCredentials, getCurrentUser().getCurrentTenantId())); | ||
49 | + } | ||
50 | +} |
@@ -19,13 +19,17 @@ public interface FastIotConstants { | @@ -19,13 +19,17 @@ public interface FastIotConstants { | ||
19 | Pattern EMAIL_PATTERN = Pattern.compile(EMAIL, Pattern.CASE_INSENSITIVE); | 19 | Pattern EMAIL_PATTERN = Pattern.compile(EMAIL, Pattern.CASE_INSENSITIVE); |
20 | Pattern CHINA_MOBILE_PATTERN = Pattern.compile(MOBILE); | 20 | Pattern CHINA_MOBILE_PATTERN = Pattern.compile(MOBILE); |
21 | String DEFAULT_DELIMITER = "#"; | 21 | String DEFAULT_DELIMITER = "#"; |
22 | + String RPC_COMMAND = "rpcCommand"; | ||
23 | + | ||
22 | interface CacheConfigKey { | 24 | interface CacheConfigKey { |
23 | String CACHE_CONFIG_KEY = "yunTengIotCache"; | 25 | String CACHE_CONFIG_KEY = "yunTengIotCache"; |
24 | String USER_PERMISSION_PREFIX = "userPermissionFor_"; | 26 | String USER_PERMISSION_PREFIX = "userPermissionFor_"; |
25 | String MOBILE_LOGIN_SMS_CODE = "mobileLoginSmsCode"; | 27 | String MOBILE_LOGIN_SMS_CODE = "mobileLoginSmsCode"; |
26 | - | ||
27 | String AREA = "thingsArea"; | 28 | String AREA = "thingsArea"; |
29 | + String PUBLIC_ID = "publicId_"; | ||
30 | + String TASK_CENTER_INFOS = "taskCenterInfos_"; | ||
28 | } | 31 | } |
32 | + | ||
29 | interface TBCacheConfig { | 33 | interface TBCacheConfig { |
30 | String TB_CACHE_CONFIG_KEY = "TB_CONNECT_CACHE"; | 34 | String TB_CACHE_CONFIG_KEY = "TB_CONNECT_CACHE"; |
31 | String EXISTING_TENANT = "EXISTING_TENANT"; | 35 | String EXISTING_TENANT = "EXISTING_TENANT"; |
@@ -48,7 +52,6 @@ public interface FastIotConstants { | @@ -48,7 +52,6 @@ public interface FastIotConstants { | ||
48 | int DRAFT = 0; | 52 | int DRAFT = 0; |
49 | } | 53 | } |
50 | 54 | ||
51 | - | ||
52 | interface ConfigureLevel { | 55 | interface ConfigureLevel { |
53 | String CONFIGURE = "CONFIGURE"; | 56 | String CONFIGURE = "CONFIGURE"; |
54 | String CONTENT = "CONTENT"; | 57 | String CONTENT = "CONTENT"; |
@@ -130,6 +133,12 @@ public interface FastIotConstants { | @@ -130,6 +133,12 @@ public interface FastIotConstants { | ||
130 | /** 在线 */ | 133 | /** 在线 */ |
131 | public static final int ONLINE = 1; | 134 | public static final int ONLINE = 1; |
132 | 135 | ||
136 | + /** 发布 */ | ||
137 | + public static final int PUBLISH = 1; | ||
138 | + | ||
139 | + /** 取消发布 */ | ||
140 | + public static final int CANCEL_PUBLISH = 0; | ||
141 | + | ||
133 | /** 删除成功 */ | 142 | /** 删除成功 */ |
134 | public static final String DELETE_SUCCESS = "删除成功"; | 143 | public static final String DELETE_SUCCESS = "删除成功"; |
135 | 144 |
@@ -2,13 +2,14 @@ package org.thingsboard.server.common.data.yunteng.core.cache; | @@ -2,13 +2,14 @@ package org.thingsboard.server.common.data.yunteng.core.cache; | ||
2 | import org.springframework.cache.Cache; | 2 | import org.springframework.cache.Cache; |
3 | import org.springframework.cache.CacheManager; | 3 | import org.springframework.cache.CacheManager; |
4 | import org.springframework.stereotype.Component; | 4 | import org.springframework.stereotype.Component; |
5 | +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; | ||
5 | import java.util.Objects; | 6 | import java.util.Objects; |
6 | import java.util.Optional; | 7 | import java.util.Optional; |
7 | 8 | ||
8 | @Component | 9 | @Component |
9 | public class CacheUtils { | 10 | public class CacheUtils { |
10 | 11 | ||
11 | - private final String COMMON_STORE_AREA = "yun-teng-iot-common"; | 12 | + private final String COMMON_STORE_AREA = FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY; |
12 | 13 | ||
13 | private final CacheManager cacheManager; | 14 | private final CacheManager cacheManager; |
14 | 15 |
@@ -89,6 +89,11 @@ public enum ErrorMessage { | @@ -89,6 +89,11 @@ public enum ErrorMessage { | ||
89 | INVALID_TOPIC(400065,"无效Topic。"), | 89 | INVALID_TOPIC(400065,"无效Topic。"), |
90 | BUCKET_NOT_CONFORM_RENAME_RULE(400066,"存储桶不符合命名规范!!"), | 90 | BUCKET_NOT_CONFORM_RENAME_RULE(400066,"存储桶不符合命名规范!!"), |
91 | MINIO_KEY_AND_SIGNATURE_ERROR(400067,"Minio签名不匹配!!"), | 91 | MINIO_KEY_AND_SIGNATURE_ERROR(400067,"Minio签名不匹配!!"), |
92 | + CURRENT_VIEW_IS_PRIVATE(400068,"当前视图为私有视图,拒绝访问!"), | ||
93 | + CURRENT_URL_REQUIRES_PERMISSION(400069,"当前视图需要访问凭证或凭证验证失败!"), | ||
94 | + SHARE_VIEW_TYPE_NOT_EXIST(400070,"分享视图类型不存在"), | ||
95 | + DATA_STATE_ENABLE_NOT_DELETE(400071,"【%s】数据为启用状态不能删除!!"), | ||
96 | + EXECUTE_COMMAND_IS_NULL(400072,"执行命令不能为空"), | ||
92 | HAVE_NO_PERMISSION(500002,"没有修改权限"); | 97 | HAVE_NO_PERMISSION(500002,"没有修改权限"); |
93 | private final int code; | 98 | private final int code; |
94 | private String message; | 99 | private String message; |
common/data/src/main/java/org/thingsboard/server/common/data/yunteng/dto/ConfigurationCenterDTO.java
@@ -10,7 +10,7 @@ import javax.validation.constraints.NotEmpty; | @@ -10,7 +10,7 @@ import javax.validation.constraints.NotEmpty; | ||
10 | 10 | ||
11 | @EqualsAndHashCode(callSuper = true) | 11 | @EqualsAndHashCode(callSuper = true) |
12 | @Data | 12 | @Data |
13 | -public class ConfigurationCenterDTO extends TenantDTO { | 13 | +public class ConfigurationCenterDTO extends PublicCustomerDTO { |
14 | @ApiModelProperty(value = "组态名称", required = true) | 14 | @ApiModelProperty(value = "组态名称", required = true) |
15 | @NotEmpty( | 15 | @NotEmpty( |
16 | message = "组态名称不能为空或空字符串", | 16 | message = "组态名称不能为空或空字符串", |
@@ -5,14 +5,13 @@ import lombok.Data; | @@ -5,14 +5,13 @@ import lombok.Data; | ||
5 | import lombok.EqualsAndHashCode; | 5 | import lombok.EqualsAndHashCode; |
6 | import org.thingsboard.server.common.data.yunteng.common.AddGroup; | 6 | import org.thingsboard.server.common.data.yunteng.common.AddGroup; |
7 | import org.thingsboard.server.common.data.yunteng.dto.board.ComponentLayoutDTO; | 7 | import org.thingsboard.server.common.data.yunteng.dto.board.ComponentLayoutDTO; |
8 | -import org.thingsboard.server.common.data.yunteng.enums.ViewType; | ||
9 | 8 | ||
10 | import javax.validation.constraints.NotEmpty; | 9 | import javax.validation.constraints.NotEmpty; |
11 | import java.util.List; | 10 | import java.util.List; |
12 | 11 | ||
13 | @EqualsAndHashCode(callSuper = true) | 12 | @EqualsAndHashCode(callSuper = true) |
14 | @Data | 13 | @Data |
15 | -public class DataBoardDTO extends TenantDTO { | 14 | +public class DataBoardDTO extends PublicCustomerDTO { |
16 | @ApiModelProperty(value = "数据看板名称", required = true) | 15 | @ApiModelProperty(value = "数据看板名称", required = true) |
17 | @NotEmpty(message = "数据看板名称不能为空或者空字符串", groups = AddGroup.class) | 16 | @NotEmpty(message = "数据看板名称不能为空或者空字符串", groups = AddGroup.class) |
18 | private String name; | 17 | private String name; |
@@ -21,9 +20,6 @@ public class DataBoardDTO extends TenantDTO { | @@ -21,9 +20,6 @@ public class DataBoardDTO extends TenantDTO { | ||
21 | @NotEmpty(message = "组织ID不能为空或者空字符串", groups = AddGroup.class) | 20 | @NotEmpty(message = "组织ID不能为空或者空字符串", groups = AddGroup.class) |
22 | private String organizationId; | 21 | private String organizationId; |
23 | 22 | ||
24 | - @ApiModelProperty(value = "视图类型") | ||
25 | - private ViewType viewType = ViewType.PRIVATE_VIEW; | ||
26 | - | ||
27 | @ApiModelProperty(value = "组件布局") | 23 | @ApiModelProperty(value = "组件布局") |
28 | private List<ComponentLayoutDTO> layout; | 24 | private List<ComponentLayoutDTO> layout; |
29 | 25 |
@@ -121,6 +121,8 @@ public class DeviceDTO extends TenantDTO { | @@ -121,6 +121,8 @@ public class DeviceDTO extends TenantDTO { | ||
121 | @ApiModelProperty(value = "启用/禁用") | 121 | @ApiModelProperty(value = "启用/禁用") |
122 | private boolean enable; | 122 | private boolean enable; |
123 | 123 | ||
124 | + private JsonNode customerAdditionalInfo; | ||
125 | + | ||
124 | public DeviceState getDeviceState() { | 126 | public DeviceState getDeviceState() { |
125 | if (lastOnlineTime == null) { | 127 | if (lastOnlineTime == null) { |
126 | return DeviceState.INACTIVE; | 128 | return DeviceState.INACTIVE; |
common/data/src/main/java/org/thingsboard/server/common/data/yunteng/dto/PublicCustomerDTO.java
0 → 100644
1 | +package org.thingsboard.server.common.data.yunteng.dto; | ||
2 | + | ||
3 | +import io.swagger.annotations.ApiModelProperty; | ||
4 | +import lombok.Data; | ||
5 | +import org.thingsboard.server.common.data.yunteng.enums.ViewType; | ||
6 | + | ||
7 | +@Data | ||
8 | +public class PublicCustomerDTO extends TenantDTO { | ||
9 | + @ApiModelProperty(value = "分享公共ID") | ||
10 | + private String publicId; | ||
11 | + | ||
12 | + @ApiModelProperty(value = "视图类型") | ||
13 | + private ViewType viewType = ViewType.PRIVATE_VIEW; | ||
14 | + | ||
15 | + @ApiModelProperty(value = "访问凭证") | ||
16 | + private String accessCredentials; | ||
17 | +} |
@@ -11,33 +11,27 @@ import javax.validation.constraints.NotEmpty; | @@ -11,33 +11,27 @@ import javax.validation.constraints.NotEmpty; | ||
11 | 11 | ||
12 | @EqualsAndHashCode(callSuper = true) | 12 | @EqualsAndHashCode(callSuper = true) |
13 | @Data | 13 | @Data |
14 | -public class TkDataViewDTO extends TenantDTO { | ||
15 | - @ApiModelProperty(value = "大屏名称", required = true) | ||
16 | - @NotEmpty( | ||
17 | - message = "大屏名称不能为空或空字符串", | ||
18 | - groups = {UpdateGroup.class, AddGroup.class}) | ||
19 | - private String name; | 14 | +public class TkDataViewDTO extends PublicCustomerDTO { |
15 | + @ApiModelProperty(value = "大屏名称", required = true) | ||
16 | + @NotEmpty( | ||
17 | + message = "大屏名称不能为空或空字符串", | ||
18 | + groups = {UpdateGroup.class, AddGroup.class}) | ||
19 | + private String name; | ||
20 | 20 | ||
21 | - @ApiModelProperty(value = "状态:0待发布 1发布") | ||
22 | - private Integer state; | 21 | + @ApiModelProperty(value = "状态:0待发布 1发布") |
22 | + private Integer state; | ||
23 | 23 | ||
24 | - @ApiModelProperty(value = "大屏描述") | ||
25 | - private String remark; | 24 | + @ApiModelProperty(value = "大屏描述") |
25 | + private String remark; | ||
26 | 26 | ||
27 | - @ApiModelProperty(value = "组织ID", required = true) | ||
28 | - @NotEmpty( | ||
29 | - message = "组织ID不能为空或空字符串", | ||
30 | - groups = {UpdateGroup.class, AddGroup.class}) | ||
31 | - private String organizationId; | 27 | + @ApiModelProperty(value = "组织ID", required = true) |
28 | + @NotEmpty( | ||
29 | + message = "组织ID不能为空或空字符串", | ||
30 | + groups = {UpdateGroup.class, AddGroup.class}) | ||
31 | + private String organizationId; | ||
32 | 32 | ||
33 | - @ApiModelProperty(value = "组态缩略图") | ||
34 | - private String thumbnail; | 33 | + @ApiModelProperty(value = "组态缩略图") |
34 | + private String thumbnail; | ||
35 | 35 | ||
36 | - private OrganizationDTO organizationDTO; | ||
37 | - | ||
38 | - @ApiModelProperty(value = "视图类型") | ||
39 | - private ViewType viewType; | ||
40 | - | ||
41 | - @ApiModelProperty(value = "访问凭证") | ||
42 | - private String accessCredentials; | 36 | + private OrganizationDTO organizationDTO; |
43 | } | 37 | } |
@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.annotation.TableField; | @@ -5,7 +5,9 @@ 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.apache.ibatis.type.EnumTypeHandler; | ||
8 | import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; | 9 | import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; |
10 | +import org.thingsboard.server.common.data.yunteng.enums.ViewType; | ||
9 | 11 | ||
10 | @EqualsAndHashCode(callSuper = true) | 12 | @EqualsAndHashCode(callSuper = true) |
11 | @TableName(ModelConstants.Table.TK_CONFIGURATION_CENTER_NAME) | 13 | @TableName(ModelConstants.Table.TK_CONFIGURATION_CENTER_NAME) |
@@ -16,6 +18,13 @@ public class TkConfigurationCenterEntity extends TenantBaseEntity { | @@ -16,6 +18,13 @@ public class TkConfigurationCenterEntity extends TenantBaseEntity { | ||
16 | private String remark; | 18 | private String remark; |
17 | private String organizationId; | 19 | private String organizationId; |
18 | private String platform; | 20 | private String platform; |
21 | + | ||
19 | @TableField(updateStrategy = FieldStrategy.IGNORED) | 22 | @TableField(updateStrategy = FieldStrategy.IGNORED) |
20 | private String thumbnail; | 23 | private String thumbnail; |
24 | + | ||
25 | + @TableField(typeHandler = EnumTypeHandler.class) | ||
26 | + private ViewType viewType; | ||
27 | + | ||
28 | + @TableField(updateStrategy = FieldStrategy.IGNORED) | ||
29 | + private String accessCredentials; | ||
21 | } | 30 | } |
1 | package org.thingsboard.server.dao.yunteng.entities; | 1 | package org.thingsboard.server.dao.yunteng.entities; |
2 | 2 | ||
3 | +import com.baomidou.mybatisplus.annotation.FieldStrategy; | ||
3 | import com.baomidou.mybatisplus.annotation.TableField; | 4 | import com.baomidou.mybatisplus.annotation.TableField; |
4 | import com.baomidou.mybatisplus.annotation.TableName; | 5 | import com.baomidou.mybatisplus.annotation.TableName; |
5 | import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | 6 | import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; |
@@ -30,4 +31,7 @@ public class TkDataBoardEntity extends TenantBaseEntity { | @@ -30,4 +31,7 @@ public class TkDataBoardEntity extends TenantBaseEntity { | ||
30 | private Integer componentNum; | 31 | private Integer componentNum; |
31 | 32 | ||
32 | private String organizationId; | 33 | private String organizationId; |
34 | + | ||
35 | + @TableField(updateStrategy = FieldStrategy.IGNORED) | ||
36 | + private String accessCredentials; | ||
33 | } | 37 | } |
@@ -25,5 +25,6 @@ public class TkDataViewEntity extends TenantBaseEntity { | @@ -25,5 +25,6 @@ public class TkDataViewEntity extends TenantBaseEntity { | ||
25 | @TableField(typeHandler = EnumTypeHandler.class) | 25 | @TableField(typeHandler = EnumTypeHandler.class) |
26 | private ViewType viewType; | 26 | private ViewType viewType; |
27 | 27 | ||
28 | + @TableField(updateStrategy = FieldStrategy.IGNORED) | ||
28 | private String accessCredentials; | 29 | private String accessCredentials; |
29 | } | 30 | } |
@@ -12,6 +12,7 @@ import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidatio | @@ -12,6 +12,7 @@ import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidatio | ||
12 | import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | 12 | import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; |
13 | import org.thingsboard.server.common.data.yunteng.dto.*; | 13 | import org.thingsboard.server.common.data.yunteng.dto.*; |
14 | import org.thingsboard.server.common.data.yunteng.dto.request.ConfigurationContentInfoDTO; | 14 | import org.thingsboard.server.common.data.yunteng.dto.request.ConfigurationContentInfoDTO; |
15 | +import org.thingsboard.server.common.data.yunteng.enums.ViewType; | ||
15 | import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; | 16 | import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; |
16 | import org.thingsboard.server.dao.yunteng.entities.TkConfigurationCenterEntity; | 17 | import org.thingsboard.server.dao.yunteng.entities.TkConfigurationCenterEntity; |
17 | import org.thingsboard.server.dao.yunteng.mapper.ConfigurationCenterMapper; | 18 | import org.thingsboard.server.dao.yunteng.mapper.ConfigurationCenterMapper; |
@@ -128,4 +129,52 @@ public class TkConfigurationCenterServiceImpl | @@ -128,4 +129,52 @@ public class TkConfigurationCenterServiceImpl | ||
128 | ? list.get(FastIotConstants.MagicNumber.ZERO) | 129 | ? list.get(FastIotConstants.MagicNumber.ZERO) |
129 | : null; | 130 | : null; |
130 | } | 131 | } |
132 | + | ||
133 | + @Override | ||
134 | + public ConfigurationCenterDTO getConfigurationCenterInfoById(String id, String tenantId) { | ||
135 | + TkConfigurationCenterEntity entity = | ||
136 | + baseMapper.selectOne( | ||
137 | + new LambdaQueryWrapper<TkConfigurationCenterEntity>() | ||
138 | + .eq(TkConfigurationCenterEntity::getTenantId, tenantId) | ||
139 | + .eq(TkConfigurationCenterEntity::getId, id)); | ||
140 | + if (null == entity) { | ||
141 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
142 | + } | ||
143 | + return entity.getDTO(ConfigurationCenterDTO.class); | ||
144 | + } | ||
145 | + | ||
146 | + @Override | ||
147 | + public boolean isNeedCredentialsForPublicView(String id, String tenantId) { | ||
148 | + TkConfigurationCenterEntity entity = | ||
149 | + baseMapper.selectOne( | ||
150 | + new LambdaQueryWrapper<TkConfigurationCenterEntity>() | ||
151 | + .eq(TkConfigurationCenterEntity::getTenantId, tenantId) | ||
152 | + .eq(TkConfigurationCenterEntity::getId, id)); | ||
153 | + if (null == entity) { | ||
154 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
155 | + } | ||
156 | + return StringUtils.isNotEmpty(entity.getAccessCredentials()); | ||
157 | + } | ||
158 | + | ||
159 | + @Override | ||
160 | + @Transactional | ||
161 | + public boolean shareOrMonopolyConfigurationCenter( | ||
162 | + boolean isShare, String id, String accessCredentials, String tenantId) { | ||
163 | + TkConfigurationCenterEntity entity = | ||
164 | + baseMapper.selectOne( | ||
165 | + new LambdaQueryWrapper<TkConfigurationCenterEntity>() | ||
166 | + .eq(TkConfigurationCenterEntity::getTenantId, tenantId) | ||
167 | + .eq(TkConfigurationCenterEntity::getId, id)); | ||
168 | + if (null == entity) { | ||
169 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
170 | + } | ||
171 | + if (isShare) { | ||
172 | + entity.setViewType(ViewType.PUBLIC_VIEW); | ||
173 | + entity.setAccessCredentials(accessCredentials); | ||
174 | + } else { | ||
175 | + entity.setViewType(ViewType.PRIVATE_VIEW); | ||
176 | + entity.setAccessCredentials(null); | ||
177 | + } | ||
178 | + return baseMapper.updateById(entity) > FastIotConstants.MagicNumber.ZERO; | ||
179 | + } | ||
131 | } | 180 | } |
@@ -12,6 +12,7 @@ import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidatio | @@ -12,6 +12,7 @@ import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidatio | ||
12 | import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | 12 | import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; |
13 | import org.thingsboard.server.common.data.yunteng.dto.*; | 13 | import org.thingsboard.server.common.data.yunteng.dto.*; |
14 | import org.thingsboard.server.common.data.yunteng.dto.board.ComponentLayoutDTO; | 14 | import org.thingsboard.server.common.data.yunteng.dto.board.ComponentLayoutDTO; |
15 | +import org.thingsboard.server.common.data.yunteng.enums.ViewType; | ||
15 | import org.thingsboard.server.common.data.yunteng.utils.JacksonUtil; | 16 | import org.thingsboard.server.common.data.yunteng.utils.JacksonUtil; |
16 | import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; | 17 | import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; |
17 | import org.thingsboard.server.dao.yunteng.entities.TkDataBoardEntity; | 18 | import org.thingsboard.server.dao.yunteng.entities.TkDataBoardEntity; |
@@ -82,12 +83,11 @@ public class TkDataBoardServiceImpl extends AbstractBaseService<DataBoardMapper, | @@ -82,12 +83,11 @@ public class TkDataBoardServiceImpl extends AbstractBaseService<DataBoardMapper, | ||
82 | @Transactional | 83 | @Transactional |
83 | public DataBoardDTO saveOrUpdateDataBoard(DataBoardDTO dataBoardDTO) { | 84 | public DataBoardDTO saveOrUpdateDataBoard(DataBoardDTO dataBoardDTO) { |
84 | TkDataBoardEntity dataBoard = dataBoardDTO.getEntity(TkDataBoardEntity.class); | 85 | TkDataBoardEntity dataBoard = dataBoardDTO.getEntity(TkDataBoardEntity.class); |
86 | + if(dataBoardDTO.getViewType().equals(ViewType.PRIVATE_VIEW)){ | ||
87 | + dataBoard.setAccessCredentials(null); | ||
88 | + } | ||
85 | if (StringUtils.isEmpty(dataBoardDTO.getId())) { | 89 | if (StringUtils.isEmpty(dataBoardDTO.getId())) { |
86 | - try { | ||
87 | - baseMapper.insert(dataBoard); | ||
88 | - } catch (Exception e) { | ||
89 | - e.printStackTrace(); | ||
90 | - } | 90 | + baseMapper.insert(dataBoard); |
91 | } else { | 91 | } else { |
92 | if (null != dataBoardDTO.getLayout() && !dataBoardDTO.getLayout().isEmpty()) { | 92 | if (null != dataBoardDTO.getLayout() && !dataBoardDTO.getLayout().isEmpty()) { |
93 | dataBoard.setLayout(JacksonUtil.convertValue(dataBoardDTO.getLayout(), JsonNode.class)); | 93 | dataBoard.setLayout(JacksonUtil.convertValue(dataBoardDTO.getLayout(), JsonNode.class)); |
@@ -111,9 +111,9 @@ public class TkDataBoardServiceImpl extends AbstractBaseService<DataBoardMapper, | @@ -111,9 +111,9 @@ public class TkDataBoardServiceImpl extends AbstractBaseService<DataBoardMapper, | ||
111 | @Transactional | 111 | @Transactional |
112 | public boolean deleteDataBoard(DeleteDTO deleteDTO) { | 112 | public boolean deleteDataBoard(DeleteDTO deleteDTO) { |
113 | dataComponentMapper.delete( | 113 | dataComponentMapper.delete( |
114 | - new LambdaQueryWrapper<TkDataComponentEntity>() | ||
115 | - .eq(TkDataComponentEntity::getTenantId, deleteDTO.getTenantId()) | ||
116 | - .in(TkDataComponentEntity::getDataBoardId, deleteDTO.getIds())); | 114 | + new LambdaQueryWrapper<TkDataComponentEntity>() |
115 | + .eq(TkDataComponentEntity::getTenantId, deleteDTO.getTenantId()) | ||
116 | + .in(TkDataComponentEntity::getDataBoardId, deleteDTO.getIds())); | ||
117 | return baseMapper.delete( | 117 | return baseMapper.delete( |
118 | new LambdaQueryWrapper<TkDataBoardEntity>() | 118 | new LambdaQueryWrapper<TkDataBoardEntity>() |
119 | .eq(TkDataBoardEntity::getTenantId, deleteDTO.getTenantId()) | 119 | .eq(TkDataBoardEntity::getTenantId, deleteDTO.getTenantId()) |
@@ -170,4 +170,38 @@ public class TkDataBoardServiceImpl extends AbstractBaseService<DataBoardMapper, | @@ -170,4 +170,38 @@ public class TkDataBoardServiceImpl extends AbstractBaseService<DataBoardMapper, | ||
170 | public boolean updateDataBoardComponentNum(String id, String tenantId, int count) { | 170 | public boolean updateDataBoardComponentNum(String id, String tenantId, int count) { |
171 | return baseMapper.updateDataBoardComponentNum(id, tenantId, count); | 171 | return baseMapper.updateDataBoardComponentNum(id, tenantId, count); |
172 | } | 172 | } |
173 | + | ||
174 | + @Override | ||
175 | + public boolean isNeedCredentialsForPublicView(String id, String tenantId) { | ||
176 | + TkDataBoardEntity entity = | ||
177 | + baseMapper.selectOne( | ||
178 | + new LambdaQueryWrapper<TkDataBoardEntity>() | ||
179 | + .eq(TkDataBoardEntity::getTenantId, tenantId) | ||
180 | + .eq(TkDataBoardEntity::getId, id)); | ||
181 | + if (null == entity) { | ||
182 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
183 | + } | ||
184 | + return StringUtils.isNotEmpty(entity.getAccessCredentials()); | ||
185 | + } | ||
186 | + | ||
187 | + @Override | ||
188 | + public boolean shareOrMonopolyDataBoard( | ||
189 | + boolean isShare, String id, String accessCredentials, String tenantId) { | ||
190 | + TkDataBoardEntity entity = | ||
191 | + baseMapper.selectOne( | ||
192 | + new LambdaQueryWrapper<TkDataBoardEntity>() | ||
193 | + .eq(TkDataBoardEntity::getTenantId, tenantId) | ||
194 | + .eq(TkDataBoardEntity::getId, id)); | ||
195 | + if (null == entity) { | ||
196 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
197 | + } | ||
198 | + if (isShare) { | ||
199 | + entity.setViewType(ViewType.PUBLIC_VIEW); | ||
200 | + entity.setAccessCredentials(accessCredentials); | ||
201 | + } else { | ||
202 | + entity.setViewType(ViewType.PRIVATE_VIEW); | ||
203 | + entity.setAccessCredentials(null); | ||
204 | + } | ||
205 | + return baseMapper.updateById(entity) > FastIotConstants.MagicNumber.ZERO; | ||
206 | + } | ||
173 | } | 207 | } |
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
4 | import com.baomidou.mybatisplus.core.metadata.IPage; | 4 | import com.baomidou.mybatisplus.core.metadata.IPage; |
5 | import lombok.RequiredArgsConstructor; | 5 | import lombok.RequiredArgsConstructor; |
6 | import lombok.extern.slf4j.Slf4j; | 6 | import lombok.extern.slf4j.Slf4j; |
7 | +import org.apache.commons.lang3.StringUtils; | ||
7 | import org.springframework.stereotype.Service; | 8 | import org.springframework.stereotype.Service; |
8 | import org.springframework.transaction.annotation.Transactional; | 9 | import org.springframework.transaction.annotation.Transactional; |
9 | import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; | 10 | import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; |
@@ -11,9 +12,9 @@ import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidatio | @@ -11,9 +12,9 @@ import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidatio | ||
11 | import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | 12 | import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; |
12 | import org.thingsboard.server.common.data.yunteng.dto.*; | 13 | import org.thingsboard.server.common.data.yunteng.dto.*; |
13 | import org.thingsboard.server.common.data.yunteng.dto.request.TkDataViewContentInfoDTO; | 14 | import org.thingsboard.server.common.data.yunteng.dto.request.TkDataViewContentInfoDTO; |
15 | +import org.thingsboard.server.common.data.yunteng.enums.ViewType; | ||
14 | import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; | 16 | import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; |
15 | import org.thingsboard.server.dao.yunteng.entities.TkDataViewEntity; | 17 | import org.thingsboard.server.dao.yunteng.entities.TkDataViewEntity; |
16 | -import org.thingsboard.server.dao.yunteng.entities.TkDataViewInterfaceEntity; | ||
17 | import org.thingsboard.server.dao.yunteng.mapper.TkDataViewMapper; | 18 | import org.thingsboard.server.dao.yunteng.mapper.TkDataViewMapper; |
18 | import org.thingsboard.server.dao.yunteng.mapper.OrganizationMapper; | 19 | import org.thingsboard.server.dao.yunteng.mapper.OrganizationMapper; |
19 | import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; | 20 | import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; |
@@ -31,116 +32,161 @@ import java.util.stream.Collectors; | @@ -31,116 +32,161 @@ import java.util.stream.Collectors; | ||
31 | @Slf4j | 32 | @Slf4j |
32 | @Service | 33 | @Service |
33 | @RequiredArgsConstructor | 34 | @RequiredArgsConstructor |
34 | -public class TkDataViewServiceImpl | ||
35 | - extends AbstractBaseService<TkDataViewMapper, TkDataViewEntity> | ||
36 | - implements TkDataViewService { | ||
37 | - private final OrganizationMapper organizationMapper; | ||
38 | - private final TkDataViewContentService ytDataViewContentService; | ||
39 | - private final UserOrganizationMappingService userOrganizationMappingService; | 35 | +public class TkDataViewServiceImpl extends AbstractBaseService<TkDataViewMapper, TkDataViewEntity> |
36 | + implements TkDataViewService { | ||
37 | + private final OrganizationMapper organizationMapper; | ||
38 | + private final TkDataViewContentService ytDataViewContentService; | ||
39 | + private final UserOrganizationMappingService userOrganizationMappingService; | ||
40 | 40 | ||
41 | - @Override | ||
42 | - public TkPageData<TkDataViewDTO> page( | ||
43 | - Map<String, Object> queryMap, boolean tenantAdmin) { | ||
44 | - List<String> organizationIds = null; | ||
45 | - if (null != queryMap.get("organizationId")) { | ||
46 | - String organizationId = (String) queryMap.get("organizationId"); | ||
47 | - List<OrganizationDTO> organizationList = | ||
48 | - organizationMapper.findOrganizationTreeList( | ||
49 | - (String) queryMap.get("tenantId"), new HashSet<>(List.of(organizationId))); | ||
50 | - if (organizationList.size() == FastIotConstants.MagicNumber.ZERO) { | ||
51 | - throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
52 | - } | ||
53 | - organizationIds = | ||
54 | - organizationList.stream().map(BaseDTO::getId).distinct().collect(Collectors.toList()); | ||
55 | - } | ||
56 | - if (!tenantAdmin && null != queryMap.get("userId")) { | ||
57 | - // 获取客户的组织关系 | ||
58 | - String userId = (String) queryMap.get("userId"); | ||
59 | - organizationIds = userOrganizationMappingService.compareOrganizationIdsByCustomerId(organizationIds, userId); | ||
60 | - } | ||
61 | - if (null != organizationIds && organizationIds.size() > FastIotConstants.MagicNumber.ZERO) { | ||
62 | - queryMap.put("organizationIds", organizationIds); | ||
63 | - } | ||
64 | - IPage<TkDataViewEntity> page = | ||
65 | - getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false); | ||
66 | - IPage<TkDataViewDTO> DataViewIPage = | ||
67 | - baseMapper.getDataViewPage(page, queryMap); | ||
68 | - return getPageData(DataViewIPage, TkDataViewDTO.class); | 41 | + @Override |
42 | + public TkPageData<TkDataViewDTO> page(Map<String, Object> queryMap, boolean tenantAdmin) { | ||
43 | + List<String> organizationIds = null; | ||
44 | + if (null != queryMap.get("organizationId")) { | ||
45 | + String organizationId = (String) queryMap.get("organizationId"); | ||
46 | + List<OrganizationDTO> organizationList = | ||
47 | + organizationMapper.findOrganizationTreeList( | ||
48 | + (String) queryMap.get("tenantId"), new HashSet<>(List.of(organizationId))); | ||
49 | + if (organizationList.size() == FastIotConstants.MagicNumber.ZERO) { | ||
50 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
51 | + } | ||
52 | + organizationIds = | ||
53 | + organizationList.stream().map(BaseDTO::getId).distinct().collect(Collectors.toList()); | ||
69 | } | 54 | } |
55 | + if (!tenantAdmin && null != queryMap.get("userId")) { | ||
56 | + // 获取客户的组织关系 | ||
57 | + String userId = (String) queryMap.get("userId"); | ||
58 | + organizationIds = | ||
59 | + userOrganizationMappingService.compareOrganizationIdsByCustomerId( | ||
60 | + organizationIds, userId); | ||
61 | + } | ||
62 | + if (null != organizationIds && organizationIds.size() > FastIotConstants.MagicNumber.ZERO) { | ||
63 | + queryMap.put("organizationIds", organizationIds); | ||
64 | + } | ||
65 | + IPage<TkDataViewEntity> page = | ||
66 | + getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false); | ||
67 | + IPage<TkDataViewDTO> DataViewIPage = baseMapper.getDataViewPage(page, queryMap); | ||
68 | + return getPageData(DataViewIPage, TkDataViewDTO.class); | ||
69 | + } | ||
70 | + | ||
71 | + @Override | ||
72 | + @Transactional | ||
73 | + public TkDataViewDTO saveDataView(TkDataViewDTO tkDataViewDTO) { | ||
74 | + TkDataViewEntity dataView = tkDataViewDTO.getEntity(TkDataViewEntity.class); | ||
75 | + dataView.setState(0); | ||
76 | + baseMapper.insert(dataView); | ||
77 | + TkDataViewContentDTO contentDTO = new TkDataViewContentDTO(); | ||
78 | + contentDTO.setTenantId(dataView.getTenantId()); | ||
79 | + contentDTO.setViewId(dataView.getId()); | ||
80 | + ytDataViewContentService.saveDataViewContent(contentDTO); | ||
81 | + return tkDataViewDTO; | ||
82 | + } | ||
70 | 83 | ||
71 | - @Override | ||
72 | - @Transactional | ||
73 | - public TkDataViewDTO saveDataView(TkDataViewDTO TkDataViewDTO) { | ||
74 | - TkDataViewEntity dataView = | ||
75 | - TkDataViewDTO.getEntity(TkDataViewEntity.class); | ||
76 | - dataView.setState(0); | ||
77 | - baseMapper.insert(dataView); | ||
78 | - TkDataViewContentDTO contentDTO = new TkDataViewContentDTO(); | ||
79 | - contentDTO.setTenantId(dataView.getTenantId()); | ||
80 | - contentDTO.setViewId(dataView.getId()); | ||
81 | - contentDTO.setContent( | ||
82 | - "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/></root></mxGraphModel>"); | ||
83 | - ytDataViewContentService.saveDataViewContent(contentDTO); | ||
84 | - return TkDataViewDTO; | 84 | + @Override |
85 | + @Transactional | ||
86 | + public TkDataViewDTO updateDataView(TkDataViewDTO tkDataViewDTO) { | ||
87 | + TkDataViewEntity dataView = baseMapper.selectById(tkDataViewDTO.getId()); | ||
88 | + if (!dataView.getTenantId().equals(tkDataViewDTO.getTenantId())) { | ||
89 | + throw new TkDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); | ||
85 | } | 90 | } |
91 | + //设计不修改状态 | ||
92 | + tkDataViewDTO.setViewType(null); | ||
93 | + baseMapper.updateById(tkDataViewDTO.getEntity(TkDataViewEntity.class)); | ||
94 | + return tkDataViewDTO; | ||
95 | + } | ||
86 | 96 | ||
87 | - @Override | ||
88 | - @Transactional | ||
89 | - public TkDataViewDTO updateDataView(TkDataViewDTO TkDataViewDTO) { | ||
90 | - TkDataViewEntity DataView = baseMapper.selectById(TkDataViewDTO.getId()); | ||
91 | - if (!DataView.getTenantId().equals(TkDataViewDTO.getTenantId())) { | ||
92 | - throw new TkDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); | ||
93 | - } | ||
94 | - baseMapper.updateById(TkDataViewDTO.getEntity(TkDataViewEntity.class)); | ||
95 | - return TkDataViewDTO; | 97 | + @Override |
98 | + @Transactional | ||
99 | + public boolean deleteDataView(DeleteDTO deleteDTO) { | ||
100 | + List<TkDataViewEntity> centerList = | ||
101 | + baseMapper.selectList( | ||
102 | + new LambdaQueryWrapper<TkDataViewEntity>() | ||
103 | + .in(TkDataViewEntity::getId, deleteDTO.getIds())); | ||
104 | + for (TkDataViewEntity center : centerList) { | ||
105 | + if (!center.getTenantId().equals(deleteDTO.getTenantId())) { | ||
106 | + throw new TkDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); | ||
107 | + } | ||
96 | } | 108 | } |
109 | + ytDataViewContentService.deleteDataViewContentByCenterId(deleteDTO.getIds()); | ||
110 | + return baseMapper.deleteBatchIds(deleteDTO.getIds()) > FastIotConstants.MagicNumber.ZERO; | ||
111 | + } | ||
97 | 112 | ||
98 | - @Override | ||
99 | - @Transactional | ||
100 | - public boolean deleteDataView(DeleteDTO deleteDTO) { | ||
101 | - List<TkDataViewEntity> centerList = | ||
102 | - baseMapper.selectList( | ||
103 | - new LambdaQueryWrapper<TkDataViewEntity>() | ||
104 | - .in(TkDataViewEntity::getId, deleteDTO.getIds())); | ||
105 | - for (TkDataViewEntity center : centerList) { | ||
106 | - if (!center.getTenantId().equals(deleteDTO.getTenantId())) { | ||
107 | - throw new TkDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); | ||
108 | - } | ||
109 | - } | ||
110 | - ytDataViewContentService.deleteDataViewContentByCenterId(deleteDTO.getIds()); | ||
111 | - return baseMapper.deleteBatchIds(deleteDTO.getIds()) > FastIotConstants.MagicNumber.ZERO; | 113 | + @Override |
114 | + public TkDataViewContentInfoDTO getDataViewInfos(String id, String tenantId) { | ||
115 | + List<TkDataViewContentInfoDTO> list = baseMapper.getDataViewInfoById(id, tenantId); | ||
116 | + return list.size() > FastIotConstants.MagicNumber.ZERO | ||
117 | + ? list.get(FastIotConstants.MagicNumber.ZERO) | ||
118 | + : null; | ||
119 | + } | ||
120 | + | ||
121 | + @Override | ||
122 | + public TkDataViewDTO getDataViewById(String id, String tenantId) { | ||
123 | + TkDataViewEntity entity = | ||
124 | + baseMapper.selectOne( | ||
125 | + new LambdaQueryWrapper<TkDataViewEntity>() | ||
126 | + .eq(TkDataViewEntity::getTenantId, tenantId) | ||
127 | + .eq(TkDataViewEntity::getId, id)); | ||
128 | + if (null == entity) { | ||
129 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
112 | } | 130 | } |
131 | + return entity.getDTO(TkDataViewDTO.class); | ||
132 | + } | ||
113 | 133 | ||
114 | - @Override | ||
115 | - public TkDataViewContentInfoDTO getDataViewInfos(String id, String tenantId) { | ||
116 | - List<TkDataViewContentInfoDTO> list = baseMapper.getDataViewInfoById(id, tenantId); | ||
117 | - return list.size() > FastIotConstants.MagicNumber.ZERO | ||
118 | - ? list.get(FastIotConstants.MagicNumber.ZERO) | ||
119 | - : null; | 134 | + @Override |
135 | + public boolean isNeedCredentialsForPublicView(String id, String tenantId) { | ||
136 | + TkDataViewEntity entity = | ||
137 | + baseMapper.selectOne( | ||
138 | + new LambdaQueryWrapper<TkDataViewEntity>() | ||
139 | + .eq(TkDataViewEntity::getTenantId, tenantId) | ||
140 | + .eq(TkDataViewEntity::getId, id)); | ||
141 | + if (null == entity) { | ||
142 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
120 | } | 143 | } |
144 | + return StringUtils.isNotEmpty(entity.getAccessCredentials()); | ||
145 | + } | ||
121 | 146 | ||
147 | + @Override | ||
148 | + @Transactional | ||
149 | + public boolean shareOrMonopolyDataViewCenter( | ||
150 | + boolean isShare, String id, String accessCredentials, String tenantId) { | ||
151 | + TkDataViewEntity entity = | ||
152 | + baseMapper.selectOne( | ||
153 | + new LambdaQueryWrapper<TkDataViewEntity>() | ||
154 | + .eq(TkDataViewEntity::getTenantId, tenantId) | ||
155 | + .eq(TkDataViewEntity::getId, id)); | ||
156 | + if (null == entity) { | ||
157 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
158 | + } | ||
159 | + if (isShare) { | ||
160 | + entity.setViewType(ViewType.PUBLIC_VIEW); | ||
161 | + entity.setAccessCredentials(accessCredentials); | ||
162 | + } else { | ||
163 | + entity.setViewType(ViewType.PRIVATE_VIEW); | ||
164 | + entity.setAccessCredentials(null); | ||
165 | + } | ||
166 | + return baseMapper.updateById(entity) > FastIotConstants.MagicNumber.ZERO; | ||
167 | + } | ||
122 | 168 | ||
123 | - @Override | ||
124 | - public boolean publishDataView(String id, String tenantId) { | ||
125 | - TkDataViewEntity dataView = baseMapper.selectById(id); | ||
126 | - if (!dataView.getTenantId().equals(tenantId)) { | ||
127 | - throw new TkDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); | ||
128 | - } | ||
129 | - //Modify dataView state is publish | ||
130 | - dataView.setState(1); | ||
131 | - int resultInt = baseMapper.updateById(dataView); | ||
132 | - return resultInt > 0 ? true : false; | 169 | + @Override |
170 | + public boolean publishDataView(String id, String tenantId) { | ||
171 | + TkDataViewEntity dataView = baseMapper.selectById(id); | ||
172 | + if (!dataView.getTenantId().equals(tenantId)) { | ||
173 | + throw new TkDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); | ||
133 | } | 174 | } |
175 | + // Modify dataView state is publish | ||
176 | + dataView.setState(FastIotConstants.StateValue.PUBLISH); | ||
177 | + int resultInt = baseMapper.updateById(dataView); | ||
178 | + return resultInt > FastIotConstants.MagicNumber.ZERO; | ||
179 | + } | ||
134 | 180 | ||
135 | - @Override | ||
136 | - public boolean cancelPublishDataView(String id, String tenantId) { | ||
137 | - TkDataViewEntity dataView = baseMapper.selectById(id); | ||
138 | - if (!dataView.getTenantId().equals(tenantId)) { | ||
139 | - throw new TkDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); | ||
140 | - } | ||
141 | - //Modify dataView state is cancelPublish | ||
142 | - dataView.setState(0); | ||
143 | - int resultInt = baseMapper.updateById(dataView); | ||
144 | - return resultInt > 0 ? true : false; | 181 | + @Override |
182 | + public boolean cancelPublishDataView(String id, String tenantId) { | ||
183 | + TkDataViewEntity dataView = baseMapper.selectById(id); | ||
184 | + if (!dataView.getTenantId().equals(tenantId)) { | ||
185 | + throw new TkDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage()); | ||
145 | } | 186 | } |
187 | + // Modify dataView state is cancelPublish | ||
188 | + dataView.setState(FastIotConstants.StateValue.CANCEL_PUBLISH); | ||
189 | + int resultInt = baseMapper.updateById(dataView); | ||
190 | + return resultInt > FastIotConstants.MagicNumber.ZERO; | ||
191 | + } | ||
146 | } | 192 | } |
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
4 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 4 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
5 | import com.baomidou.mybatisplus.core.metadata.IPage; | 5 | import com.baomidou.mybatisplus.core.metadata.IPage; |
6 | import com.fasterxml.jackson.databind.JsonNode; | 6 | import com.fasterxml.jackson.databind.JsonNode; |
7 | +import com.google.common.util.concurrent.Futures; | ||
8 | +import com.google.common.util.concurrent.ListenableFuture; | ||
7 | import lombok.RequiredArgsConstructor; | 9 | import lombok.RequiredArgsConstructor; |
8 | import lombok.extern.slf4j.Slf4j; | 10 | import lombok.extern.slf4j.Slf4j; |
9 | import org.apache.commons.lang3.StringUtils; | 11 | import org.apache.commons.lang3.StringUtils; |
@@ -365,7 +367,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev | @@ -365,7 +367,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev | ||
365 | List<String> queryOrganizationIds = organizationAllIds(tenantId, organizationId); | 367 | List<String> queryOrganizationIds = organizationAllIds(tenantId, organizationId); |
366 | queryMap.put("organizationIds", queryOrganizationIds); | 368 | queryMap.put("organizationIds", queryOrganizationIds); |
367 | } | 369 | } |
368 | - //用于数据流转已选,待选过滤============开始 | 370 | + // 用于数据流转已选,待选过滤============开始 |
369 | if (StringUtils.isNotEmpty(convertConfigId)) { | 371 | if (StringUtils.isNotEmpty(convertConfigId)) { |
370 | ConvertConfigDTO configDTO = | 372 | ConvertConfigDTO configDTO = |
371 | convertConfigService.findConvertConfigDTOById(tenantId, convertConfigId); | 373 | convertConfigService.findConvertConfigDTOById(tenantId, convertConfigId); |
@@ -382,7 +384,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev | @@ -382,7 +384,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev | ||
382 | } | 384 | } |
383 | } | 385 | } |
384 | } | 386 | } |
385 | - //用于数据流转已选,待选过滤============结束 | 387 | + // 用于数据流转已选,待选过滤============结束 |
386 | IPage<TkDeviceEntity> page = | 388 | IPage<TkDeviceEntity> page = |
387 | getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false); | 389 | getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false); |
388 | IPage<DeviceDTO> deviceIPage = baseMapper.getDevicePage(page, queryMap); | 390 | IPage<DeviceDTO> deviceIPage = baseMapper.getDevicePage(page, queryMap); |
@@ -668,12 +670,16 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev | @@ -668,12 +670,16 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev | ||
668 | public List<String> rpcDevices(String tenantId, String organizationId, String projectId) { | 670 | public List<String> rpcDevices(String tenantId, String organizationId, String projectId) { |
669 | List<String> orgIds = organizationAllIds(tenantId, organizationId); | 671 | List<String> orgIds = organizationAllIds(tenantId, organizationId); |
670 | 672 | ||
671 | - List<TkDeviceEntity> organizationDevices = baseMapper.selectList(new LambdaQueryWrapper<TkDeviceEntity>().eq(TkDeviceEntity::getDeviceProfileId, projectId).in(TkDeviceEntity::getOrganizationId,orgIds)); | 673 | + List<TkDeviceEntity> organizationDevices = |
674 | + baseMapper.selectList( | ||
675 | + new LambdaQueryWrapper<TkDeviceEntity>() | ||
676 | + .eq(TkDeviceEntity::getDeviceProfileId, projectId) | ||
677 | + .in(TkDeviceEntity::getOrganizationId, orgIds)); | ||
672 | List<String> allDevices = new ArrayList<>(); | 678 | List<String> allDevices = new ArrayList<>(); |
673 | - if(organizationDevices != null && !organizationDevices.isEmpty()){ | 679 | + if (organizationDevices != null && !organizationDevices.isEmpty()) { |
674 | for (TkDeviceEntity item : organizationDevices) { | 680 | for (TkDeviceEntity item : organizationDevices) { |
675 | DeviceTypeEnum deviceType = item.getDeviceType(); | 681 | DeviceTypeEnum deviceType = item.getDeviceType(); |
676 | - if(DeviceTypeEnum.SENSOR.equals(deviceType)){ | 682 | + if (DeviceTypeEnum.SENSOR.equals(deviceType)) { |
677 | allDevices.add(item.getGatewayId()); | 683 | allDevices.add(item.getGatewayId()); |
678 | continue; | 684 | continue; |
679 | } | 685 | } |
@@ -682,4 +688,26 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev | @@ -682,4 +688,26 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev | ||
682 | } | 688 | } |
683 | return allDevices; | 689 | return allDevices; |
684 | } | 690 | } |
691 | + | ||
692 | + @Override | ||
693 | + public ListenableFuture<List<DeviceDTO>> findDeviceListByDeviceProfileId( | ||
694 | + String deviceProfileId, String tenantId) { | ||
695 | + if (StringUtils.isEmpty(deviceProfileId) || StringUtils.isEmpty(tenantId)) { | ||
696 | + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | ||
697 | + } | ||
698 | + List<DeviceDTO> devices = new ArrayList<>(); | ||
699 | + List<TkDeviceEntity> entityList = | ||
700 | + baseMapper.selectList( | ||
701 | + new LambdaQueryWrapper<TkDeviceEntity>() | ||
702 | + .eq(TkDeviceEntity::getTenantId, tenantId) | ||
703 | + .eq(TkDeviceEntity::getDeviceProfileId, deviceProfileId)); | ||
704 | + return Optional.ofNullable(entityList) | ||
705 | + .map( | ||
706 | + list -> | ||
707 | + Futures.immediateFuture( | ||
708 | + list.stream() | ||
709 | + .map(obj -> obj.getDTO(DeviceDTO.class)) | ||
710 | + .collect(Collectors.toList()))) | ||
711 | + .orElse(Futures.immediateFuture(devices)); | ||
712 | + } | ||
685 | } | 713 | } |
1 | +package org.thingsboard.server.dao.yunteng.impl; | ||
2 | + | ||
3 | +import com.google.common.base.Objects; | ||
4 | +import lombok.RequiredArgsConstructor; | ||
5 | +import org.springframework.stereotype.Service; | ||
6 | +import org.thingsboard.server.common.data.StringUtils; | ||
7 | +import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; | ||
8 | +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; | ||
9 | +import org.thingsboard.server.common.data.yunteng.dto.ConfigurationCenterDTO; | ||
10 | +import org.thingsboard.server.common.data.yunteng.dto.DataBoardDTO; | ||
11 | +import org.thingsboard.server.common.data.yunteng.dto.DataComponentDTO; | ||
12 | +import org.thingsboard.server.common.data.yunteng.dto.TkDataViewDTO; | ||
13 | +import org.thingsboard.server.common.data.yunteng.dto.board.MoreDataComponentInfoDTO; | ||
14 | +import org.thingsboard.server.common.data.yunteng.dto.request.ConfigurationContentInfoDTO; | ||
15 | +import org.thingsboard.server.common.data.yunteng.dto.request.TkDataViewContentInfoDTO; | ||
16 | +import org.thingsboard.server.common.data.yunteng.enums.ShareViewType; | ||
17 | +import org.thingsboard.server.common.data.yunteng.enums.ViewType; | ||
18 | +import org.thingsboard.server.dao.yunteng.service.*; | ||
19 | + | ||
20 | +import java.util.List; | ||
21 | + | ||
22 | +@Service | ||
23 | +@RequiredArgsConstructor | ||
24 | +public class TkShareViewServiceImpl implements TkShareViewService { | ||
25 | + | ||
26 | + private final TkDataComponentService tkDataComponentService; | ||
27 | + private final TkDataBoardService tkDataBoardService; | ||
28 | + private final TkDataViewService tkDataViewService; | ||
29 | + private final TkConfigurationCenterService tkConfigurationCenterService; | ||
30 | + | ||
31 | + private MoreDataComponentInfoDTO viewDataComponentsByBoardId( | ||
32 | + String boardId, String accessCredentials, String tenantId) { | ||
33 | + DataBoardDTO dto = tkDataBoardService.findDataBoardInfoById(boardId, tenantId); | ||
34 | + checkParams(dto, dto.getViewType(), dto.getAccessCredentials(), accessCredentials); | ||
35 | + MoreDataComponentInfoDTO moreDataComponentInfoDTO = new MoreDataComponentInfoDTO(); | ||
36 | + List<DataComponentDTO> data = | ||
37 | + tkDataComponentService.getDataComponentsByBoardId(tenantId, boardId); | ||
38 | + moreDataComponentInfoDTO.setComponentLayout(dto.getLayout()); | ||
39 | + moreDataComponentInfoDTO.setComponentData(data); | ||
40 | + return moreDataComponentInfoDTO; | ||
41 | + } | ||
42 | + | ||
43 | + private ConfigurationContentInfoDTO viewConfigurationById( | ||
44 | + String id, String accessCredentials, String tenantId) { | ||
45 | + ConfigurationCenterDTO centerDTO = | ||
46 | + tkConfigurationCenterService.getConfigurationCenterInfoById(id, tenantId); | ||
47 | + checkParams( | ||
48 | + centerDTO, centerDTO.getViewType(), centerDTO.getAccessCredentials(), accessCredentials); | ||
49 | + return tkConfigurationCenterService.getConfigurationInfos(id, tenantId); | ||
50 | + } | ||
51 | + | ||
52 | + private TkDataViewContentInfoDTO viewDataViewInfosById( | ||
53 | + String id, String accessCredentials, String tenantId) { | ||
54 | + TkDataViewDTO dto = tkDataViewService.getDataViewById(id, tenantId); | ||
55 | + checkParams(dto, dto.getViewType(), dto.getAccessCredentials(), accessCredentials); | ||
56 | + return tkDataViewService.getDataViewInfos(id, tenantId); | ||
57 | + } | ||
58 | + | ||
59 | + private void checkParams( | ||
60 | + Object dto, ViewType viewType, String targetCredentials, String sourceCredentials) { | ||
61 | + if (null == dto) { | ||
62 | + throw new TkDataValidationException(ErrorMessage.NOT_BELONG_CURRENT_TENANT.getMessage()); | ||
63 | + } | ||
64 | + if (!Objects.equal(viewType, ViewType.PUBLIC_VIEW)) { | ||
65 | + throw new TkDataValidationException(ErrorMessage.CURRENT_VIEW_IS_PRIVATE.getMessage()); | ||
66 | + } | ||
67 | + if (StringUtils.isNotEmpty(targetCredentials)) { | ||
68 | + if (!Objects.equal(targetCredentials, sourceCredentials)) { | ||
69 | + throw new TkDataValidationException( | ||
70 | + ErrorMessage.CURRENT_URL_REQUIRES_PERMISSION.getMessage()); | ||
71 | + } | ||
72 | + } | ||
73 | + } | ||
74 | + | ||
75 | + @Override | ||
76 | + public Object viewShareDataById( | ||
77 | + ShareViewType shareViewType, String id, String accessCredentials, String tenantId) { | ||
78 | + Object result; | ||
79 | + switch (shareViewType) { | ||
80 | + case DATA_BOARD: | ||
81 | + result = viewDataComponentsByBoardId(id, accessCredentials, tenantId); | ||
82 | + break; | ||
83 | + case SCADA: | ||
84 | + result = viewConfigurationById(id, accessCredentials, tenantId); | ||
85 | + break; | ||
86 | + case LARGE_SCREEN: | ||
87 | + result = viewDataViewInfosById(id, accessCredentials, tenantId); | ||
88 | + break; | ||
89 | + default: | ||
90 | + throw new TkDataValidationException(ErrorMessage.SHARE_VIEW_TYPE_NOT_EXIST.getMessage()); | ||
91 | + } | ||
92 | + return result; | ||
93 | + } | ||
94 | + | ||
95 | + @Override | ||
96 | + public boolean checkPublicViewNeedCredentials( | ||
97 | + ShareViewType type, String viewId, String tenantId) { | ||
98 | + boolean result; | ||
99 | + switch (type) { | ||
100 | + case SCADA: | ||
101 | + result = tkConfigurationCenterService.isNeedCredentialsForPublicView(viewId, tenantId); | ||
102 | + break; | ||
103 | + case DATA_BOARD: | ||
104 | + result = tkDataBoardService.isNeedCredentialsForPublicView(viewId, tenantId); | ||
105 | + break; | ||
106 | + case LARGE_SCREEN: | ||
107 | + result = tkDataViewService.isNeedCredentialsForPublicView(viewId, tenantId); | ||
108 | + break; | ||
109 | + default: | ||
110 | + throw new TkDataValidationException(ErrorMessage.SHARE_VIEW_TYPE_NOT_EXIST.getMessage()); | ||
111 | + } | ||
112 | + return result; | ||
113 | + } | ||
114 | +} |
@@ -16,5 +16,28 @@ public interface TkConfigurationCenterService { | @@ -16,5 +16,28 @@ public interface TkConfigurationCenterService { | ||
16 | 16 | ||
17 | boolean deleteConfigurationCenter(DeleteDTO deleteDTO); | 17 | boolean deleteConfigurationCenter(DeleteDTO deleteDTO); |
18 | 18 | ||
19 | - ConfigurationContentInfoDTO getConfigurationInfos(String id,String tenantId); | 19 | + ConfigurationContentInfoDTO getConfigurationInfos(String id, String tenantId); |
20 | + | ||
21 | + ConfigurationCenterDTO getConfigurationCenterInfoById(String id,String tenantId); | ||
22 | + | ||
23 | + /** | ||
24 | + * 根据租户ID和数据看板ID,判断是否需要密码 | ||
25 | + * | ||
26 | + * @param id 数据看板ID | ||
27 | + * @param tenantId 租户ID | ||
28 | + * @return 需要true,不需要false | ||
29 | + */ | ||
30 | + boolean isNeedCredentialsForPublicView(String id, String tenantId); | ||
31 | + | ||
32 | + /** | ||
33 | + * 分享或取消分享组态中心 | ||
34 | + * | ||
35 | + * @param isShare true分享 false取消分享 | ||
36 | + * @param id 组态ID | ||
37 | + * @param accessCredentials 分享的密码:不用密码则为null | ||
38 | + * @param tenantId 租户ID | ||
39 | + * @return true成功 false失败 | ||
40 | + */ | ||
41 | + boolean shareOrMonopolyConfigurationCenter( | ||
42 | + boolean isShare, String id, String accessCredentials, String tenantId); | ||
20 | } | 43 | } |
@@ -56,4 +56,23 @@ public interface TkDataBoardService { | @@ -56,4 +56,23 @@ public interface TkDataBoardService { | ||
56 | * @return false失败 true成功 | 56 | * @return false失败 true成功 |
57 | */ | 57 | */ |
58 | boolean updateDataBoardComponentNum(String id,String tenantId,int count); | 58 | boolean updateDataBoardComponentNum(String id,String tenantId,int count); |
59 | + | ||
60 | + /** | ||
61 | + * 根据租户ID和数据看板ID,判断是否需要密码 | ||
62 | + * @param id 数据看板ID | ||
63 | + * @param tenantId 租户ID | ||
64 | + * @return 需要true,不需要false | ||
65 | + */ | ||
66 | + boolean isNeedCredentialsForPublicView(String id,String tenantId); | ||
67 | + | ||
68 | + /** | ||
69 | + * 分享或取消分享数据刊本 | ||
70 | + * @param isShare 分享 | ||
71 | + * @param id 数据看板ID | ||
72 | + * @param accessCredentials 访问凭证 | ||
73 | + * @param tenantId 租户ID | ||
74 | + * @return true成功 false失败 | ||
75 | + */ | ||
76 | + boolean shareOrMonopolyDataBoard( | ||
77 | + boolean isShare, String id, String accessCredentials, String tenantId); | ||
59 | } | 78 | } |
@@ -10,17 +10,40 @@ import java.util.Map; | @@ -10,17 +10,40 @@ import java.util.Map; | ||
10 | * @author tianfuLei | 10 | * @author tianfuLei |
11 | */ | 11 | */ |
12 | public interface TkDataViewService { | 12 | public interface TkDataViewService { |
13 | - TkPageData<TkDataViewDTO> page(Map<String, Object> queryMap, boolean tenantAdmin); | 13 | + TkPageData<TkDataViewDTO> page(Map<String, Object> queryMap, boolean tenantAdmin); |
14 | 14 | ||
15 | - TkDataViewDTO saveDataView(TkDataViewDTO TkDataViewDTO); | 15 | + TkDataViewDTO saveDataView(TkDataViewDTO TkDataViewDTO); |
16 | 16 | ||
17 | - TkDataViewDTO updateDataView(TkDataViewDTO TkDataViewDTO); | 17 | + TkDataViewDTO updateDataView(TkDataViewDTO TkDataViewDTO); |
18 | 18 | ||
19 | - boolean deleteDataView(DeleteDTO deleteDTO); | 19 | + boolean deleteDataView(DeleteDTO deleteDTO); |
20 | 20 | ||
21 | - TkDataViewContentInfoDTO getDataViewInfos(String id, String tenantId); | 21 | + TkDataViewContentInfoDTO getDataViewInfos(String id, String tenantId); |
22 | 22 | ||
23 | - boolean publishDataView(String id, String tenantId); | 23 | + TkDataViewDTO getDataViewById(String id, String tenantId); |
24 | 24 | ||
25 | - boolean cancelPublishDataView(String id, String tenantId); | 25 | + /** |
26 | + * 根据租户ID和大屏ID,判断是否需要密码 | ||
27 | + * | ||
28 | + * @param id 大屏ID | ||
29 | + * @param tenantId 租户ID | ||
30 | + * @return 需要true,不需要false | ||
31 | + */ | ||
32 | + boolean isNeedCredentialsForPublicView(String id, String tenantId); | ||
33 | + | ||
34 | + /** | ||
35 | + * 分享或取消分享大屏 | ||
36 | + * | ||
37 | + * @param isShare true分享 false取消分享 | ||
38 | + * @param id 大屏ID | ||
39 | + * @param accessCredentials 分享的密码:不用密码则为null | ||
40 | + * @param tenantId 租户ID | ||
41 | + * @return true成功 false失败 | ||
42 | + */ | ||
43 | + boolean shareOrMonopolyDataViewCenter( | ||
44 | + boolean isShare, String id, String accessCredentials, String tenantId); | ||
45 | + | ||
46 | + boolean publishDataView(String id, String tenantId); | ||
47 | + | ||
48 | + boolean cancelPublishDataView(String id, String tenantId); | ||
26 | } | 49 | } |
1 | package org.thingsboard.server.dao.yunteng.service; | 1 | package org.thingsboard.server.dao.yunteng.service; |
2 | 2 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 3 | import com.fasterxml.jackson.databind.JsonNode; |
4 | -import org.thingsboard.server.common.data.DeviceTransportType; | 4 | +import com.google.common.util.concurrent.ListenableFuture;import org.thingsboard.server.common.data.DeviceTransportType; |
5 | import org.thingsboard.server.common.data.id.EntityId; | 5 | import org.thingsboard.server.common.data.id.EntityId; |
6 | import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO; | 6 | import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO; |
7 | import org.thingsboard.server.common.data.yunteng.dto.RelationDeviceDTO; | 7 | import org.thingsboard.server.common.data.yunteng.dto.RelationDeviceDTO; |
@@ -202,4 +202,6 @@ public interface TkDeviceService extends BaseService<TkDeviceEntity> { | @@ -202,4 +202,6 @@ public interface TkDeviceService extends BaseService<TkDeviceEntity> { | ||
202 | * @return 需要接收RPC控制的网关设备或直连设备的ID | 202 | * @return 需要接收RPC控制的网关设备或直连设备的ID |
203 | */ | 203 | */ |
204 | List<String> rpcDevices(String tenantId,String organizationId,String projectId); | 204 | List<String> rpcDevices(String tenantId,String organizationId,String projectId); |
205 | + | ||
206 | + ListenableFuture<List<DeviceDTO>> findDeviceListByDeviceProfileId(String deviceProfileId,String tenantId); | ||
205 | } | 207 | } |
1 | +package org.thingsboard.server.dao.yunteng.service; | ||
2 | + | ||
3 | +import org.thingsboard.server.common.data.yunteng.enums.ShareViewType; | ||
4 | + | ||
5 | +public interface TkShareViewService { | ||
6 | + | ||
7 | + Object viewShareDataById(ShareViewType shareViewType,String id, String accessCredentials, String tenantId); | ||
8 | + | ||
9 | + boolean checkPublicViewNeedCredentials(ShareViewType type, String viewId, String tenantId); | ||
10 | +} |
@@ -14,6 +14,8 @@ | @@ -14,6 +14,8 @@ | ||
14 | <result property="tenantId" column="tenant_id"/> | 14 | <result property="tenantId" column="tenant_id"/> |
15 | <result property="updater" column="updater"/> | 15 | <result property="updater" column="updater"/> |
16 | <result property="thumbnail" column="thumbnail"/> | 16 | <result property="thumbnail" column="thumbnail"/> |
17 | + <result property="viewType" column="view_type" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/> | ||
18 | + <result property="accessCredentials" column="access_credentials"/> | ||
17 | <association property="organizationDTO" | 19 | <association property="organizationDTO" |
18 | javaType="org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO"> | 20 | javaType="org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO"> |
19 | <result property="name" column="organization_name"/> | 21 | <result property="name" column="organization_name"/> |
@@ -30,7 +32,8 @@ | @@ -30,7 +32,8 @@ | ||
30 | </resultMap> | 32 | </resultMap> |
31 | 33 | ||
32 | <sql id="columns"> | 34 | <sql id="columns"> |
33 | - a.id,a.name,a.platform,a.organization_id,a.thumbnail, a.remark,a.update_time,a.create_time,a.creator,a.tenant_id,a.updater,io.name AS organization_name | 35 | + a.id,a.name,a.platform,a.organization_id,a.thumbnail, a.remark,a.update_time,a.create_time,a.creator,a.tenant_id, |
36 | + a.updater,io.name AS organization_name,a.view_type,a.access_credentials | ||
34 | </sql> | 37 | </sql> |
35 | <select id="getConfigurationCenterPage" resultMap="configurationCenterMap"> | 38 | <select id="getConfigurationCenterPage" resultMap="configurationCenterMap"> |
36 | SELECT | 39 | SELECT |
@@ -35,7 +35,9 @@ | @@ -35,7 +35,9 @@ | ||
35 | <result property="updater" column="updater"/> | 35 | <result property="updater" column="updater"/> |
36 | <result property="description" column="description"/> | 36 | <result property="description" column="description"/> |
37 | <result property="customerId" column="customer_id"/> | 37 | <result property="customerId" column="customer_id"/> |
38 | - <result property="customerName" column="cusotomer_name"/> | 38 | + <result property="customerName" column="customer_name"/> |
39 | + <result property="customerAdditionalInfo" column="customer_additional_info" | ||
40 | + typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/> | ||
39 | <result property="organizationId" column="organization_id"/> | 41 | <result property="organizationId" column="organization_id"/> |
40 | <result property="gatewayId" column="gateway_id"/> | 42 | <result property="gatewayId" column="gateway_id"/> |
41 | <result property="gatewayName" column="gateway_name"/> | 43 | <result property="gatewayName" column="gateway_name"/> |
@@ -83,7 +85,7 @@ | @@ -83,7 +85,7 @@ | ||
83 | </sql> | 85 | </sql> |
84 | <select id="getDevicePage" resultMap="deviceMap"> | 86 | <select id="getDevicePage" resultMap="deviceMap"> |
85 | SELECT | 87 | SELECT |
86 | - <include refid="pageColumns"/>,d.customer_id::TEXT AS customer_id,cus.title AS cusotomer_name | 88 | + <include refid="pageColumns"/>,d.customer_id::TEXT AS customer_id,cus.title AS customer_name,cus.additional_info AS customer_additional_info |
87 | FROM tk_device ifd | 89 | FROM tk_device ifd |
88 | LEFT JOIN device_profile ifdp ON ifd.profile_id = ifdp.id::TEXT | 90 | LEFT JOIN device_profile ifdp ON ifd.profile_id = ifdp.id::TEXT |
89 | LEFT JOIN tk_organization io ON io.id = ifd.organization_id | 91 | LEFT JOIN tk_organization io ON io.id = ifd.organization_id |
@@ -14,6 +14,8 @@ | @@ -14,6 +14,8 @@ | ||
14 | <result property="tenantId" column="tenant_id"/> | 14 | <result property="tenantId" column="tenant_id"/> |
15 | <result property="updater" column="updater"/> | 15 | <result property="updater" column="updater"/> |
16 | <result property="thumbnail" column="thumbnail"/> | 16 | <result property="thumbnail" column="thumbnail"/> |
17 | + <result property="accessCredentials" column="access_credentials"/> | ||
18 | + <result property="viewType" column="view_type" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/> | ||
17 | <association property="organizationDTO" | 19 | <association property="organizationDTO" |
18 | javaType="org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO"> | 20 | javaType="org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO"> |
19 | <result property="name" column="organization_name"/> | 21 | <result property="name" column="organization_name"/> |
@@ -34,7 +36,8 @@ | @@ -34,7 +36,8 @@ | ||
34 | </resultMap> | 36 | </resultMap> |
35 | 37 | ||
36 | <sql id="columns"> | 38 | <sql id="columns"> |
37 | - a.id,a.name, a.remark,a.state,a.tenant_id,a.organization_id,a.thumbnail,a.updater,a.update_time,a.create_time,a.creator,io.name AS organization_name | 39 | + a.id,a.name, a.remark,a.state,a.tenant_id,a.organization_id,a.thumbnail,a.updater,a.update_time,a.create_time, |
40 | + a.creator,io.name AS organization_name,a.access_credentials,a.view_type | ||
38 | </sql> | 41 | </sql> |
39 | <select id="getDataViewPage" resultMap="dataViewMap"> | 42 | <select id="getDataViewPage" resultMap="dataViewMap"> |
40 | SELECT | 43 | SELECT |