diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 816d380a..ee3a2356 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -25,7 +25,9 @@ "Bash(git diff:*)", "Bash(source \"$HOME/.nvm/nvm.sh\")", "Bash(nvm use:*)", - "Bash(npm run:*)" + "Bash(npm run:*)", + "mcp__filesystem__read_text_file", + "Bash(sips:*)" ] } } diff --git a/CLAUDE.md b/CLAUDE.md index d8bcd74e..1e879c51 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -111,6 +111,8 @@ fastbee-plugs/ **认证方式:** 通过 `Authorization` 请求头传递 JWT Token。Token 配置在 `application.yml` 的 `token:` 节点下。 +**权限策略(重要):** 后端接口权限基于若依 `@PreAuthorize("@ss.hasPermi(...)" )` / `@ss.hasAnyPermi(...)`。`sys_menu.menu_type = C` 通常代表页面权限,`menu_type = F` 代表按钮/功能权限。由于前端页面会跨模块复用选择器/列表/详情接口(例如设备计算公式页面复用产品物模型接口、数据中心复用设备/场景接口),读接口、列表接口、下拉选择器、详情接口应优先使用 `hasAnyPermi`,允许“接口原所属权限 + 实际使用页面的页面级权限”。示例:`@PreAuthorize("@ss.hasAnyPermi('iot:model:list,iot:device:list')")`。写接口(新增/修改/删除/导入/导出)不要默认用页面 `list` 权限放开;只有确认该写操作属于该页面功能时,才追加对应页面的 `add/edit/remove` 权限,例如设备页维护计算公式可考虑 `iot:model:edit,iot:device:edit`。 + **API 文档:** 服务运行时可通过 `/swagger-ui/index.html` 访问 Swagger/OpenAPI 文档。 ### 前端架构 diff --git a/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysNoticeController.java b/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysNoticeController.java index afa2a2bb..078fc6e1 100644 --- a/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysNoticeController.java +++ b/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysNoticeController.java @@ -32,7 +32,7 @@ public class SysNoticeController extends BaseController { * 获取通知公告列表 */ @ApiOperation("获取通知公告列表") - @PreAuthorize("@ss.hasPermi('system:notice:list')") + @PreAuthorize("@ss.hasAnyPermi('system:notice:list,iot:device:list')") @GetMapping("/list") public TableDataInfo list(SysNotice notice) { startPage(); @@ -44,7 +44,7 @@ public class SysNoticeController extends BaseController { * 根据通知公告编号获取详细信息 */ @ApiOperation("根据通知公告编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:notice:query')") + @PreAuthorize("@ss.hasAnyPermi('system:notice:query,iot:device:list')") @GetMapping(value = "/{noticeId}") public AjaxResult getInfo(@PathVariable Long noticeId) { return success(noticeService.selectNoticeById(noticeId)); diff --git a/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysUserController.java b/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysUserController.java index cd653c42..e29b0c04 100644 --- a/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysUserController.java +++ b/fastbee-admin/src/main/java/com/fastbee/web/controller/system/SysUserController.java @@ -55,7 +55,7 @@ public class SysUserController extends BaseController { * 获取用户列表 */ @ApiOperation("获取用户分页列表") - @PreAuthorize("@ss.hasPermi('system:user:list')") + @PreAuthorize("@ss.hasAnyPermi('system:user:list,iot:project:list,iot:device:list,iot:push:list')") @GetMapping("/list") public TableDataInfo list(SysUser user) { startPage(); @@ -245,7 +245,7 @@ public class SysUserController extends BaseController { * 获取部门树列表 */ @ApiOperation("获取部门树列表") - @PreAuthorize("@ss.hasAnyPermi('system:user:list,iot:device:list')") + @PreAuthorize("@ss.hasAnyPermi('system:user:list,iot:device:list,dataCenter:history:list,iot:project:list')") @GetMapping("/deptTree") public AjaxResult deptTree(SysDept dept) { return success(deptService.selectDeptTreeList(dept)); diff --git a/fastbee-notify/fastbee-notify-web/src/main/java/com/fastbee/notify/controller/NotifyTemplateController.java b/fastbee-notify/fastbee-notify-web/src/main/java/com/fastbee/notify/controller/NotifyTemplateController.java index 86ba64bb..0e575561 100644 --- a/fastbee-notify/fastbee-notify-web/src/main/java/com/fastbee/notify/controller/NotifyTemplateController.java +++ b/fastbee-notify/fastbee-notify-web/src/main/java/com/fastbee/notify/controller/NotifyTemplateController.java @@ -41,7 +41,7 @@ public class NotifyTemplateController extends BaseController { /** * 查询通知模版列表 */ - @PreAuthorize("@ss.hasPermi('notify:template:list')") + @PreAuthorize("@ss.hasAnyPermi('notify:template:list,iot:alert:list,iot:push:list')") @GetMapping("/list") @ApiOperation("查询通知模版列表") public TableDataInfo list(NotifyTemplate notifyTemplate) { @@ -66,7 +66,7 @@ public class NotifyTemplateController extends BaseController { /** * 获取通知模版详细信息 */ - @PreAuthorize("@ss.hasPermi('notify:template:query')") + @PreAuthorize("@ss.hasAnyPermi('notify:template:query,iot:alert:list,iot:push:list')") @GetMapping(value = "/{id}") @ApiOperation("获取通知模版详细信息") public AjaxResult getInfo(@PathVariable("id") Long id) { @@ -109,7 +109,7 @@ public class NotifyTemplateController extends BaseController { /** * 获取消息通知模版参数信息 */ - @PreAuthorize("@ss.hasPermi('notify:template:query')") + @PreAuthorize("@ss.hasAnyPermi('notify:template:query,iot:alert:list,iot:push:list')") @GetMapping(value = "/msgParams") @ApiOperation("获取模板参数配置") public AjaxResult msgParams(Long channelId, String msgType) { @@ -120,7 +120,7 @@ public class NotifyTemplateController extends BaseController { /** * 获取通知模版详细信息 */ - @PreAuthorize("@ss.hasPermi('notify:template:query')") + @PreAuthorize("@ss.hasAnyPermi('notify:template:query,iot:alert:list,iot:push:list')") @GetMapping(value = "/getUsable") @ApiOperation("获取同一业务的模板是否有可用的") public AjaxResult getUsable(NotifyTemplate notifyTemplate) { @@ -142,7 +142,7 @@ public class NotifyTemplateController extends BaseController { /** * 获取消息通知模版参数变量 */ - @PreAuthorize("@ss.hasPermi('notify:template:query')") + @PreAuthorize("@ss.hasAnyPermi('notify:template:query,iot:alert:list,iot:push:list')") @GetMapping(value = "/listVariables") @ApiOperation("获取模板内容变量") public AjaxResult listVariables(Long id, String channelType, String provider) { diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/datacenter/DataCenterController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/datacenter/DataCenterController.java index 997debdf..905b5549 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/datacenter/DataCenterController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/datacenter/DataCenterController.java @@ -58,7 +58,7 @@ public class DataCenterController { * @return com.fastbee.common.core.domain.AjaxResult */ @ApiOperation("查询设备的历史数据") - @PreAuthorize("@ss.hasPermi('dataCenter:history:list')") + @PreAuthorize("@ss.hasAnyPermi('dataCenter:history:list,iot:device:list')") @PostMapping("/deviceHistory") public AjaxResult deviceHistory(@RequestBody DeviceHistoryParam deviceHistoryParam) { if (StringUtils.isEmpty(deviceHistoryParam.getSerialNumber())) { @@ -134,7 +134,7 @@ public class DataCenterController { } @ApiOperation("网关计算物模型历史(查询时按公式计算,按分钟对齐,缺数沿用上一分钟)") - @PreAuthorize("@ss.hasPermi('dataCenter:history:list')") + @PreAuthorize("@ss.hasAnyPermi('dataCenter:history:list,iot:device:list')") @PostMapping("/deviceHistoryCalculated") public AjaxResult deviceHistoryCalculated(@RequestBody DeviceHistoryParam deviceHistoryParam) { if (deviceHistoryParam.getDeviceId() == null || StringUtils.isEmpty(deviceHistoryParam.getSerialNumber())) { @@ -217,14 +217,14 @@ public class DataCenterController { } @ApiOperation("网关设备仅计算物模型列表(历史记录-网关计算量 变量下拉用)") - @PreAuthorize("@ss.hasPermi('dataCenter:history:list')") + @PreAuthorize("@ss.hasAnyPermi('dataCenter:history:list,iot:device:list')") @GetMapping("/gatewayCalculatedModels") public AjaxResult listGatewayCalculatedModels(@RequestParam Long deviceId) { return AjaxResult.success(dataCenterService.listGatewayCalculatedModels(deviceId)); } @ApiOperation("多设备对比历史(支持多变量,按分钟对齐,缺数沿用上一分钟)") - @PreAuthorize("@ss.hasPermi('dataCenter:history:list')") + @PreAuthorize("@ss.hasAnyPermi('dataCenter:history:list,iot:device:list')") @PostMapping("/subDeviceComparativeHistory") public AjaxResult subDeviceComparativeHistory(@RequestBody SubDeviceCompareParam param) { boolean hasIdentifier = (param.getIdentifierList() != null && !param.getIdentifierList().isEmpty()) @@ -292,7 +292,7 @@ public class DataCenterController { } @ApiOperation("查询场景变量历史数据") - @PreAuthorize("@ss.hasPermi('dataCenter:history:list')") + @PreAuthorize("@ss.hasAnyPermi('dataCenter:history:list,iot:device:list,scene:model:list')") @GetMapping("/sceneHistory") public AjaxResult sceneHistory(SceneHistoryParam sceneHistoryParam) { if (StringUtils.isNotEmpty(sceneHistoryParam.getSerialNumber())) { diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/device/DeviceController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/device/DeviceController.java index 00b35c94..07f0f26f 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/device/DeviceController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/device/DeviceController.java @@ -107,7 +107,7 @@ public class DeviceController extends BaseController { /** * 查询设备简短列表,主页列表数据 */ - @PreAuthorize("@ss.hasPermi('iot:device:list')") + @PreAuthorize("@ss.hasAnyPermi('iot:device:list,iot:scene:list,dataCenter:history:list,dataCenter:analysis:list,dataCenter:repair:list')") @GetMapping("/shortList") @ApiOperation("设备分页简短列表") public TableDataInfo shortList(Device device) { @@ -382,6 +382,23 @@ public class DeviceController extends BaseController { return deviceService.assignment(deptId, deviceIds); } + /** + * 超级管理员将设备分配给指定用户 + */ + @PreAuthorize("@ss.hasPermi('iot:device:assignment')") + @ApiOperation("超级管理员分配设备给指定用户") + @PostMapping("/assignUser") + public AjaxResult assignUser(@RequestParam("deviceId") Long deviceId, + @RequestParam("userId") Long userId) { + if (null == deviceId) { + return error(MessageUtils.message("device.id.null")); + } + if (null == userId) { + return error(MessageUtils.message("device.user.id.null")); + } + return deviceService.assignUser(deviceId, userId); + } + /** * 回收设备 * @@ -424,7 +441,7 @@ public class DeviceController extends BaseController { /** * 查询变量概况 */ - @PreAuthorize("@ss.hasPermi('iot:device:query')") + @PreAuthorize("@ss.hasAnyPermi('iot:device:query,iot:device:list,dataCenter:history:list,dataCenter:analysis:list,dataCenter:repair:list')") @GetMapping("/listThingsModel") @ApiOperation("查询变量概况") public TableDataInfo listThingsModel(Integer pageNum, Integer pageSize, Long deviceId, String modelName, Integer type) { diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/deviceConfig/GroupController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/deviceConfig/GroupController.java index a7b1f06e..7876e011 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/deviceConfig/GroupController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/deviceConfig/GroupController.java @@ -34,7 +34,7 @@ public class GroupController extends BaseController { /** * 查询设备分组列表 */ - @PreAuthorize("@ss.hasAnyPermi('iot:group:list,iot:device:list')") + @PreAuthorize("@ss.hasAnyPermi('iot:group:list,iot:device:list,dataCenter:history:list,iot:project:list')") @GetMapping("/list") @ApiOperation("分组分页列表") public TableDataInfo list(Group group) { @@ -58,7 +58,7 @@ public class GroupController extends BaseController { /** * 获取设备分组详细信息 */ - @PreAuthorize("@ss.hasPermi('iot:group:query')") + @PreAuthorize("@ss.hasAnyPermi('iot:group:query,iot:device:list,dataCenter:history:list,iot:project:list')") @GetMapping(value = "/{groupId}") @ApiOperation("获取分组详情") public AjaxResult getInfo(@PathVariable("groupId") Long groupId) { @@ -68,7 +68,7 @@ public class GroupController extends BaseController { /** * 获取分组下的所有关联设备ID数组 */ - @PreAuthorize("@ss.hasPermi('iot:group:query')") + @PreAuthorize("@ss.hasAnyPermi('iot:group:query,iot:device:list,dataCenter:history:list,iot:project:list')") @GetMapping(value = "/getDeviceIds/{groupId}") @ApiOperation("获取分组下的所有关联设备ID数组") public AjaxResult getDeviceIds(@PathVariable("groupId") Long groupId) { diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/deviceConfig/ThingsModelController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/deviceConfig/ThingsModelController.java index e9085df5..1c37fd07 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/deviceConfig/ThingsModelController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/deviceConfig/ThingsModelController.java @@ -44,7 +44,7 @@ public class ThingsModelController extends BaseController { /** * 查询物模型列表 */ - @PreAuthorize("@ss.hasPermi('iot:model:list')") + @PreAuthorize("@ss.hasAnyPermi('iot:model:list,iot:device:list')") @GetMapping("/list") @ApiOperation("产品物模型分页列表") public TableDataInfo list(ThingsModel thingsModel) { @@ -56,7 +56,7 @@ public class ThingsModelController extends BaseController { /** * 查询物模型列表 */ - @PreAuthorize("@ss.hasPermi('iot:model:list')") + @PreAuthorize("@ss.hasAnyPermi('iot:model:list,iot:device:list')") @GetMapping("/listByProductIdAndSerialNumber") @ApiOperation("产品物模型分页列表(根据产品ID和设备编号查询)") public TableDataInfo listByProductIdAndSerialNumber(@RequestParam("productId") Long productId, @@ -80,7 +80,7 @@ public class ThingsModelController extends BaseController { /** * 获取物模型详细信息 */ - @PreAuthorize("@ss.hasPermi('iot:model:query')") + @PreAuthorize("@ss.hasAnyPermi('iot:model:query,iot:device:list')") @GetMapping(value = "/{modelId}") @ApiOperation("获取产品物模型详情") public AjaxResult getInfo(@PathVariable("modelId") Long modelId) { @@ -150,7 +150,7 @@ public class ThingsModelController extends BaseController { /** * 获取缓存的JSON物模型 */ - @PreAuthorize("@ss.hasAnyPermi('iot:model:query,iot:device:list')") + @PreAuthorize("@ss.hasAnyPermi('iot:model:query,iot:device:list,iot:scene:list')") @GetMapping(value = "/cache/{productId}") @ApiOperation("获取缓存的JSON物模型") public AjaxResult getCacheThingsModelByProductId(@PathVariable("productId") Long productId) { @@ -182,7 +182,7 @@ public class ThingsModelController extends BaseController { /** * 获取modbus配置可选择物模型 */ - @PreAuthorize("@ss.hasPermi('iot:model:list')") + @PreAuthorize("@ss.hasAnyPermi('iot:model:list,iot:device:list')") @GetMapping("/listModbus") @ApiOperation("获取modbus配置可选择物模型") public TableDataInfo listModbus(Long productId) { @@ -195,7 +195,7 @@ public class ThingsModelController extends BaseController { /** * 根据设备获取可读写物模型 */ - @PreAuthorize("@ss.hasPermi('iot:model:list')") + @PreAuthorize("@ss.hasAnyPermi('iot:model:list,iot:device:list')") @GetMapping("/write") @ApiOperation("根据设备获取可读写物模型") public TableDataInfo write(Long deviceId) { diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/deviceLog/EventLogController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/deviceLog/EventLogController.java index f85836a3..2575993d 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/deviceLog/EventLogController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/deviceLog/EventLogController.java @@ -34,7 +34,7 @@ public class EventLogController extends BaseController { * 查询事件日志列表 */ @ApiOperation("查询事件日志列表") - @PreAuthorize("@ss.hasPermi('iot:event:list')") + @PreAuthorize("@ss.hasAnyPermi('iot:event:list,iot:device:list')") @GetMapping("/list") public TableDataInfo list(EventLog eventLog) { startPage(); @@ -59,7 +59,7 @@ public class EventLogController extends BaseController { * 获取事件日志详细信息 */ @ApiOperation("获取事件日志详细信息") - @PreAuthorize("@ss.hasPermi('iot:event:query')") + @PreAuthorize("@ss.hasAnyPermi('iot:event:query,iot:device:list')") @GetMapping(value = "/{logId}") public AjaxResult getInfo(@PathVariable("logId") Long logId) { return success(eventLogService.getById(logId)); diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/deviceLog/FunctionLogController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/deviceLog/FunctionLogController.java index d27a6187..078aee17 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/deviceLog/FunctionLogController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/deviceLog/FunctionLogController.java @@ -34,7 +34,7 @@ public class FunctionLogController extends BaseController { * 查询设备服务下发日志列表 */ @ApiOperation("查询设备服务下发日志列表") - @PreAuthorize("@ss.hasPermi('iot:log:list')") + @PreAuthorize("@ss.hasAnyPermi('iot:log:list,iot:device:list')") @GetMapping("/list") public TableDataInfo list(FunctionLog functionLog) { startPage(); @@ -59,7 +59,7 @@ public class FunctionLogController extends BaseController { * 获取设备服务下发日志详细信息 */ @ApiOperation("获取设备服务下发日志详细信息") - @PreAuthorize("@ss.hasPermi('iot:log:query')") + @PreAuthorize("@ss.hasAnyPermi('iot:log:query,iot:device:list')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return AjaxResult.success(functionLogService.selectFunctionLogById(id)); diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/gateway/SubGatewayController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/gateway/SubGatewayController.java index 3c1419fb..7499bfa8 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/gateway/SubGatewayController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/gateway/SubGatewayController.java @@ -32,7 +32,7 @@ public class SubGatewayController extends BaseController { /** * 查询网关与子设备关联列表 */ - @PreAuthorize("@ss.hasPermi('sub:gateway:list')") + @PreAuthorize("@ss.hasAnyPermi('sub:gateway:list,iot:device:list,dataCenter:history:list')") @GetMapping("/list") @ApiOperation("查询网关与子设备关联列表") public TableDataInfo list(SubGateway gateway) { @@ -44,7 +44,7 @@ public class SubGatewayController extends BaseController { /** * 获取网关与子设备关联详细信息 */ - @PreAuthorize("@ss.hasPermi('sub:gateway:query')") + @PreAuthorize("@ss.hasAnyPermi('sub:gateway:query,iot:device:list,dataCenter:history:list')") @GetMapping(value = "/{id}") @ApiOperation("获取网关与子设备关联详细信息") public AjaxResult getInfo(@PathVariable("id") Long id) { @@ -84,7 +84,7 @@ public class SubGatewayController extends BaseController { /** * 获取可选择的网关子设备列表 */ - @PreAuthorize("@ss.hasPermi('sub:gateway:query')") + @PreAuthorize("@ss.hasAnyPermi('sub:gateway:query,iot:device:list')") @GetMapping(value = "/subDevice") @ApiOperation("获取可选择的网关子设备列表") public TableDataInfo subDevice(GateSubDeviceVO subDeviceVO) { diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/platform/PlatformDeviceMappingController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/platform/PlatformDeviceMappingController.java index ed3d3b21..ed857816 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/platform/PlatformDeviceMappingController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/platform/PlatformDeviceMappingController.java @@ -33,7 +33,7 @@ public class PlatformDeviceMappingController extends BaseController { return getDataTable(mappingService.selectList(query)); } - @PreAuthorize("@ss.hasPermi('platform:deviceMapping:query')") + @PreAuthorize("@ss.hasAnyPermi('platform:deviceMapping:query,platform:deviceMapping:list')") @GetMapping("/{id}") @ApiOperation("获取设备绑定详情") public AjaxResult getInfo(@PathVariable Long id) { @@ -75,7 +75,7 @@ public class PlatformDeviceMappingController extends BaseController { // ==================== 子映射管理 ==================== - @PreAuthorize("@ss.hasPermi('platform:deviceMapping:query')") + @PreAuthorize("@ss.hasAnyPermi('platform:deviceMapping:query,platform:deviceMapping:list')") @GetMapping("/{id}/sub-mappings") @ApiOperation("查询子设备映射列表") public AjaxResult listSubMappings(@PathVariable Long id) { diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/ruleEngine/BridgeController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/ruleEngine/BridgeController.java index c0570198..e67e2c96 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/ruleEngine/BridgeController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/ruleEngine/BridgeController.java @@ -31,7 +31,7 @@ public class BridgeController extends BaseController { /** * 查询数据桥接列表 */ - @PreAuthorize("@ss.hasPermi('iot:bridge:list')") + @PreAuthorize("@ss.hasAnyPermi('iot:bridge:list,iot:scene:list')") @GetMapping("/list") @ApiOperation("查询数据桥接列表") public TableDataInfo list(Bridge bridge) { @@ -55,7 +55,7 @@ public class BridgeController extends BaseController { /** * 获取数据桥接详细信息 */ - @PreAuthorize("@ss.hasPermi('iot:bridge:query')") + @PreAuthorize("@ss.hasAnyPermi('iot:bridge:query,iot:scene:list')") @GetMapping(value = "/{id}") @ApiOperation("获取数据桥接详细信息") public AjaxResult getInfo(@PathVariable("id") Long id) { diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/sceneModel/SceneModelController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/sceneModel/SceneModelController.java index a02c680c..dbad8001 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/sceneModel/SceneModelController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/sceneModel/SceneModelController.java @@ -33,7 +33,7 @@ public class SceneModelController extends BaseController { /** * 查询场景管理列表 */ - @PreAuthorize("@ss.hasAnyPermi('scene:model:list,iot:device:list')") + @PreAuthorize("@ss.hasAnyPermi('scene:model:list,iot:device:list,dataCenter:history:list')") @GetMapping("/list") @ApiOperation("查询场景管理列表") public TableDataInfo list(SceneModel sceneModel) { @@ -58,7 +58,7 @@ public class SceneModelController extends BaseController { /** * 获取场景管理详细信息 */ - @PreAuthorize("@ss.hasPermi('scene:model:query')") + @PreAuthorize("@ss.hasAnyPermi('scene:model:query,scene:model:list,dataCenter:history:list')") @GetMapping(value = "/{sceneModelId}") @ApiOperation("获取场景管理详细信息") public AjaxResult getInfo(@PathVariable("sceneModelId") Long sceneModelId) { diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/sceneModel/SceneModelDataController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/sceneModel/SceneModelDataController.java index 0de79b50..77a4b2f7 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/sceneModel/SceneModelDataController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/sceneModel/SceneModelDataController.java @@ -37,7 +37,7 @@ public class SceneModelDataController extends BaseController { /** * 查询所有变量列表 */ - @PreAuthorize("@ss.hasPermi('scene:modelData:list')") + @PreAuthorize("@ss.hasAnyPermi('scene:modelData:list,scene:model:list,dataCenter:history:list')") @GetMapping("/list") @ApiOperation("查询所有变量列表") public TableDataInfo list(SceneModelData sceneModelData) { @@ -55,7 +55,7 @@ public class SceneModelDataController extends BaseController { /** * 查询关联设备变量的列表 */ - @PreAuthorize("@ss.hasPermi('scene:modelDeviceData:list')") + @PreAuthorize("@ss.hasAnyPermi('scene:modelDeviceData:list,scene:model:list,dataCenter:history:list,iot:scene:list')") @GetMapping("/listByType") @ApiOperation("查询关联设备变量的列表") public TableDataExtendInfo listByType(SceneModelData sceneModelData) { @@ -82,7 +82,7 @@ public class SceneModelDataController extends BaseController { /** * 获取【请填写功能名称】详细信息 */ - @PreAuthorize("@ss.hasPermi('scene:modelData:query')") + @PreAuthorize("@ss.hasAnyPermi('scene:modelData:query,scene:model:list,dataCenter:history:list')") @GetMapping(value = "/{id}") @ApiOperation("获取场景变量详情") public AjaxResult getInfo(@PathVariable("id") Long id) { diff --git a/fastbee-plugs/fastbee-mqtt-client/src/main/java/com/fastbee/mqttclient/PubMqttCallBack.java b/fastbee-plugs/fastbee-mqtt-client/src/main/java/com/fastbee/mqttclient/PubMqttCallBack.java index 471bf528..a2a15f0c 100644 --- a/fastbee-plugs/fastbee-mqtt-client/src/main/java/com/fastbee/mqttclient/PubMqttCallBack.java +++ b/fastbee-plugs/fastbee-mqtt-client/src/main/java/com/fastbee/mqttclient/PubMqttCallBack.java @@ -96,16 +96,15 @@ public class PubMqttCallBack implements MqttCallbackExtended { @Override public void connectComplete(boolean reconnect, String serverURI) { log.info("MQTT内部客户端已经连接!"); - System.out.print("" + - " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \n" + - " * _⚲_⚲_ ______ _ ____ * \n" + - " * | / \\ | | ____| | | | _ \\ * \n" + - " * | | | ● | | | | |__ __ _ ___| |_ | |_) | ___ ___ * \n" + - " * | \\ / | | __/ _` / __| __| | _ < / _ \\/ _ \\ * \n" + - " * \\ / | | | (_| \\__ \\ |_ | |_) | __/ __/ * \n" + - " * V |_| \\__,_|___/\\__| |____/ \\___|\\___| * \n" + - " * * \n" + - " * * * * * * * * * * * * FastBee物联网平台[✔启动成功] * * * * * * * * * * * * \n"); + System.out.print( + "▌▌▌▌ ▌▌▌▌ ▌▌▌▌▌▌ ▍▌▌▌▌▍ ▌▌▌ ▌▌▌▌ ▌▌▌▌▌▍ ▌▌▌▌\n" + + " ▌▌▌▌▎▌▌▌▌ ▌▌▌ ▌▌▌ ▍▌▌▌▌▌▌▎ ▌▌▌ ▌▌▌▎▌▌ ▌▌▌▌▌▌▌ ▌▌▌▌\n" + + " ▌▌▌▌▌▌ ▌▌▌▌ ▌▌▌ ▍▌▌▌▏▌▌▌▌ ▌▌▌ ▌▌▌ ▌▌▌ ▌▌▌▌▌▌▌▌ ▌▌▌▌\n" + + " ▌▌▌▍ ▌▌▌▍▍▍▌▌▌▌ ▌▌▌▌ ▌▌▌▌▌▌▌ ▌▌▌▌▍▍▍▌▌▌ ▌▌▌▌ ▌▌▌▌▌▌▌▌\n" + + " ▌▌▌▏ ▌▌▌▌▌▌▌▌▌▌▌▌ ▌▌▌▌ ▌▌▌▌▌▌ ▌▌▌▌▌▌▌▌▌▌▌▌ ▌▌▌▌ ▌▌▌▌▌▌\n" + + " ▌▌▌▏ ▌▌▌▌ ▌▌▌▌ ▌▌▌▌ ▌▌▌▌▌ ▌▌▌▌ ▌▌▌▌ ▌▌▌▌ ▌▌▌▌▌" + ); + //连接后订阅, enable为false表示使用emq if (!enabled) { diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java index 77f7c92f..e2ea2801 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceMapper.java @@ -356,6 +356,11 @@ public interface DeviceMapper extends BaseMapperX { */ int updateTenantIdByDeptIds(@Param("tenantId") Long tenantId, @Param("tenantName") String tenantName, @Param("deviceIdList") List deviceIdList); + /** + * 更新单个设备所属用户 + */ + int updateTenantIdByDeviceId(@Param("tenantId") Long tenantId, @Param("tenantName") String tenantName, @Param("deviceId") Long deviceId); + /** * 查询终端用户设备简短列表,主页列表数据 */ diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java index c56c50c4..0100cd88 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/IDeviceService.java @@ -354,6 +354,15 @@ public interface IDeviceService { */ AjaxResult assignment(Long deptId, String deviceIds); + /** + * 超级管理员将设备分配给指定用户 + * + * @param deviceId 设备id + * @param userId 用户id + * @return com.fastbee.common.core.domain.AjaxResult + */ + AjaxResult assignUser(Long deviceId, Long userId); + /** * 回收设备 * diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java index 7f302fcd..49de5187 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java @@ -2113,6 +2113,40 @@ public class DeviceServiceImpl implements IDeviceService { return result > 0 ? AjaxResult.success("分配设备成功") : AjaxResult.error("分配设备失败"); } + @Override + public AjaxResult assignUser(Long deviceId, Long userId) { + if (!Objects.equals(SecurityUtils.getUserId(), 1L)) { + return AjaxResult.error("只有超级管理员可以分配设备"); + } + Device device = deviceMapper.selectDeviceByDeviceId(deviceId); + if (null == device) { + return AjaxResult.error("设备不存在"); + } + SysUser targetUser = userService.selectUserById(userId); + if (null == targetUser) { + return AjaxResult.error("用户不存在"); + } + int result = deviceMapper.updateTenantIdByDeviceId(targetUser.getUserId(), targetUser.getUserName(), deviceId); + if (result > 0) { + SysUser currSysUser = getLoginUser().getUser(); + DeviceRecord deviceRecord = new DeviceRecord(); + deviceRecord.setOperateDeptId(currSysUser.getDeptId()) + .setTargetDeptId(targetUser.getDeptId()) + .setDeviceId(device.getDeviceId()) + .setProductId(device.getProductId()) + .setSerialNumber(device.getSerialNumber()) + .setType(DeviceRecordTypeEnum.ASSIGNMENT_DETAIL.getType()) + .setDistributeType(DeviceDistributeTypeEnum.SELECT.getType()) + .setTenantId(device.getTenantId()) + .setTenantName(device.getTenantName()) + .setStatus(StatusEnum.SUCCESS.getStatus()) + .setCreateBy(currSysUser.getUserName()); + deviceRecordMapper.insertDeviceRecord(deviceRecord); + return AjaxResult.success("分配设备成功"); + } + return AjaxResult.error("分配设备失败"); + } + @Override public AjaxResult recovery(String deviceIds, Long recoveryDeptId) { SysUser currSysUser = getLoginUser().getUser(); diff --git a/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml b/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml index 86885e1f..2a895354 100644 --- a/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml +++ b/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceMapper.xml @@ -1033,6 +1033,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + update iot_device + set tenant_id = #{tenantId}, + tenant_name = #{tenantName}, + update_time = now() + where device_id = #{deviceId} + +