refactor: 批量添加到工作空间 可以指定用户组

--story=1003798 --user=lyh 6.批量添加到工作空间/项目 可以指定用户组
https://www.tapd.cn/55049933/s/1064580
This commit is contained in:
shiziyuan9527 2021-11-05 17:02:37 +08:00 committed by 刘瑞斌
parent 0401ec24fa
commit 0f40c075d4
6 changed files with 235 additions and 2 deletions

View File

@ -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

View File

@ -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);

View File

@ -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>

View File

@ -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: {

View File

@ -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: {

View File

@ -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: {