Showing
37 changed files
with
1140 additions
and
107 deletions
... | ... | @@ -557,7 +557,7 @@ public abstract class BaseController { |
557 | 557 | } |
558 | 558 | } |
559 | 559 | |
560 | - DeviceProfile checkDeviceProfileId(DeviceProfileId deviceProfileId, Operation operation) throws ThingsboardException { | |
560 | + protected DeviceProfile checkDeviceProfileId(DeviceProfileId deviceProfileId, Operation operation) throws ThingsboardException { | |
561 | 561 | try { |
562 | 562 | validateId(deviceProfileId, "Incorrect deviceProfileId " + deviceProfileId); |
563 | 563 | DeviceProfile deviceProfile = deviceProfileService.findDeviceProfileById(getCurrentUser().getTenantId(), deviceProfileId); | ... | ... |
... | ... | @@ -105,6 +105,8 @@ public class YtDeviceController extends BaseController { |
105 | 105 | @RequestParam(value = "deviceState", required = false) DeviceState deviceState, |
106 | 106 | @RequestParam(value = "deviceType", required = false) DeviceTypeEnum deviceType, |
107 | 107 | @RequestParam(value = "organizationId",required = false) String organizationId, |
108 | + @RequestParam(value = "alarmStatus",required = false) Integer alarmStatus, | |
109 | + @RequestParam(value = "profileId",required = false) String profileId, | |
108 | 110 | @RequestParam(value = ORDER_FILED, required = false) String orderBy, |
109 | 111 | @RequestParam(value = ORDER_TYPE, required = false) OrderTypeEnum orderType) throws ThingsboardException { |
110 | 112 | HashMap<String, Object> queryMap = new HashMap<>(); |
... | ... | @@ -112,6 +114,8 @@ public class YtDeviceController extends BaseController { |
112 | 114 | queryMap.put(PAGE, page); |
113 | 115 | queryMap.put(ORDER_FILED, orderBy); |
114 | 116 | queryMap.put("name", name); |
117 | + queryMap.put("alarmStatus", alarmStatus); | |
118 | + queryMap.put("profileId", profileId); | |
115 | 119 | if (deviceState != null) { |
116 | 120 | queryMap.put("deviceState", deviceState.name()); |
117 | 121 | } | ... | ... |
application/src/main/java/org/thingsboard/server/controller/yunteng/YtSceneLinkageController.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.http.HttpStatus; | |
7 | +import org.springframework.http.ResponseEntity; | |
8 | +import org.springframework.validation.annotation.Validated; | |
9 | +import org.springframework.web.bind.annotation.*; | |
10 | +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; | |
11 | +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.DeleteGroup; | |
14 | +import org.thingsboard.server.common.data.yunteng.common.UpdateGroup; | |
15 | +import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; | |
16 | +import org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO; | |
17 | +import org.thingsboard.server.common.data.yunteng.dto.TriggerDTO; | |
18 | +import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; | |
19 | +import org.thingsboard.server.controller.BaseController; | |
20 | +import org.thingsboard.server.dao.yunteng.service.SceneLinkageService; | |
21 | + | |
22 | +import java.net.URI; | |
23 | +import java.util.HashMap; | |
24 | +import java.util.List; | |
25 | +import java.util.Map; | |
26 | +import java.util.Optional; | |
27 | + | |
28 | +import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.PAGE; | |
29 | +import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.PAGE_SIZE; | |
30 | + | |
31 | +/** @Description 场景联动 @Author cxy @Date 2021/11/25 11:25 */ | |
32 | +@RestController | |
33 | +@RequestMapping("/api/yt/sceneLinkage") | |
34 | +@RequiredArgsConstructor | |
35 | +@Api(tags = "场景联动") | |
36 | +public class YtSceneLinkageController extends BaseController { | |
37 | + | |
38 | + private final SceneLinkageService sceneLinkageService; | |
39 | + | |
40 | + @ApiOperation(value = "保存新增的场景联动数据") | |
41 | + @PostMapping | |
42 | + public ResponseEntity<SceneLinkageDTO> saveSceneLinkage( | |
43 | + @Validated(AddGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO) | |
44 | + throws ThingsboardException { | |
45 | + SceneLinkageDTO newSceneLinkageDTO = | |
46 | + sceneLinkageService.saveScenelinkage( | |
47 | + sceneLinkageDTO, getCurrentUser().getCurrentTenantId()); | |
48 | + return Optional.ofNullable(newSceneLinkageDTO) | |
49 | + .map( | |
50 | + dto -> { | |
51 | + URI location = | |
52 | + ServletUriComponentsBuilder.fromCurrentRequest() | |
53 | + .path("/{id}") | |
54 | + .buildAndExpand(newSceneLinkageDTO.getId()) | |
55 | + .toUri(); | |
56 | + return ResponseEntity.created(location).body(newSceneLinkageDTO); | |
57 | + }) | |
58 | + .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build()); | |
59 | + } | |
60 | + | |
61 | + @ApiOperation("修改场景联动的数据") | |
62 | + @PostMapping("/update") | |
63 | + public void updateSceneLinkage( | |
64 | + @Validated(UpdateGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO) { | |
65 | + sceneLinkageService.updateSceneLinkage(sceneLinkageDTO); | |
66 | + } | |
67 | + | |
68 | + @ApiOperation("场景联动的分页") | |
69 | + @GetMapping(params = {PAGE_SIZE, PAGE}) | |
70 | + public PageData<SceneLinkageDTO> page( | |
71 | + @RequestParam(PAGE_SIZE) int pageSize, | |
72 | + @RequestParam(PAGE) int page, | |
73 | + @RequestParam(value = "name", required = false) String name, | |
74 | + @RequestParam(value = "status", required = false) Integer status, | |
75 | + @RequestParam(value = "organizationId", required = false) String organizationId, | |
76 | + @RequestParam(value = "triggers", required = false) List<TriggerDTO> triggers) | |
77 | + throws ThingsboardException { | |
78 | + HashMap<String, Object> queryMap = new HashMap<>(); | |
79 | + queryMap.put(PAGE_SIZE, pageSize); | |
80 | + queryMap.put(PAGE, page); | |
81 | + queryMap.put("name", name); | |
82 | + queryMap.put("status", status); | |
83 | + queryMap.put("organizationId", organizationId); | |
84 | + queryMap.put("triggers", triggers); | |
85 | + return sceneLinkageService.page(queryMap, getCurrentUser().getCurrentTenantId()); | |
86 | + } | |
87 | + | |
88 | + @ApiOperation(value = "删除场景联动") | |
89 | + @DeleteMapping | |
90 | + public void delete(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) | |
91 | + throws ThingsboardException { | |
92 | + sceneLinkageService.deleteSceneLinkage( | |
93 | + deleteDTO.getIds(), getCurrentUser().getCurrentTenantId()); | |
94 | + } | |
95 | + | |
96 | + @ApiOperation(value = "修改场景联动所属状态") | |
97 | + @PutMapping("/updateSceneStatus/{sceneLinkageId}/{status}") | |
98 | + public void updateRoleStatus( | |
99 | + @PathVariable String sceneLinkageId, @PathVariable("status") int status) | |
100 | + throws ThingsboardException { | |
101 | + | |
102 | + sceneLinkageService.updateSceneStatus( | |
103 | + sceneLinkageId, status, getCurrentUser().getCurrentTenantId()); | |
104 | + } | |
105 | + | |
106 | + @ApiOperation(value = "通过场景id获取所属组织的设备集合") | |
107 | + @GetMapping("/device") | |
108 | + public ResponseEntity<Map> findDeviceList(@RequestParam String organizationId) { | |
109 | + HashMap<String, Object> map = | |
110 | + new HashMap<>() { | |
111 | + { | |
112 | + put("items", sceneLinkageService.findDeviceList(organizationId)); | |
113 | + } | |
114 | + }; | |
115 | + return ResponseEntity.ok(map); | |
116 | + } | |
117 | +} | ... | ... |
... | ... | @@ -60,6 +60,14 @@ public final class ModelConstants { |
60 | 60 | public static final String SYS_APP_DESIGN_TABLE_NAME = "sys_app_design"; |
61 | 61 | /** 中国城镇区街 */ |
62 | 62 | public static final String SYS_TOWN_TABLE_NAME = "sys_town"; |
63 | + /** 场景联动表 */ | |
64 | + public static final String IOTFS_SCENE_LINKAGE_TABLE_NAME = "iotfs_scene_linkage"; | |
65 | + /** 场景触发器 */ | |
66 | + public static final String IOTFS_TRIGGER_TABLE_NAME = "iotfs_trigger"; | |
67 | + /** 执行条件表 */ | |
68 | + public static final String IOTFS_DO_CONDITION_TABLE_NAME = "iotfs_do_condition"; | |
69 | + /** 条件动作表 */ | |
70 | + public static final String IOTFS_DO_ACTION_TABLE_NAME = "iotfs_do_action"; | |
63 | 71 | } |
64 | 72 | |
65 | 73 | public static class TableFields { | ... | ... |
common/data/src/main/java/org/thingsboard/server/common/data/yunteng/dto/DoActionDTO.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 lombok.EqualsAndHashCode; | |
6 | + | |
7 | +import java.util.List; | |
8 | + | |
9 | +/** | |
10 | + * @Description 场景联动执行动作数据传输表 | |
11 | + * @Author cxy | |
12 | + * @Date 2021/11/24 17:32 | |
13 | + */ | |
14 | +@Data | |
15 | +@EqualsAndHashCode(callSuper = true) | |
16 | +public class DoActionDTO extends TenantDTO{ | |
17 | + | |
18 | + @ApiModelProperty(value = "所属设备id") | |
19 | + private String deviceId; | |
20 | + | |
21 | + @ApiModelProperty(value = "设备输出方式") | |
22 | + private String outPut; | |
23 | + | |
24 | + @ApiModelProperty(value = "下发指令") | |
25 | + private String command; | |
26 | + | |
27 | + @ApiModelProperty(value = "输出目标:设备,场景,其他") | |
28 | + private String outTarget; | |
29 | + | |
30 | + @ApiModelProperty(value = "场景联动id") | |
31 | + private String sceneLinkageId; | |
32 | + | |
33 | + @ApiModelProperty(value = "所属设备集合") | |
34 | + private List<DeviceDTO> deviceDTOList; | |
35 | +} | ... | ... |
common/data/src/main/java/org/thingsboard/server/common/data/yunteng/dto/DoConditionDTO.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 lombok.EqualsAndHashCode; | |
6 | + | |
7 | +import java.util.List; | |
8 | + | |
9 | +/** | |
10 | + * @Description 场景联动执行条件数据传输表 | |
11 | + * @Author cxy | |
12 | + * @Date 2021/11/24 17:33 | |
13 | + */ | |
14 | +@Data | |
15 | +@EqualsAndHashCode(callSuper = true) | |
16 | +public class DoConditionDTO extends TenantDTO{ | |
17 | + | |
18 | + @ApiModelProperty(value = "所属设备id") | |
19 | + private String deviceId; | |
20 | + | |
21 | + @ApiModelProperty(value = "设备状态") | |
22 | + private String status; | |
23 | + | |
24 | + @ApiModelProperty(value = "属性") | |
25 | + private String property; | |
26 | + | |
27 | + @ApiModelProperty(value = "比较大小,0为=, 1为<, 2为 >,3为<=, 4为>=") | |
28 | + private Integer compare; | |
29 | + | |
30 | + @ApiModelProperty(value = "请输入比较值") | |
31 | + private String value; | |
32 | + | |
33 | + @ApiModelProperty(value = "场景联动id") | |
34 | + private String sceneLinkageId; | |
35 | + | |
36 | + @ApiModelProperty(value = "所属设备集合") | |
37 | + private List<DeviceDTO> deviceDTOList; | |
38 | +} | ... | ... |
common/data/src/main/java/org/thingsboard/server/common/data/yunteng/dto/SceneLinkageDTO.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 lombok.EqualsAndHashCode; | |
6 | +import org.thingsboard.server.common.data.yunteng.common.AddGroup; | |
7 | + | |
8 | +import javax.validation.constraints.NotEmpty; | |
9 | +import java.util.List; | |
10 | + | |
11 | +/** | |
12 | + * @Description 场景联动数据传输表 | |
13 | + * @Author cxy | |
14 | + * @Date 2021/11/24 17:31 | |
15 | + */ | |
16 | +@Data | |
17 | +@EqualsAndHashCode(callSuper = true) | |
18 | +public class SceneLinkageDTO extends TenantDTO{ | |
19 | + | |
20 | + @ApiModelProperty(value = "场景联动名称", required = true) | |
21 | + @NotEmpty(message = "名称不能为空或字符串", groups = AddGroup.class) | |
22 | + private String name; | |
23 | + | |
24 | + @ApiModelProperty(value = "状态:0表示已停用,1表示启用") | |
25 | + private Integer status; | |
26 | + | |
27 | + @ApiModelProperty(value = "描述") | |
28 | + private String description; | |
29 | + | |
30 | + @NotEmpty(message = "所属组织不能为空或者空字符串", groups = {AddGroup.class}) | |
31 | + @ApiModelProperty(value = "所属组织id",required = true) | |
32 | + private String organizationId; | |
33 | + | |
34 | + @ApiModelProperty(value = "触发器") | |
35 | + private List<TriggerDTO> triggers; | |
36 | + | |
37 | + @ApiModelProperty(value = "执行动作") | |
38 | + private List<DoActionDTO> doActions; | |
39 | + | |
40 | + @ApiModelProperty(value = "执行条件") | |
41 | + private List<DoConditionDTO> doConditions; | |
42 | + | |
43 | +} | ... | ... |
... | ... | @@ -32,20 +32,9 @@ public class SysEnterpriseDTO extends BaseDTO { |
32 | 32 | private String area; |
33 | 33 | @ApiModelProperty(value = "联系电话") |
34 | 34 | private String tel; |
35 | - @ApiModelProperty(value = "省") | |
36 | - private String nameProv; | |
37 | - @ApiModelProperty(value = "省code") | |
38 | - private String codeProv; | |
39 | - @ApiModelProperty(value = "市") | |
40 | - private String nameCity; | |
41 | - @ApiModelProperty(value = "市code") | |
42 | - private String codeCity; | |
43 | - @ApiModelProperty(value = "区") | |
44 | - private String nameCoun; | |
45 | - @ApiModelProperty(value = "区code") | |
46 | - private String codeCoun; | |
47 | - @ApiModelProperty(value = "县") | |
48 | - private String nameTown; | |
49 | - @ApiModelProperty(value = "县code") | |
35 | + @ApiModelProperty(value = "区域信息") | |
36 | + private SysTownDTO sysTown; | |
50 | 37 | private String codeTown; |
38 | + @ApiModelProperty(value = "二维码") | |
39 | + private String qrCode; | |
51 | 40 | } | ... | ... |
1 | +package org.thingsboard.server.common.data.yunteng.dto; | |
2 | + | |
3 | +import io.swagger.annotations.ApiModel; | |
4 | +import io.swagger.annotations.ApiModelProperty; | |
5 | +import lombok.Data; | |
6 | +import lombok.RequiredArgsConstructor; | |
7 | + | |
8 | +@Data | |
9 | +@ApiModel(value = "区域信息") | |
10 | +@RequiredArgsConstructor | |
11 | +public class SysTownDTO { | |
12 | + @ApiModelProperty(value = "省") | |
13 | + private String nameProv; | |
14 | + @ApiModelProperty(value = "省code") | |
15 | + private String codeProv; | |
16 | + @ApiModelProperty(value = "市") | |
17 | + private String nameCity; | |
18 | + @ApiModelProperty(value = "市code") | |
19 | + private String codeCity; | |
20 | + @ApiModelProperty(value = "区") | |
21 | + private String nameCoun; | |
22 | + @ApiModelProperty(value = "区code") | |
23 | + private String codeCoun; | |
24 | + @ApiModelProperty(value = "县") | |
25 | + private String nameTown; | |
26 | + @ApiModelProperty(value = "县code") | |
27 | + private String codeTown; | |
28 | +} | ... | ... |
1 | +package org.thingsboard.server.common.data.yunteng.dto; | |
2 | + | |
3 | +import io.swagger.annotations.ApiModelProperty; | |
4 | +import lombok.Data; | |
5 | +import lombok.EqualsAndHashCode; | |
6 | + | |
7 | +import java.util.List; | |
8 | + | |
9 | +/** | |
10 | + * @Description 场景联动触发器数据传输表 | |
11 | + * @Author cxy | |
12 | + * @Date 2021/11/24 17:32 | |
13 | + */ | |
14 | +@Data | |
15 | +@EqualsAndHashCode(callSuper = true) | |
16 | +public class TriggerDTO extends TenantDTO{ | |
17 | + | |
18 | + @ApiModelProperty(value = "所属设备id") | |
19 | + private String deviceId; | |
20 | + | |
21 | + @ApiModelProperty(value = "触发方式") | |
22 | + private String touchWay; | |
23 | + | |
24 | + @ApiModelProperty(value = "触发事件") | |
25 | + private String triggerEvent; | |
26 | + | |
27 | + @ApiModelProperty(value = "属性选择") | |
28 | + private String attributeChoose; | |
29 | + | |
30 | + @ApiModelProperty(value = "场景联动id") | |
31 | + private String sceneLinkageId; | |
32 | + | |
33 | + @ApiModelProperty(value = "比较大小,0为=, 1为<, 2为 >,3为<=, 4为>=") | |
34 | + private Integer compare; | |
35 | + | |
36 | + @ApiModelProperty(value = "请输入比较值") | |
37 | + private String value; | |
38 | + | |
39 | + @ApiModelProperty(value = "设备集合") | |
40 | + private List<DeviceDTO> deviceDTOList; | |
41 | +} | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.entities; | |
2 | +import com.baomidou.mybatisplus.annotation.TableName; | |
3 | +import lombok.Data; | |
4 | +import lombok.EqualsAndHashCode; | |
5 | +import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; | |
6 | + | |
7 | +/** @Description 执行动作 @Author cxy @Date 2021/11/24 17:24 */ | |
8 | +@Data | |
9 | +@TableName(value = ModelConstants.Table.IOTFS_DO_ACTION_TABLE_NAME,autoResultMap = true) | |
10 | +@EqualsAndHashCode(callSuper = true) | |
11 | +public class DoAction extends TenantBaseEntity { | |
12 | + | |
13 | + private static final long serialVersionUID = -5459834451418047957L; | |
14 | + | |
15 | + private String deviceId; | |
16 | + /** 设备输出方式 */ | |
17 | + private String outPut; | |
18 | + /** 下发指令 */ | |
19 | + private String command; | |
20 | + | |
21 | + /** 输出目标:设备,场景,其他 */ | |
22 | + private String outTarget; | |
23 | + | |
24 | + /** 场景联动id */ | |
25 | + private String sceneLinkageId; | |
26 | +} | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.entities; | |
2 | + | |
3 | +import com.baomidou.mybatisplus.annotation.TableName; | |
4 | +import lombok.Data; | |
5 | +import lombok.EqualsAndHashCode; | |
6 | +import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; | |
7 | + | |
8 | +/** @Description 执行条件实体表 @Author cxy @Date 2021/11/24 17:16 */ | |
9 | +@Data | |
10 | +@TableName(value = ModelConstants.Table.IOTFS_DO_CONDITION_TABLE_NAME) | |
11 | +@EqualsAndHashCode(callSuper = true) | |
12 | +public class DoCondition extends TenantBaseEntity { | |
13 | + private static final long serialVersionUID = 2827674377416477646L; | |
14 | + /** 设备 */ | |
15 | + private String deviceId; | |
16 | + /** 设备状态 */ | |
17 | + private String status; | |
18 | + /** 设备属性 */ | |
19 | + private String property; | |
20 | + | |
21 | + /** 比较大小: 0为=, 1为<, 2为 >,3为<=, 4为>= */ | |
22 | + private Integer compare; | |
23 | + | |
24 | + /** 请输入比较值 */ | |
25 | + private String value; | |
26 | + | |
27 | + private String sceneLinkageId; | |
28 | +} | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.entities; | |
2 | +import com.baomidou.mybatisplus.annotation.TableName; | |
3 | +import lombok.Data; | |
4 | +import lombok.EqualsAndHashCode; | |
5 | +import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; | |
6 | + | |
7 | +/** @Description 场景联动实体表 @Author cxy @Date 2021/11/24 16:40 */ | |
8 | +@Data | |
9 | +@TableName(value = ModelConstants.Table.IOTFS_SCENE_LINKAGE_TABLE_NAME) | |
10 | +@EqualsAndHashCode(callSuper = true) | |
11 | +public class SceneLinkage extends TenantBaseEntity { | |
12 | + | |
13 | + private static final long serialVersionUID = -306446373876239910L; | |
14 | + | |
15 | + private String name; | |
16 | + /** | |
17 | + * 0表示已停用,1表示启用 | |
18 | + */ | |
19 | + private Integer status; | |
20 | + | |
21 | + private String description; | |
22 | + | |
23 | + private String organizationId; | |
24 | +} | ... | ... |
1 | 1 | package org.thingsboard.server.dao.yunteng.entities; |
2 | 2 | |
3 | -import com.baomidou.mybatisplus.annotation.TableField; | |
4 | 3 | import com.baomidou.mybatisplus.annotation.TableName; |
5 | 4 | import lombok.Data; |
6 | 5 | import lombok.RequiredArgsConstructor; |
... | ... | @@ -36,25 +35,6 @@ public class SysEnterprise extends TenantBaseEntity { |
36 | 35 | private String tel; |
37 | 36 | /** 县code */ |
38 | 37 | private String codeTown; |
39 | - /** 省 */ | |
40 | - @TableField(exist = false) | |
41 | - private String nameProv; | |
42 | - /** 省code */ | |
43 | - @TableField(exist = false) | |
44 | - private String codeProv; | |
45 | - /** 市 */ | |
46 | - @TableField(exist = false) | |
47 | - private String nameCity; | |
48 | - /** 市code */ | |
49 | - @TableField(exist = false) | |
50 | - private String codeCity; | |
51 | - /** 区 */ | |
52 | - @TableField(exist = false) | |
53 | - private String nameCoun; | |
54 | - /** 区code */ | |
55 | - @TableField(exist = false) | |
56 | - private String codeCoun; | |
57 | - /** 县 */ | |
58 | - @TableField(exist = false) | |
59 | - private String nameTown; | |
38 | + /** 二维码 */ | |
39 | + private String qrCode; | |
60 | 40 | } | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.entities; | |
2 | +import com.baomidou.mybatisplus.annotation.TableName; | |
3 | +import lombok.Data; | |
4 | +import lombok.EqualsAndHashCode; | |
5 | +import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; | |
6 | + | |
7 | +/** @Description 触发器实体表 @Author cxy @Date 2021/11/24 17:06 */ | |
8 | +@Data | |
9 | +@TableName(value = ModelConstants.Table.IOTFS_TRIGGER_TABLE_NAME) | |
10 | +@EqualsAndHashCode(callSuper = true) | |
11 | +public class Trigger extends TenantBaseEntity { | |
12 | + | |
13 | + private static final long serialVersionUID = -1847061176808850967L; | |
14 | + /** 设备 */ | |
15 | + private String deviceId; | |
16 | + /** 触发方式 */ | |
17 | + private String touchWay; | |
18 | + /** 触发事件 */ | |
19 | + private String triggerEvent; | |
20 | + /** 属性选择 */ | |
21 | + private String attributeChoose; | |
22 | + /** 场景联动id */ | |
23 | + private String sceneLinkageId; | |
24 | + /** 比较大小: 0为=, 1为<, 2为 >,3为<=, 4为>= */ | |
25 | + private Integer compare; | |
26 | + /** 请输入比较值 */ | |
27 | + private String value; | |
28 | +} | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.impl; | |
2 | +import lombok.RequiredArgsConstructor; | |
3 | +import org.springframework.stereotype.Service; | |
4 | +import org.thingsboard.server.dao.yunteng.entities.DoAction; | |
5 | +import org.thingsboard.server.dao.yunteng.mapper.DoActionMapper; | |
6 | +import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; | |
7 | +import org.thingsboard.server.dao.yunteng.service.DoActionService; | |
8 | + | |
9 | +/** | |
10 | + * @Description | |
11 | + * @Author cxy | |
12 | + * @Date 2021/12/6 20:23 | |
13 | + */ | |
14 | +@Service | |
15 | +@RequiredArgsConstructor | |
16 | +public class DoActionServiceImpl extends AbstractBaseService<DoActionMapper, DoAction> | |
17 | + implements DoActionService { | |
18 | +} | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.impl; | |
2 | +import lombok.RequiredArgsConstructor; | |
3 | +import org.springframework.stereotype.Service; | |
4 | +import org.thingsboard.server.dao.yunteng.entities.DoCondition; | |
5 | +import org.thingsboard.server.dao.yunteng.mapper.DoConditionMapper; | |
6 | +import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; | |
7 | +import org.thingsboard.server.dao.yunteng.service.DoConditionService; | |
8 | + | |
9 | +/** | |
10 | + * @Description | |
11 | + * @Author cxy | |
12 | + * @Date 2021/12/6 20:16 | |
13 | + */ | |
14 | +@Service | |
15 | +@RequiredArgsConstructor | |
16 | +public class DoConditionServiceImpl extends AbstractBaseService<DoConditionMapper, DoCondition> | |
17 | + implements DoConditionService { | |
18 | +} | ... | ... |
... | ... | @@ -46,7 +46,8 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple |
46 | 46 | private final UserRoleMapper userRoleMapper; |
47 | 47 | |
48 | 48 | @Override |
49 | - public PageData<RoleDTO> page(boolean isSysadmin,boolean isPlatformAdmin, String tenantId,Map<String, Object> queryMap) { | |
49 | + public PageData<RoleDTO> page( | |
50 | + boolean isSysadmin, boolean isPlatformAdmin, String tenantId, Map<String, Object> queryMap) { | |
50 | 51 | IPage<Role> roleIPage = |
51 | 52 | baseMapper.selectPage( |
52 | 53 | getPage(queryMap, "create_time", false), |
... | ... | @@ -56,14 +57,10 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple |
56 | 57 | .eq(queryMap.get("roleType") != null, Role::getRoleType, queryMap.get("roleType")) |
57 | 58 | .ne(queryMap.get("roleType") == null, Role::getRoleType, RoleEnum.TENANT_ADMIN) |
58 | 59 | .ne( |
59 | - queryMap.get("roleType") == null | |
60 | - && isPlatformAdmin, | |
60 | + queryMap.get("roleType") == null && isPlatformAdmin, | |
61 | 61 | Role::getRoleType, |
62 | 62 | RoleEnum.SYS_ADMIN) |
63 | - .eq( | |
64 | - !isSysadmin, | |
65 | - Role::getTenantId, | |
66 | - tenantId) | |
63 | + .eq(!isSysadmin, Role::getTenantId, tenantId) | |
67 | 64 | .like( |
68 | 65 | queryMap.get("roleName") != null, |
69 | 66 | Role::getName, |
... | ... | @@ -73,14 +70,11 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple |
73 | 70 | |
74 | 71 | @Override |
75 | 72 | @Transactional |
76 | - public boolean deleteRole(String[] roleIds,String tenantId) { | |
73 | + public boolean deleteRole(String[] roleIds, String tenantId) { | |
77 | 74 | Set<String> ids = Set.of(roleIds); |
78 | 75 | int notTenantMenuCount = |
79 | 76 | baseMapper.selectCount( |
80 | - new QueryWrapper<Role>() | |
81 | - .lambda() | |
82 | - .ne(Role::getTenantId, tenantId) | |
83 | - .in(Role::getId, ids)); | |
77 | + new QueryWrapper<Role>().lambda().ne(Role::getTenantId, tenantId).in(Role::getId, ids)); | |
84 | 78 | if (notTenantMenuCount > 0) { |
85 | 79 | throw new AccessDeniedException("cannot delete role that not create by you"); |
86 | 80 | } |
... | ... | @@ -99,40 +93,32 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple |
99 | 93 | } |
100 | 94 | |
101 | 95 | @Override |
102 | - public Set<String> getPermissions(boolean isSysadmin,boolean isTenantAdmin,String tenantId,String useerId) { | |
96 | + public Set<String> getPermissions( | |
97 | + boolean isSysadmin, boolean isTenantAdmin, String tenantId, String useerId) { | |
103 | 98 | Set<String> permissions = Sets.newHashSet(); |
104 | 99 | Set<String> allPermission; |
105 | 100 | String cacheKey; |
106 | 101 | boolean cachePresent; |
107 | 102 | if (isSysadmin) { |
108 | - cacheKey = | |
109 | - FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + RoleEnum.SYS_ADMIN.name(); | |
103 | + cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + RoleEnum.SYS_ADMIN.name(); | |
110 | 104 | Optional<Set<String>> optionalPermission = |
111 | 105 | cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey); |
112 | 106 | cachePresent = optionalPermission.isPresent(); |
113 | 107 | allPermission = optionalPermission.orElseGet(menuMapper::getAllPermission); |
114 | 108 | } else if (isTenantAdmin) { |
115 | - cacheKey = | |
116 | - FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX | |
117 | - + tenantId; | |
109 | + cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + tenantId; | |
118 | 110 | Optional<Set<String>> optionalPermission = |
119 | 111 | cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey); |
120 | 112 | cachePresent = optionalPermission.isPresent(); |
121 | 113 | allPermission = |
122 | - optionalPermission.orElseGet( | |
123 | - () -> | |
124 | - menuMapper.getAllPermissionsByTenantId(tenantId)); | |
114 | + optionalPermission.orElseGet(() -> menuMapper.getAllPermissionsByTenantId(tenantId)); | |
125 | 115 | } else { |
126 | - cacheKey = | |
127 | - FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX | |
128 | - + useerId; | |
116 | + cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + useerId; | |
129 | 117 | Optional<Set<String>> optionalPermission = |
130 | 118 | cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey); |
131 | 119 | cachePresent = optionalPermission.isPresent(); |
132 | 120 | allPermission = |
133 | - optionalPermission.orElseGet( | |
134 | - () -> | |
135 | - menuMapper.getAllPermissionsByUserId(useerId)); | |
121 | + optionalPermission.orElseGet(() -> menuMapper.getAllPermissionsByUserId(useerId)); | |
136 | 122 | } |
137 | 123 | if (cachePresent) { |
138 | 124 | return allPermission; |
... | ... | @@ -146,16 +132,13 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple |
146 | 132 | |
147 | 133 | @Override |
148 | 134 | @Transactional |
149 | - public void updateRoleStatus(String roleId, int status,boolean isSysadmin,String tenantId) { | |
135 | + public void updateRoleStatus(String roleId, int status, boolean isSysadmin, String tenantId) { | |
150 | 136 | Optional.ofNullable( |
151 | 137 | baseMapper.selectOne( |
152 | 138 | new QueryWrapper<Role>() |
153 | 139 | .lambda() |
154 | 140 | .eq(Role::getId, roleId) |
155 | - .eq( | |
156 | - !isSysadmin, | |
157 | - Role::getTenantId, | |
158 | - tenantId))) | |
141 | + .eq(!isSysadmin, Role::getTenantId, tenantId))) | |
159 | 142 | .ifPresent( |
160 | 143 | role -> { |
161 | 144 | role.setEnabled(status == 1); |
... | ... | @@ -165,15 +148,15 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple |
165 | 148 | |
166 | 149 | @Override |
167 | 150 | @Transactional |
168 | - public RoleDTO saveOrUpdateRoleInfoWithMenu(RoleReqDTO roleReqDTO,boolean isSysadmin,boolean isPlatformAdmin,String tenantId) { | |
151 | + public RoleDTO saveOrUpdateRoleInfoWithMenu( | |
152 | + RoleReqDTO roleReqDTO, boolean isSysadmin, boolean isPlatformAdmin, String tenantId) { | |
169 | 153 | Role role; |
170 | 154 | // 默认普通管理员角色,即租户管理员添加的角色 |
171 | 155 | var roleType = RoleEnum.CUSTOMER_USER.name(); |
172 | 156 | if (null != roleReqDTO.getRoleType()) { |
173 | 157 | roleType = roleReqDTO.getRoleType().name(); |
174 | 158 | } else { |
175 | - if (isSysadmin | |
176 | - || isPlatformAdmin) { | |
159 | + if (isSysadmin || isPlatformAdmin) { | |
177 | 160 | roleType = RoleEnum.PLATFORM_ADMIN.name(); |
178 | 161 | } |
179 | 162 | } |
... | ... | @@ -185,10 +168,7 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple |
185 | 168 | new QueryWrapper<Role>() |
186 | 169 | .lambda() |
187 | 170 | .eq(Role::getId, roleReqDTO.getId()) |
188 | - .eq( | |
189 | - !isSysadmin, | |
190 | - Role::getTenantId, | |
191 | - tenantId)); | |
171 | + .eq(!isSysadmin, Role::getTenantId, tenantId)); | |
192 | 172 | if (role == null) { |
193 | 173 | return null; |
194 | 174 | } else { |
... | ... | @@ -223,27 +203,25 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple |
223 | 203 | tenantRoles.forEach( |
224 | 204 | tenantRole -> { |
225 | 205 | String updateTenantId = tenantRole.getTenantId(); |
226 | - int deleteCount = | |
227 | - tenantMenuMapper.delete( | |
228 | - new QueryWrapper<TenantMenu>() | |
229 | - .lambda() | |
230 | - .eq(TenantMenu::getTenantId, updateTenantId)); | |
231 | - if (deleteCount > 0) { | |
232 | - menus.forEach( | |
233 | - menu -> { | |
234 | - TenantMenu tenantMenu = new TenantMenu(); | |
235 | - tenantMenu.setMenuId(menu); | |
236 | - tenantMenu.setTenantId(updateTenantId); | |
237 | - tenantMenuMapper.insert(tenantMenu); | |
238 | - }); | |
239 | - } | |
206 | + tenantMenuMapper.delete( | |
207 | + new QueryWrapper<TenantMenu>() | |
208 | + .lambda() | |
209 | + .eq(TenantMenu::getTenantId, updateTenantId)); | |
210 | + menus.forEach( | |
211 | + menu -> { | |
212 | + TenantMenu tenantMenu = new TenantMenu(); | |
213 | + tenantMenu.setMenuId(menu); | |
214 | + tenantMenu.setTenantId(updateTenantId); | |
215 | + tenantMenuMapper.insert(tenantMenu); | |
216 | + }); | |
240 | 217 | }); |
241 | 218 | } |
242 | 219 | return role.getDTO(RoleDTO.class); |
243 | 220 | } |
244 | 221 | |
245 | 222 | @Override |
246 | - public List<RoleDTO> findRoleInfo(boolean isTenantAdmin,String tenantId,String userId,RoleDTO roleDTO) { | |
223 | + public List<RoleDTO> findRoleInfo( | |
224 | + boolean isTenantAdmin, String tenantId, String userId, RoleDTO roleDTO) { | |
247 | 225 | if (StringUtils.isEmpty(roleDTO.getTenantId())) { |
248 | 226 | roleDTO.setTenantId(tenantId); |
249 | 227 | } | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.impl; | |
2 | + | |
3 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |
4 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |
5 | +import com.baomidou.mybatisplus.core.metadata.IPage; | |
6 | +import lombok.RequiredArgsConstructor; | |
7 | +import org.apache.commons.lang3.StringUtils; | |
8 | +import org.springframework.stereotype.Service; | |
9 | +import org.springframework.transaction.annotation.Transactional; | |
10 | +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; | |
11 | +import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException; | |
12 | +import org.thingsboard.server.common.data.yunteng.dto.*; | |
13 | +import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; | |
14 | +import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; | |
15 | +import org.thingsboard.server.dao.exception.DataValidationException; | |
16 | +import org.thingsboard.server.dao.yunteng.entities.*; | |
17 | +import org.thingsboard.server.dao.yunteng.mapper.*; | |
18 | +import org.thingsboard.server.dao.yunteng.service.*; | |
19 | + | |
20 | +import java.util.*; | |
21 | +import java.util.stream.Collectors; | |
22 | + | |
23 | +/** @Description 场景联动业务实现层 @Author cxy @Date 2021/11/25 11:22 */ | |
24 | +@Service | |
25 | +@RequiredArgsConstructor | |
26 | +public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMapper, SceneLinkage> | |
27 | + implements SceneLinkageService { | |
28 | + | |
29 | + private final SceneLinkageMapper sceneLinkageMapper; | |
30 | + private final DeviceMapper deviceMapper; | |
31 | + private final DoActionMapper doActionMapper; | |
32 | + private final DoConditionMapper doConditionMapper; | |
33 | + private final TriggerMapper triggerMapper; | |
34 | + private final OrganizationMapper organizationMapper; | |
35 | + private final TriggerServiceImpl triggerService; | |
36 | + private final DoConditionServiceImpl doConditionService; | |
37 | + private final DoActionServiceImpl doActionService; | |
38 | + /** | |
39 | + * 增加场景联动,触发器可以多个,执行条件可以多个,执行动作可以多个 | |
40 | + * | |
41 | + * @param sceneLinkageDTO 场景对象 | |
42 | + * @return SceneLinkageDTO 场景 | |
43 | + */ | |
44 | + @Override | |
45 | + @Transactional | |
46 | + public SceneLinkageDTO saveScenelinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) { | |
47 | + sceneLinkageDTO.setTenantId(tenantId); | |
48 | + // 第一步保存场景,获取场景ID | |
49 | + // 场景对象 | |
50 | + SceneLinkage sceneLinkage = sceneLinkageDTO.getEntity(SceneLinkage.class); | |
51 | + // 新增 | |
52 | + int insert = sceneLinkageMapper.insert(sceneLinkage); | |
53 | + if (insert > 0) { | |
54 | + sceneLinkage.copyToDTO(sceneLinkageDTO); | |
55 | + } | |
56 | + // 拿到场景id | |
57 | + String sceneLinkageId = sceneLinkage.getId(); | |
58 | + // 拿到场景id的组织,假如是云腾公司的组织id | |
59 | + String organizationId = sceneLinkage.getOrganizationId(); | |
60 | + // 拿到当前组织id所包含的设备集合 | |
61 | + List<YtDevice> deviceList = | |
62 | + deviceMapper.selectList( | |
63 | + new QueryWrapper<YtDevice>() | |
64 | + .lambda() | |
65 | + .select(YtDevice::getId) | |
66 | + .eq( | |
67 | + StringUtils.isNoneBlank(organizationId), | |
68 | + YtDevice::getOrganizationId, | |
69 | + organizationId)); | |
70 | + // 判断设备id是否包含 | |
71 | + List<TriggerDTO> triggerDTOS = sceneLinkageDTO.getTriggers(); | |
72 | + if (triggerDTOS != null) { | |
73 | + boolean condition = false; | |
74 | + for (TriggerDTO triggerDTO : triggerDTOS) { | |
75 | + String deviceId = triggerDTO.getDeviceId(); | |
76 | + if (deviceId == null) { | |
77 | + break; | |
78 | + } | |
79 | + for (YtDevice device : deviceList) { | |
80 | + String id = device.getId(); | |
81 | + if (deviceId.equals(id)) { | |
82 | + triggerDTO.setDeviceId(id); | |
83 | + condition = true; | |
84 | + break; | |
85 | + } | |
86 | + } | |
87 | + if (!condition) { | |
88 | + throw new DataValidationException("触发器里面该设备不存在"); | |
89 | + } | |
90 | + } | |
91 | + } | |
92 | + List<DoConditionDTO> doConditionList = sceneLinkageDTO.getDoConditions(); | |
93 | + // 定义常量,如果满足条件,则新增,循环完了不满足则抛出异常 | |
94 | + if (doConditionList != null) { | |
95 | + boolean conditionC = false; | |
96 | + for (DoConditionDTO conditionDTO : doConditionList) { | |
97 | + String deviceIdC = conditionDTO.getDeviceId(); | |
98 | + if (deviceIdC == null) { | |
99 | + break; | |
100 | + } | |
101 | + for (YtDevice deviceC : deviceList) { | |
102 | + String id = deviceC.getId(); | |
103 | + if (deviceIdC.equals(id)) { | |
104 | + conditionDTO.setDeviceId(id); | |
105 | + conditionC = true; | |
106 | + break; | |
107 | + } | |
108 | + } | |
109 | + if (!conditionC) { | |
110 | + throw new DataValidationException("执行条件里面该设备不存在"); | |
111 | + } | |
112 | + } | |
113 | + } | |
114 | + List<DoActionDTO> doActionDTOList = sceneLinkageDTO.getDoActions(); | |
115 | + // 定义常量,如果满足条件,则新增,循环完了不满足则抛出异常 | |
116 | + if (doActionDTOList != null) { | |
117 | + boolean conditionA = false; | |
118 | + for (DoActionDTO actionDTO : doActionDTOList) { | |
119 | + String deviceIdA = actionDTO.getDeviceId(); | |
120 | + if (deviceIdA == null) { | |
121 | + break; | |
122 | + } | |
123 | + for (YtDevice deviceA : deviceList) { | |
124 | + String id = deviceA.getId(); | |
125 | + if (deviceIdA.equals(id)) { | |
126 | + actionDTO.setDeviceId(id); | |
127 | + conditionA = true; | |
128 | + break; | |
129 | + } | |
130 | + } | |
131 | + if (!conditionA) { | |
132 | + throw new DataValidationException("执行动作里面该设备不存在"); | |
133 | + } | |
134 | + } | |
135 | + } | |
136 | + // 3.批量新增Trigger | |
137 | + List<Trigger> collect = | |
138 | + sceneLinkageDTO.getTriggers().stream() | |
139 | + .peek(triggerDTO -> triggerDTO.setSceneLinkageId(sceneLinkageId)) | |
140 | + .peek(triggerDTO -> triggerDTO.setTenantId(tenantId)) | |
141 | + .map(triggerDTO -> triggerDTO.getEntity(Trigger.class)) | |
142 | + .collect(Collectors.toList()); | |
143 | + triggerService.insertBatch(collect, 1000); | |
144 | + // 4.批量新增执行条件 | |
145 | + List<DoCondition> collectC = | |
146 | + sceneLinkageDTO.getDoConditions().stream() | |
147 | + .peek(doConditionDTO -> doConditionDTO.setSceneLinkageId(sceneLinkageId)) | |
148 | + .peek(doConditionDTO -> doConditionDTO.setTenantId(tenantId)) | |
149 | + .map(doConditionDTO -> doConditionDTO.getEntity(DoCondition.class)) | |
150 | + .collect(Collectors.toList()); | |
151 | + doConditionService.insertBatch(collectC, 1000); | |
152 | + // 5.批量新增执行动作 | |
153 | + List<DoAction> collectA = | |
154 | + sceneLinkageDTO.getDoActions().stream() | |
155 | + .peek(doActionDTO -> doActionDTO.setSceneLinkageId(sceneLinkageId)) | |
156 | + .peek(doActionDTO -> doActionDTO.setTenantId(tenantId)) | |
157 | + .map(doActionDTO -> doActionDTO.getEntity(DoAction.class)) | |
158 | + .collect(Collectors.toList()); | |
159 | + doActionService.insertBatch(collectA, 1000); | |
160 | + return sceneLinkageDTO; | |
161 | + } | |
162 | + | |
163 | + /** | |
164 | + * byId删除场景联动 | |
165 | + * | |
166 | + * @param ids 删除的ids | |
167 | + */ | |
168 | + @Override | |
169 | + public void deleteSceneLinkage(Set<String> ids, String tenantId) { | |
170 | + // 删除场景,一并删除数据库触发器,执行条件,执行动作的数据 | |
171 | + triggerMapper.delete( | |
172 | + new LambdaQueryWrapper<Trigger>() | |
173 | + .eq(Trigger::getTenantId, tenantId) | |
174 | + .in(Trigger::getSceneLinkageId, ids)); | |
175 | + doConditionMapper.delete( | |
176 | + new LambdaQueryWrapper<DoCondition>() | |
177 | + .eq(DoCondition::getTenantId, tenantId) | |
178 | + .in(DoCondition::getSceneLinkageId, ids)); | |
179 | + doActionMapper.delete( | |
180 | + new LambdaQueryWrapper<DoAction>() | |
181 | + .eq(DoAction::getTenantId, tenantId) | |
182 | + .in(DoAction::getSceneLinkageId, ids)); | |
183 | + LambdaQueryWrapper<SceneLinkage> Wrapper = | |
184 | + new QueryWrapper<SceneLinkage>() | |
185 | + .lambda() | |
186 | + .eq(SceneLinkage::getTenantId, tenantId) | |
187 | + .in(SceneLinkage::getId, ids); | |
188 | + sceneLinkageMapper.delete(Wrapper); | |
189 | + } | |
190 | + /** | |
191 | + * 修改场景联动和包含的触发器,执行条件,执行动作 | |
192 | + * | |
193 | + * @param sceneLinkageDTO 场景 | |
194 | + * @return SceneLinkageDTO 场景 | |
195 | + */ | |
196 | + @Override | |
197 | + @Transactional | |
198 | + public SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO) { | |
199 | + // 获取场景 | |
200 | + SceneLinkage sceneLinkage = baseMapper.selectById(sceneLinkageDTO.getId()); | |
201 | + if (sceneLinkage == null) { | |
202 | + throw new YtDataValidationException("此场景已不存在"); | |
203 | + } | |
204 | + sceneLinkageDTO.copyToEntity(sceneLinkage); | |
205 | + | |
206 | + updateTrigger(sceneLinkageDTO); | |
207 | + updateDoAction(sceneLinkageDTO); | |
208 | + updateDoCondition(sceneLinkageDTO); | |
209 | + sceneLinkageMapper.updateById(sceneLinkage); | |
210 | + return sceneLinkage.getDTO(SceneLinkageDTO.class); | |
211 | + } | |
212 | + /** | |
213 | + * 修改触发器 | |
214 | + * | |
215 | + * @param sceneLinkageDTO 修改场景 | |
216 | + */ | |
217 | + private void updateTrigger(SceneLinkageDTO sceneLinkageDTO) { | |
218 | + // 先删除触发器 | |
219 | + triggerMapper.delete( | |
220 | + new QueryWrapper<Trigger>() | |
221 | + .lambda() | |
222 | + .eq( | |
223 | + StringUtils.isNoneBlank(sceneLinkageDTO.getId()), | |
224 | + Trigger::getSceneLinkageId, | |
225 | + sceneLinkageDTO.getId())); | |
226 | + // 如果获取的触发器不为空,进行添加操作 | |
227 | + if (null != sceneLinkageDTO.getTriggers() && !sceneLinkageDTO.getTriggers().isEmpty()) { | |
228 | + sceneLinkageDTO | |
229 | + .getTriggers() | |
230 | + .forEach( | |
231 | + triggerDTO -> { | |
232 | + Trigger trigger = new Trigger(); | |
233 | + triggerDTO.copyToEntity(trigger); | |
234 | + triggerMapper.insert(trigger); | |
235 | + }); | |
236 | + } | |
237 | + } | |
238 | + /** | |
239 | + * 修改执行动作 | |
240 | + * | |
241 | + * @param sceneLinkageDTO 场景 | |
242 | + */ | |
243 | + private void updateDoAction(SceneLinkageDTO sceneLinkageDTO) { | |
244 | + doActionMapper.delete( | |
245 | + new QueryWrapper<DoAction>() | |
246 | + .lambda() | |
247 | + .eq( | |
248 | + StringUtils.isNoneBlank(sceneLinkageDTO.getId()), | |
249 | + DoAction::getSceneLinkageId, | |
250 | + sceneLinkageDTO.getId())); | |
251 | + if (null != sceneLinkageDTO.getDoActions() && !sceneLinkageDTO.getDoActions().isEmpty()) { | |
252 | + sceneLinkageDTO | |
253 | + .getDoActions() | |
254 | + .forEach( | |
255 | + doActionDTO -> { | |
256 | + DoAction doAction = new DoAction(); | |
257 | + doActionDTO.copyToEntity(doAction); | |
258 | + doActionMapper.insert(doAction); | |
259 | + }); | |
260 | + } | |
261 | + } | |
262 | + /** | |
263 | + * 修改执行动作 | |
264 | + * | |
265 | + * @param sceneLinkageDTO 场景 | |
266 | + */ | |
267 | + private void updateDoCondition(SceneLinkageDTO sceneLinkageDTO) { | |
268 | + doConditionMapper.delete( | |
269 | + new QueryWrapper<DoCondition>() | |
270 | + .lambda() | |
271 | + .eq( | |
272 | + StringUtils.isNoneBlank(sceneLinkageDTO.getId()), | |
273 | + DoCondition::getSceneLinkageId, | |
274 | + sceneLinkageDTO.getId())); | |
275 | + if (null != sceneLinkageDTO.getDoConditions() && !sceneLinkageDTO.getDoActions().isEmpty()) { | |
276 | + sceneLinkageDTO | |
277 | + .getDoConditions() | |
278 | + .forEach( | |
279 | + doConditionDTO -> { | |
280 | + DoCondition doCondition = new DoCondition(); | |
281 | + doConditionDTO.copyToEntity(doCondition); | |
282 | + doConditionMapper.insert(doCondition); | |
283 | + }); | |
284 | + } | |
285 | + } | |
286 | + /** | |
287 | + * 通过分页查询 | |
288 | + * | |
289 | + * @param queryMap 封装参数 | |
290 | + * @return SceneLinkageDTO 场景对象 | |
291 | + */ | |
292 | + @Override | |
293 | + @Transactional | |
294 | + public PageData<SceneLinkageDTO> page(Map<String, Object> queryMap, String tenantId) { | |
295 | + queryMap.put("tenantCode", tenantId); | |
296 | + // 拿到传入的组织id | |
297 | + String organizationId = (String) queryMap.get("organizationId"); | |
298 | + // 不为空 | |
299 | + if (!StringUtils.isEmpty(organizationId)) { | |
300 | + // 新建组织集合 | |
301 | + List<String> organizationIds = new ArrayList<>(); | |
302 | + // 添加拿到的组织 | |
303 | + organizationIds.add(organizationId); | |
304 | + // 查询该组织的所有子类 | |
305 | + List<OrganizationDTO> organizationDTOS = | |
306 | + organizationMapper.findOrganizationTreeList(tenantId, organizationIds); | |
307 | + // 遍历组织id | |
308 | + List<String> queryOrganizationIds = new ArrayList<>(); | |
309 | + organizationDTOS.forEach( | |
310 | + item -> { | |
311 | + queryOrganizationIds.add(item.getId()); | |
312 | + }); | |
313 | + queryMap.put("organizationIds", queryOrganizationIds); | |
314 | + } | |
315 | + IPage<SceneLinkage> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false); | |
316 | + IPage<SceneLinkageDTO> scenePage = baseMapper.getScenePage(page, queryMap); | |
317 | + scenePage | |
318 | + .getRecords() | |
319 | + .forEach( | |
320 | + sceneLinkageDTO -> { | |
321 | + List<TriggerDTO> collect = | |
322 | + triggerMapper | |
323 | + .selectList( | |
324 | + new LambdaQueryWrapper<Trigger>() | |
325 | + .in(Trigger::getSceneLinkageId, sceneLinkageDTO.getId())) | |
326 | + .stream() | |
327 | + .map(trigger -> trigger.getDTO(TriggerDTO.class)) | |
328 | + .collect(Collectors.toList()); | |
329 | + sceneLinkageDTO.setTriggers(collect); | |
330 | + }); | |
331 | + return getPageData(scenePage, SceneLinkageDTO.class); | |
332 | + } | |
333 | + /** 获取当前租户的场景联动 */ | |
334 | + @Override | |
335 | + public List<SceneLinkageDTO> findSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) { | |
336 | + List<SceneLinkage> scenelinkageList = | |
337 | + baseMapper.selectList( | |
338 | + new QueryWrapper<SceneLinkage>() | |
339 | + .lambda() | |
340 | + .eq(SceneLinkage::getTenantId, tenantId) | |
341 | + .like(SceneLinkage::getName, sceneLinkageDTO.getName()) | |
342 | + .like(SceneLinkage::getOrganizationId, sceneLinkageDTO.getOrganizationId()) | |
343 | + .like(SceneLinkage::getStatus, sceneLinkageDTO.getStatus())); | |
344 | + return ReflectUtils.sourceToTarget(scenelinkageList, SceneLinkageDTO.class); | |
345 | + } | |
346 | + /** | |
347 | + * 修改当前场景联动的状态,启用或者停用 | |
348 | + * | |
349 | + * @param sceneLinkageId 场景id | |
350 | + * @param status 状态 | |
351 | + */ | |
352 | + @Override | |
353 | + @Transactional(rollbackFor = Exception.class) | |
354 | + public void updateSceneStatus(String sceneLinkageId, int status, String tenantId) { | |
355 | + Optional.ofNullable( | |
356 | + baseMapper.selectOne( | |
357 | + new QueryWrapper<SceneLinkage>() | |
358 | + .lambda() | |
359 | + .eq(SceneLinkage::getId, sceneLinkageId) | |
360 | + .eq(SceneLinkage::getTenantId, tenantId))) | |
361 | + .ifPresent( | |
362 | + sceneLinkage -> { | |
363 | + sceneLinkage.setStatus(status); | |
364 | + baseMapper.updateById(sceneLinkage); | |
365 | + }); | |
366 | + } | |
367 | + /** | |
368 | + * 通过组织id查询全部的设备集合 | |
369 | + * | |
370 | + * @param organizationId | |
371 | + * @return 设备集合 | |
372 | + */ | |
373 | + @Override | |
374 | + public List<DeviceDTO> findDeviceList(String organizationId) { | |
375 | + // 拿到当前组织id所包含的设备集合 | |
376 | + List<YtDevice> deviceList = | |
377 | + deviceMapper.selectList( | |
378 | + new QueryWrapper<YtDevice>() | |
379 | + .lambda() | |
380 | + .eq( | |
381 | + StringUtils.isNoneBlank(organizationId), | |
382 | + YtDevice::getOrganizationId, | |
383 | + organizationId)); | |
384 | + List<DeviceDTO> deviceDTOList = | |
385 | + deviceList.stream() | |
386 | + .map(device -> device.getDTO(DeviceDTO.class)) | |
387 | + .collect(Collectors.toList()); | |
388 | + return ReflectUtils.sourceToTarget(deviceDTOList, DeviceDTO.class); | |
389 | + } | |
390 | +} | ... | ... |
... | ... | @@ -30,8 +30,7 @@ public class SysEnterpriseServiceImpl |
30 | 30 | |
31 | 31 | @Override |
32 | 32 | public SysEnterpriseDTO get(String tenantId) { |
33 | - SysEnterprise sysEnterprise = baseMapper.get(tenantId).getEntity(SysEnterprise.class); | |
34 | - return sysEnterprise == null ? null : sysEnterprise.getDTO(SysEnterpriseDTO.class); | |
33 | + return baseMapper.get(tenantId); | |
35 | 34 | } |
36 | 35 | |
37 | 36 | @Override | ... | ... |
... | ... | @@ -47,15 +47,14 @@ public class SysNoticeServiceImpl extends AbstractBaseService<SysNoticeMapper, S |
47 | 47 | public PageData<SysNoticeDTO> page(Map<String, Object> queryMap) { |
48 | 48 | IPage<SysNotice> sysNoticeIPage = |
49 | 49 | getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, true); |
50 | - sysNoticeIPage = baseMapper.page(sysNoticeIPage, queryMap); | |
50 | + baseMapper.page(sysNoticeIPage, queryMap); | |
51 | 51 | return getPageData(sysNoticeIPage, SysNoticeDTO.class); |
52 | 52 | } |
53 | 53 | |
54 | 54 | @Override |
55 | 55 | public SysNoticeDTO get(String id,String tenantId) { |
56 | 56 | return baseMapper |
57 | - .get(id, tenantId) | |
58 | - .getDTO(SysNoticeDTO.class); | |
57 | + .get(id, tenantId); | |
59 | 58 | } |
60 | 59 | |
61 | 60 | @Override | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.impl; | |
2 | +import lombok.RequiredArgsConstructor; | |
3 | +import org.springframework.stereotype.Service; | |
4 | +import org.thingsboard.server.dao.yunteng.entities.Trigger; | |
5 | +import org.thingsboard.server.dao.yunteng.mapper.TriggerMapper; | |
6 | +import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; | |
7 | +import org.thingsboard.server.dao.yunteng.service.TriggerService; | |
8 | + | |
9 | +/** | |
10 | + * @Description | |
11 | + * @Author cxy | |
12 | + * @Date 2021/12/6 19:53 | |
13 | + */ | |
14 | +@Service | |
15 | +@RequiredArgsConstructor | |
16 | +public class TriggerServiceImpl extends AbstractBaseService<TriggerMapper, Trigger> | |
17 | + implements TriggerService { | |
18 | +} | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.mapper; | |
2 | + | |
3 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
4 | +import org.apache.ibatis.annotations.Mapper; | |
5 | +import org.thingsboard.server.dao.yunteng.entities.DoAction; | |
6 | + | |
7 | +/** | |
8 | + * @Description 执行动作mapper | |
9 | + * @Author cxy | |
10 | + * @Date 2021/11/26 9:38 | |
11 | + */ | |
12 | +@Mapper | |
13 | +public interface DoActionMapper extends BaseMapper<DoAction> { | |
14 | +} | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.mapper; | |
2 | + | |
3 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
4 | +import org.apache.ibatis.annotations.Mapper; | |
5 | +import org.thingsboard.server.dao.yunteng.entities.DoCondition; | |
6 | + | |
7 | +/** | |
8 | + * @Description 执行条件mapper | |
9 | + * @Author cxy | |
10 | + * @Date 2021/11/26 9:39 | |
11 | + */ | |
12 | +@Mapper | |
13 | +public interface DoConditionMapper extends BaseMapper<DoCondition> { | |
14 | +} | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.mapper; | |
2 | + | |
3 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
4 | +import com.baomidou.mybatisplus.core.metadata.IPage; | |
5 | +import org.apache.ibatis.annotations.Mapper; | |
6 | +import org.apache.ibatis.annotations.Param; | |
7 | +import org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO; | |
8 | +import org.thingsboard.server.dao.yunteng.entities.SceneLinkage; | |
9 | + | |
10 | +import java.util.Map; | |
11 | + | |
12 | +/** | |
13 | + * @Description 场景联动持久层 | |
14 | + * @Author cxy | |
15 | + * @Date 2021/11/25 10:48 | |
16 | + */ | |
17 | +@Mapper | |
18 | +public interface SceneLinkageMapper extends BaseMapper<SceneLinkage> { | |
19 | + /** | |
20 | + * 分页条件查询 | |
21 | + * @param page | |
22 | + * @param queryMap | |
23 | + * @return | |
24 | + */ | |
25 | + IPage<SceneLinkageDTO> getScenePage( | |
26 | + IPage<?> page, @Param("queryMap") Map<String, Object> queryMap); | |
27 | + | |
28 | + | |
29 | +} | ... | ... |
... | ... | @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
4 | 4 | import com.baomidou.mybatisplus.core.metadata.IPage; |
5 | 5 | import org.apache.ibatis.annotations.Mapper; |
6 | 6 | import org.apache.ibatis.annotations.Param; |
7 | +import org.thingsboard.server.common.data.yunteng.dto.SysNoticeDTO; | |
7 | 8 | import org.thingsboard.server.dao.yunteng.entities.SysNotice; |
8 | 9 | |
9 | 10 | import java.util.Map; |
... | ... | @@ -20,11 +21,11 @@ public interface SysNoticeMapper extends BaseMapper<SysNotice> { |
20 | 21 | * @param queryMap |
21 | 22 | * @return 系统通知分页 |
22 | 23 | */ |
23 | - IPage<SysNotice> page(IPage<SysNotice> page, @Param("queryMap") Map<String, Object> queryMap); | |
24 | + IPage<SysNoticeDTO> page(IPage<SysNotice> page, @Param("queryMap") Map<String, Object> queryMap); | |
24 | 25 | |
25 | 26 | /** |
26 | 27 | * @param id |
27 | 28 | * @return 消息详情 |
28 | 29 | */ |
29 | - SysNotice get(@Param("id") String id, @Param("tenantId") String tenantId); | |
30 | + SysNoticeDTO get(@Param("id") String id, @Param("tenantId") String tenantId); | |
30 | 31 | } | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.mapper; | |
2 | + | |
3 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
4 | +import org.apache.ibatis.annotations.Mapper; | |
5 | +import org.thingsboard.server.dao.yunteng.entities.Trigger; | |
6 | + | |
7 | +/** | |
8 | + * @Description 触发器mapper层 | |
9 | + * @Author cxy | |
10 | + * @Date 2021/11/26 9:30 | |
11 | + */ | |
12 | +@Mapper | |
13 | +public interface TriggerMapper extends BaseMapper<Trigger> { | |
14 | +} | ... | ... |
1 | +package org.thingsboard.server.dao.yunteng.service; | |
2 | +import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO; | |
3 | +import org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO; | |
4 | +import org.thingsboard.server.common.data.yunteng.utils.tools.PageData; | |
5 | + | |
6 | +import java.util.List; | |
7 | +import java.util.Map; | |
8 | +import java.util.Set; | |
9 | + | |
10 | +/** | |
11 | + * @Description 场景联动的业务 | |
12 | + * @Author cxy | |
13 | + * @Date 2021/11/25 11:19 | |
14 | + */ | |
15 | +public interface SceneLinkageService { | |
16 | + /** | |
17 | + * 新增场景联动 | |
18 | + * @param sceneLinkageDTO | |
19 | + * @return | |
20 | + */ | |
21 | + SceneLinkageDTO saveScenelinkage(SceneLinkageDTO sceneLinkageDTO,String tenantId); | |
22 | + | |
23 | + /** | |
24 | + * 删除场景联动 | |
25 | + * @param ids | |
26 | + * @return | |
27 | + */ | |
28 | + void deleteSceneLinkage(Set<String> ids,String tenantId); | |
29 | + | |
30 | + /** | |
31 | + * 修改场景联动 | |
32 | + * @param sceneLinkageDTO | |
33 | + * @return | |
34 | + */ | |
35 | + SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO); | |
36 | + | |
37 | + /** | |
38 | + * 分页查询 | |
39 | + * @param queryMap | |
40 | + * @return | |
41 | + */ | |
42 | + PageData<SceneLinkageDTO> page(Map<String, Object> queryMap,String tenantId); | |
43 | + | |
44 | + /** | |
45 | + * 查找场景联动所有数据 | |
46 | + * @param sceneLinkageDTO | |
47 | + * @return | |
48 | + */ | |
49 | + List<SceneLinkageDTO> findSceneLinkage(SceneLinkageDTO sceneLinkageDTO,String tenantId); | |
50 | + | |
51 | + /** | |
52 | + * 修改场景的状态 | |
53 | + * @param sceneLinkageId | |
54 | + * @param status | |
55 | + */ | |
56 | + void updateSceneStatus(String sceneLinkageId, int status,String tenantId); | |
57 | + | |
58 | + /** | |
59 | + * 通过组织id查询设备集合 | |
60 | + * @param organizationId | |
61 | + * @return | |
62 | + */ | |
63 | + List<DeviceDTO> findDeviceList(String organizationId); | |
64 | + | |
65 | +} | ... | ... |
... | ... | @@ -12,6 +12,7 @@ |
12 | 12 | <result property="updater" column="updater"/> |
13 | 13 | <result property="updateTime" column="update_time"/> |
14 | 14 | <result property="remark" column="remark"/> |
15 | + <result property="tenantId" column="tenant_id"/> | |
15 | 16 | </resultMap> |
16 | 17 | |
17 | 18 | <select id="findOrganizationTreeList" resultMap="organizationDTOMap"> | ... | ... |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |
3 | + | |
4 | +<mapper namespace="org.thingsboard.server.dao.yunteng.mapper.SceneLinkageMapper"> | |
5 | + <resultMap id="sceneLinkageMap" type="org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO"> | |
6 | + <result property="id" column="id"/> | |
7 | + <result property="name" column="name"/> | |
8 | + <result property="organizationId" column="organization_id"/> | |
9 | + <result property="status" column="status"/> | |
10 | + <result property="description" column="description"/> | |
11 | + <result property="tenantId" column="tenant_id"/> | |
12 | + <result property="updater" column="updater"/> | |
13 | + <result property="updateTime" column="update_time"/> | |
14 | + <result property="createTime" column="create_time"/> | |
15 | + <result property="creator" column="creator"/> | |
16 | + </resultMap> | |
17 | + <sql id="columns"> | |
18 | + s.id,s.name,s.organization_id,s.status,s.description,s.tenant_id,s.updater,s.update_time,s.create_time,s.creator | |
19 | + </sql> | |
20 | + <select id="getScenePage" resultMap="sceneLinkageMap"> | |
21 | + SELECT | |
22 | + <include refid="columns"/> | |
23 | + FROM iotfs_scene_linkage s | |
24 | + LEFT JOIN iotfs_organization io ON io.id = s.organization_id | |
25 | + <where> | |
26 | + <if test="queryMap.tenantId !=null and queryMap.tenantId !=''"> | |
27 | + AND s.tenant_id = #{queryMap.tenantId} | |
28 | + </if> | |
29 | + <if test="queryMap.name !=null and queryMap.name !=''"> | |
30 | + AND s.name LIKE concat('%',#{queryMap.name}::TEXT,'%') | |
31 | + </if> | |
32 | + <if test="queryMap.status !=null and queryMap.status!=''"> | |
33 | + AND s.status = #{queryMap.status} | |
34 | + </if> | |
35 | + <if test="queryMap.organizationId !=null"> | |
36 | + AND s.organization_id IN | |
37 | + <foreach collection="queryMap.organizationIds" item="organizationId" open="(" separator="," close=")"> | |
38 | + #{organizationId} | |
39 | + </foreach> | |
40 | + </if> | |
41 | + </where> | |
42 | + </select> | |
43 | + | |
44 | +</mapper> | ... | ... |
... | ... | @@ -13,13 +13,17 @@ |
13 | 13 | <result property="area" column="area"/> |
14 | 14 | <result property="tel" column="tel"/> |
15 | 15 | <result property="codeTown" column="code_town"/> |
16 | - <result property="nameProv" column="name_prov"/> | |
17 | - <result property="codeProv" column="code_prov"/> | |
18 | - <result property="nameCity" column="name_city"/> | |
19 | - <result property="codeCity" column="code_city"/> | |
20 | - <result property="nameCoun" column="name_coun"/> | |
21 | - <result property="codeCoun" column="code_coun"/> | |
22 | - <result property="nameTown" column="name_town"/> | |
16 | + <result property="qrCode" column="qr_code"/> | |
17 | + <association property="sysTown" javaType="org.thingsboard.server.common.data.yunteng.dto.SysTownDTO"> | |
18 | + <result property="nameProv" column="name_prov"/> | |
19 | + <result property="codeProv" column="code_prov"/> | |
20 | + <result property="nameCity" column="name_city"/> | |
21 | + <result property="codeCity" column="code_city"/> | |
22 | + <result property="nameCoun" column="name_coun"/> | |
23 | + <result property="codeCoun" column="code_coun"/> | |
24 | + <result property="nameTown" column="name_town"/> | |
25 | + <result property="codeTown" column="code_town"/> | |
26 | + </association> | |
23 | 27 | </resultMap> |
24 | 28 | |
25 | 29 | <select id="get" resultMap="entity"> |
... | ... | @@ -33,6 +37,7 @@ |
33 | 37 | se.area area, |
34 | 38 | se.tel tel, |
35 | 39 | se.code_town code_town, |
40 | + se.qr_code qr_code, | |
36 | 41 | st.name_prov name_prov, |
37 | 42 | st.code_prov code_prov, |
38 | 43 | st.name_city name_city, | ... | ... |