Commit edb90765 by 真的三个金的鑫

feat: 支持设备按团队与用户两级可见性分配

按当前组织过滤设备列表,超管可分配到多团队,团队管理员可再分配给用户;飞手/成员仅看分配给自己的设备。

Co-authored-by: Cursor <cursoragent@cursor.com>
parent 00e1fef8
......@@ -3,6 +3,8 @@ package com.dji.sample.manage.controller;
import com.dji.sample.manage.model.dto.*;
import com.dji.sample.manage.model.enums.OperateRecordTypeEnum;
import com.dji.sample.manage.model.param.DeviceSearchParam;
import com.dji.sample.manage.model.param.DeviceVisibilityAssignParam;
import com.dji.sample.manage.model.param.DeviceVisibilityRemoveParam;
import com.dji.sample.manage.service.IDeviceDictionaryService;
import com.dji.sample.manage.service.IOperateRecordService;
import com.dji.sample.manage.service.IDeviceService;
......@@ -381,4 +383,93 @@ public class DeviceController {
: HttpResultResponse.success(osdOpt.get());
}
/**
* 可分配设备列表(机场+无人机)。超管:全量;团队管理员:本团队已分配。
*/
@GetMapping("/{workspace_id}/visibility/assignable")
public HttpResultResponse<List<DeviceDTO>> listAssignableDevices(
@PathVariable("workspace_id") String workspaceId) {
return HttpResultResponse.success(deviceService.listAssignableDevices(workspaceId));
}
/**
* 团队及已分配设备数量(仅超管)。
*/
@GetMapping("/{workspace_id}/visibility/orgs")
public HttpResultResponse<List<DeviceVisibilityOrgDTO>> listVisibilityOrgs(
@PathVariable("workspace_id") String workspaceId) {
return HttpResultResponse.success(deviceService.listVisibilityOrgs(workspaceId));
}
/**
* 某团队已分配设备。
*/
@GetMapping("/{workspace_id}/visibility/org/{org_id}")
public HttpResultResponse<List<DeviceDTO>> listOrgVisibleDevices(
@PathVariable("workspace_id") String workspaceId,
@PathVariable("org_id") String orgId) {
return HttpResultResponse.success(deviceService.listOrgVisibleDevices(workspaceId, orgId));
}
/**
* 超管覆盖设置团队可见设备。
*/
@PutMapping("/{workspace_id}/visibility/org/{org_id}")
public HttpResultResponse assignDevicesToOrg(
@PathVariable("workspace_id") String workspaceId,
@PathVariable("org_id") String orgId,
@RequestBody DeviceVisibilityAssignParam param) {
deviceService.assignDevicesToOrg(workspaceId, orgId,
param == null ? null : param.getDeviceSnList());
return HttpResultResponse.success();
}
/**
* 从团队移除设备可见性。
*/
@PostMapping("/{workspace_id}/visibility/org/{org_id}/remove")
public HttpResultResponse removeDevicesFromOrg(
@PathVariable("workspace_id") String workspaceId,
@PathVariable("org_id") String orgId,
@RequestBody DeviceVisibilityRemoveParam param) {
deviceService.removeDevicesFromOrg(workspaceId, orgId,
param == null ? null : param.getDeviceSnList());
return HttpResultResponse.success();
}
/**
* 团队内用户及已分配设备数。
*/
@GetMapping("/{workspace_id}/visibility/org/{org_id}/users")
public HttpResultResponse<List<DeviceVisibilityUserDTO>> listVisibilityUsers(
@PathVariable("workspace_id") String workspaceId,
@PathVariable("org_id") String orgId) {
return HttpResultResponse.success(deviceService.listVisibilityUsers(workspaceId, orgId));
}
/**
* 某用户在团队下已分配的设备。
*/
@GetMapping("/{workspace_id}/visibility/org/{org_id}/user/{user_id}")
public HttpResultResponse<List<DeviceDTO>> listUserVisibleDevices(
@PathVariable("workspace_id") String workspaceId,
@PathVariable("org_id") String orgId,
@PathVariable("user_id") String userId) {
return HttpResultResponse.success(deviceService.listUserVisibleDevices(workspaceId, orgId, userId));
}
/**
* 覆盖设置用户在本团队可见的设备。
*/
@PutMapping("/{workspace_id}/visibility/org/{org_id}/user/{user_id}")
public HttpResultResponse assignDevicesToUser(
@PathVariable("workspace_id") String workspaceId,
@PathVariable("org_id") String orgId,
@PathVariable("user_id") String userId,
@RequestBody DeviceVisibilityAssignParam param) {
deviceService.assignDevicesToUser(workspaceId, orgId, userId,
param == null ? null : param.getDeviceSnList());
return HttpResultResponse.success();
}
}
\ No newline at end of file
package com.dji.sample.manage.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dji.sample.manage.model.entity.UserDeviceEntity;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface IUserDeviceMapper extends BaseMapper<UserDeviceEntity> {
}
package com.dji.sample.manage.model.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 团队设备可见性汇总
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeviceVisibilityOrgDTO implements Serializable {
@JsonProperty("org_id")
private String orgId;
@JsonProperty("org_name")
private String orgName;
@JsonProperty("device_count")
private Integer deviceCount;
}
package com.dji.sample.manage.model.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 团队内用户设备分配汇总
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeviceVisibilityUserDTO implements Serializable {
@JsonProperty("user_id")
private String userId;
private String username;
@JsonProperty("user_name")
private String userName;
@JsonProperty("role_type")
private Integer roleType;
@JsonProperty("device_count")
private Integer deviceCount;
}
package com.dji.sample.manage.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
* 团队内用户可见设备
*/
@Data
@TableName("manage_user_device")
public class UserDeviceEntity implements Serializable {
@TableId(type = IdType.AUTO)
private Integer id;
private String userId;
private Integer deviceId;
private String deviceSn;
private String orgId;
private String workspaceId;
private Long createTime;
private Long updateTime;
private String creatorId;
private String creatorName;
private String updaterId;
private String updaterName;
}
package com.dji.sample.manage.model.param;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 覆盖分配团队可见设备
*/
@Data
public class DeviceVisibilityAssignParam {
@JsonProperty("device_sn_list")
private List<String> deviceSnList = new ArrayList<>();
}
package com.dji.sample.manage.model.param;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 从团队移除设备可见性
*/
@Data
public class DeviceVisibilityRemoveParam {
@JsonProperty("device_sn_list")
private List<String> deviceSnList = new ArrayList<>();
}
......@@ -2,10 +2,7 @@ package com.dji.sample.manage.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dji.sample.component.websocket.model.BizCodeEnum;
import com.dji.sample.manage.model.dto.DeviceDTO;
import com.dji.sample.manage.model.dto.DeviceDetailCountDTO;
import com.dji.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
import com.dji.sample.manage.model.dto.TopologyDeviceDTO;
import com.dji.sample.manage.model.dto.*;
import com.dji.sample.manage.model.entity.DeviceEntity;
import com.dji.sample.manage.model.param.DeviceQueryParam;
import com.dji.sample.manage.model.param.DeviceSearchParam;
......@@ -13,9 +10,9 @@ import com.dji.sdk.cloudapi.device.ControlSourceEnum;
import com.dji.sdk.cloudapi.device.DeviceOsdHost;
import com.dji.sdk.cloudapi.device.DockModeCodeEnum;
import com.dji.sdk.cloudapi.device.DroneModeCodeEnum;
import com.dji.sdk.config.version.GatewayManager;
import com.dji.sdk.common.HttpResultResponse;
import com.dji.sdk.common.PaginationData;
import com.dji.sdk.config.version.GatewayManager;
import com.fasterxml.jackson.databind.JsonNode;
import java.util.List;
......@@ -280,6 +277,46 @@ public interface IDeviceService extends IService<DeviceEntity> {
void cancelShareDevice(DeviceDTO device);
/**
* 可分配设备列表:超管看 workspace 全量机场/无人机;团队管理员仅看本团队已分配设备。
*/
List<DeviceDTO> listAssignableDevices(String workspaceId);
/**
* 团队列表及已分配设备数量(仅超管)。
*/
List<DeviceVisibilityOrgDTO> listVisibilityOrgs(String workspaceId);
/**
* 查询某团队已分配的设备。
*/
List<DeviceDTO> listOrgVisibleDevices(String workspaceId, String orgId);
/**
* 超管覆盖设置某团队可见设备集合。
*/
void assignDevicesToOrg(String workspaceId, String orgId, List<String> deviceSnList);
/**
* 从团队移除设备可见性(超管或本团队管理员)。
*/
void removeDevicesFromOrg(String workspaceId, String orgId, List<String> deviceSnList);
/**
* 团队内用户及已分配设备数(团队管理员+)。
*/
List<DeviceVisibilityUserDTO> listVisibilityUsers(String workspaceId, String orgId);
/**
* 某用户在某团队下已分配的设备。
*/
List<DeviceDTO> listUserVisibleDevices(String workspaceId, String orgId, String userId);
/**
* 团队管理员覆盖设置某用户在本团队可见的设备(须为本团队已有设备子集)。
*/
void assignDevicesToUser(String workspaceId, String orgId, String userId, List<String> deviceSnList);
/**
* Get the devices list in one workspace.
* @param workspaceId
* @param page
......
package com.dji.sample.manage.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dji.sample.manage.model.entity.UserDeviceEntity;
public interface IUserDeviceService extends IService<UserDeviceEntity> {
}
package com.dji.sample.manage.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dji.sample.manage.dao.IUserDeviceMapper;
import com.dji.sample.manage.model.entity.UserDeviceEntity;
import com.dji.sample.manage.service.IUserDeviceService;
import org.springframework.stereotype.Service;
@Service
public class UserDeviceServiceImpl extends ServiceImpl<IUserDeviceMapper, UserDeviceEntity> implements IUserDeviceService {
}
-- 团队内用户-设备可见性(同一设备可分给多用户)
CREATE TABLE IF NOT EXISTS `manage_user_device` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` varchar(64) NOT NULL,
`device_id` int DEFAULT NULL,
`device_sn` varchar(64) NOT NULL,
`org_id` varchar(64) NOT NULL,
`workspace_id` varchar(64) NOT NULL,
`create_time` bigint DEFAULT NULL,
`update_time` bigint DEFAULT NULL,
`creator_id` varchar(64) DEFAULT NULL,
`creator_name` varchar(64) DEFAULT NULL,
`updater_id` varchar(64) DEFAULT NULL,
`updater_name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_org_device` (`user_id`, `org_id`, `device_sn`),
KEY `idx_org_user` (`org_id`, `user_id`),
KEY `idx_device_sn` (`device_sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='团队内用户设备可见性';
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment