refactor: 批量添加到工作空间 可以指定用户组
--story=1003798 --user=lyh 6.批量添加到工作空间/项目 可以指定用户组 https://www.tapd.cn/55049933/s/1064580
This commit is contained in:
parent
0401ec24fa
commit
0f40c075d4
|
@ -744,11 +744,56 @@ public class UserService {
|
|||
String batchType = request.getBatchType();
|
||||
if (StringUtils.equals(BatchProcessUserInfoType.ADD_PROJECT.name(), batchType)) {
|
||||
batchAddUserToProject(request);
|
||||
} else if (StringUtils.equals(BatchProcessUserInfoType.ADD_WORKSPACE.name(), batchType)) {
|
||||
batchAddUserToWorkspace(request);
|
||||
} else {
|
||||
batchAddUserGroup(request);
|
||||
}
|
||||
}
|
||||
|
||||
private void batchAddUserToWorkspace(UserBatchProcessRequest request) {
|
||||
List<String> userIds = this.selectIdByUserRequest(request);
|
||||
String toSetGroup = request.getSelectUserGroupId();
|
||||
if (StringUtils.isBlank(toSetGroup)) {
|
||||
MSException.throwException("batch add user to workspace error. group id is illegal");
|
||||
} else {
|
||||
// 验证用户组ID有效性
|
||||
GroupExample groupExample = new GroupExample();
|
||||
groupExample.createCriteria()
|
||||
.andIdEqualTo(toSetGroup)
|
||||
.andTypeEqualTo(UserGroupType.WORKSPACE);
|
||||
List<Group> groups = groupMapper.selectByExample(groupExample);
|
||||
if (CollectionUtils.isEmpty(groups)) {
|
||||
MSException.throwException("batch add user to workspace error. group id is illegal");
|
||||
}
|
||||
}
|
||||
|
||||
List<String> worksapceIds = request.getBatchProcessValue();
|
||||
for (String userId : userIds) {
|
||||
UserGroupExample userGroupExample = new UserGroupExample();
|
||||
userGroupExample
|
||||
.createCriteria()
|
||||
.andUserIdEqualTo(userId)
|
||||
.andGroupIdEqualTo(toSetGroup);
|
||||
List<UserGroup> userGroups = userGroupMapper.selectByExample(userGroupExample);
|
||||
List<String> exist = userGroups.stream().map(UserGroup::getSourceId).collect(Collectors.toList());
|
||||
worksapceIds.removeAll(exist);
|
||||
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
|
||||
UserGroupMapper mapper = sqlSession.getMapper(UserGroupMapper.class);
|
||||
for (String workspaceId : worksapceIds) {
|
||||
UserGroup userGroup = new UserGroup();
|
||||
userGroup.setId(UUID.randomUUID().toString());
|
||||
userGroup.setUserId(userId);
|
||||
userGroup.setGroupId(toSetGroup);
|
||||
userGroup.setSourceId(workspaceId);
|
||||
userGroup.setCreateTime(System.currentTimeMillis());
|
||||
userGroup.setUpdateTime(System.currentTimeMillis());
|
||||
mapper.insertSelective(userGroup);
|
||||
}
|
||||
sqlSession.flushStatements();
|
||||
}
|
||||
}
|
||||
|
||||
private void batchAddUserGroup(UserBatchProcessRequest request) {
|
||||
List<String> userIds = this.selectIdByUserRequest(request);
|
||||
// groupId+resourceId e.g. admin+none
|
||||
|
|
|
@ -99,6 +99,7 @@
|
|||
</el-dialog>
|
||||
<user-import ref="userImportDialog" @refreshAll="search"></user-import>
|
||||
<project-cascader :title="batchAddTitle" @confirm="cascaderConfirm" ref="cascaderDialog"></project-cascader>
|
||||
<workspace-cascader :title="addToWorkspaceTitle" @confirm="cascaderConfirm" ref="workspaceCascader"></workspace-cascader>
|
||||
<group-cascader :title="$t('user.add_user_group_batch')" @confirm="cascaderConfirm" ref="groupCascaderDialog"></group-cascader>
|
||||
<edit-user ref="editUser" @refresh="search"/>
|
||||
</div>
|
||||
|
@ -130,10 +131,12 @@ import EditUser from "@/business/components/settings/system/EditUser";
|
|||
import ProjectCascader from "@/business/components/settings/system/components/ProjectCascader";
|
||||
import GroupCascader from "@/business/components/settings/system/components/GroupCascader";
|
||||
import {logout} from "@/network/user";
|
||||
import WorkspaceCascader from "@/business/components/settings/system/components/WorkspaceCascader";
|
||||
|
||||
export default {
|
||||
name: "MsUser",
|
||||
components: {
|
||||
WorkspaceCascader,
|
||||
GroupCascader,
|
||||
EditUser,
|
||||
MsCreateBox,
|
||||
|
@ -170,6 +173,7 @@ export default {
|
|||
updatePath: '/user/special/update',
|
||||
editPasswordPath: '/user/special/password',
|
||||
batchAddTitle: this.$t('user.add_project_batch'),
|
||||
addToWorkspaceTitle: this.$t('user.add_workspace_batch'),
|
||||
result: {},
|
||||
currentUserId: '',
|
||||
createVisible: false,
|
||||
|
@ -200,6 +204,9 @@ export default {
|
|||
},
|
||||
{
|
||||
name: this.$t('user.add_user_group_batch'), handleClick: this.addUserGroupBatch
|
||||
},
|
||||
{
|
||||
name: this.$t('user.add_workspace_batch'), handleClick: this.addToWorkspaceBatch
|
||||
}
|
||||
],
|
||||
rule: {
|
||||
|
@ -444,6 +451,9 @@ export default {
|
|||
addToProjectBatch(){
|
||||
this.$refs.cascaderDialog.open();
|
||||
},
|
||||
addToWorkspaceBatch(){
|
||||
this.$refs.workspaceCascader.open();
|
||||
},
|
||||
addUserGroupBatch(){
|
||||
this.$refs.groupCascaderDialog.open();
|
||||
},
|
||||
|
@ -465,12 +475,22 @@ export default {
|
|||
});
|
||||
},
|
||||
cascaderRequestError(type) {
|
||||
type === "ADD_PROJECT" ? this.$refs.cascaderDialog.loading = false :
|
||||
if (type === "ADD_PROJECT") {
|
||||
this.$refs.cascaderDialog.loading = false;
|
||||
} else if (type === "ADD_WORKSPACE") {
|
||||
this.$refs.workspaceCascader.loading = false;
|
||||
} else {
|
||||
this.$refs.groupCascaderDialog.loading = false;
|
||||
}
|
||||
},
|
||||
cascaderClose(type) {
|
||||
type === "ADD_PROJECT" ? this.$refs.cascaderDialog.close() :
|
||||
if (type === "ADD_PROJECT") {
|
||||
this.$refs.cascaderDialog.close();
|
||||
} else if (type === "ADD_WORKSPACE") {
|
||||
this.$refs.workspaceCascader.close();
|
||||
} else {
|
||||
this.$refs.groupCascaderDialog.close();
|
||||
}
|
||||
},
|
||||
buildBatchParam(param) {
|
||||
param.ids = Array.from(this.selectRows).map(row => row.id);
|
||||
|
|
|
@ -0,0 +1,162 @@
|
|||
<template>
|
||||
<el-dialog class="user-cascade" :title="title" :visible.sync="dialogVisible"
|
||||
@close="close" v-loading="loading">
|
||||
<div class="block">
|
||||
<el-select v-model="selectedUserGroup" clearable size="medium" style="width: 260px;"
|
||||
placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in workspaceUserGroups"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" style="margin-top: 5px;">
|
||||
<el-form-item prop="workspace" label-width="0px">
|
||||
<el-cascader-panel :props="props"
|
||||
popper-class="ms-cascade"
|
||||
v-model="selectedIds"
|
||||
ref="cascadeSelector"
|
||||
:key="isResourceShow"
|
||||
clearable>
|
||||
</el-cascader-panel>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<ms-dialog-footer
|
||||
@cancel="close()"
|
||||
@confirm="confirm()"/>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import ElUploadList from "element-ui/packages/upload/src/upload-list";
|
||||
import MsTableButton from '../../../../components/common/components/MsTableButton';
|
||||
import {listenGoBack, removeGoBackListener} from "@/common/js/utils";
|
||||
import MsDialogFooter from "@/business/components/common/components/MsDialogFooter";
|
||||
import {GROUP_WORKSPACE} from "@/common/js/constants";
|
||||
|
||||
export default {
|
||||
name: "WorkspaceCascader",
|
||||
components: {ElUploadList, MsTableButton, MsDialogFooter},
|
||||
data() {
|
||||
let validateSelect = (rule, value, callback) => {
|
||||
let checkNodes = this.$refs.cascadeSelector.getCheckedNodes(true);
|
||||
if (checkNodes.length === 0) {
|
||||
callback(new Error(this.$t('user.select_workspace').toString()));
|
||||
}
|
||||
callback();
|
||||
};
|
||||
const self = this
|
||||
return {
|
||||
ruleForm: {
|
||||
workspace: '',
|
||||
},
|
||||
rules: {
|
||||
workspace: [
|
||||
{validator: validateSelect, message: this.$t('user.select_workspace'), trigger: 'change'}
|
||||
],
|
||||
},
|
||||
selectedIds: [],
|
||||
selectedUserGroup: "",
|
||||
workspaceUserGroups: [],
|
||||
isResourceShow: 0,
|
||||
props: {
|
||||
multiple: true,
|
||||
lazy: true,
|
||||
value: 'id',
|
||||
label: 'name',
|
||||
lazyLoad(node, resolve) {
|
||||
const {level} = node;
|
||||
if (level === 0) {
|
||||
self.getWorkspace(resolve);
|
||||
} else {
|
||||
resolve([]);
|
||||
}
|
||||
}
|
||||
},
|
||||
dialogVisible: false,
|
||||
loading: false,
|
||||
};
|
||||
},
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getWorkspaceUserGroup();
|
||||
},
|
||||
methods: {
|
||||
close() {
|
||||
removeGoBackListener(this.close);
|
||||
this.loading = false;
|
||||
this.dialogVisible = false;
|
||||
this.selectedIds = [];
|
||||
++this.isResourceShow;
|
||||
this.$refs['ruleForm'].resetFields();
|
||||
},
|
||||
open() {
|
||||
listenGoBack(this.close);
|
||||
this.dialogVisible = true;
|
||||
this.rules.workspace[0].message = this.$t('user.select_workspace');
|
||||
},
|
||||
confirm() {
|
||||
if (!this.selectedUserGroup) {
|
||||
this.$warning(this.$t('user.select_workspace'));
|
||||
return;
|
||||
}
|
||||
this.$refs.ruleForm.validate((valid) => {
|
||||
if (valid) {
|
||||
let checkNodes = this.$refs.cascadeSelector.getCheckedNodes(true);
|
||||
let selectValueArr = [];
|
||||
for (let i = 0; i < checkNodes.length; i++) {
|
||||
selectValueArr.push(checkNodes[i].value);
|
||||
}
|
||||
this.$emit('confirm', 'ADD_WORKSPACE', selectValueArr, this.selectedUserGroup);
|
||||
this.loading = true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
getWorkspace(resolve) {
|
||||
this.$get("workspace/list/", res => {
|
||||
let data = res.data ? res.data : [];
|
||||
data.forEach(d => d.leaf = true);
|
||||
resolve(data);
|
||||
})
|
||||
},
|
||||
getWorkspaceUserGroup() {
|
||||
this.$post("/user/group/get", {type: GROUP_WORKSPACE}, (res) => {
|
||||
this.workspaceUserGroups = res.data ? res.data : [];
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
|
||||
<style scoped>
|
||||
.user-cascade >>> .el-dialog {
|
||||
width: 600px;
|
||||
}
|
||||
|
||||
.user-cascade >>> .el-dialog__body {
|
||||
padding: 5px 20px;
|
||||
}
|
||||
|
||||
/deep/ .el-form-item__content {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
/deep/ .el-cascader-menu__wrap {
|
||||
height: 300px;
|
||||
width: 560px;
|
||||
}
|
||||
</style>
|
|
@ -656,8 +656,10 @@ export default {
|
|||
},
|
||||
select_project: 'please select project',
|
||||
select_group: 'please select group',
|
||||
select_workspace: 'please select workspace',
|
||||
add_user_group_batch: 'Batch Add User Group',
|
||||
add_project_batch: 'Batch Add User To Project',
|
||||
add_workspace_batch: "Batch Add User To Workspace",
|
||||
add_project_batch_tip: 'Add a read-only user group for members by default (system)',
|
||||
},
|
||||
group: {
|
||||
|
|
|
@ -660,9 +660,11 @@ export default {
|
|||
add_user_role_batch: '批量添加角色',
|
||||
},
|
||||
select_project: '请选择项目',
|
||||
select_workspace: '请选择工作空间',
|
||||
select_group: '请选择用户组',
|
||||
add_user_group_batch: '批量添加用户组',
|
||||
add_project_batch: '批量添加到项目',
|
||||
add_workspace_batch: "批量添加到工作空间",
|
||||
add_project_batch_tip: '默认为成员添加只读用户组(系统)',
|
||||
},
|
||||
group: {
|
||||
|
|
|
@ -660,8 +660,10 @@ export default {
|
|||
},
|
||||
select_project: '請選擇項目',
|
||||
select_group: '請選擇用戶組',
|
||||
select_workspace: '請選擇工作空間',
|
||||
add_user_group_batch: '批量添加用戶組',
|
||||
add_project_batch: '批量添加到項目',
|
||||
add_workspace_batch: "批量添加到工作空間",
|
||||
add_project_batch_tip: '默認為成員添加只讀用戶組(系統)',
|
||||
},
|
||||
group: {
|
||||
|
|
Loading…
Reference in New Issue