Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
GeoFlyApi
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
GeoFly
GeoFlyApi
Commits
d0878a67
Commit
d0878a67
authored
Jul 19, 2025
by
gdj
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加org
parent
fa930cc6
Hide whitespace changes
Inline
Side-by-side
Showing
52 changed files
with
2193 additions
and
57 deletions
+2193
-57
sample/src/main/java/com/dji/sample/common/model/CustomClaim.java
+2
-0
sample/src/main/java/com/dji/sample/common/util/SecurityUtils.java
+29
-16
sample/src/main/java/com/dji/sample/manage/controller/DeviceController.java
+24
-0
sample/src/main/java/com/dji/sample/manage/controller/LoginController.java
+17
-5
sample/src/main/java/com/dji/sample/manage/controller/OrgController.java
+122
-0
sample/src/main/java/com/dji/sample/manage/controller/UserController.java
+5
-2
sample/src/main/java/com/dji/sample/manage/controller/UserOrgController.java
+51
-0
sample/src/main/java/com/dji/sample/manage/dao/IDeviceOrgMapper.java
+9
-0
sample/src/main/java/com/dji/sample/manage/dao/IFleetOrgMapper.java
+13
-0
sample/src/main/java/com/dji/sample/manage/dao/IOrgMapper.java
+12
-0
sample/src/main/java/com/dji/sample/manage/dao/IUserOrgMapper.java
+24
-0
sample/src/main/java/com/dji/sample/manage/model/dto/DeviceDTO.java
+11
-0
sample/src/main/java/com/dji/sample/manage/model/dto/DeviceOrgDTO.java
+37
-0
sample/src/main/java/com/dji/sample/manage/model/dto/FleetDTO.java
+2
-0
sample/src/main/java/com/dji/sample/manage/model/dto/FleetOrgDTO.java
+37
-0
sample/src/main/java/com/dji/sample/manage/model/dto/OrgDTO.java
+39
-0
sample/src/main/java/com/dji/sample/manage/model/dto/OrgJoinDTO.java
+34
-0
sample/src/main/java/com/dji/sample/manage/model/dto/UserDTO.java
+3
-0
sample/src/main/java/com/dji/sample/manage/model/dto/UserLoginDTO.java
+5
-0
sample/src/main/java/com/dji/sample/manage/model/dto/UserOrgDTO.java
+17
-0
sample/src/main/java/com/dji/sample/manage/model/entity/DeviceEntity.java
+4
-0
sample/src/main/java/com/dji/sample/manage/model/entity/DeviceOrgEntity.java
+39
-0
sample/src/main/java/com/dji/sample/manage/model/entity/FleetEntity.java
+3
-0
sample/src/main/java/com/dji/sample/manage/model/entity/FleetOrgEntity.java
+39
-0
sample/src/main/java/com/dji/sample/manage/model/entity/OrgEntity.java
+46
-0
sample/src/main/java/com/dji/sample/manage/model/entity/UserOrgEntity.java
+43
-0
sample/src/main/java/com/dji/sample/manage/model/enums/RoleTypeEnum.java
+3
-3
sample/src/main/java/com/dji/sample/manage/model/param/DeviceSearchParam.java
+3
-0
sample/src/main/java/com/dji/sample/manage/model/param/searchParam/OrgSearchParam.java
+25
-0
sample/src/main/java/com/dji/sample/manage/model/param/searchParam/UserSearchParam.java
+16
-0
sample/src/main/java/com/dji/sample/manage/service/IDeviceOrgService.java
+11
-0
sample/src/main/java/com/dji/sample/manage/service/IDeviceService.java
+4
-0
sample/src/main/java/com/dji/sample/manage/service/IFleetOrgService.java
+10
-0
sample/src/main/java/com/dji/sample/manage/service/IOrgService.java
+81
-0
sample/src/main/java/com/dji/sample/manage/service/IUserOrgService.java
+68
-0
sample/src/main/java/com/dji/sample/manage/service/IUserService.java
+25
-0
sample/src/main/java/com/dji/sample/manage/service/impl/DeviceOrgServiceImpl.java
+14
-0
sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
+227
-0
sample/src/main/java/com/dji/sample/manage/service/impl/FleetOrgServiceImpl.java
+14
-0
sample/src/main/java/com/dji/sample/manage/service/impl/FleetServiceImpl.java
+14
-1
sample/src/main/java/com/dji/sample/manage/service/impl/OrgServiceImpl.java
+468
-0
sample/src/main/java/com/dji/sample/manage/service/impl/UserOrgServiceImpl.java
+144
-0
sample/src/main/java/com/dji/sample/manage/service/impl/UserServiceImpl.java
+286
-5
sample/src/main/java/com/dji/sample/wayline/model/dto/WaylineFileDTO.java
+2
-0
sample/src/main/java/com/dji/sample/wayline/model/dto/WaylineFileTreeVO.java
+2
-0
sample/src/main/java/com/dji/sample/wayline/model/dto/WaylineJobDTO.java
+2
-0
sample/src/main/java/com/dji/sample/wayline/model/entity/WaylineFileEntity.java
+4
-0
sample/src/main/java/com/dji/sample/wayline/model/entity/WaylineJobEntity.java
+6
-0
sample/src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java
+3
-0
sample/src/main/java/com/dji/sample/wayline/model/param/WaylineJobSearchParam.java
+3
-0
sample/src/main/java/com/dji/sample/wayline/service/impl/WaylineFileServiceImpl.java
+57
-23
sample/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
+34
-2
No files found.
sample/src/main/java/com/dji/sample/common/model/CustomClaim.java
View file @
d0878a67
...
...
@@ -39,6 +39,8 @@ public class CustomClaim {
@JsonAlias
(
"workspace_id"
)
private
String
workspaceId
;
@JsonAlias
(
"org_id"
)
private
String
orgId
;
/**
* Convert the custom claim data type to the Map type.
* @return map
...
...
sample/src/main/java/com/dji/sample/common/util/SecurityUtils.java
View file @
d0878a67
...
...
@@ -85,6 +85,13 @@ public class SecurityUtils {
return
customClaim
.
getWorkspaceId
();
}
public
static
String
getOrgId
()
{
DecodedJWT
jwt
=
JwtUtil
.
verifyToken
(
getToken
());
CustomClaim
customClaim
=
new
CustomClaim
(
jwt
.
getClaims
());
return
customClaim
.
getOrgId
();
}
public
static
String
getUserId
()
{
DecodedJWT
jwt
=
JwtUtil
.
verifyToken
(
getToken
());
CustomClaim
customClaim
=
new
CustomClaim
(
jwt
.
getClaims
());
...
...
@@ -92,6 +99,12 @@ public class SecurityUtils {
return
customClaim
.
getId
();
}
public
static
String
getUsername
()
{
DecodedJWT
jwt
=
JwtUtil
.
verifyToken
(
getToken
());
CustomClaim
customClaim
=
new
CustomClaim
(
jwt
.
getClaims
());
return
customClaim
.
getUsername
();
}
public
static
boolean
isSysAdminRole
()
{
Integer
roleType
=
getRoleType
();
...
...
@@ -119,21 +132,21 @@ public class SecurityUtils {
return
!
isAdminRole
();
}
public
static
boolean
is
Project
AdminRole
(
Integer
roleType
)
{
return
roleType
==
RoleTypeEnum
.
PROJECT
_ADMIN
.
getVal
();
public
static
boolean
is
Org
AdminRole
(
Integer
roleType
)
{
return
roleType
==
RoleTypeEnum
.
ORG
_ADMIN
.
getVal
();
}
public
static
boolean
isNot
Project
AdminRole
(
Integer
roleType
)
{
return
!
is
Project
AdminRole
(
roleType
);
public
static
boolean
isNot
Org
AdminRole
(
Integer
roleType
)
{
return
!
is
Org
AdminRole
(
roleType
);
}
public
static
boolean
is
Project
AdminRole
()
{
public
static
boolean
is
Org
AdminRole
()
{
Integer
roleType
=
getRoleType
();
return
is
Project
AdminRole
(
roleType
);
return
is
Org
AdminRole
(
roleType
);
}
public
static
boolean
isNot
Project
AdminRole
()
{
return
!
is
Project
AdminRole
();
public
static
boolean
isNot
Org
AdminRole
()
{
return
!
is
Org
AdminRole
();
}
public
static
boolean
isAdminRole
(
Integer
roleType
)
{
...
...
@@ -189,7 +202,7 @@ public class SecurityUtils {
return
aboveMemberRole
(
roleType
);
}
public
static
boolean
aboveMemberRole
(
Integer
roleType
)
{
int
[]
roleArr
=
{
RoleTypeEnum
.
MEMBER
.
getVal
(),
RoleTypeEnum
.
PILOT
.
getVal
(),
RoleTypeEnum
.
ADMIN
.
getVal
(),
RoleTypeEnum
.
PROJECT
_ADMIN
.
getVal
(),
RoleTypeEnum
.
SYS_ADMIN
.
getVal
()};
int
[]
roleArr
=
{
RoleTypeEnum
.
MEMBER
.
getVal
(),
RoleTypeEnum
.
PILOT
.
getVal
(),
RoleTypeEnum
.
ADMIN
.
getVal
(),
RoleTypeEnum
.
ORG
_ADMIN
.
getVal
(),
RoleTypeEnum
.
SYS_ADMIN
.
getVal
()};
for
(
int
role
:
roleArr
){
if
(
roleType
==
role
)
{
...
...
@@ -213,7 +226,7 @@ public class SecurityUtils {
}
public
static
boolean
abovePilotRole
(
Integer
roleType
)
{
int
[]
roleArr
=
{
RoleTypeEnum
.
PILOT
.
getVal
(),
RoleTypeEnum
.
ADMIN
.
getVal
(),
RoleTypeEnum
.
PROJECT
_ADMIN
.
getVal
(),
RoleTypeEnum
.
SYS_ADMIN
.
getVal
()};
int
[]
roleArr
=
{
RoleTypeEnum
.
PILOT
.
getVal
(),
RoleTypeEnum
.
ADMIN
.
getVal
(),
RoleTypeEnum
.
ORG
_ADMIN
.
getVal
(),
RoleTypeEnum
.
SYS_ADMIN
.
getVal
()};
for
(
int
role
:
roleArr
){
if
(
roleType
==
role
)
{
...
...
@@ -237,7 +250,7 @@ public class SecurityUtils {
}
public
static
boolean
aboveAdminRole
(
Integer
roleType
)
{
int
[]
roleArr
=
{
RoleTypeEnum
.
ADMIN
.
getVal
(),
RoleTypeEnum
.
PROJECT
_ADMIN
.
getVal
(),
RoleTypeEnum
.
SYS_ADMIN
.
getVal
()};
int
[]
roleArr
=
{
RoleTypeEnum
.
ADMIN
.
getVal
(),
RoleTypeEnum
.
ORG
_ADMIN
.
getVal
(),
RoleTypeEnum
.
SYS_ADMIN
.
getVal
()};
for
(
int
role
:
roleArr
){
if
(
roleType
==
role
)
{
...
...
@@ -247,21 +260,21 @@ public class SecurityUtils {
return
false
;
}
public
static
boolean
above
Project
AdminRoleAndThrowError
()
{
boolean
result
=
above
Project
AdminRole
();
public
static
boolean
above
Org
AdminRoleAndThrowError
()
{
boolean
result
=
above
Org
AdminRole
();
if
(!
result
)
{
throw
new
RuntimeException
(
"The current role has no permissions"
);
}
return
true
;
}
public
static
boolean
above
Project
AdminRole
()
{
public
static
boolean
above
Org
AdminRole
()
{
Integer
roleType
=
getRoleType
();
return
aboveSysAdminRole
(
roleType
);
}
public
static
boolean
above
Project
AdminRole
(
Integer
roleType
)
{
int
[]
roleArr
=
{
RoleTypeEnum
.
PROJECT
_ADMIN
.
getVal
(),
RoleTypeEnum
.
SYS_ADMIN
.
getVal
()};
public
static
boolean
above
Org
AdminRole
(
Integer
roleType
)
{
int
[]
roleArr
=
{
RoleTypeEnum
.
ORG
_ADMIN
.
getVal
(),
RoleTypeEnum
.
SYS_ADMIN
.
getVal
()};
for
(
int
role
:
roleArr
)
{
if
(
roleType
==
role
)
{
...
...
sample/src/main/java/com/dji/sample/manage/controller/DeviceController.java
View file @
d0878a67
...
...
@@ -270,4 +270,27 @@ public class DeviceController {
return
HttpResultResponse
.
success
(
devices
);
}
/**
* share device to the org
* @param device
* @return
*/
@PostMapping
(
"/{workspace_id}/share"
)
public
HttpResultResponse
shareDevice
(
@RequestBody
DeviceDTO
device
,
@PathVariable
(
"workspace_id"
)
String
workspaceId
)
{
device
.
setWorkspaceId
(
workspaceId
);
deviceService
.
shareDevice
(
device
);
return
HttpResultResponse
.
success
();
}
/**
* cancel share device to the org
* @param device
* @return
*/
@PostMapping
(
"/{workspace_id}/cancelShare"
)
public
HttpResultResponse
cancelShareDevice
(
@RequestBody
DeviceDTO
device
,
@PathVariable
(
"workspace_id"
)
String
workspaceId
)
{
device
.
setWorkspaceId
(
workspaceId
);
deviceService
.
cancelShareDevice
(
device
);
return
HttpResultResponse
.
success
();
}
}
\ No newline at end of file
sample/src/main/java/com/dji/sample/manage/controller/LoginController.java
View file @
d0878a67
...
...
@@ -7,10 +7,7 @@ import com.dji.sample.manage.service.IUserService;
import
com.dji.sdk.common.HttpResultResponse
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
...
...
@@ -30,7 +27,8 @@ public class LoginController {
String
username
=
loginDTO
.
getUsername
();
String
password
=
loginDTO
.
getPassword
();
return
userService
.
userLogin
(
username
,
password
,
loginDTO
.
getFlag
());
// return userService.userLogin(username, password, loginDTO.getFlag());
return
userService
.
userLogin
(
loginDTO
);
}
@PostMapping
(
"/token/refresh"
)
...
...
@@ -45,4 +43,18 @@ public class LoginController {
return
HttpResultResponse
.
success
(
user
.
get
());
}
@PostMapping
(
"/token/changeOrg"
)
public
HttpResultResponse
changeOrg
(
HttpServletRequest
request
,
HttpServletResponse
response
,
@RequestParam
(
name
=
"org_id"
)
String
orgId
)
{
String
token
=
request
.
getHeader
(
PARAM_TOKEN
);
Optional
<
UserDTO
>
user
=
userService
.
changeOrgRefreshToken
(
token
,
orgId
);
if
(
user
.
isEmpty
())
{
response
.
setStatus
(
HttpStatus
.
UNAUTHORIZED
.
value
());
return
HttpResultResponse
.
error
(
CommonErrorEnum
.
NO_TOKEN
.
getMessage
());
}
return
HttpResultResponse
.
success
(
user
.
get
());
}
}
sample/src/main/java/com/dji/sample/manage/controller/OrgController.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
controller
;
import
com.dji.sample.common.model.CustomClaim
;
import
com.dji.sample.manage.model.dto.OrgDTO
;
import
com.dji.sample.manage.model.dto.OrgJoinDTO
;
import
com.dji.sample.manage.model.dto.WorkspaceDTO
;
import
com.dji.sample.manage.model.param.searchParam.OrgSearchParam
;
import
com.dji.sample.manage.model.param.searchParam.WorkspaceSearchParam
;
import
com.dji.sample.manage.service.IOrgService
;
import
com.dji.sample.manage.service.IWorkspaceService
;
import
com.dji.sdk.common.HttpResultResponse
;
import
com.dji.sdk.common.PaginationData
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Optional
;
import
static
com
.
dji
.
sample
.
common
.
util
.
SecurityUtils
.*;
import
static
com
.
dji
.
sample
.
component
.
AuthInterceptor
.
TOKEN_CLAIM
;
@RestController
@RequestMapping
(
"${url.manage.prefix}${url.manage.version}/orgs"
)
public
class
OrgController
{
@Autowired
private
IOrgService
orgService
;
/**
* Gets information about the workspace that the current user is in.
* @param request
* @return
*/
@GetMapping
(
"/current"
)
public
HttpResultResponse
getCurrentOrg
(
HttpServletRequest
request
)
{
CustomClaim
customClaim
=
(
CustomClaim
)
request
.
getAttribute
(
TOKEN_CLAIM
);
Optional
<
OrgDTO
>
orgOpt
=
orgService
.
getOrgByOrgId
(
customClaim
.
getOrgId
());
return
orgOpt
.
isEmpty
()
?
HttpResultResponse
.
error
()
:
HttpResultResponse
.
success
(
orgOpt
.
get
());
}
@GetMapping
(
"/getOne"
)
public
HttpResultResponse
getWorkspace
(
OrgSearchParam
param
)
{
param
.
setWorkspaceId
(
getWorkspaceId
());
// 判断权限 系统管理员才允许全查
if
(!
aboveSysAdminRole
())
{
param
.
setRoleUserId
(
getUserId
());
}
OrgDTO
org
=
orgService
.
getOrg
(
param
);
return
HttpResultResponse
.
success
(
org
);
}
@GetMapping
(
"/page"
)
public
HttpResultResponse
getOrgPage
(
OrgSearchParam
param
,
@RequestParam
(
defaultValue
=
"1"
)
Long
page
,
@RequestParam
(
value
=
"page_size"
,
defaultValue
=
"50"
)
Long
pageSize
)
{
// 判断权限 系统管理员才允许全查
if
(!
aboveSysAdminRole
())
{
param
.
setOrgId
(
getOrgId
());
}
PaginationData
<
OrgDTO
>
workspacePage
=
orgService
.
getOrgPage
(
param
,
page
,
pageSize
);
return
HttpResultResponse
.
success
(
workspacePage
);
}
@PostMapping
(
"/add"
)
public
HttpResultResponse
addOrg
(
@RequestBody
OrgDTO
orgDTO
)
{
// 判断权限 系统管理员才允许新增
aboveSysAdminRoleAndThrowError
();
orgDTO
.
setWorkspaceId
(
getWorkspaceId
());
OrgDTO
org
=
orgService
.
addOrg
(
orgDTO
);
return
HttpResultResponse
.
success
(
org
);
}
@PostMapping
(
"/edit"
)
public
HttpResultResponse
editOrg
(
@RequestBody
OrgDTO
orgDTO
)
{
// 判断权限 管理员才允许修改
aboveAdminRoleAndThrowError
();
orgDTO
.
setWorkspaceId
(
getWorkspaceId
());
boolean
isEdit
=
orgService
.
editOrg
(
orgDTO
);
return
isEdit
?
HttpResultResponse
.
success
()
:
HttpResultResponse
.
error
();
}
@PostMapping
(
"/delete"
)
public
HttpResultResponse
delWorkspace
(
@RequestBody
OrgDTO
orgDTO
)
{
// 判断权限 系统管理员才允许修改
aboveSysAdminRoleAndThrowError
();
boolean
isDel
=
orgService
.
delOrg
(
orgDTO
);
return
isDel
?
HttpResultResponse
.
success
()
:
HttpResultResponse
.
error
();
}
@PostMapping
(
"/apply"
)
public
HttpResultResponse
applyOrg
(
@RequestBody
OrgJoinDTO
orgDTO
)
{
boolean
isDel
=
orgService
.
applyOrg
(
orgDTO
);
return
isDel
?
HttpResultResponse
.
success
()
:
HttpResultResponse
.
error
();
}
@PostMapping
(
"/joinByAdmin"
)
public
HttpResultResponse
joinOrgByAdmin
(
@RequestBody
OrgJoinDTO
orgDTO
)
{
boolean
isDel
=
orgService
.
joinOrgByAdmin
(
orgDTO
);
return
isDel
?
HttpResultResponse
.
success
()
:
HttpResultResponse
.
error
();
}
}
\ No newline at end of file
sample/src/main/java/com/dji/sample/manage/controller/UserController.java
View file @
d0878a67
...
...
@@ -3,6 +3,7 @@ package com.dji.sample.manage.controller;
import
com.dji.sample.common.model.CustomClaim
;
import
com.dji.sample.manage.model.dto.UserListDTO
;
import
com.dji.sample.manage.model.entity.UserEntity
;
import
com.dji.sample.manage.model.param.searchParam.UserSearchParam
;
import
com.dji.sample.manage.service.IUserService
;
import
com.dji.sdk.common.HttpResultResponse
;
import
com.dji.sdk.common.PaginationData
;
...
...
@@ -34,16 +35,18 @@ public class UserController {
/**
* Paging to query all users in a workspace.
* @param param param
* @param page current page
* @param pageSize
* @param workspaceId
* @return
*/
@GetMapping
(
"/{workspace_id}/users"
)
public
HttpResultResponse
<
PaginationData
<
UserListDTO
>>
getUsers
(
@RequestParam
(
defaultValue
=
"1"
)
Long
page
,
public
HttpResultResponse
<
PaginationData
<
UserListDTO
>>
getUsers
(
UserSearchParam
param
,
@RequestParam
(
defaultValue
=
"1"
)
Long
page
,
@RequestParam
(
value
=
"page_size"
,
defaultValue
=
"50"
)
Long
pageSize
,
@PathVariable
(
"workspace_id"
)
String
workspaceId
)
{
PaginationData
<
UserListDTO
>
paginationData
=
userService
.
getUsers
ByWorkspaceId
(
page
,
pageSize
,
workspaceId
);
PaginationData
<
UserListDTO
>
paginationData
=
userService
.
getUsers
(
param
,
workspaceId
,
page
,
pageSize
);
return
HttpResultResponse
.
success
(
paginationData
);
}
...
...
sample/src/main/java/com/dji/sample/manage/controller/UserOrgController.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
controller
;
import
com.dji.sample.common.model.CustomClaim
;
import
com.dji.sample.manage.model.dto.OrgDTO
;
import
com.dji.sample.manage.model.dto.UserOrgDTO
;
import
com.dji.sample.manage.model.param.searchParam.OrgSearchParam
;
import
com.dji.sample.manage.service.IOrgService
;
import
com.dji.sample.manage.service.IUserOrgService
;
import
com.dji.sdk.common.HttpResultResponse
;
import
com.dji.sdk.common.PaginationData
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Optional
;
import
static
com
.
dji
.
sample
.
common
.
util
.
SecurityUtils
.*;
import
static
com
.
dji
.
sample
.
component
.
AuthInterceptor
.
TOKEN_CLAIM
;
@RestController
@RequestMapping
(
"${url.manage.prefix}${url.manage.version}/orgUser"
)
public
class
UserOrgController
{
@Autowired
private
IUserOrgService
userOrgService
;
@PostMapping
(
"/addUserToOrg"
)
public
HttpResultResponse
addUserToOrg
(
@RequestBody
UserOrgDTO
userOrgDTO
)
{
// 判断权限 管理员才允许新增
aboveAdminRoleAndThrowError
();
boolean
isAdd
=
userOrgService
.
addUserToOrg
(
userOrgDTO
.
getUserId
(),
userOrgDTO
.
getOrgId
(),
userOrgDTO
.
getRoleType
());
return
isAdd
?
HttpResultResponse
.
success
()
:
HttpResultResponse
.
error
();
}
@PostMapping
(
"/removeUserFromOrg"
)
public
HttpResultResponse
removeUserFromOrg
(
@RequestBody
UserOrgDTO
userOrgDTO
)
{
// 判断权限 管理员才允许删除
aboveAdminRoleAndThrowError
();
boolean
isDel
=
userOrgService
.
removeUserFromOrg
(
userOrgDTO
.
getUserId
(),
userOrgDTO
.
getOrgId
());
return
isDel
?
HttpResultResponse
.
success
()
:
HttpResultResponse
.
error
();
}
}
\ No newline at end of file
sample/src/main/java/com/dji/sample/manage/dao/IDeviceOrgMapper.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
dao
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.dji.sample.manage.model.entity.DeviceOrgEntity
;
import
org.apache.ibatis.annotations.Mapper
;
@Mapper
public
interface
IDeviceOrgMapper
extends
BaseMapper
<
DeviceOrgEntity
>
{
}
sample/src/main/java/com/dji/sample/manage/dao/IFleetOrgMapper.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
dao
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.dji.sample.manage.model.entity.DeviceOrgEntity
;
import
com.dji.sample.manage.model.entity.FleetOrgEntity
;
import
org.apache.ibatis.annotations.Mapper
;
/**
* @author guan
*/
@Mapper
public
interface
IFleetOrgMapper
extends
BaseMapper
<
FleetOrgEntity
>
{
}
sample/src/main/java/com/dji/sample/manage/dao/IOrgMapper.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
dao
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.dji.sample.manage.model.entity.OrgEntity
;
import
org.apache.ibatis.annotations.Mapper
;
/**
* @author guan
*/
@Mapper
public
interface
IOrgMapper
extends
BaseMapper
<
OrgEntity
>
{
}
sample/src/main/java/com/dji/sample/manage/dao/IUserOrgMapper.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
dao
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.dji.sample.manage.model.dto.UserOrgDTO
;
import
com.dji.sample.manage.model.entity.UserOrgEntity
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.annotations.Select
;
import
java.util.List
;
@Mapper
public
interface
IUserOrgMapper
extends
BaseMapper
<
UserOrgEntity
>
{
/**
* 查询用户所有关联的组织信息,包含组织名称
* @param userId 用户ID
* @return 用户组织列表(包含组织名称)
*/
@Select
(
"SELECT uo.*, o.org_name FROM manage_user_org uo "
+
"LEFT JOIN manage_org o ON uo.org_id = o.org_id "
+
"WHERE uo.user_id = #{userId} AND uo.status = 1"
)
List
<
UserOrgDTO
>
selectUserOrgs
(
@Param
(
"userId"
)
String
userId
);
}
sample/src/main/java/com/dji/sample/manage/model/dto/DeviceDTO.java
View file @
d0878a67
...
...
@@ -85,4 +85,14 @@ public class DeviceDTO {
@JsonProperty
(
"device_enum"
)
private
String
deviceEnum
;
/**
* 设备归属团队
*/
private
String
orgId
;
/**
* 是否来源于其他团队的分享设备
*/
private
String
isShared
;
}
\ No newline at end of file
sample/src/main/java/com/dji/sample/manage/model/dto/DeviceOrgDTO.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
model
.
dto
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* @author guan
*/
@Data
public
class
DeviceOrgDTO
implements
Serializable
{
private
Integer
id
;
private
Integer
deviceId
;
private
String
deviceSn
;
private
String
orgId
;
private
Integer
isShared
;
private
Long
createTime
;
private
Long
updateTime
;
private
String
creatorId
;
private
String
creatorName
;
private
String
updaterId
;
private
String
updaterName
;
private
String
workspceId
;
}
sample/src/main/java/com/dji/sample/manage/model/dto/FleetDTO.java
View file @
d0878a67
...
...
@@ -40,6 +40,8 @@ public class FleetDTO implements Serializable {
private
String
nickname
;
private
String
orgId
;
@JsonProperty
(
value
=
"user_list"
)
private
List
<
FleetUserDTO
>
userList
;
...
...
sample/src/main/java/com/dji/sample/manage/model/dto/FleetOrgDTO.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
model
.
dto
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* @author guan
*/
@Data
public
class
FleetOrgDTO
implements
Serializable
{
private
Integer
id
;
private
Integer
fleetId
;
private
String
fleetSn
;
private
String
orgId
;
private
Integer
isShared
;
private
Long
createTime
;
private
Long
updateTime
;
private
String
creatorId
;
private
String
creatorName
;
private
String
updaterId
;
private
String
updaterName
;
private
String
workspceId
;
}
sample/src/main/java/com/dji/sample/manage/model/dto/OrgDTO.java
0 → 100644
View file @
d0878a67
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
;
import
java.time.LocalDateTime
;
/**
* @author guan
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public
class
OrgDTO
implements
Serializable
{
private
Integer
id
;
private
String
orgId
;
private
String
orgName
;
private
String
orgDesc
;
private
String
workspaceId
;
private
LocalDateTime
createTime
;
private
LocalDateTime
updateTime
;
private
String
bindCode
;
@JsonProperty
(
"admin_user_id"
)
private
String
adminUserId
;
@JsonProperty
(
"admin_user_name"
)
private
String
adminUserName
;
@JsonProperty
(
"admin_user_password"
)
private
String
adminUserPassword
;
}
sample/src/main/java/com/dji/sample/manage/model/dto/OrgJoinDTO.java
0 → 100644
View file @
d0878a67
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
;
import
java.time.LocalDateTime
;
/**
* @author guan
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public
class
OrgJoinDTO
implements
Serializable
{
private
String
orgId
;
private
String
orgName
;
private
String
orgDesc
;
private
String
workspaceId
;
private
String
bindCode
;
private
String
joinUserId
;
private
String
joinUserName
;
private
Integer
joinUserRoleType
;
}
sample/src/main/java/com/dji/sample/manage/model/dto/UserDTO.java
View file @
d0878a67
...
...
@@ -20,6 +20,9 @@ public class UserDTO {
@JsonProperty
(
"workspace_id"
)
private
String
workspaceId
;
@JsonProperty
(
"org_id"
)
private
String
orgId
;
@JsonProperty
(
"user_type"
)
private
Integer
userType
;
...
...
sample/src/main/java/com/dji/sample/manage/model/dto/UserLoginDTO.java
View file @
d0878a67
...
...
@@ -22,4 +22,9 @@ public class UserLoginDTO {
@NonNull
private
Integer
flag
;
private
String
orgId
;
private
String
orgName
;
}
sample/src/main/java/com/dji/sample/manage/model/dto/UserOrgDTO.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
model
.
dto
;
import
lombok.Builder
;
import
lombok.Data
;
@Data
@Builder
public
class
UserOrgDTO
{
private
Integer
id
;
private
String
userId
;
private
String
orgId
;
private
String
orgName
;
// 组织名称
private
Integer
roleType
;
private
Integer
status
;
// private String createTime;
// private String updateTime;
}
sample/src/main/java/com/dji/sample/manage/model/entity/DeviceEntity.java
View file @
d0878a67
...
...
@@ -88,4 +88,7 @@ public class DeviceEntity implements Serializable {
@TableField
(
value
=
"login_time"
)
private
Long
loginTime
;
@TableField
(
value
=
"org_id"
)
private
String
orgId
;
}
\ No newline at end of file
sample/src/main/java/com/dji/sample/manage/model/entity/DeviceOrgEntity.java
0 → 100644
View file @
d0878a67
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_device_org"
)
public
class
DeviceOrgEntity
implements
Serializable
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
Integer
deviceId
;
private
String
deviceSn
;
private
String
orgId
;
private
Integer
isShared
;
private
Long
createTime
;
private
Long
updateTime
;
private
String
creatorId
;
private
String
creatorName
;
private
String
updaterId
;
private
String
updaterName
;
private
String
workspaceId
;
}
sample/src/main/java/com/dji/sample/manage/model/entity/FleetEntity.java
View file @
d0878a67
...
...
@@ -49,4 +49,6 @@ public class FleetEntity implements Serializable {
@TableField
(
value
=
"nickname"
)
private
String
nickname
;
@TableField
(
value
=
"org_id"
)
private
String
orgId
;
}
\ No newline at end of file
sample/src/main/java/com/dji/sample/manage/model/entity/FleetOrgEntity.java
0 → 100644
View file @
d0878a67
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
(
"fleet_device_org"
)
public
class
FleetOrgEntity
implements
Serializable
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
Integer
fleetId
;
private
String
fleetSn
;
private
String
orgId
;
private
Integer
isShared
;
private
Long
createTime
;
private
Long
updateTime
;
private
String
creatorId
;
private
String
creatorName
;
private
String
updaterId
;
private
String
updaterName
;
private
String
workspaceId
;
}
sample/src/main/java/com/dji/sample/manage/model/entity/OrgEntity.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
model
.
entity
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* @author guan
*/
@Data
@TableName
(
"manage_org"
)
public
class
OrgEntity
implements
Serializable
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
String
orgId
;
private
String
orgName
;
private
String
orgDesc
;
private
String
workspaceId
;
private
Long
createTime
;
private
Long
updateTime
;
private
String
creatorId
;
private
String
creatorName
;
private
String
updaterId
;
private
String
updaterName
;
private
String
bindCode
;
@TableField
(
value
=
"admin_user_id"
)
private
String
adminUserId
;
}
sample/src/main/java/com/dji/sample/manage/model/entity/UserOrgEntity.java
0 → 100644
View file @
d0878a67
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
;
/**
* @author guan
*/
@Data
@TableName
(
"manage_user_org"
)
public
class
UserOrgEntity
implements
Serializable
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
String
userId
;
private
String
orgId
;
private
Integer
roleType
;
private
Integer
status
;
private
Long
createTime
;
private
Long
updateTime
;
private
String
creatorId
;
private
String
creatorName
;
private
String
updaterId
;
private
String
updaterName
;
private
String
workspaceId
;
}
sample/src/main/java/com/dji/sample/manage/model/enums/RoleTypeEnum.java
View file @
d0878a67
...
...
@@ -12,7 +12,7 @@ public enum RoleTypeEnum {
PILOT
(
2
,
"飞手"
),
PROJECT
_ADMIN
(
50
,
"项目管理员"
),
ORG
_ADMIN
(
50
,
"项目管理员"
),
SYS_ADMIN
(
100
,
"系统管理员"
),
...
...
@@ -39,8 +39,8 @@ public enum RoleTypeEnum {
if
(
val
==
SYS_ADMIN
.
val
)
{
return
SYS_ADMIN
;
}
if
(
val
==
PROJECT
_ADMIN
.
val
)
{
return
PROJECT
_ADMIN
;
if
(
val
==
ORG
_ADMIN
.
val
)
{
return
ORG
_ADMIN
;
}
if
(
val
==
ADMIN
.
val
)
{
return
ADMIN
;
...
...
sample/src/main/java/com/dji/sample/manage/model/param/DeviceSearchParam.java
View file @
d0878a67
...
...
@@ -27,6 +27,9 @@ public class DeviceSearchParam {
@JsonProperty
(
"workspace_id"
)
private
String
workspaceId
;
@JsonProperty
(
"org_id"
)
private
String
orgId
;
@JsonProperty
(
"device_type"
)
private
Integer
deviceType
;
...
...
sample/src/main/java/com/dji/sample/manage/model/param/searchParam/OrgSearchParam.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
model
.
param
.
searchParam
;
import
lombok.Data
;
/**
* @author guan
*/
@Data
public
class
OrgSearchParam
{
private
String
orgId
;
private
String
workspaceId
;
private
Integer
id
;
private
String
orgName
;
private
String
orgDesc
;
/**
* 只能查看自己的团队
*/
private
String
roleUserId
;
}
sample/src/main/java/com/dji/sample/manage/model/param/searchParam/UserSearchParam.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
model
.
param
.
searchParam
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
public
class
UserSearchParam
implements
Serializable
{
@JsonProperty
(
"device_sn"
)
private
String
orgId
;
private
String
workspaceId
;
}
sample/src/main/java/com/dji/sample/manage/service/IDeviceOrgService.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
service
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.dji.sample.manage.model.entity.DeviceOrgEntity
;
import
com.dji.sample.manage.model.entity.UserOrgEntity
;
/**
* @author guan
*/
public
interface
IDeviceOrgService
extends
IService
<
DeviceOrgEntity
>
{
}
sample/src/main/java/com/dji/sample/manage/service/IDeviceService.java
View file @
d0878a67
...
...
@@ -270,6 +270,10 @@ public interface IDeviceService extends IService<DeviceEntity> {
boolean
editAirport
(
DeviceDTO
airport
);
void
shareDevice
(
DeviceDTO
device
);
void
cancelShareDevice
(
DeviceDTO
device
);
/**
* Get the devices list in one workspace.
* @param workspaceId
...
...
sample/src/main/java/com/dji/sample/manage/service/IFleetOrgService.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
service
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.dji.sample.manage.model.entity.FleetOrgEntity
;
/**
* @author guan
*/
public
interface
IFleetOrgService
extends
IService
<
FleetOrgEntity
>
{
}
sample/src/main/java/com/dji/sample/manage/service/IOrgService.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
service
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.dji.sample.manage.model.dto.OrgDTO
;
import
com.dji.sample.manage.model.dto.OrgJoinDTO
;
import
com.dji.sample.manage.model.dto.WorkspaceDTO
;
import
com.dji.sample.manage.model.entity.OrgEntity
;
import
com.dji.sample.manage.model.param.searchParam.OrgSearchParam
;
import
com.dji.sample.manage.model.param.searchParam.WorkspaceSearchParam
;
import
com.dji.sdk.common.PaginationData
;
import
java.util.List
;
import
java.util.Optional
;
public
interface
IOrgService
extends
IService
<
OrgEntity
>
{
/**
* 根据组织ID获取组织信息
* @param orgId 组织ID
* @return 组织信息
*/
Optional
<
OrgDTO
>
getOrgByOrgId
(
String
orgId
);
PaginationData
<
OrgDTO
>
getOrgPage
(
OrgSearchParam
param
,
Long
page
,
Long
pageSize
);
OrgDTO
addOrg
(
OrgDTO
orgDTO
);
boolean
editOrg
(
OrgDTO
orgDTO
);
boolean
delOrg
(
OrgDTO
orgDTO
);
/**
* 用户申请加入团队
* @param orgDTO
* @return
*/
boolean
applyOrg
(
OrgJoinDTO
orgDTO
);
/**
* 管理员增加团队
* @param orgDTO
* @return
*/
boolean
joinOrgByAdmin
(
OrgJoinDTO
orgDTO
);
OrgDTO
getOrg
(
OrgSearchParam
param
);
/**
* 获取组织对应的workspaceId
* @param orgId 组织ID
* @return workspaceId
*/
String
getWorkspaceIdByOrgId
(
String
orgId
);
/**
* 获取所有组织列表
* @return 组织列表
*/
List
<
OrgDTO
>
getAllOrgs
();
/**
* 删除组织
* @param orgId 组织ID
* @return 是否删除成功
*/
boolean
deleteOrg
(
String
orgId
);
/**
* 创建组织
* @param orgDTO 组织实体
* @return 是否创建成功
*/
boolean
createOrg
(
OrgDTO
orgDTO
);
/**
* 更新组织
* @param orgDTO 组织实体
* @return 是否更新成功
*/
boolean
updateOrg
(
OrgDTO
orgDTO
);
}
sample/src/main/java/com/dji/sample/manage/service/IUserOrgService.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
service
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.dji.sample.manage.model.dto.UserOrgDTO
;
import
com.dji.sample.manage.model.entity.UserOrgEntity
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
public
interface
IUserOrgService
extends
IService
<
UserOrgEntity
>
{
/**
* 获取用户在特定组织的角色信息
* @param userId 用户ID
* @param orgId 组织ID
* @return 用户组织关联信息
*/
Optional
<
UserOrgEntity
>
getUserOrg
(
String
userId
,
String
orgId
);
/**
* 获取用户的所有组织信息
* @param userId 用户ID
* @return 用户所有组织关联信息列表
*/
List
<
UserOrgDTO
>
getUserOrgs
(
String
userId
);
/**
* 获取特定组织中所有用户ID
* @param orgId 组织ID
* @return 用户ID列表
*/
List
<
String
>
getUserIdsByOrgId
(
String
orgId
);
/**
* 获取组织中所有用户的角色映射
* @param orgId 组织ID
* @return 用户ID与角色类型的映射
*/
Map
<
String
,
Integer
>
getUserRoleMapByOrgId
(
String
orgId
);
/**
* 添加用户到组织
* @param userId 用户ID
* @param orgId 组织ID
* @param roleType 角色类型
* @return 操作是否成功
*/
boolean
addUserToOrg
(
String
userId
,
String
orgId
,
Integer
roleType
);
/**
* 从组织移除用户
* @param userId 用户ID
* @param orgId 组织ID
* @return 操作是否成功
*/
boolean
removeUserFromOrg
(
String
userId
,
String
orgId
);
/**
* 更新用户在组织的角色
* @param userId 用户ID
* @param orgId 组织ID
* @param roleType 新的角色类型
* @return 操作是否成功
*/
boolean
updateUserOrgRole
(
String
userId
,
String
orgId
,
Integer
roleType
);
}
sample/src/main/java/com/dji/sample/manage/service/IUserService.java
View file @
d0878a67
...
...
@@ -3,7 +3,9 @@ package com.dji.sample.manage.service;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.dji.sample.manage.model.dto.UserDTO
;
import
com.dji.sample.manage.model.dto.UserListDTO
;
import
com.dji.sample.manage.model.dto.UserLoginDTO
;
import
com.dji.sample.manage.model.entity.UserEntity
;
import
com.dji.sample.manage.model.param.searchParam.UserSearchParam
;
import
com.dji.sdk.common.HttpResultResponse
;
import
com.dji.sdk.common.PaginationData
;
...
...
@@ -29,6 +31,13 @@ public interface IUserService extends IService<UserEntity> {
HttpResultResponse
userLogin
(
String
username
,
String
password
,
Integer
flag
);
/**
* Verify the username and password to log in.
* @param loginDTO
* @return
*/
HttpResultResponse
userLogin
(
UserLoginDTO
loginDTO
);
/**
* Create a user object containing a new token.
* @param token
* @return
...
...
@@ -36,12 +45,26 @@ public interface IUserService extends IService<UserEntity> {
Optional
<
UserDTO
>
refreshToken
(
String
token
);
/**
* Create a user object containing a new token.
* @param token
* @return
*/
Optional
<
UserDTO
>
changeOrgRefreshToken
(
String
token
,
String
orgId
);
/**
* Query information about all users in a workspace.
* @param workspaceId uuid
* @return
*/
PaginationData
<
UserListDTO
>
getUsersByWorkspaceId
(
long
page
,
long
pageSize
,
String
workspaceId
);
/**
* Query information about all users.
* @param workspaceId uuid
* @return
*/
PaginationData
<
UserListDTO
>
getUsers
(
UserSearchParam
param
,
String
workspaceId
,
long
page
,
long
pageSize
);
Boolean
updateUser
(
String
workspaceId
,
String
userId
,
UserListDTO
user
);
Boolean
deleteUser
(
String
workspaceId
,
String
userId
);
...
...
@@ -58,4 +81,6 @@ public interface IUserService extends IService<UserEntity> {
UserEntity
addWorkspaceAdminUser
(
UserEntity
user
);
UserEntity
addOrgAdminUser
(
UserEntity
user
);
}
sample/src/main/java/com/dji/sample/manage/service/impl/DeviceOrgServiceImpl.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
service
.
impl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.dji.sample.manage.dao.IDeviceOrgMapper
;
import
com.dji.sample.manage.dao.IUserOrgMapper
;
import
com.dji.sample.manage.model.entity.DeviceOrgEntity
;
import
com.dji.sample.manage.model.entity.UserOrgEntity
;
import
com.dji.sample.manage.service.IDeviceOrgService
;
import
com.dji.sample.manage.service.IUserOrgService
;
import
org.springframework.stereotype.Service
;
@Service
public
class
DeviceOrgServiceImpl
extends
ServiceImpl
<
IDeviceOrgMapper
,
DeviceOrgEntity
>
implements
IDeviceOrgService
{
}
sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
View file @
d0878a67
...
...
@@ -12,6 +12,8 @@ import com.dji.sample.control.model.enums.DroneAuthorityEnum;
import
com.dji.sample.manage.dao.IDeviceMapper
;
import
com.dji.sample.manage.model.dto.*
;
import
com.dji.sample.manage.model.entity.DeviceEntity
;
import
com.dji.sample.manage.model.entity.DeviceOrgEntity
;
import
com.dji.sample.manage.model.entity.UserOrgEntity
;
import
com.dji.sample.manage.model.enums.DeviceFirmwareStatusEnum
;
import
com.dji.sample.manage.model.enums.PropertySetFieldEnum
;
import
com.dji.sample.manage.model.enums.UserTypeEnum
;
...
...
@@ -52,11 +54,13 @@ import org.springframework.util.StringUtils;
import
java.time.Instant
;
import
java.time.LocalDateTime
;
import
java.time.ZoneId
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Optional
;
import
java.util.stream.Collectors
;
import
static
com
.
dji
.
sample
.
common
.
constant
.
DeviceConstant
.
CUSTOM_DOCK_LIST
;
import
static
com
.
dji
.
sample
.
common
.
util
.
SecurityUtils
.*;
/**
*
...
...
@@ -129,6 +133,12 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
@Autowired
private
AbstractFirmwareService
abstractFirmwareService
;
@Autowired
private
IDeviceOrgService
deviceOrgService
;
@Autowired
private
IUserOrgService
userOrgService
;
@Override
public
void
subDeviceOffline
(
String
deviceSn
)
{
// If no information about this device exists in the cache, the drone is considered to be offline.
...
...
@@ -373,6 +383,7 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
.
deviceDesc
(
entity
.
getDeviceDesc
())
.
controlSource
(
ControlSourceEnum
.
find
(
entity
.
getDeviceIndex
()))
.
workspaceId
(
entity
.
getWorkspaceId
())
.
orgId
(
entity
.
getOrgId
())
.
type
(
DeviceTypeEnum
.
find
(
entity
.
getDeviceType
()))
.
subType
(
DeviceSubTypeEnum
.
find
(
entity
.
getSubType
()))
.
domain
(
DeviceDomainEnum
.
find
(
entity
.
getDomain
()))
...
...
@@ -563,6 +574,56 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
wrapper
.
like
(
DeviceEntity:
:
getBoundStatus
,
param
.
getBoundStatus
());
}
if
(
StringUtils
.
hasText
(
param
.
getOrgId
()))
{
// 查询 指定团队的设备
LambdaQueryWrapper
<
DeviceOrgEntity
>
deviceOrgQueryWrapper
=
new
LambdaQueryWrapper
<>();
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getWorkspaceId
,
workspaceId
);
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getOrgId
,
param
.
getOrgId
());
List
<
DeviceOrgEntity
>
deviceOrgEntities
=
deviceOrgService
.
list
(
deviceOrgQueryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
deviceOrgEntities
))
{
return
new
PaginationData
<>(
new
ArrayList
<>(),
new
Pagination
(
page
,
pageSize
,
0
));
}
List
<
String
>
deviceSnList
=
deviceOrgEntities
.
stream
().
map
(
DeviceOrgEntity:
:
getDeviceSn
).
distinct
().
collect
(
Collectors
.
toList
());
if
(
CollectionUtils
.
isEmpty
(
deviceSnList
))
{
return
new
PaginationData
<>(
new
ArrayList
<>(),
new
Pagination
(
page
,
pageSize
,
0
));
}
wrapper
.
in
(
DeviceEntity:
:
getDeviceSn
,
deviceSnList
);
}
else
{
// 假如不是超级管理员 只能查询自己所属团队的设备
if
(
aboveSysAdminRole
())
{
}
else
{
// 查询自己团队
LambdaQueryWrapper
<
UserOrgEntity
>
userOrgQueryWrapper
=
new
LambdaQueryWrapper
<>();
userOrgQueryWrapper
.
eq
(
UserOrgEntity:
:
getUserId
,
getUserId
());
userOrgQueryWrapper
.
eq
(
UserOrgEntity:
:
getWorkspaceId
,
workspaceId
);
List
<
UserOrgEntity
>
userOrgEntities
=
userOrgService
.
list
(
userOrgQueryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
userOrgEntities
))
{
return
new
PaginationData
<>(
new
ArrayList
<>(),
new
Pagination
(
page
,
pageSize
,
0
));
}
List
<
String
>
userOrgIdList
=
userOrgEntities
.
stream
().
map
(
UserOrgEntity:
:
getOrgId
).
distinct
().
collect
(
Collectors
.
toList
());
if
(
CollectionUtils
.
isEmpty
(
userOrgIdList
))
{
return
new
PaginationData
<>(
new
ArrayList
<>(),
new
Pagination
(
page
,
pageSize
,
0
));
}
// 查询 团队的设备
LambdaQueryWrapper
<
DeviceOrgEntity
>
deviceOrgQueryWrapper
=
new
LambdaQueryWrapper
<>();
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getWorkspaceId
,
workspaceId
);
deviceOrgQueryWrapper
.
in
(
DeviceOrgEntity:
:
getOrgId
,
userOrgIdList
);
List
<
DeviceOrgEntity
>
deviceOrgEntities
=
deviceOrgService
.
list
(
deviceOrgQueryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
deviceOrgEntities
))
{
return
new
PaginationData
<>(
new
ArrayList
<>(),
new
Pagination
(
page
,
pageSize
,
0
));
}
List
<
String
>
deviceSnList
=
deviceOrgEntities
.
stream
().
map
(
DeviceOrgEntity:
:
getDeviceSn
).
distinct
().
collect
(
Collectors
.
toList
());
if
(
CollectionUtils
.
isEmpty
(
deviceSnList
))
{
return
new
PaginationData
<>(
new
ArrayList
<>(),
new
Pagination
(
page
,
pageSize
,
0
));
}
wrapper
.
in
(
DeviceEntity:
:
getDeviceSn
,
deviceSnList
);
}
}
Page
<
DeviceEntity
>
pagination
=
mapper
.
selectPage
(
new
Page
<>(
page
,
pageSize
),
wrapper
);
List
<
DeviceDTO
>
devicesList
=
pagination
.
getRecords
().
stream
().
map
(
this
::
deviceEntityConvertToDTO
)
.
peek
(
device
->
{
...
...
@@ -653,6 +714,11 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
queryWrapper
.
eq
(
DeviceEntity:
:
getDeviceSn
,
deviceSn
);
int
delete
=
this
.
mapper
.
delete
(
queryWrapper
);
// 删除 全部相关的权限
LambdaQueryWrapper
<
DeviceOrgEntity
>
deviceOrgQueryWrapper
=
new
LambdaQueryWrapper
<>();
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getDeviceSn
,
deviceSn
);
boolean
deviceOrgRemove
=
deviceOrgService
.
remove
(
deviceOrgQueryWrapper
);
return
delete
>
0
;
}
...
...
@@ -835,6 +901,7 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
.
userId
(
dto
.
getUserId
())
.
nickname
(
dto
.
getNickname
())
.
workspaceId
(
dto
.
getWorkspaceId
())
.
orgId
(
dto
.
getOrgId
())
.
boundStatus
(
dto
.
getBoundStatus
())
.
domain
(
Optional
.
ofNullable
(
dto
.
getDomain
()).
map
(
DeviceDomainEnum:
:
getDomain
).
orElse
(
null
))
.
deviceType
(
Optional
.
ofNullable
(
dto
.
getType
()).
map
(
DeviceTypeEnum:
:
getType
).
orElse
(
null
))
...
...
@@ -875,6 +942,7 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
DeviceEntity
updateDrone
=
new
DeviceEntity
();
updateDrone
.
setId
(
dbDrone
.
getId
());
updateDrone
.
setWorkspaceId
(
drone
.
getWorkspaceId
());
updateDrone
.
setOrgId
(
StringUtils
.
hasText
(
drone
.
getOrgId
())
?
drone
.
getOrgId
()
:
getOrgId
());
updateDrone
.
setNickname
(
drone
.
getNickname
());
deviceEntity
.
setDeviceName
(
drone
.
getDeviceName
());
...
...
@@ -886,6 +954,23 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
updateDrone
.
setBoundStatus
(
true
);
updateDrone
.
setBoundTime
(
System
.
currentTimeMillis
());
int
update
=
this
.
mapper
.
updateById
(
updateDrone
);
// 增加 无人机和团队的关联关系
DeviceOrgEntity
deviceOrgEntity
=
new
DeviceOrgEntity
();
deviceOrgEntity
.
setWorkspaceId
(
updateDrone
.
getWorkspaceId
());
deviceOrgEntity
.
setOrgId
(
StringUtils
.
hasText
(
drone
.
getOrgId
())
?
drone
.
getOrgId
()
:
getOrgId
());
deviceOrgEntity
.
setDeviceSn
(
updateDrone
.
getDeviceSn
());
deviceOrgEntity
.
setDeviceId
(
dbDrone
.
getId
());
deviceOrgEntity
.
setIsShared
(
0
);
deviceOrgEntity
.
setCreatorId
(
getUserId
());
deviceOrgEntity
.
setCreatorName
(
getUsername
());
deviceOrgEntity
.
setCreateTime
(
System
.
currentTimeMillis
());
deviceOrgEntity
.
setUpdaterId
(
getUserId
());
deviceOrgEntity
.
setUpdaterName
(
getUsername
());
deviceOrgEntity
.
setUpdateTime
(
System
.
currentTimeMillis
());
boolean
deviceOrgSaveRes
=
deviceOrgService
.
save
(
deviceOrgEntity
);
return
update
>
0
;
}
}
...
...
@@ -895,6 +980,7 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
// M350(DeviceDomainEnum.DRONE, DeviceTypeEnum.M350, DeviceSubTypeEnum.ZERO),
deviceEntity
.
setNickname
(
drone
.
getNickname
());
deviceEntity
.
setWorkspaceId
(
drone
.
getWorkspaceId
());
deviceEntity
.
setOrgId
(
StringUtils
.
hasText
(
drone
.
getOrgId
())
?
drone
.
getOrgId
()
:
getOrgId
());
// 类型
deviceEntity
.
setDomain
(
DeviceDomainEnum
.
DRONE
.
getDomain
());
deviceEntity
.
setDeviceType
(
drone
.
getType
().
getType
());
...
...
@@ -921,6 +1007,23 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
// url_select The icon displayed on the remote control when it is selected.
int
insert
=
this
.
mapper
.
insert
(
deviceEntity
);
// 增加 无人机和团队的关联关系
DeviceOrgEntity
deviceOrgEntity
=
new
DeviceOrgEntity
();
deviceOrgEntity
.
setWorkspaceId
(
deviceEntity
.
getWorkspaceId
());
deviceOrgEntity
.
setOrgId
(
StringUtils
.
hasText
(
drone
.
getOrgId
())
?
drone
.
getOrgId
()
:
getOrgId
());
deviceOrgEntity
.
setDeviceSn
(
deviceEntity
.
getDeviceSn
());
deviceOrgEntity
.
setDeviceId
(
deviceEntity
.
getId
());
deviceOrgEntity
.
setIsShared
(
0
);
deviceOrgEntity
.
setCreatorId
(
getUserId
());
deviceOrgEntity
.
setCreatorName
(
getUsername
());
deviceOrgEntity
.
setCreateTime
(
System
.
currentTimeMillis
());
deviceOrgEntity
.
setUpdaterId
(
getUserId
());
deviceOrgEntity
.
setUpdaterName
(
getUsername
());
deviceOrgEntity
.
setUpdateTime
(
System
.
currentTimeMillis
());
boolean
deviceOrgSaveRes
=
deviceOrgService
.
save
(
deviceOrgEntity
);
return
insert
>
0
;
}
...
...
@@ -1012,6 +1115,7 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
newDrone
.
setWorkspaceId
(
dock
.
getWorkspaceId
());
newDrone
.
setOrgId
(
StringUtils
.
hasText
(
dock
.
getOrgId
())
?
dock
.
getOrgId
()
:
getOrgId
());
// 飞机型号
DeviceDTO
children
=
dock
.
getChildren
();
...
...
@@ -1030,6 +1134,22 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
newDrone
.
setBoundTime
(
System
.
currentTimeMillis
());
int
droneInsert
=
mapper
.
insert
(
newDrone
);
// 增加 无人机和团队的关联关系
DeviceOrgEntity
deviceOrgEntity
=
new
DeviceOrgEntity
();
deviceOrgEntity
.
setWorkspaceId
(
newDrone
.
getWorkspaceId
());
deviceOrgEntity
.
setOrgId
(
StringUtils
.
hasText
(
newDrone
.
getOrgId
())
?
newDrone
.
getOrgId
()
:
getOrgId
());
deviceOrgEntity
.
setDeviceSn
(
newDrone
.
getDeviceSn
());
deviceOrgEntity
.
setDeviceId
(
newDrone
.
getId
());
deviceOrgEntity
.
setIsShared
(
0
);
deviceOrgEntity
.
setCreatorId
(
getUserId
());
deviceOrgEntity
.
setCreatorName
(
getUsername
());
deviceOrgEntity
.
setCreateTime
(
System
.
currentTimeMillis
());
deviceOrgEntity
.
setUpdaterId
(
getUserId
());
deviceOrgEntity
.
setUpdaterName
(
getUsername
());
deviceOrgEntity
.
setUpdateTime
(
System
.
currentTimeMillis
());
boolean
deviceOrgSaveRes
=
deviceOrgService
.
save
(
deviceOrgEntity
);
}
else
{
// 飞机存在
...
...
@@ -1048,13 +1168,31 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
// 绑定无人机
LambdaUpdateWrapper
<
DeviceEntity
>
updateDroneWrapper
=
new
LambdaUpdateWrapper
<>();
updateDroneWrapper
.
set
(
DeviceEntity:
:
getWorkspaceId
,
dock
.
getWorkspaceId
());
updateDroneWrapper
.
set
(
DeviceEntity:
:
getOrgId
,
StringUtils
.
hasText
(
dock
.
getOrgId
())
?
dock
.
getOrgId
()
:
getOrgId
());
updateDroneWrapper
.
eq
(
DeviceEntity:
:
getDeviceSn
,
droneSn
);
int
updateDroneInt
=
mapper
.
update
(
new
DeviceEntity
(),
updateDroneWrapper
);
// 增加 无人机和团队的关联关系
DeviceOrgEntity
deviceOrgEntity
=
new
DeviceOrgEntity
();
deviceOrgEntity
.
setWorkspaceId
(
drone
.
getWorkspaceId
());
deviceOrgEntity
.
setOrgId
(
StringUtils
.
hasText
(
dock
.
getOrgId
())
?
dock
.
getOrgId
()
:
getOrgId
());
deviceOrgEntity
.
setDeviceSn
(
drone
.
getDeviceSn
());
deviceOrgEntity
.
setDeviceId
(
drone
.
getId
());
deviceOrgEntity
.
setIsShared
(
0
);
deviceOrgEntity
.
setCreatorId
(
getUserId
());
deviceOrgEntity
.
setCreatorName
(
getUsername
());
deviceOrgEntity
.
setCreateTime
(
System
.
currentTimeMillis
());
deviceOrgEntity
.
setUpdaterId
(
getUserId
());
deviceOrgEntity
.
setUpdaterName
(
getUsername
());
deviceOrgEntity
.
setUpdateTime
(
System
.
currentTimeMillis
());
boolean
deviceOrgSaveRes
=
deviceOrgService
.
save
(
deviceOrgEntity
);
}
}
}
addDockEntity
.
setWorkspaceId
(
dock
.
getWorkspaceId
());
addDockEntity
.
setOrgId
(
StringUtils
.
hasText
(
dock
.
getOrgId
())
?
dock
.
getOrgId
()
:
getOrgId
());
// 机场sn
addDockEntity
.
setDeviceSn
(
dock
.
getDeviceSn
());
addDockEntity
.
setNickname
(
dock
.
getNickname
());
...
...
@@ -1089,6 +1227,23 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
int
insert
=
this
.
mapper
.
insert
(
addDockEntity
);
// 增加 机场和团队的关联关系
DeviceOrgEntity
deviceOrgEntity
=
new
DeviceOrgEntity
();
deviceOrgEntity
.
setWorkspaceId
(
addDockEntity
.
getWorkspaceId
());
deviceOrgEntity
.
setOrgId
(
StringUtils
.
hasText
(
dock
.
getOrgId
())
?
dock
.
getOrgId
()
:
getOrgId
());
deviceOrgEntity
.
setDeviceSn
(
addDockEntity
.
getDeviceSn
());
deviceOrgEntity
.
setDeviceId
(
addDockEntity
.
getId
());
deviceOrgEntity
.
setIsShared
(
0
);
deviceOrgEntity
.
setCreatorId
(
getUserId
());
deviceOrgEntity
.
setCreatorName
(
getUsername
());
deviceOrgEntity
.
setCreateTime
(
System
.
currentTimeMillis
());
deviceOrgEntity
.
setUpdaterId
(
getUserId
());
deviceOrgEntity
.
setUpdaterName
(
getUsername
());
deviceOrgEntity
.
setUpdateTime
(
System
.
currentTimeMillis
());
boolean
deviceOrgSaveRes
=
deviceOrgService
.
save
(
deviceOrgEntity
);
return
insert
>
0
;
}
...
...
@@ -1140,6 +1295,78 @@ public class DeviceServiceImpl extends ServiceImpl<IDeviceMapper, DeviceEntity>
return
update
>
0
;
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
void
shareDevice
(
DeviceDTO
device
)
{
if
(!
StringUtils
.
hasText
(
device
.
getDeviceSn
()))
{
throw
new
RuntimeException
(
"share device sn is null"
);
}
if
(!
StringUtils
.
hasText
(
device
.
getOrgId
()))
{
throw
new
RuntimeException
(
"share org id is null"
);
}
// 查询设备是否存在
LambdaQueryWrapper
<
DeviceEntity
>
deviceQueryWrapper
=
new
LambdaQueryWrapper
<>();
deviceQueryWrapper
.
eq
(
DeviceEntity:
:
getDeviceSn
,
device
.
getDeviceSn
());
DeviceEntity
dbDevice
=
this
.
getOne
(
deviceQueryWrapper
);
if
(
dbDevice
==
null
)
{
throw
new
RuntimeException
(
"device does not exist!"
);
}
// 查询是否已经分享
LambdaQueryWrapper
<
DeviceOrgEntity
>
deviceOrgQueryWrapper
=
new
LambdaQueryWrapper
<>();
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getDeviceSn
,
device
.
getDeviceSn
());
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getOrgId
,
device
.
getOrgId
());
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getWorkspaceId
,
StringUtils
.
hasText
(
device
.
getWorkspaceId
())
?
device
.
getWorkspaceId
()
:
getWorkspaceId
());
List
<
DeviceOrgEntity
>
deviceOrgEntities
=
deviceOrgService
.
list
(
deviceOrgQueryWrapper
);
if
(!
CollectionUtils
.
isEmpty
(
deviceOrgEntities
))
{
throw
new
RuntimeException
(
"the device has been shared with the Org"
);
}
DeviceOrgEntity
deviceOrgEntity
=
new
DeviceOrgEntity
();
deviceOrgEntity
.
setWorkspaceId
(
StringUtils
.
hasText
(
device
.
getWorkspaceId
())
?
device
.
getWorkspaceId
()
:
getWorkspaceId
());
deviceOrgEntity
.
setOrgId
(
device
.
getOrgId
());
deviceOrgEntity
.
setDeviceSn
(
device
.
getDeviceSn
());
deviceOrgEntity
.
setDeviceId
(
dbDevice
.
getId
());
deviceOrgEntity
.
setIsShared
(
1
);
deviceOrgEntity
.
setCreatorId
(
getUserId
());
deviceOrgEntity
.
setCreatorName
(
getUsername
());
deviceOrgEntity
.
setCreateTime
(
System
.
currentTimeMillis
());
deviceOrgEntity
.
setUpdaterId
(
getUserId
());
deviceOrgEntity
.
setUpdaterName
(
getUsername
());
deviceOrgEntity
.
setUpdateTime
(
System
.
currentTimeMillis
());
boolean
deviceOrgSaveRes
=
deviceOrgService
.
save
(
deviceOrgEntity
);
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
void
cancelShareDevice
(
DeviceDTO
device
)
{
if
(!
StringUtils
.
hasText
(
device
.
getDeviceSn
()))
{
throw
new
RuntimeException
(
"share device sn is null"
);
}
if
(!
StringUtils
.
hasText
(
device
.
getOrgId
()))
{
throw
new
RuntimeException
(
"share org id is null"
);
}
// 查询设备是否存在
LambdaQueryWrapper
<
DeviceEntity
>
deviceQueryWrapper
=
new
LambdaQueryWrapper
<>();
deviceQueryWrapper
.
eq
(
DeviceEntity:
:
getDeviceSn
,
device
.
getDeviceSn
());
DeviceEntity
dbDevice
=
this
.
getOne
(
deviceQueryWrapper
);
if
(
dbDevice
==
null
)
{
throw
new
RuntimeException
(
"device does not exist!"
);
}
// 删除已经分享的
LambdaQueryWrapper
<
DeviceOrgEntity
>
deviceOrgQueryWrapper
=
new
LambdaQueryWrapper
<>();
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getDeviceSn
,
device
.
getDeviceSn
());
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getOrgId
,
device
.
getOrgId
());
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getWorkspaceId
,
StringUtils
.
hasText
(
device
.
getWorkspaceId
())
?
device
.
getWorkspaceId
()
:
getWorkspaceId
());
deviceOrgQueryWrapper
.
eq
(
DeviceOrgEntity:
:
getIsShared
,
1
);
boolean
deviceOrgSaveRes
=
deviceOrgService
.
remove
(
deviceOrgQueryWrapper
);
}
/**
* Get the devices list in one workspace.
...
...
sample/src/main/java/com/dji/sample/manage/service/impl/FleetOrgServiceImpl.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
service
.
impl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.dji.sample.manage.dao.IFleetOrgMapper
;
import
com.dji.sample.manage.model.entity.FleetOrgEntity
;
import
com.dji.sample.manage.service.IFleetOrgService
;
import
org.springframework.stereotype.Service
;
/**
* @author guan
*/
@Service
public
class
FleetOrgServiceImpl
extends
ServiceImpl
<
IFleetOrgMapper
,
FleetOrgEntity
>
implements
IFleetOrgService
{
}
sample/src/main/java/com/dji/sample/manage/service/impl/FleetServiceImpl.java
View file @
d0878a67
...
...
@@ -32,6 +32,9 @@ import java.util.Map;
import
java.util.UUID
;
import
java.util.stream.Collectors
;
import
static
com
.
dji
.
sample
.
common
.
util
.
SecurityUtils
.
aboveSysAdminRole
;
import
static
com
.
dji
.
sample
.
common
.
util
.
SecurityUtils
.
getOrgId
;
/**
* @author guan
*/
...
...
@@ -74,6 +77,13 @@ public class FleetServiceImpl extends ServiceImpl<IFleetMapper, FleetEntity> imp
fleetQueryWrapper
.
like
(
FleetEntity:
:
getFleetName
,
param
.
getFleetName
());
}
// 限制 团队
if
(
aboveSysAdminRole
())
{
}
else
{
fleetQueryWrapper
.
eq
(
FleetEntity:
:
getOrgId
,
getOrgId
());
}
Page
<
FleetEntity
>
pagination
=
mapper
.
selectPage
(
new
Page
<>(
page
,
pageSize
),
fleetQueryWrapper
);
List
<
FleetDTO
>
fleetList
=
pagination
.
getRecords
().
stream
()
...
...
@@ -127,7 +137,8 @@ public class FleetServiceImpl extends ServiceImpl<IFleetMapper, FleetEntity> imp
}
else
{
addFleet
.
setFleetSn
(
UUID
.
randomUUID
().
toString
());
}
addFleet
.
setOrgId
(
StringUtils
.
hasText
(
fleetDTO
.
getOrgId
())
?
fleetDTO
.
getOrgId
()
:
getOrgId
());
addFleet
.
setFleetName
(
fleetDTO
.
getFleetName
());
addFleet
.
setNickname
(
fleetDTO
.
getNickname
());
addFleet
.
setFleetDesc
(
fleetDTO
.
getFleetDesc
());
...
...
@@ -279,6 +290,7 @@ public class FleetServiceImpl extends ServiceImpl<IFleetMapper, FleetEntity> imp
fleetDTO
.
setFleetDesc
(
fleetEntity
.
getFleetDesc
());
fleetDTO
.
setUserId
(
fleetEntity
.
getUserId
());
fleetDTO
.
setNickname
(
fleetEntity
.
getNickname
());
fleetDTO
.
setOrgId
(
fleetEntity
.
getOrgId
());
return
fleetDTO
;
}
...
...
@@ -293,6 +305,7 @@ public class FleetServiceImpl extends ServiceImpl<IFleetMapper, FleetEntity> imp
fleetEntity
.
setFleetDesc
(
fleetDTO
.
getFleetDesc
());
fleetEntity
.
setUserId
(
fleetDTO
.
getUserId
());
fleetEntity
.
setNickname
(
fleetDTO
.
getNickname
());
fleetEntity
.
setOrgId
(
fleetDTO
.
getOrgId
());
return
fleetEntity
;
}
...
...
sample/src/main/java/com/dji/sample/manage/service/impl/OrgServiceImpl.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
service
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.dji.sample.manage.dao.IOrgMapper
;
import
com.dji.sample.manage.model.dto.OrgDTO
;
import
com.dji.sample.manage.model.dto.OrgJoinDTO
;
import
com.dji.sample.manage.model.dto.WorkspaceDTO
;
import
com.dji.sample.manage.model.entity.OrgEntity
;
import
com.dji.sample.manage.model.entity.UserEntity
;
import
com.dji.sample.manage.model.entity.UserOrgEntity
;
import
com.dji.sample.manage.model.entity.WorkspaceEntity
;
import
com.dji.sample.manage.model.enums.RoleTypeEnum
;
import
com.dji.sample.manage.model.param.searchParam.OrgSearchParam
;
import
com.dji.sample.manage.service.IOrgService
;
import
com.dji.sample.manage.service.IUserService
;
import
com.dji.sdk.common.Pagination
;
import
com.dji.sdk.common.PaginationData
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Lazy
;
import
org.springframework.context.annotation.Role
;
import
org.springframework.stereotype.Service
;
import
com.dji.sample.common.util.SecurityUtils
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.StringUtils
;
import
java.time.Instant
;
import
java.time.LocalDateTime
;
import
java.time.ZoneId
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Optional
;
import
java.util.UUID
;
import
java.util.stream.Collectors
;
import
static
com
.
dji
.
sample
.
common
.
util
.
SecurityUtils
.*;
@Service
@Transactional
public
class
OrgServiceImpl
extends
ServiceImpl
<
IOrgMapper
,
OrgEntity
>
implements
IOrgService
{
@Autowired
private
UserOrgServiceImpl
userOrgService
;
@Autowired
@Lazy
private
IUserService
userService
;
@Override
public
Optional
<
OrgDTO
>
getOrgByOrgId
(
String
orgId
)
{
LambdaQueryWrapper
<
OrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgId
);
OrgEntity
entity
=
getOne
(
queryWrapper
);
if
(
entity
==
null
)
{
return
Optional
.
empty
();
}
return
Optional
.
of
(
entityConvertToDto
(
entity
));
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
OrgDTO
addOrg
(
OrgDTO
orgDTO
)
{
OrgEntity
addOrgEntity
=
new
OrgEntity
();
addOrgEntity
.
setWorkspaceId
(
orgDTO
.
getWorkspaceId
());
// 绑定码 不能重复
String
bindCode
=
orgDTO
.
getBindCode
();
if
(!
StringUtils
.
hasText
(
bindCode
))
{
throw
new
RuntimeException
(
"bindCode can't be null"
);
}
LambdaQueryWrapper
<
OrgEntity
>
bindCodeQueryWrapper
=
new
LambdaQueryWrapper
<>();
bindCodeQueryWrapper
.
eq
(
OrgEntity:
:
getBindCode
,
bindCode
);
List
<
OrgEntity
>
bindCodeOrgList
=
this
.
list
(
bindCodeQueryWrapper
);
if
(!
CollectionUtils
.
isEmpty
(
bindCodeOrgList
))
{
throw
new
RuntimeException
(
"bindCode is already exit"
);
}
addOrgEntity
.
setBindCode
(
orgDTO
.
getBindCode
());
// 团队编码不能重复
if
(
StringUtils
.
hasText
(
orgDTO
.
getOrgId
()))
{
LambdaQueryWrapper
<
OrgEntity
>
orgIdQueryWrapper
=
new
LambdaQueryWrapper
<>();
orgIdQueryWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgDTO
.
getOrgId
());
List
<
OrgEntity
>
orgIdOrgList
=
this
.
list
(
orgIdQueryWrapper
);
if
(!
CollectionUtils
.
isEmpty
(
orgIdOrgList
))
{
throw
new
RuntimeException
(
"orgId is already exit"
);
}
addOrgEntity
.
setOrgId
(
orgDTO
.
getOrgId
());
}
else
{
addOrgEntity
.
setOrgId
(
UUID
.
randomUUID
().
toString
());
}
addOrgEntity
.
setOrgName
(
orgDTO
.
getOrgName
());
addOrgEntity
.
setOrgDesc
(
orgDTO
.
getOrgDesc
());
addOrgEntity
.
setCreateTime
(
System
.
currentTimeMillis
());
addOrgEntity
.
setCreatorId
(
getUserId
());
addOrgEntity
.
setCreatorName
(
getUsername
());
addOrgEntity
.
setUpdateTime
(
System
.
currentTimeMillis
());
addOrgEntity
.
setUpdaterId
(
getUserId
());
addOrgEntity
.
setUpdaterName
(
getUsername
());
// 新增orgAdmin
UserEntity
orgAdmin
=
new
UserEntity
();
orgAdmin
.
setWorkspaceId
(
orgDTO
.
getWorkspaceId
());
orgAdmin
.
setUsername
(
orgDTO
.
getAdminUserName
());
orgAdmin
.
setPassword
(
orgDTO
.
getAdminUserPassword
());
UserEntity
saveAdmin
=
userService
.
addOrgAdminUser
(
orgAdmin
);
addOrgEntity
.
setAdminUserId
(
saveAdmin
.
getUserId
());
boolean
addOrgRes
=
this
.
save
(
addOrgEntity
);
// 增加用户和团队的权限
UserOrgEntity
userOrgEntity
=
new
UserOrgEntity
();
userOrgEntity
.
setOrgId
(
addOrgEntity
.
getOrgId
());
userOrgEntity
.
setUserId
(
saveAdmin
.
getUserId
());
userOrgEntity
.
setWorkspaceId
(
addOrgEntity
.
getWorkspaceId
());
userOrgEntity
.
setCreateTime
(
System
.
currentTimeMillis
());
userOrgEntity
.
setCreatorId
(
getUserId
());
userOrgEntity
.
setCreatorName
(
getUsername
());
userOrgEntity
.
setUpdateTime
(
System
.
currentTimeMillis
());
userOrgEntity
.
setUpdaterId
(
getUserId
());
userOrgEntity
.
setUpdaterName
(
getUsername
());
userOrgEntity
.
setRoleType
(
RoleTypeEnum
.
ORG_ADMIN
.
getVal
());
boolean
userOrgSaveRes
=
userOrgService
.
save
(
userOrgEntity
);
OrgDTO
entityConvertToDto
=
entityConvertToDto
(
addOrgEntity
);
return
entityConvertToDto
;
}
@Override
public
boolean
editOrg
(
OrgDTO
orgDTO
)
{
if
(
orgDTO
.
getId
()
==
null
&&
!
StringUtils
.
hasText
(
orgDTO
.
getOrgId
()))
{
throw
new
RuntimeException
(
"id and orgId is null"
);
}
LambdaQueryWrapper
<
OrgEntity
>
queryDbWrapper
=
new
LambdaQueryWrapper
<>();
if
(
orgDTO
.
getId
()
!=
null
)
{
queryDbWrapper
.
eq
(
OrgEntity:
:
getId
,
orgDTO
.
getId
());
}
else
{
queryDbWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgDTO
.
getOrgId
());
}
OrgEntity
dbOrg
=
this
.
getOne
(
queryDbWrapper
);
LambdaUpdateWrapper
<
OrgEntity
>
updateWrapper
=
new
LambdaUpdateWrapper
<>();
if
(
orgDTO
.
getId
()
!=
null
)
{
updateWrapper
.
eq
(
OrgEntity:
:
getId
,
orgDTO
.
getId
());
}
else
{
updateWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgDTO
.
getOrgId
());
}
// 绑定码 不能重复
String
bindCode
=
orgDTO
.
getBindCode
();
if
(
StringUtils
.
hasText
(
bindCode
))
{
if
(!
bindCode
.
equals
(
orgDTO
.
getBindCode
()))
{
// 查询
LambdaQueryWrapper
<
OrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
OrgEntity:
:
getBindCode
,
bindCode
);
List
<
OrgEntity
>
bingCodeList
=
this
.
list
(
queryWrapper
);
if
(!
CollectionUtils
.
isEmpty
(
bingCodeList
))
{
throw
new
RuntimeException
(
"bindCode is already exit"
);
}
}
updateWrapper
.
set
(
OrgEntity:
:
getBindCode
,
bindCode
);
}
// 修改 名称
if
(
StringUtils
.
hasText
(
orgDTO
.
getOrgName
()))
{
updateWrapper
.
set
(
OrgEntity:
:
getOrgName
,
orgDTO
.
getOrgName
());
}
// 修改 描述
if
(
StringUtils
.
hasText
(
orgDTO
.
getOrgDesc
()))
{
updateWrapper
.
set
(
OrgEntity:
:
getOrgDesc
,
orgDTO
.
getOrgDesc
());
}
boolean
update
=
this
.
update
(
updateWrapper
);
return
update
;
}
@Override
public
boolean
delOrg
(
OrgDTO
orgDTO
)
{
if
(
orgDTO
.
getId
()
==
null
&&
!
StringUtils
.
hasText
(
orgDTO
.
getOrgId
()))
{
throw
new
RuntimeException
(
"id and orgId is null"
);
}
boolean
remove
;
if
(
orgDTO
.
getId
()
!=
null
)
{
remove
=
this
.
removeById
(
orgDTO
.
getId
());
}
else
{
LambdaQueryWrapper
<
OrgEntity
>
wrapper
=
new
LambdaQueryWrapper
<>();
wrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgDTO
.
getOrgId
());
remove
=
this
.
remove
(
wrapper
);
}
return
remove
;
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
boolean
applyOrg
(
OrgJoinDTO
orgDTO
)
{
// 查询绑定码是否正确
if
(!
StringUtils
.
hasText
(
orgDTO
.
getBindCode
()))
{
throw
new
RuntimeException
(
"bindCode is null"
);
}
if
(!
StringUtils
.
hasText
(
orgDTO
.
getOrgDesc
())
&&
!
StringUtils
.
hasText
(
orgDTO
.
getOrgId
()))
{
throw
new
RuntimeException
(
"org info is null"
);
}
LambdaQueryWrapper
<
OrgEntity
>
orgQueryWrapper
=
new
LambdaQueryWrapper
<>();
orgQueryWrapper
.
eq
(
OrgEntity:
:
getWorkspaceId
,
getWorkspaceId
());
if
(
StringUtils
.
hasText
(
orgDTO
.
getOrgId
()))
{
orgQueryWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgDTO
.
getOrgId
());
}
else
if
(
StringUtils
.
hasText
(
orgDTO
.
getOrgName
()))
{
orgQueryWrapper
.
eq
(
OrgEntity:
:
getOrgName
,
orgDTO
.
getOrgName
());
}
orgQueryWrapper
.
eq
(
OrgEntity:
:
getBindCode
,
orgDTO
.
getBindCode
());
OrgEntity
orgEntity
=
this
.
getOne
(
orgQueryWrapper
);
if
(
orgEntity
==
null
)
{
throw
new
RuntimeException
(
"org info or bindCode is error"
);
}
String
joinUserId
=
getUserId
();
String
joinOrgId
=
orgEntity
.
getOrgId
();
Integer
joinUserRoleType
=
RoleTypeEnum
.
MEMBER
.
getVal
();
boolean
addOrgRes
=
userOrgService
.
addUserToOrg
(
joinUserId
,
joinOrgId
,
joinUserRoleType
);
return
addOrgRes
;
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
boolean
joinOrgByAdmin
(
OrgJoinDTO
orgDTO
)
{
if
(!
aboveAdminRole
())
{
throw
new
RuntimeException
(
"current roleType is not admin"
);
}
if
(
orgDTO
.
getJoinUserRoleType
()
!=
null
)
{
if
(
RoleTypeEnum
.
find
(
orgDTO
.
getJoinUserRoleType
())
==
RoleTypeEnum
.
UNKNOWN
)
{
throw
new
RuntimeException
(
"org roleType is error"
);
}
}
if
(!
StringUtils
.
hasText
(
orgDTO
.
getJoinUserId
())
&&
!
StringUtils
.
hasText
(
orgDTO
.
getJoinUserName
()))
{
throw
new
RuntimeException
(
"user info is null"
);
}
if
(!
StringUtils
.
hasText
(
orgDTO
.
getOrgId
())
&&
!
StringUtils
.
hasText
(
orgDTO
.
getOrgName
()))
{
throw
new
RuntimeException
(
"org info is null"
);
}
LambdaQueryWrapper
<
OrgEntity
>
orgQueryWrapper
=
new
LambdaQueryWrapper
<>();
orgQueryWrapper
.
eq
(
OrgEntity:
:
getWorkspaceId
,
getWorkspaceId
());
if
(
StringUtils
.
hasText
(
orgDTO
.
getOrgId
()))
{
orgQueryWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgDTO
.
getOrgId
());
}
else
if
(
StringUtils
.
hasText
(
orgDTO
.
getOrgName
()))
{
orgQueryWrapper
.
eq
(
OrgEntity:
:
getOrgName
,
orgDTO
.
getOrgName
());
}
OrgEntity
orgEntity
=
this
.
getOne
(
orgQueryWrapper
);
if
(
orgEntity
==
null
)
{
throw
new
RuntimeException
(
"org info or bindCode is error"
);
}
if
(
aboveSysAdminRole
())
{
// 系统管理员可以增加全部组织
// 非系统管理员权限
if
(
aboveSysAdminRole
(
orgDTO
.
getJoinUserRoleType
()))
{
throw
new
RuntimeException
(
"org roleType is error"
);
}
}
else
if
(
aboveAdminRole
())
{
// 管理员只能增加自己当前组织
if
(!
orgEntity
.
getOrgId
().
equals
(
getOrgId
()))
{
throw
new
RuntimeException
(
"admin can not select other org!"
);
}
// 非组织管理员权限
if
(
aboveOrgAdminRole
(
orgDTO
.
getJoinUserRoleType
()))
{
throw
new
RuntimeException
(
"org roleType is error"
);
}
}
String
joinUserId
;
// 查询 用户是否存在
if
(!
StringUtils
.
hasText
(
orgDTO
.
getJoinUserId
()))
{
String
joinUserName
=
orgDTO
.
getJoinUserName
();
LambdaQueryWrapper
<
UserEntity
>
userQueryWrapper
=
new
LambdaQueryWrapper
<>();
userQueryWrapper
.
eq
(
UserEntity:
:
getUsername
,
joinUserName
);
UserEntity
joinUser
=
userService
.
getOne
(
userQueryWrapper
);
if
(
joinUser
==
null
)
{
throw
new
RuntimeException
(
"joinUserName is error"
);
}
joinUserId
=
joinUser
.
getUserId
();
}
else
{
joinUserId
=
StringUtils
.
hasText
(
orgDTO
.
getJoinUserId
())
?
orgDTO
.
getJoinUserId
()
:
getUserId
();
}
String
joinOrgId
=
orgEntity
.
getOrgId
();
Integer
joinUserRoleType
=
orgDTO
.
getJoinUserRoleType
()
!=
null
?
orgDTO
.
getJoinUserRoleType
()
:
RoleTypeEnum
.
MEMBER
.
getVal
();
boolean
addOrgRes
=
userOrgService
.
addUserToOrg
(
joinUserId
,
joinOrgId
,
joinUserRoleType
);
return
addOrgRes
;
}
@Override
public
PaginationData
<
OrgDTO
>
getOrgPage
(
OrgSearchParam
param
,
Long
page
,
Long
pageSize
)
{
LambdaQueryWrapper
<
OrgEntity
>
orgQueryWrapper
=
new
LambdaQueryWrapper
<>();
if
(
StringUtils
.
hasText
(
param
.
getOrgId
()))
{
orgQueryWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
param
.
getOrgId
());
}
if
(
StringUtils
.
hasText
(
param
.
getWorkspaceId
()))
{
orgQueryWrapper
.
eq
(
OrgEntity:
:
getWorkspaceId
,
param
.
getWorkspaceId
());
}
// 增加查询内容
if
(
StringUtils
.
hasText
(
param
.
getOrgDesc
()))
{
orgQueryWrapper
.
like
(
OrgEntity:
:
getOrgDesc
,
param
.
getOrgDesc
());
}
Page
<
OrgEntity
>
pagination
=
this
.
page
(
new
Page
<>(
page
,
pageSize
),
orgQueryWrapper
);
List
<
OrgDTO
>
orgDTOList
=
pagination
.
getRecords
().
stream
()
.
map
(
this
::
entityConvertToDto
)
//.peek(fleet -> {})
.
collect
(
Collectors
.
toList
());
return
new
PaginationData
<>(
orgDTOList
,
new
Pagination
(
pagination
.
getCurrent
(),
pagination
.
getSize
(),
pagination
.
getTotal
()));
}
@Override
public
OrgDTO
getOrg
(
OrgSearchParam
param
)
{
LambdaQueryWrapper
<
OrgEntity
>
orgQueryWrapper
=
new
LambdaQueryWrapper
<>();
orgQueryWrapper
.
eq
(
OrgEntity:
:
getWorkspaceId
,
param
.
getWorkspaceId
());
if
(
StringUtils
.
hasText
(
param
.
getRoleUserId
()))
{
// 查询 权限团队
LambdaQueryWrapper
<
UserOrgEntity
>
userOrgQueryWrapper
=
new
LambdaQueryWrapper
<>();
userOrgQueryWrapper
.
eq
(
UserOrgEntity:
:
getUserId
,
param
.
getRoleUserId
());
List
<
UserOrgEntity
>
userOrgEntities
=
userOrgService
.
list
(
userOrgQueryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
userOrgEntities
))
{
return
OrgDTO
.
builder
().
build
();
}
List
<
String
>
roleOrgIdList
=
userOrgEntities
.
stream
().
map
(
UserOrgEntity:
:
getOrgId
).
collect
(
Collectors
.
toList
());
if
(
CollectionUtils
.
isEmpty
(
roleOrgIdList
))
{
return
OrgDTO
.
builder
().
build
();
}
orgQueryWrapper
.
in
(
OrgEntity:
:
getOrgId
,
roleOrgIdList
);
}
if
(
StringUtils
.
hasText
(
param
.
getOrgId
()))
{
orgQueryWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
param
.
getOrgId
());
}
if
(
param
.
getId
()
!=
null
)
{
orgQueryWrapper
.
eq
(
OrgEntity:
:
getId
,
param
.
getId
());
}
OrgEntity
orgEntity
=
this
.
getOne
(
orgQueryWrapper
);
OrgDTO
orgDTO
=
this
.
entityConvertToDto
(
orgEntity
);
return
orgDTO
;
}
@Override
public
String
getWorkspaceIdByOrgId
(
String
orgId
)
{
LambdaQueryWrapper
<
OrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgId
)
.
select
(
OrgEntity:
:
getWorkspaceId
);
OrgEntity
entity
=
getOne
(
queryWrapper
);
return
entity
!=
null
?
entity
.
getWorkspaceId
()
:
null
;
}
@Override
public
boolean
deleteOrg
(
String
orgId
)
{
LambdaQueryWrapper
<
OrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgId
);
return
remove
(
queryWrapper
);
}
@Override
public
boolean
createOrg
(
OrgDTO
orgDTO
)
{
OrgEntity
entity
=
new
OrgEntity
();
entity
.
setOrgId
(
orgDTO
.
getOrgId
());
entity
.
setOrgName
(
orgDTO
.
getOrgName
());
entity
.
setOrgDesc
(
orgDTO
.
getOrgDesc
());
entity
.
setWorkspaceId
(
orgDTO
.
getWorkspaceId
());
// 设置创建者和更新者信息
String
currentUserId
=
SecurityUtils
.
getUserId
();
String
currentUserName
=
SecurityUtils
.
getUsername
();
entity
.
setCreatorId
(
currentUserId
);
entity
.
setCreatorName
(
currentUserName
);
entity
.
setUpdaterId
(
currentUserId
);
entity
.
setUpdaterName
(
currentUserName
);
entity
.
setBindCode
(
orgDTO
.
getBindCode
());
save
(
entity
);
return
entity
.
getOrgId
()
!=
null
;
}
@Override
public
boolean
updateOrg
(
OrgDTO
orgDTO
)
{
LambdaQueryWrapper
<
OrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgDTO
.
getOrgId
());
OrgEntity
entity
=
getOne
(
queryWrapper
);
if
(
entity
==
null
)
{
return
false
;
}
entity
.
setOrgName
(
orgDTO
.
getOrgName
());
entity
.
setOrgDesc
(
orgDTO
.
getOrgDesc
());
entity
.
setWorkspaceId
(
orgDTO
.
getWorkspaceId
());
// 设置更新者信息
entity
.
setUpdaterId
(
SecurityUtils
.
getUserId
());
entity
.
setUpdaterName
(
SecurityUtils
.
getUsername
());
return
updateById
(
entity
);
}
@Override
public
List
<
OrgDTO
>
getAllOrgs
()
{
List
<
OrgEntity
>
entities
=
list
();
return
entities
.
stream
()
.
map
(
this
::
entityConvertToDto
)
.
collect
(
Collectors
.
toList
());
}
private
OrgDTO
entityConvertToDto
(
OrgEntity
entity
)
{
if
(
entity
==
null
)
{
return
null
;
}
UserEntity
adminUser
=
null
;
if
(
StringUtils
.
hasText
(
entity
.
getAdminUserId
()))
{
LambdaQueryWrapper
<
UserEntity
>
userWrapper
=
new
LambdaQueryWrapper
<>();
userWrapper
.
eq
(
UserEntity:
:
getUserId
,
entity
.
getAdminUserId
());
adminUser
=
userService
.
getOne
(
userWrapper
);
}
return
OrgDTO
.
builder
()
.
id
(
entity
.
getId
())
.
orgId
(
entity
.
getOrgId
())
.
orgName
(
entity
.
getOrgName
())
.
orgDesc
(
entity
.
getOrgDesc
())
.
workspaceId
(
entity
.
getWorkspaceId
())
.
createTime
(
Objects
.
nonNull
(
entity
.
getCreateTime
())
?
LocalDateTime
.
ofInstant
(
Instant
.
ofEpochMilli
(
entity
.
getCreateTime
()),
ZoneId
.
systemDefault
())
:
null
)
.
updateTime
(
Objects
.
nonNull
(
entity
.
getUpdateTime
())
?
LocalDateTime
.
ofInstant
(
Instant
.
ofEpochMilli
(
entity
.
getUpdateTime
()),
ZoneId
.
systemDefault
())
:
null
)
.
bindCode
(
entity
.
getBindCode
())
.
adminUserName
(
adminUser
!=
null
?
adminUser
.
getUsername
()
:
null
)
.
build
();
}
}
sample/src/main/java/com/dji/sample/manage/service/impl/UserOrgServiceImpl.java
0 → 100644
View file @
d0878a67
package
com
.
dji
.
sample
.
manage
.
service
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.dji.sample.common.util.SecurityUtils
;
// 修正导入包
import
com.dji.sample.manage.dao.IUserOrgMapper
;
import
com.dji.sample.manage.model.dto.UserOrgDTO
;
import
com.dji.sample.manage.model.entity.UserOrgEntity
;
import
com.dji.sample.manage.service.IUserOrgService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.stream.Collectors
;
@Service
public
class
UserOrgServiceImpl
extends
ServiceImpl
<
IUserOrgMapper
,
UserOrgEntity
>
implements
IUserOrgService
{
@Autowired
private
IUserOrgMapper
userOrgMapper
;
@Override
public
Optional
<
UserOrgEntity
>
getUserOrg
(
String
userId
,
String
orgId
)
{
LambdaQueryWrapper
<
UserOrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
UserOrgEntity:
:
getUserId
,
userId
)
.
eq
(
UserOrgEntity:
:
getOrgId
,
orgId
)
.
eq
(
UserOrgEntity:
:
getStatus
,
1
);
UserOrgEntity
entity
=
getOne
(
queryWrapper
);
return
Optional
.
ofNullable
(
entity
);
}
@Override
public
List
<
UserOrgDTO
>
getUserOrgs
(
String
userId
)
{
return
userOrgMapper
.
selectUserOrgs
(
userId
);
}
@Override
public
List
<
String
>
getUserIdsByOrgId
(
String
orgId
)
{
LambdaQueryWrapper
<
UserOrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
UserOrgEntity:
:
getOrgId
,
orgId
)
.
eq
(
UserOrgEntity:
:
getStatus
,
1
)
.
select
(
UserOrgEntity:
:
getUserId
);
return
this
.
list
(
queryWrapper
)
.
stream
()
.
map
(
UserOrgEntity:
:
getUserId
)
.
collect
(
Collectors
.
toList
());
}
@Override
public
Map
<
String
,
Integer
>
getUserRoleMapByOrgId
(
String
orgId
)
{
LambdaQueryWrapper
<
UserOrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
UserOrgEntity:
:
getOrgId
,
orgId
)
.
eq
(
UserOrgEntity:
:
getStatus
,
1
)
.
select
(
UserOrgEntity:
:
getUserId
,
UserOrgEntity:
:
getRoleType
);
return
this
.
list
(
queryWrapper
)
.
stream
()
.
collect
(
Collectors
.
toMap
(
UserOrgEntity:
:
getUserId
,
UserOrgEntity:
:
getRoleType
));
}
@Override
public
boolean
addUserToOrg
(
String
userId
,
String
orgId
,
Integer
roleType
)
{
// 检查是否已存在
LambdaQueryWrapper
<
UserOrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
UserOrgEntity:
:
getUserId
,
userId
)
.
eq
(
UserOrgEntity:
:
getOrgId
,
orgId
);
UserOrgEntity
entity
=
getOne
(
queryWrapper
);
if
(
entity
!=
null
)
{
// 如果已存在但被禁用,则启用
if
(
entity
.
getStatus
()
==
0
)
{
entity
.
setStatus
(
1
);
entity
.
setRoleType
(
roleType
);
// entity.setUpdateTime(System.currentTimeMillis());
return
updateById
(
entity
);
}
return
false
;
// 已存在且启用状态
}
// 创建新关联
UserOrgEntity
userOrg
=
new
UserOrgEntity
();
userOrg
.
setUserId
(
userId
);
userOrg
.
setOrgId
(
orgId
);
userOrg
.
setRoleType
(
roleType
);
userOrg
.
setStatus
(
1
);
userOrg
.
setCreateTime
(
System
.
currentTimeMillis
());
userOrg
.
setUpdateTime
(
System
.
currentTimeMillis
());
// 创建新关联时设置创建者和更新者信息
String
currentUserId
=
SecurityUtils
.
getUserId
();
String
currentUserName
=
SecurityUtils
.
getUsername
();
userOrg
.
setCreatorId
(
currentUserId
);
userOrg
.
setCreatorName
(
currentUserName
);
userOrg
.
setUpdaterId
(
currentUserId
);
userOrg
.
setUpdaterName
(
currentUserName
);
return
save
(
userOrg
);
}
@Override
public
boolean
removeUserFromOrg
(
String
userId
,
String
orgId
)
{
LambdaQueryWrapper
<
UserOrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
UserOrgEntity:
:
getUserId
,
userId
)
.
eq
(
UserOrgEntity:
:
getOrgId
,
orgId
);
// 使用逻辑删除(将状态设置为禁用)
UserOrgEntity
entity
=
getOne
(
queryWrapper
);
if
(
entity
!=
null
)
{
entity
.
setStatus
(
0
);
// entity.setUpdateTime(System.currentTimeMillis());
return
updateById
(
entity
);
}
return
false
;
}
@Override
public
boolean
updateUserOrgRole
(
String
userId
,
String
orgId
,
Integer
roleType
)
{
LambdaQueryWrapper
<
UserOrgEntity
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
UserOrgEntity:
:
getUserId
,
userId
)
.
eq
(
UserOrgEntity:
:
getOrgId
,
orgId
);
UserOrgEntity
entity
=
getOne
(
queryWrapper
);
if
(
entity
!=
null
)
{
entity
.
setRoleType
(
roleType
);
// entity.setUpdateTime(System.currentTimeMillis());
// 设置更新者信息
entity
.
setUpdaterId
(
SecurityUtils
.
getUserId
());
entity
.
setUpdaterName
(
SecurityUtils
.
getUsername
());
return
updateById
(
entity
);
}
return
false
;
}
}
sample/src/main/java/com/dji/sample/manage/service/impl/UserServiceImpl.java
View file @
d0878a67
...
...
@@ -13,13 +13,16 @@ import com.dji.sample.common.util.JwtUtil;
import
com.dji.sample.common.util.SecurityUtils
;
import
com.dji.sample.component.mqtt.config.MqttPropertyConfiguration
;
import
com.dji.sample.manage.dao.IUserMapper
;
import
com.dji.sample.manage.model.dto.UserDTO
;
import
com.dji.sample.manage.model.dto.UserListDTO
;
import
com.dji.sample.manage.model.dto.WorkspaceDTO
;
import
com.dji.sample.manage.model.dto.*
;
import
com.dji.sample.manage.model.entity.OrgEntity
;
import
com.dji.sample.manage.model.entity.UserEntity
;
import
com.dji.sample.manage.model.entity.UserOrgEntity
;
import
com.dji.sample.manage.model.entity.WorkspaceEntity
;
import
com.dji.sample.manage.model.enums.RoleTypeEnum
;
import
com.dji.sample.manage.model.enums.UserTypeEnum
;
import
com.dji.sample.manage.model.param.searchParam.UserSearchParam
;
import
com.dji.sample.manage.service.IOrgService
;
import
com.dji.sample.manage.service.IUserOrgService
;
import
com.dji.sample.manage.service.IUserService
;
import
com.dji.sample.manage.service.IWorkspaceService
;
import
com.dji.sdk.common.HttpResultResponse
;
...
...
@@ -54,6 +57,11 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, UserEntity> implem
private
MqttPropertyConfiguration
mqttPropertyConfiguration
;
@Autowired
private
IOrgService
orgService
;
@Autowired
private
IUserOrgService
userOrgService
;
@Autowired
private
IWorkspaceService
workspaceService
;
@Override
...
...
@@ -72,6 +80,108 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, UserEntity> implem
return
HttpResultResponse
.
success
(
user
);
}
/**
* Verify the username and password to log in.
* @param loginDTO
* @return
*/
@Override
public
HttpResultResponse
userLogin
(
UserLoginDTO
loginDTO
)
{
String
username
=
loginDTO
.
getUsername
();
Integer
flag
=
loginDTO
.
getFlag
();
String
password
=
loginDTO
.
getPassword
();
String
orgId
=
loginDTO
.
getOrgId
();
String
orgName
=
loginDTO
.
getOrgName
();
if
(!
StringUtils
.
hasText
(
loginDTO
.
getOrgId
())
&&
!
StringUtils
.
hasText
(
loginDTO
.
getOrgName
()))
{
orgId
=
"123456"
;
}
// check user
UserEntity
userEntity
=
this
.
getUserByUsername
(
username
);
if
(
userEntity
==
null
)
{
return
new
HttpResultResponse
()
.
setCode
(
HttpStatus
.
UNAUTHORIZED
.
value
())
.
setMessage
(
"invalid username"
);
}
// 修改逻辑 跳过web判定
if
(
flag
!=
UserTypeEnum
.
WEB
.
getVal
())
{
if
(
flag
.
intValue
()
!=
userEntity
.
getUserType
().
intValue
())
{
return
HttpResultResponse
.
error
(
"The account type does not match."
);
}
}
// 密码加密验证
// if (!password.equals(userEntity.getPassword())) {
if
(!
SecurityUtils
.
matchesPassword
(
password
,
userEntity
.
getPassword
()))
{
return
new
HttpResultResponse
()
.
setCode
(
HttpStatus
.
UNAUTHORIZED
.
value
())
.
setMessage
(
"invalid password"
);
}
Optional
<
WorkspaceDTO
>
workspaceOpt
=
workspaceService
.
getWorkspaceByWorkspaceId
(
userEntity
.
getWorkspaceId
());
if
(
workspaceOpt
.
isEmpty
())
{
return
new
HttpResultResponse
()
.
setCode
(
HttpStatus
.
UNAUTHORIZED
.
value
())
.
setMessage
(
"invalid workspace id"
);
}
// 查询 org
LambdaQueryWrapper
<
OrgEntity
>
orgQueryWrapper
=
new
LambdaQueryWrapper
<>();
orgQueryWrapper
.
eq
(
OrgEntity:
:
getWorkspaceId
,
userEntity
.
getWorkspaceId
());
if
(
StringUtils
.
hasText
(
orgId
))
{
orgQueryWrapper
.
eq
(
OrgEntity:
:
getOrgId
,
orgId
);
}
else
if
(
StringUtils
.
hasText
(
orgName
))
{
orgQueryWrapper
.
eq
(
OrgEntity:
:
getOrgName
,
orgName
);
}
else
{
return
new
HttpResultResponse
()
.
setCode
(
HttpStatus
.
UNAUTHORIZED
.
value
())
.
setMessage
(
"invalid org info"
);
}
List
<
OrgEntity
>
orgEntityList
=
orgService
.
list
(
orgQueryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
orgEntityList
))
{
return
new
HttpResultResponse
()
.
setCode
(
HttpStatus
.
UNAUTHORIZED
.
value
())
.
setMessage
(
"invalid org id"
);
}
OrgEntity
orgEntity
=
orgEntityList
.
get
(
0
);
// 查询权限
Integer
roleType
;
// 系统管理员
if
(
userEntity
.
getRoleType
()
!=
null
&&
userEntity
.
getRoleType
()
==
RoleTypeEnum
.
SYS_ADMIN
.
getVal
())
{
roleType
=
userEntity
.
getRoleType
();
}
else
{
// 团队权限
LambdaQueryWrapper
<
UserOrgEntity
>
userOrgWrapper
=
new
LambdaQueryWrapper
<>();
userOrgWrapper
.
eq
(
UserOrgEntity:
:
getUserId
,
userEntity
.
getUserId
());
userOrgWrapper
.
eq
(
UserOrgEntity:
:
getOrgId
,
orgEntity
.
getOrgId
());
List
<
UserOrgEntity
>
userOrgEntityList
=
userOrgService
.
list
(
userOrgWrapper
);
if
(
CollectionUtils
.
isEmpty
(
userOrgEntityList
))
{
return
new
HttpResultResponse
()
.
setCode
(
HttpStatus
.
UNAUTHORIZED
.
value
())
.
setMessage
(
"invalid org role"
);
}
UserOrgEntity
userOrgEntity
=
userOrgEntityList
.
get
(
0
);
roleType
=
userOrgEntity
.
getRoleType
();
}
// 创建token
CustomClaim
customClaim
=
new
CustomClaim
(
userEntity
.
getUserId
(),
userEntity
.
getUsername
(),
userEntity
.
getUserType
(),
roleType
,
workspaceOpt
.
get
().
getWorkspaceId
(),
orgEntity
.
getOrgId
());
// create token
String
token
=
JwtUtil
.
createToken
(
customClaim
.
convertToMap
());
UserDTO
userDTO
=
entityConvertToDTO
(
userEntity
);
userDTO
.
setMqttAddr
(
MqttPropertyConfiguration
.
getBasicMqttAddress
());
userDTO
.
setAccessToken
(
token
);
userDTO
.
setWorkspaceId
(
workspaceOpt
.
get
().
getWorkspaceId
());
userDTO
.
setRoleType
(
roleType
);
userDTO
.
setOrgId
(
orgEntity
.
getOrgId
());
return
HttpResultResponse
.
success
(
userDTO
);
}
@Override
public
HttpResultResponse
userLogin
(
String
username
,
String
password
,
Integer
flag
)
{
// check user
...
...
@@ -106,7 +216,7 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, UserEntity> implem
CustomClaim
customClaim
=
new
CustomClaim
(
userEntity
.
getUserId
(),
userEntity
.
getUsername
(),
userEntity
.
getUserType
(),
userEntity
.
getRoleType
(),
workspaceOpt
.
get
().
getWorkspaceId
());
workspaceOpt
.
get
().
getWorkspaceId
()
,
null
);
// create token
String
token
=
JwtUtil
.
createToken
(
customClaim
.
convertToMap
());
...
...
@@ -141,9 +251,68 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, UserEntity> implem
}
user
.
setWorkspaceId
(
customClaim
.
getWorkspaceId
());
user
.
setAccessToken
(
refreshToken
);
user
.
setRoleType
(
customClaim
.
getRoleType
());
user
.
setOrgId
(
customClaim
.
getOrgId
());
return
Optional
.
of
(
user
);
}
/**
* Create a user object containing a new token.
* @param token
* @return
*/
@Override
public
Optional
<
UserDTO
>
changeOrgRefreshToken
(
String
token
,
String
orgId
)
{
if
(!
StringUtils
.
hasText
(
token
))
{
return
Optional
.
empty
();
}
if
(!
StringUtils
.
hasText
(
orgId
))
{
return
Optional
.
empty
();
}
CustomClaim
customClaim
;
try
{
DecodedJWT
jwt
=
JwtUtil
.
verifyToken
(
token
);
customClaim
=
new
CustomClaim
(
jwt
.
getClaims
());
}
catch
(
TokenExpiredException
e
)
{
customClaim
=
new
CustomClaim
(
JWT
.
decode
(
token
).
getClaims
());
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
Optional
.
empty
();
}
// 查询权限
Integer
roleType
;
// 组织 验证
customClaim
.
setOrgId
(
orgId
);
if
(
customClaim
.
getRoleType
()
==
RoleTypeEnum
.
SYS_ADMIN
.
getVal
())
{
roleType
=
customClaim
.
getRoleType
();
}
else
{
// 查询团队权限
LambdaQueryWrapper
<
UserOrgEntity
>
userOrgWrapper
=
new
LambdaQueryWrapper
<>();
userOrgWrapper
.
eq
(
UserOrgEntity:
:
getUserId
,
customClaim
.
getId
());
userOrgWrapper
.
eq
(
UserOrgEntity:
:
getOrgId
,
orgId
);
List
<
UserOrgEntity
>
userOrgEntityList
=
userOrgService
.
list
(
userOrgWrapper
);
if
(
CollectionUtils
.
isEmpty
(
userOrgEntityList
))
{
throw
new
RuntimeException
(
"invalid org role"
);
}
UserOrgEntity
userOrgEntity
=
userOrgEntityList
.
get
(
0
);
roleType
=
userOrgEntity
.
getRoleType
();
customClaim
.
setRoleType
(
roleType
);
}
String
refreshToken
=
JwtUtil
.
createToken
(
customClaim
.
convertToMap
());
UserDTO
user
=
entityConvertToDTO
(
this
.
getUserByUsername
(
customClaim
.
getUsername
()));
if
(
Objects
.
isNull
(
user
))
{
return
Optional
.
empty
();
}
user
.
setWorkspaceId
(
customClaim
.
getWorkspaceId
());
user
.
setAccessToken
(
refreshToken
);
user
.
setRoleType
(
roleType
);
user
.
setOrgId
(
orgId
);
return
Optional
.
of
(
user
);
}
@Override
public
PaginationData
<
UserListDTO
>
getUsersByWorkspaceId
(
long
page
,
long
pageSize
,
String
workspaceId
)
{
Page
<
UserEntity
>
userEntityPage
=
mapper
.
selectPage
(
...
...
@@ -157,6 +326,60 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, UserEntity> implem
return
new
PaginationData
<>(
usersList
,
new
Pagination
(
userEntityPage
.
getCurrent
(),
userEntityPage
.
getSize
(),
userEntityPage
.
getTotal
()));
}
/**
* Query information about all users.
* @param workspaceId uuid
* @return
*/
@Override
public
PaginationData
<
UserListDTO
>
getUsers
(
UserSearchParam
param
,
String
workspaceId
,
long
page
,
long
pageSize
)
{
LambdaQueryWrapper
<
UserEntity
>
userQueryWrapper
=
new
LambdaQueryWrapper
<>();
userQueryWrapper
.
eq
(
UserEntity:
:
getWorkspaceId
,
workspaceId
);
// 查询指定 团队的人员
if
(
StringUtils
.
hasText
(
param
.
getOrgId
()))
{
// 需要增加限制
LambdaQueryWrapper
<
UserOrgEntity
>
userOrgQueryWrapper
=
new
LambdaQueryWrapper
<>();
userOrgQueryWrapper
.
eq
(
UserOrgEntity:
:
getWorkspaceId
,
workspaceId
);
userOrgQueryWrapper
.
eq
(
UserOrgEntity:
:
getOrgId
,
param
.
getOrgId
());
List
<
UserOrgEntity
>
userOrgEntities
=
userOrgService
.
list
(
userOrgQueryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
userOrgEntities
))
{
return
new
PaginationData
<>();
}
List
<
String
>
userOrgUserIdList
=
userOrgEntities
.
stream
().
map
(
UserOrgEntity:
:
getUserId
).
distinct
().
collect
(
Collectors
.
toList
());
if
(
CollectionUtils
.
isEmpty
(
userOrgUserIdList
))
{
return
new
PaginationData
<>();
}
userQueryWrapper
.
in
(
UserEntity:
:
getUserId
,
userOrgUserIdList
);
}
else
{
// 假如不是 系统管理员 只能查询自己团队的用户
if
(
aboveSysAdminRole
())
{
}
else
{
String
orgId
=
getOrgId
();
LambdaQueryWrapper
<
UserOrgEntity
>
userOrgQueryWrapper
=
new
LambdaQueryWrapper
<>();
userOrgQueryWrapper
.
eq
(
UserOrgEntity:
:
getWorkspaceId
,
workspaceId
);
userOrgQueryWrapper
.
eq
(
UserOrgEntity:
:
getOrgId
,
orgId
);
List
<
UserOrgEntity
>
userOrgEntities
=
userOrgService
.
list
(
userOrgQueryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
userOrgEntities
))
{
return
new
PaginationData
<>();
}
List
<
String
>
userOrgUserIdList
=
userOrgEntities
.
stream
().
map
(
UserOrgEntity:
:
getUserId
).
distinct
().
collect
(
Collectors
.
toList
());
if
(
CollectionUtils
.
isEmpty
(
userOrgUserIdList
))
{
return
new
PaginationData
<>();
}
userQueryWrapper
.
in
(
UserEntity:
:
getUserId
,
userOrgUserIdList
);
}
}
Page
<
UserEntity
>
userEntityPage
=
this
.
page
(
new
Page
<>(
page
,
pageSize
),
userQueryWrapper
);
List
<
UserListDTO
>
usersList
=
userEntityPage
.
getRecords
()
.
stream
()
.
map
(
this
::
entity2UserListDTO
)
.
collect
(
Collectors
.
toList
());
return
new
PaginationData
<>(
usersList
,
new
Pagination
(
userEntityPage
.
getCurrent
(),
userEntityPage
.
getSize
(),
userEntityPage
.
getTotal
()));
}
@Override
public
Boolean
updateUser
(
String
workspaceId
,
String
userId
,
UserListDTO
user
)
{
UserEntity
userEntity
=
mapper
.
selectOne
(
...
...
@@ -202,7 +425,7 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, UserEntity> implem
// throw new RuntimeException("Failed to delete admin");
// }
// 然后 假如是删除管理员 不能删除 项目管理员
if
(
userEntity
.
getRoleType
()
==
RoleTypeEnum
.
PROJECT
_ADMIN
.
getVal
())
{
if
(
userEntity
.
getRoleType
()
==
RoleTypeEnum
.
ORG
_ADMIN
.
getVal
())
{
throw
new
RuntimeException
(
"can't delete workspace project admin"
);
}
if
(
userEntity
.
getRoleType
()
==
RoleTypeEnum
.
ADMIN
.
getVal
())
{
...
...
@@ -215,6 +438,13 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, UserEntity> implem
}
int
delete
=
mapper
.
delete
(
queryWrapper
);
// 删除相关用户组织表
LambdaQueryWrapper
<
UserOrgEntity
>
userOrgQueryWrapper
=
new
LambdaQueryWrapper
<>();
userOrgQueryWrapper
.
eq
(
UserOrgEntity:
:
getUserId
,
userEntity
.
getUserId
());
userOrgQueryWrapper
.
eq
(
UserOrgEntity:
:
getWorkspaceId
,
userEntity
.
getWorkspaceId
());
boolean
userOrgDelRes
=
userOrgService
.
remove
(
userOrgQueryWrapper
);
return
delete
>
0
;
}
...
...
@@ -257,6 +487,22 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, UserEntity> implem
userEntity
.
setWorkspaceId
(
workspaceId
);
int
insert
=
this
.
mapper
.
insert
(
userEntity
);
// 增加用户权限
UserOrgEntity
userOrgEntity
=
new
UserOrgEntity
();
userOrgEntity
.
setWorkspaceId
(
workspaceId
);
userOrgEntity
.
setOrgId
(
getOrgId
());
userOrgEntity
.
setUserId
(
userEntity
.
getUserId
());
userOrgEntity
.
setRoleType
(
user
.
getRoleType
()
!=
null
?
user
.
getRoleType
()
:
RoleTypeEnum
.
MEMBER
.
getVal
());
// private Integer status;
userOrgEntity
.
setCreatorId
(
getUserId
());
userOrgEntity
.
setCreatorName
(
getUsername
());
userOrgEntity
.
setCreateTime
(
System
.
currentTimeMillis
());
userOrgEntity
.
setUpdaterId
(
getUserId
());
userOrgEntity
.
setUpdaterName
(
getUsername
());
userOrgEntity
.
setUpdateTime
(
System
.
currentTimeMillis
());
boolean
userOrgSaveRes
=
userOrgService
.
save
(
userOrgEntity
);
return
insert
>
0
;
}
...
...
@@ -292,6 +538,41 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, UserEntity> implem
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
UserEntity
addOrgAdminUser
(
UserEntity
user
)
{
// 系统管理员才能创建
aboveSysAdminRoleAndThrowError
();
// 判断用户是否存在 用户存在直接返回
// 用户名不能重复
String
username
=
user
.
getUsername
();
LambdaQueryWrapper
<
UserEntity
>
userQueryWrapper
=
new
LambdaQueryWrapper
<>();
userQueryWrapper
.
eq
(
UserEntity:
:
getUsername
,
username
);
// userQueryWrapper.eq(UserEntity::getWorkspaceId, user.getWorkspaceId());
List
<
UserEntity
>
nameUserList
=
this
.
list
(
userQueryWrapper
);
if
(!
CollectionUtils
.
isEmpty
(
nameUserList
))
{
// throw new RuntimeException("the username is already existed");
return
nameUserList
.
get
(
0
);
}
UserEntity
userEntity
=
new
UserEntity
();
userEntity
.
setUserType
(
UserTypeEnum
.
WEB
.
getVal
());
// userEntity.setRoleType(RoleTypeEnum.ADMIN.getVal());
userEntity
.
setUserId
(
UUID
.
randomUUID
().
toString
());
userEntity
.
setPassword
(
SecurityUtils
.
encryptPassword
(
user
.
getPassword
()));
userEntity
.
setUsername
(
user
.
getUsername
());
userEntity
.
setWorkspaceId
(
user
.
getWorkspaceId
());
boolean
save
=
this
.
save
(
userEntity
);
return
userEntity
;
}
/**
* Convert database entity objects into user data transfer object.
* @param entity
...
...
sample/src/main/java/com/dji/sample/wayline/model/dto/WaylineFileDTO.java
View file @
d0878a67
...
...
@@ -51,4 +51,6 @@ public class WaylineFileDTO {
@JsonAlias
(
"isDir"
)
private
Integer
isDir
;
private
String
orgId
;
}
sample/src/main/java/com/dji/sample/wayline/model/dto/WaylineFileTreeVO.java
View file @
d0878a67
...
...
@@ -53,4 +53,6 @@ public class WaylineFileTreeVO {
private
List
<
WaylineFileTreeVO
>
children
;
private
String
orgId
;
}
sample/src/main/java/com/dji/sample/wayline/model/dto/WaylineJobDTO.java
View file @
d0878a67
...
...
@@ -87,4 +87,6 @@ public class WaylineJobDTO {
@CloudSDKVersion
(
since
=
CloudSDKVersionEnum
.
V1_0_0
)
private
SimulateMission
simulateMission
;
private
String
orgId
;
}
sample/src/main/java/com/dji/sample/wayline/model/entity/WaylineFileEntity.java
View file @
d0878a67
...
...
@@ -74,4 +74,8 @@ public class WaylineFileEntity implements Serializable {
// @TableLogic
@TableField
(
"is_deleted"
)
private
Boolean
isDeleted
;
@TableField
(
"org_id"
)
private
String
orgId
;
}
sample/src/main/java/com/dji/sample/wayline/model/entity/WaylineJobEntity.java
View file @
d0878a67
...
...
@@ -89,4 +89,10 @@ public class WaylineJobEntity implements Serializable {
@TableField
(
"task_scene"
)
private
Integer
taskScene
;
/**
* orgId
*/
@TableField
(
"org_id"
)
private
String
orgId
;
}
sample/src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java
View file @
d0878a67
...
...
@@ -48,4 +48,7 @@ public class CreateJobParam {
private
List
<
Long
>
taskDays
;
private
List
<
List
<
Long
>>
taskPeriods
;
private
String
orgId
;
}
sample/src/main/java/com/dji/sample/wayline/model/param/WaylineJobSearchParam.java
View file @
d0878a67
...
...
@@ -26,4 +26,7 @@ public class WaylineJobSearchParam {
@JsonProperty
(
"job_ids"
)
private
String
jobIds
;
@JsonProperty
(
"org_id"
)
private
String
orgId
;
}
sample/src/main/java/com/dji/sample/wayline/service/impl/WaylineFileServiceImpl.java
View file @
d0878a67
...
...
@@ -48,6 +48,8 @@ import java.util.stream.Collectors;
import
java.util.zip.ZipEntry
;
import
java.util.zip.ZipInputStream
;
import
static
com
.
dji
.
sample
.
common
.
util
.
SecurityUtils
.
aboveSysAdminRole
;
import
static
com
.
dji
.
sample
.
common
.
util
.
SecurityUtils
.
getOrgId
;
import
static
com
.
dji
.
sample
.
wayline
.
model
.
dto
.
KmzFileProperties
.
WAYLINE_FILE_SUFFIX
;
/**
...
...
@@ -67,31 +69,40 @@ public class WaylineFileServiceImpl extends ServiceImpl<IWaylineFileMapper, Wayl
@Override
public
PaginationData
<
GetWaylineListResponse
>
getWaylinesByParam
(
String
workspaceId
,
GetWaylineListRequest
param
)
{
LambdaQueryWrapper
<
WaylineFileEntity
>
waylineFileaQueryWrapper
=
new
LambdaQueryWrapper
<
WaylineFileEntity
>();
if
(
aboveSysAdminRole
())
{
}
else
{
waylineFileaQueryWrapper
.
eq
(
WaylineFileEntity:
:
getOrgId
,
getOrgId
());
}
waylineFileaQueryWrapper
.
eq
(
WaylineFileEntity:
:
getIsDir
,
WaylineFileTypeEnum
.
FILE
.
getVal
())
.
eq
(
WaylineFileEntity:
:
getWorkspaceId
,
workspaceId
)
.
eq
(
Objects
.
nonNull
(
param
.
getFavorited
()),
WaylineFileEntity:
:
getFavorited
,
param
.
getFavorited
())
.
and
(
param
.
getTemplateType
()
!=
null
,
wrapper
->
{
for
(
WaylineTypeEnum
type
:
param
.
getTemplateType
())
{
wrapper
.
like
(
WaylineFileEntity:
:
getTemplateTypes
,
type
.
getValue
()).
or
();
}
})
.
and
(
param
.
getPayloadModelKey
()
!=
null
,
wrapper
->
{
for
(
DeviceEnum
type
:
param
.
getPayloadModelKey
())
{
wrapper
.
like
(
WaylineFileEntity:
:
getPayloadModelKeys
,
type
.
getType
()).
or
();
}
})
.
and
(
param
.
getDroneModelKeys
()
!=
null
,
wrapper
->
{
for
(
DeviceEnum
type
:
param
.
getDroneModelKeys
())
{
wrapper
.
eq
(
WaylineFileEntity:
:
getDroneModelKey
,
type
.
getType
()).
or
();
}
})
.
like
(
Objects
.
nonNull
(
param
.
getKey
()),
WaylineFileEntity:
:
getName
,
param
.
getKey
())
// There is a risk of SQL injection
.
last
(
Objects
.
nonNull
(
param
.
getOrderBy
()),
" order by "
+
param
.
getOrderBy
().
toString
());
// Paging Query
Page
<
WaylineFileEntity
>
page
=
mapper
.
selectPage
(
new
Page
<
WaylineFileEntity
>(
param
.
getPage
(),
param
.
getPageSize
()),
new
LambdaQueryWrapper
<
WaylineFileEntity
>()
.
eq
(
WaylineFileEntity:
:
getIsDir
,
WaylineFileTypeEnum
.
FILE
.
getVal
())
.
eq
(
WaylineFileEntity:
:
getWorkspaceId
,
workspaceId
)
.
eq
(
Objects
.
nonNull
(
param
.
getFavorited
()),
WaylineFileEntity:
:
getFavorited
,
param
.
getFavorited
())
.
and
(
param
.
getTemplateType
()
!=
null
,
wrapper
->
{
for
(
WaylineTypeEnum
type
:
param
.
getTemplateType
())
{
wrapper
.
like
(
WaylineFileEntity:
:
getTemplateTypes
,
type
.
getValue
()).
or
();
}
})
.
and
(
param
.
getPayloadModelKey
()
!=
null
,
wrapper
->
{
for
(
DeviceEnum
type
:
param
.
getPayloadModelKey
())
{
wrapper
.
like
(
WaylineFileEntity:
:
getPayloadModelKeys
,
type
.
getType
()).
or
();
}
})
.
and
(
param
.
getDroneModelKeys
()
!=
null
,
wrapper
->
{
for
(
DeviceEnum
type
:
param
.
getDroneModelKeys
())
{
wrapper
.
eq
(
WaylineFileEntity:
:
getDroneModelKey
,
type
.
getType
()).
or
();
}
})
.
like
(
Objects
.
nonNull
(
param
.
getKey
()),
WaylineFileEntity:
:
getName
,
param
.
getKey
())
// There is a risk of SQL injection
.
last
(
Objects
.
nonNull
(
param
.
getOrderBy
()),
" order by "
+
param
.
getOrderBy
().
toString
()));
new
Page
<>(
param
.
getPage
(),
param
.
getPageSize
()),
waylineFileaQueryWrapper
);
// Wrap the results of a paging query into a custom paging object.
List
<
GetWaylineListResponse
>
records
=
page
.
getRecords
()
...
...
@@ -144,6 +155,7 @@ public class WaylineFileServiceImpl extends ServiceImpl<IWaylineFileMapper, Wayl
WaylineFileEntity
file
=
this
.
dtoConvertToEntity
(
metadata
);
file
.
setWaylineId
(
UUID
.
randomUUID
().
toString
());
file
.
setWorkspaceId
(
workspaceId
);
file
.
setOrgId
(
getOrgId
());
if
(!
StringUtils
.
hasText
(
file
.
getSign
()))
{
try
(
InputStream
object
=
ossService
.
getObject
(
OssConfiguration
.
bucket
,
metadata
.
getObjectKey
()))
{
...
...
@@ -301,6 +313,7 @@ public class WaylineFileServiceImpl extends ServiceImpl<IWaylineFileMapper, Wayl
dir
.
setIsDir
(
WaylineFileTypeEnum
.
DIRECTORY
.
getVal
());
dir
.
setWaylineId
(
UUID
.
randomUUID
().
toString
());
dir
.
setWorkspaceId
(
workspaceId
);
dir
.
setOrgId
(
getOrgId
());
int
insertId
=
mapper
.
insert
(
dir
);
...
...
@@ -335,6 +348,12 @@ public class WaylineFileServiceImpl extends ServiceImpl<IWaylineFileMapper, Wayl
fileQueryWrapper
.
like
(
WaylineFileEntity:
:
getAncestors
,
rootId
);
fileQueryWrapper
.
eq
(
WaylineFileEntity:
:
getIsDir
,
WaylineFileTypeEnum
.
DIRECTORY
.
getVal
());
if
(
aboveSysAdminRole
())
{
}
else
{
// 只能 查看自己团队的 航线
fileQueryWrapper
.
eq
(
WaylineFileEntity:
:
getOrgId
,
getOrgId
());
}
List
<
WaylineFileEntity
>
waylineFiles
=
mapper
.
selectList
(
fileQueryWrapper
);
return
getWaylineFileTree
(
waylineFiles
,
rootId
);
...
...
@@ -480,6 +499,7 @@ public class WaylineFileServiceImpl extends ServiceImpl<IWaylineFileMapper, Wayl
.
name
(
file
.
getName
())
.
username
(
file
.
getUsername
())
.
objectKey
(
file
.
getObjectKey
())
.
orgId
(
file
.
getOrgId
())
// Separate multiple payload data with ",".
.
payloadModelKeys
(
String
.
join
(
","
,
file
.
getPayloadModelKeys
()))
.
templateTypes
(
file
.
getTemplateTypes
().
stream
()
...
...
@@ -509,6 +529,7 @@ public class WaylineFileServiceImpl extends ServiceImpl<IWaylineFileMapper, Wayl
.
name
(
file
.
getName
())
.
username
(
file
.
getUsername
())
.
objectKey
(
file
.
getObjectKey
())
.
orgId
(
file
.
getOrgId
())
// Separate multiple payload data with ",".
// .payloadModelKeys(String.join(",", file.getPayloadModelKeys()))
// .templateTypes(file.getTemplateTypes().stream()
...
...
@@ -649,6 +670,12 @@ public class WaylineFileServiceImpl extends ServiceImpl<IWaylineFileMapper, Wayl
public
PaginationData
<
GetWaylineListResponse
>
getWaylinesByParam
(
String
workspaceId
,
String
parentId
,
GetWaylineListRequest
param
)
{
// Paging Query
LambdaQueryWrapper
<
WaylineFileEntity
>
waylineFileQueryWrapper
=
new
LambdaQueryWrapper
<>();
if
(
aboveSysAdminRole
())
{
}
else
{
waylineFileQueryWrapper
.
eq
(
WaylineFileEntity:
:
getOrgId
,
getOrgId
());
}
waylineFileQueryWrapper
.
eq
(
WaylineFileEntity:
:
getIsDir
,
WaylineFileTypeEnum
.
FILE
.
getVal
())
.
eq
(
WaylineFileEntity:
:
getWorkspaceId
,
workspaceId
)
.
eq
(
Objects
.
nonNull
(
param
.
getFavorited
()),
WaylineFileEntity:
:
getFavorited
,
param
.
getFavorited
());
...
...
@@ -689,6 +716,13 @@ public class WaylineFileServiceImpl extends ServiceImpl<IWaylineFileMapper, Wayl
public
PaginationData
<
GetWaylineListResponse
>
getWaylinesByParam
(
WaylineSearchParam
param
,
String
workspaceId
,
GetWaylineListRequest
request
)
{
// Paging Query
LambdaQueryWrapper
<
WaylineFileEntity
>
waylineFileQueryWrapper
=
new
LambdaQueryWrapper
<>();
if
(
aboveSysAdminRole
())
{
}
else
{
waylineFileQueryWrapper
.
eq
(
WaylineFileEntity:
:
getOrgId
,
getOrgId
());
}
waylineFileQueryWrapper
.
eq
(
WaylineFileEntity:
:
getIsDir
,
WaylineFileTypeEnum
.
FILE
.
getVal
());
waylineFileQueryWrapper
.
eq
(
WaylineFileEntity:
:
getWorkspaceId
,
workspaceId
);
...
...
sample/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
View file @
d0878a67
...
...
@@ -57,6 +57,9 @@ import java.util.*;
import
java.util.List
;
import
java.util.stream.Collectors
;
import
static
com
.
dji
.
sample
.
common
.
util
.
SecurityUtils
.
aboveSysAdminRole
;
import
static
com
.
dji
.
sample
.
common
.
util
.
SecurityUtils
.
getOrgId
;
/**
* @author sean
* @version 1.1
...
...
@@ -113,6 +116,7 @@ public class WaylineJobServiceImpl extends ServiceImpl<IWaylineJobMapper, Waylin
.
fileId
(
param
.
getFileId
())
.
username
(
username
)
.
workspaceId
(
workspaceId
)
.
orgId
(
StringUtils
.
hasText
(
param
.
getOrgId
())
?
param
.
getOrgId
()
:
getOrgId
())
.
jobId
(
jobId
)
.
beginTime
(
beginTime
)
.
endTime
(
endTime
)
...
...
@@ -204,6 +208,15 @@ public class WaylineJobServiceImpl extends ServiceImpl<IWaylineJobMapper, Waylin
public
PaginationData
<
WaylineJobDTO
>
getJobsByParam
(
WaylineJobSearchParam
param
,
String
workspaceId
,
long
page
,
long
pageSize
)
{
LambdaQueryWrapper
<
WaylineJobEntity
>
waylineJobQueryWrapper
=
new
LambdaQueryWrapper
<>();
if
(
StringUtils
.
hasText
(
param
.
getOrgId
()))
{
waylineJobQueryWrapper
.
eq
(
WaylineJobEntity:
:
getOrgId
,
param
.
getOrgId
());
}
if
(
aboveSysAdminRole
())
{
}
else
{
waylineJobQueryWrapper
.
eq
(
WaylineJobEntity:
:
getOrgId
,
getOrgId
());
}
waylineJobQueryWrapper
.
eq
(
WaylineJobEntity:
:
getWorkspaceId
,
workspaceId
);
waylineJobQueryWrapper
.
orderByDesc
(
WaylineJobEntity:
:
getId
);
...
...
@@ -258,8 +271,13 @@ public class WaylineJobServiceImpl extends ServiceImpl<IWaylineJobMapper, Waylin
@Override
public
PaginationData
<
WaylineJobDTO
>
getTodayJobsByWorkspaceId
(
String
workspaceId
,
String
dockSns
,
long
page
,
long
pageSize
)
{
LambdaQueryWrapper
<
WaylineJobEntity
>
waylineJobQueryWrapper
=
new
LambdaQueryWrapper
<
WaylineJobEntity
>()
.
eq
(
WaylineJobEntity:
:
getWorkspaceId
,
workspaceId
)
LambdaQueryWrapper
<
WaylineJobEntity
>
waylineJobQueryWrapper
=
new
LambdaQueryWrapper
<>();
if
(
aboveSysAdminRole
())
{
}
else
{
waylineJobQueryWrapper
.
eq
(
WaylineJobEntity:
:
getOrgId
,
getOrgId
());
}
waylineJobQueryWrapper
.
eq
(
WaylineJobEntity:
:
getWorkspaceId
,
workspaceId
)
.
orderByDesc
(
WaylineJobEntity:
:
getId
);
if
(
StringUtils
.
hasText
(
dockSns
))
{
List
<
String
>
dockSnList
=
Arrays
.
asList
(
dockSns
.
split
(
","
));
...
...
@@ -314,6 +332,7 @@ public class WaylineJobServiceImpl extends ServiceImpl<IWaylineJobMapper, Waylin
.
fileId
(
dto
.
getFileId
())
.
dockSn
(
dto
.
getDockSn
())
.
workspaceId
(
dto
.
getWorkspaceId
())
.
orgId
(
dto
.
getOrgId
())
.
taskType
(
Optional
.
ofNullable
(
dto
.
getTaskType
()).
map
(
TaskTypeEnum:
:
getType
).
orElse
(
null
))
.
taskScene
(
Optional
.
ofNullable
(
dto
.
getTaskScene
()).
map
(
TaskSceneEnum:
:
getScene
).
orElse
(
null
))
.
waylineType
(
Optional
.
ofNullable
(
dto
.
getWaylineType
()).
map
(
WaylineTypeEnum:
:
getValue
).
orElse
(
null
))
...
...
@@ -366,6 +385,7 @@ public class WaylineJobServiceImpl extends ServiceImpl<IWaylineJobMapper, Waylin
.
orElse
(
DeviceDTO
.
builder
().
build
()).
getNickname
())
.
username
(
entity
.
getUsername
())
.
workspaceId
(
entity
.
getWorkspaceId
())
.
orgId
(
entity
.
getOrgId
())
.
status
(
WaylineJobStatusEnum
.
IN_PROGRESS
.
getVal
()
==
entity
.
getStatus
()
&&
entity
.
getJobId
().
equals
(
waylineRedisService
.
getPausedWaylineJobId
(
entity
.
getDockSn
()))
?
WaylineJobStatusEnum
.
PAUSED
.
getVal
()
:
entity
.
getStatus
())
...
...
@@ -482,6 +502,11 @@ public class WaylineJobServiceImpl extends ServiceImpl<IWaylineJobMapper, Waylin
endSecond
=
endSecond
*
1000
;
waylineJobQueryWrapper
.
between
(
WaylineJobEntity:
:
getBeginTime
,
startSecond
,
endSecond
);
waylineJobQueryWrapper
.
eq
(
WaylineJobEntity:
:
getWorkspaceId
,
workspaceId
);
if
(
aboveSysAdminRole
())
{
}
else
{
waylineJobQueryWrapper
.
eq
(
WaylineJobEntity:
:
getOrgId
,
getOrgId
());
}
List
<
WaylineJobEntity
>
waylineJobList
=
this
.
mapper
.
selectList
(
waylineJobQueryWrapper
);
...
...
@@ -655,6 +680,13 @@ public class WaylineJobServiceImpl extends ServiceImpl<IWaylineJobMapper, Waylin
public
void
exportTaskList
(
HttpServletResponse
response
,
String
workspaceId
)
{
// 模拟数据(根据传入参数过滤)
LambdaQueryWrapper
<
WaylineJobEntity
>
waylineJobQueryWrapper
=
new
LambdaQueryWrapper
<>();
waylineJobQueryWrapper
.
eq
(
WaylineJobEntity:
:
getWorkspaceId
,
workspaceId
);
if
(
aboveSysAdminRole
())
{
}
else
{
waylineJobQueryWrapper
.
eq
(
WaylineJobEntity:
:
getOrgId
,
getOrgId
());
}
List
<
WaylineJobEntity
>
list
=
this
.
list
();
// 创建 Excel
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment