【新增】机构过多后一个个添加麻烦,新增批量复制一批到另一个机构下的功能

This commit is contained in:
俞宝山
2025-12-24 11:33:14 +08:00
parent 5869bad091
commit 89ef7fe062
16 changed files with 502 additions and 9 deletions

View File

@@ -49,5 +49,9 @@ export default {
// 获取人员选择器 // 获取人员选择器
orgUserSelector(data) { orgUserSelector(data) {
return request('userSelector', data, 'get') return request('userSelector', data, 'get')
},
// 复制机构
orgCopy(data) {
return request('copy', data)
} }
} }

View File

@@ -22,10 +22,6 @@ export default {
orgPage(data) { orgPage(data) {
return request('page', data, 'get') return request('page', data, 'get')
}, },
// 获取组织列表
orgList(data) {
return request('list', data, 'get')
},
// 获取组织树 // 获取组织树
orgTree(data) { orgTree(data) {
return request('tree', data, 'get') return request('tree', data, 'get')
@@ -49,5 +45,9 @@ export default {
// 获取用户选择器 // 获取用户选择器
orgUserSelector(data) { orgUserSelector(data) {
return request('userSelector', data, 'get') return request('userSelector', data, 'get')
},
// 复制组织
orgCopy(params) {
return request('copy', params)
} }
} }

View File

@@ -72,7 +72,6 @@
:expand-row-by-click="true" :expand-row-by-click="true"
:loading="selectedTableListLoading" :loading="selectedTableListLoading"
bordered bordered
> >
<template #title> <template #title>
<span>已选择: {{ selectedData.length }}</span> <span>已选择: {{ selectedData.length }}</span>

View File

@@ -0,0 +1,109 @@
<template>
<xn-form-container title="批量复制机构" :width="550" :visible="visible" :destroy-on-close="true" @close="onClose">
<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
<a-form-item label="目标上级机构:" name="targetParentId">
<a-tree-select
v-model:value="formData.targetParentId"
class="xn-wd"
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
placeholder="请选择目标上级机构"
allow-clear
tree-default-expand-all
:tree-data="treeData"
:field-names="{
children: 'children',
label: 'name',
value: 'id'
}"
selectable="false"
tree-line
/>
<a-alert
class="mt-3"
message="温馨提示:批量复制将自动跳过同名机构;复制内容包含排序号、机构名称、分类;部门主管需重新指定。"
type="warning"
show-icon
/>
</a-form-item>
</a-form>
<template #footer>
<a-button class="xn-mr8" @click="onClose">关闭</a-button>
<a-button type="primary" :loading="submitLoading" @click="onSubmit">保存</a-button>
</template>
</xn-form-container>
</template>
<script setup name="bizOrgCopyForm">
import { required } from '@/utils/formRules'
import bizOrgApi from '@/api/biz/bizOrgApi'
import { message } from 'ant-design-vue'
// 定义emit事件
const emit = defineEmits({ successful: null })
// 默认是关闭状态
const visible = ref(false)
const formRef = ref()
// 表单数据
const formData = ref({})
// 定义机构元素
const treeData = ref([])
const submitLoading = ref(false)
// 选中的ID列表
const ids = ref([])
// 打开抽屉
const onOpen = (idParam) => {
visible.value = true
formData.value = {}
if (idParam) {
ids.value = idParam.map((item) => item.id)
}
// 获取机构树并加入顶级
bizOrgApi.orgTreeSelector().then((res) => {
treeData.value = [
{
id: '0',
parentId: '-1',
name: '顶级',
children: res
}
]
})
}
// 关闭抽屉
const onClose = () => {
visible.value = false
}
// 默认要校验的
const formRules = {
targetParentId: [required('请选择目标上级机构')]
}
// 验证并提交数据
const onSubmit = () => {
formRef.value
.validate()
.then(() => {
submitLoading.value = true
const param = {
ids: ids.value,
targetParentId: formData.value.targetParentId
}
bizOrgApi
.orgCopy(param)
.then(() => {
visible.value = false
message.success('复制成功')
emit('successful')
})
.finally(() => {
submitLoading.value = false
})
})
.catch(() => {})
}
// 调用这个函数将子组件的一些数据和方法暴露出去
defineExpose({
onOpen
})
</script>

View File

@@ -75,6 +75,14 @@
<template #icon><plus-outlined /></template> <template #icon><plus-outlined /></template>
新增 新增
</a-button> </a-button>
<xn-batch-button
v-if="hasPerm('bizOrgCopy')"
buttonName="批量复制"
icon="CopyOutlined"
:isPopconFirm="false"
:selectedRowKeys="selectedRowKeys"
@batchCallBack="copyBatchOrg"
/>
<xn-batch-button <xn-batch-button
v-if="hasPerm('bizOrgBatchDelete')" v-if="hasPerm('bizOrgBatchDelete')"
buttonName="批量删除" buttonName="批量删除"
@@ -101,6 +109,7 @@
</template> </template>
</XnResizablePanel> </XnResizablePanel>
<Form ref="formRef" @successful="tableRef.refresh()" /> <Form ref="formRef" @successful="tableRef.refresh()" />
<CopyForm ref="copyFormRef" @successful="tableRef.clearRefreshSelected()" />
</template> </template>
<script setup name="bizOrg"> <script setup name="bizOrg">
@@ -108,6 +117,7 @@
import { isEmpty } from 'lodash-es' import { isEmpty } from 'lodash-es'
import bizOrgApi from '@/api/biz/bizOrgApi' import bizOrgApi from '@/api/biz/bizOrgApi'
import Form from './form.vue' import Form from './form.vue'
import CopyForm from './copyForm.vue'
const columns = [ const columns = [
{ {
@@ -219,4 +229,9 @@
tableRef.value.clearRefreshSelected() tableRef.value.clearRefreshSelected()
}) })
} }
// 批量复制
const copyFormRef = ref()
const copyBatchOrg = (params) => {
copyFormRef.value.onOpen(params)
}
</script> </script>

View File

@@ -0,0 +1,109 @@
<template>
<xn-form-container title="批量复制组织" :width="550" :visible="visible" :destroy-on-close="true" @close="onClose">
<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
<a-form-item label="目标上级组织:" name="targetParentId">
<a-tree-select
v-model:value="formData.targetParentId"
class="xn-wd"
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
placeholder="请选择目标上级组织"
allow-clear
tree-default-expand-all
:tree-data="treeData"
:field-names="{
children: 'children',
label: 'name',
value: 'id'
}"
selectable="false"
tree-line
/>
<a-alert
class="mt-3"
message="温馨提示:批量复制将自动跳过同名组织;复制内容包含排序号、组织名称、分类;部门主管需重新指定。"
type="warning"
show-icon
/>
</a-form-item>
</a-form>
<template #footer>
<a-button class="xn-mr8" @click="onClose">关闭</a-button>
<a-button type="primary" :loading="submitLoading" @click="onSubmit">保存</a-button>
</template>
</xn-form-container>
</template>
<script setup name="orgCopyForm">
import { required } from '@/utils/formRules'
import orgApi from '@/api/sys/orgApi'
import { message } from 'ant-design-vue'
// 定义emit事件
const emit = defineEmits({ successful: null })
// 默认是关闭状态
const visible = ref(false)
const formRef = ref()
// 表单数据
const formData = ref({})
// 定义机构元素
const treeData = ref([])
const submitLoading = ref(false)
// 选中的ID列表
const ids = ref([])
// 打开抽屉
const onOpen = (idParam) => {
visible.value = true
formData.value = {}
if (idParam) {
ids.value = idParam.map((item) => item.id)
}
// 获取机构树并加入顶级
orgApi.orgOrgTreeSelector().then((res) => {
treeData.value = [
{
id: '0',
parentId: '-1',
name: '顶级',
children: res
}
]
})
}
// 关闭抽屉
const onClose = () => {
visible.value = false
}
// 默认要校验的
const formRules = {
targetParentId: [required('请选择目标上级组织')]
}
// 验证并提交数据
const onSubmit = () => {
formRef.value
.validate()
.then(() => {
submitLoading.value = true
const param = {
ids: ids.value,
targetParentId: formData.value.targetParentId
}
orgApi
.orgCopy(param)
.then(() => {
visible.value = false
message.success('复制成功')
emit('successful')
})
.finally(() => {
submitLoading.value = false
})
})
.catch(() => {})
}
// 调用这个函数将子组件的一些数据和方法暴露出去
defineExpose({
onOpen
})
</script>

View File

@@ -76,6 +76,13 @@
</template> </template>
新增 新增
</a-button> </a-button>
<xn-batch-button
buttonName="批量复制"
icon="CopyOutlined"
:isPopconFirm="false"
:selectedRowKeys="selectedRowKeys"
@batchCallBack="copyBatchOrg"
/>
<xn-batch-button <xn-batch-button
buttonName="批量删除" buttonName="批量删除"
icon="DeleteOutlined" icon="DeleteOutlined"
@@ -101,6 +108,7 @@
</template> </template>
</XnResizablePanel> </XnResizablePanel>
<Form ref="formRef" @successful="tableRef.refresh()" /> <Form ref="formRef" @successful="tableRef.refresh()" />
<CopyForm ref="copyFormRef" @successful="tableRef.clearRefreshSelected()" />
</template> </template>
<script setup name="sysOrg"> <script setup name="sysOrg">
@@ -108,6 +116,7 @@
import { isEmpty } from 'lodash-es' import { isEmpty } from 'lodash-es'
import orgApi from '@/api/sys/orgApi' import orgApi from '@/api/sys/orgApi'
import Form from './form.vue' import Form from './form.vue'
import CopyForm from './copyForm.vue'
const columns = [ const columns = [
{ {
@@ -147,6 +156,7 @@
// 定义tableDOM // 定义tableDOM
const tableRef = ref(null) const tableRef = ref(null)
const formRef = ref() const formRef = ref()
const copyFormRef = ref()
const searchFormRef = ref() const searchFormRef = ref()
const searchFormState = ref({}) const searchFormState = ref({})
// 默认展开的节点 // 默认展开的节点
@@ -216,4 +226,8 @@
tableRef.value.clearRefreshSelected() tableRef.value.clearRefreshSelected()
}) })
} }
// 批量复制
const copyBatchOrg = (params) => {
copyFormRef.value.onOpen(params)
}
</script> </script>

View File

@@ -143,6 +143,22 @@ public class BizOrgController {
return CommonResult.data(bizOrgService.detail(bizOrgIdParam)); return CommonResult.data(bizOrgService.detail(bizOrgIdParam));
} }
/**
* 复制机构
*
* @author yubaoshan
* @date 2025/12/24 01:30
*/
@ApiOperationSupport(order = 7)
@Operation(summary = "复制机构")
@CommonLog("复制机构")
@SaCheckPermission("/biz/org/copy")
@PostMapping("/biz/org/copy")
public CommonResult<String> copy(@RequestBody @Valid BizOrgCopyParam bizOrgCopyParam) {
bizOrgService.copy(bizOrgCopyParam);
return CommonResult.ok();
}
/* ====机构部分所需要用到的选择器==== */ /* ====机构部分所需要用到的选择器==== */
/** /**
@@ -151,7 +167,7 @@ public class BizOrgController {
* @author xuyuxiang * @author xuyuxiang
* @date 2022/4/24 20:00 * @date 2022/4/24 20:00
*/ */
@ApiOperationSupport(order = 7) @ApiOperationSupport(order = 8)
@Operation(summary = "获取机构树选择器") @Operation(summary = "获取机构树选择器")
@SaCheckPermission("/biz/org/orgTreeSelector") @SaCheckPermission("/biz/org/orgTreeSelector")
@GetMapping("/biz/org/orgTreeSelector") @GetMapping("/biz/org/orgTreeSelector")
@@ -165,7 +181,7 @@ public class BizOrgController {
* @author xuyuxiang * @author xuyuxiang
* @date 2022/4/24 20:00 * @date 2022/4/24 20:00
*/ */
@ApiOperationSupport(order = 8) @ApiOperationSupport(order = 9)
@Operation(summary = "获取人员选择器") @Operation(summary = "获取人员选择器")
@SaCheckPermission("/biz/org/userSelector") @SaCheckPermission("/biz/org/userSelector")
@GetMapping("/biz/org/userSelector") @GetMapping("/biz/org/userSelector")

View File

@@ -0,0 +1,42 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package vip.xiaonuo.biz.modular.org.param;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 机构复制参数
*
* @author yubaoshan
* @date 2025/12/24 01:30
**/
@Getter
@Setter
public class BizOrgCopyParam {
/** 目标父id */
@Schema(description = "目标父id")
@NotBlank(message = "targetParentId不能为空")
private String targetParentId;
/** 机构id集合 */
@Schema(description = "机构id集合")
@NotEmpty(message = "ids不能为空")
private List<String> ids;
}

View File

@@ -172,4 +172,12 @@ public interface BizOrgService extends IService<BizOrg> {
* @date 2022/4/24 20:08 * @date 2022/4/24 20:08
*/ */
Page<BizUser> userSelector(BizOrgSelectorUserParam bizOrgSelectorUserParam); Page<BizUser> userSelector(BizOrgSelectorUserParam bizOrgSelectorUserParam);
/**
* 复制机构
*
* @author yubaoshan
* @date 2025/12/24 01:30
*/
void copy(BizOrgCopyParam bizOrgCopyParam);
} }

View File

@@ -34,6 +34,7 @@ import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
import vip.xiaonuo.biz.core.enums.BizDataTypeEnum; import vip.xiaonuo.biz.core.enums.BizDataTypeEnum;
import vip.xiaonuo.biz.modular.org.entity.BizOrg; import vip.xiaonuo.biz.modular.org.entity.BizOrg;
import vip.xiaonuo.biz.modular.org.enums.BizOrgCategoryEnum; import vip.xiaonuo.biz.modular.org.enums.BizOrgCategoryEnum;
import vip.xiaonuo.biz.modular.org.enums.BizOrgSourceFromTypeEnum;
import vip.xiaonuo.biz.modular.org.mapper.BizOrgMapper; import vip.xiaonuo.biz.modular.org.mapper.BizOrgMapper;
import vip.xiaonuo.biz.modular.org.param.*; import vip.xiaonuo.biz.modular.org.param.*;
import vip.xiaonuo.biz.modular.org.service.BizOrgExtService; import vip.xiaonuo.biz.modular.org.service.BizOrgExtService;
@@ -395,6 +396,63 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
return bizUserService.page(CommonPageRequest.defaultPage(), queryWrapper.lambda()); return bizUserService.page(CommonPageRequest.defaultPage(), queryWrapper.lambda());
} }
@Transactional(rollbackFor = Exception.class)
@Override
public void copy(BizOrgCopyParam bizOrgCopyParam) {
// 获取目标父id
String targetParentId = bizOrgCopyParam.getTargetParentId();
// 获取机构id集合
List<String> orgIdList = bizOrgCopyParam.getIds();
if(ObjectUtil.isNotEmpty(orgIdList)) {
// 校验数据范围
List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
// 如果有数据范围限制则校验目标父id是否有权限
if(!loginUserDataScope.contains(targetParentId)) {
throw new CommonException("您没有权限在该机构下增加机构机构id{}", targetParentId);
}
// 再校验源ID权限
if(!new HashSet<>(loginUserDataScope).containsAll(orgIdList)) {
throw new CommonException("您没有权限复制这些机构机构id{}", orgIdList);
}
} else {
throw new CommonException("您没有权限复制机构");
}
// 遍历复制
orgIdList.forEach(orgId -> {
BizOrg bizOrg = this.getById(orgId);
if(ObjectUtil.isNotEmpty(bizOrg)) {
// 查询是否有重复名称
boolean repeatName = this.count(new LambdaQueryWrapper<BizOrg>()
.eq(BizOrg::getParentId, targetParentId)
.eq(BizOrg::getName, bizOrg.getName())) > 0;
// 如果有重复名称则跳过
if(!repeatName) {
BizOrg copyBizOrg = new BizOrg();
// 复制部分字段
copyBizOrg.setName(bizOrg.getName());
copyBizOrg.setCategory(bizOrg.getCategory());
copyBizOrg.setSortCode(bizOrg.getSortCode());
copyBizOrg.setExtJson(bizOrg.getExtJson());
// 设置父id
copyBizOrg.setParentId(targetParentId);
// 重新生成code
copyBizOrg.setCode(RandomUtil.randomString(10));
// 主管置空
copyBizOrg.setDirectorId(null);
// 保存
this.save(copyBizOrg);
// 插入扩展信息
bizOrgExtService.createExtInfo(copyBizOrg.getId(), BizOrgSourceFromTypeEnum.SYSTEM_ADD.getValue());
// 发布增加事件
CommonDataChangeEventCenter.doAddWithData(BizDataTypeEnum.ORG.getValue(), JSONUtil.createArray().put(copyBizOrg));
}
}
});
}
}
/* ====以下为各种递归方法==== */ /* ====以下为各种递归方法==== */
@Override @Override

View File

@@ -136,6 +136,21 @@ public class SysOrgController {
return CommonResult.data(sysOrgService.detail(sysOrgIdParam)); return CommonResult.data(sysOrgService.detail(sysOrgIdParam));
} }
/**
* 复制组织
*
* @author yubaoshan
* @date 2025/12/24 01:10
*/
@ApiOperationSupport(order = 7)
@Operation(summary = "复制组织")
@CommonLog("复制组织")
@PostMapping("/sys/org/copy")
public CommonResult<String> copy(@RequestBody @Valid SysOrgCopyParam sysOrgCopyParam) {
sysOrgService.copy(sysOrgCopyParam);
return CommonResult.ok();
}
/* ====组织部分所需要用到的选择器==== */ /* ====组织部分所需要用到的选择器==== */
/** /**
@@ -144,7 +159,7 @@ public class SysOrgController {
* @author xuyuxiang * @author xuyuxiang
* @date 2022/4/24 20:00 * @date 2022/4/24 20:00
*/ */
@ApiOperationSupport(order = 7) @ApiOperationSupport(order = 8)
@Operation(summary = "获取组织树选择器") @Operation(summary = "获取组织树选择器")
@GetMapping("/sys/org/orgTreeSelector") @GetMapping("/sys/org/orgTreeSelector")
public CommonResult<List<Tree<String>>> orgTreeSelector() { public CommonResult<List<Tree<String>>> orgTreeSelector() {
@@ -157,7 +172,7 @@ public class SysOrgController {
* @author xuyuxiang * @author xuyuxiang
* @date 2022/4/24 20:00 * @date 2022/4/24 20:00
*/ */
@ApiOperationSupport(order = 8) @ApiOperationSupport(order = 9)
@Operation(summary = "获取用户选择器") @Operation(summary = "获取用户选择器")
@GetMapping("/sys/org/userSelector") @GetMapping("/sys/org/userSelector")
public CommonResult<Page<SysUser>> userSelector(SysOrgSelectorUserParam sysOrgSelectorUserParam) { public CommonResult<Page<SysUser>> userSelector(SysOrgSelectorUserParam sysOrgSelectorUserParam) {

View File

@@ -0,0 +1,42 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package vip.xiaonuo.sys.modular.org.param;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 组织复制参数
*
* @author xuyuxiang
* @date 2022/8/15 14:32
**/
@Getter
@Setter
public class SysOrgCopyParam {
/** 目标父id */
@Schema(description = "目标父id")
@NotBlank(message = "targetParentId不能为空")
private String targetParentId;
/** 组织id集合 */
@Schema(description = "组织id集合")
@NotEmpty(message = "ids不能为空")
private List<String> ids;
}

View File

@@ -77,6 +77,14 @@ public interface SysOrgService extends IService<SysOrg> {
*/ */
SysOrg detail(SysOrgIdParam sysOrgIdParam); SysOrg detail(SysOrgIdParam sysOrgIdParam);
/**
* 复制组织
*
* @author yubaoshan
* @date 2025/12/24 01:10
*/
void copy(SysOrgCopyParam sysOrgCopyParam);
/** /**
* 获取组织详情 * 获取组织详情
* *

View File

@@ -205,6 +205,49 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
return this.queryEntity(sysOrgIdParam.getId()); return this.queryEntity(sysOrgIdParam.getId());
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void copy(SysOrgCopyParam sysOrgCopyParam) {
// 获取目标父id
String targetParentId = sysOrgCopyParam.getTargetParentId();
// 获取组织id集合
List<String> orgIdList = sysOrgCopyParam.getIds();
if(ObjectUtil.isNotEmpty(orgIdList)) {
// 遍历复制
orgIdList.forEach(orgId -> {
SysOrg sysOrg = this.getById(orgId);
if(ObjectUtil.isNotEmpty(sysOrg)) {
// 查询是否有重复名称
boolean repeatName = this.count(new LambdaQueryWrapper<SysOrg>()
.eq(SysOrg::getParentId, targetParentId)
.eq(SysOrg::getName, sysOrg.getName())) > 0;
// 如果有重复名称则跳过
if(!repeatName) {
SysOrg copySysOrg = new SysOrg();
// 复制部分字段
copySysOrg.setName(sysOrg.getName());
copySysOrg.setCategory(sysOrg.getCategory());
copySysOrg.setSortCode(sysOrg.getSortCode());
copySysOrg.setExtJson(sysOrg.getExtJson());
// 设置父id
copySysOrg.setParentId(targetParentId);
// 重新生成code
copySysOrg.setCode(RandomUtil.randomString(10));
// 主管置空
copySysOrg.setDirectorId(null);
// 保存
this.save(copySysOrg);
// 插入扩展信息
sysOrgExtService.createExtInfo(copySysOrg.getId(), SysOrgSourceFromTypeEnum.SYSTEM_ADD.getValue());
// 发布增加事件
CommonDataChangeEventCenter.doAddWithData(SysDataTypeEnum.ORG.getValue(), JSONUtil.createArray().put(copySysOrg));
}
}
});
}
}
@Override @Override
public SysOrg queryEntity(String id) { public SysOrg queryEntity(String id) {
SysOrg sysOrg = this.getById(id); SysOrg sysOrg = this.getById(id);

View File

@@ -1176,6 +1176,16 @@ INSERT INTO `SYS_RELATION` VALUES ('1813960110876631050', '1570687866138206208',
INSERT INTO `SYS_RELATION` VALUES ('1871280434097565701', '1570687866138206208', '1870158678418993154', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1870158678418993154\",\"buttonInfo\":[\"1870158678481907713\",\"1870158678481907714\",\"1870158678481907715\",\"1870158678481907716\"]}'); INSERT INTO `SYS_RELATION` VALUES ('1871280434097565701', '1570687866138206208', '1870158678418993154', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1870158678418993154\",\"buttonInfo\":[\"1870158678481907713\",\"1870158678481907714\",\"1870158678481907715\",\"1870158678481907716\"]}');
INSERT INTO `SYS_RELATION` VALUES ('1871280434097565751', '1570687866138206208', '1871278073018986498', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1871278073018986498\",\"buttonInfo\":[\"1871278073086095361\",\"1871278073086095362\",\"1871278073086095363\",\"1871278073086095364\",\"1871280381043814402\"]}'); INSERT INTO `SYS_RELATION` VALUES ('1871280434097565751', '1570687866138206208', '1871278073018986498', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1871278073018986498\",\"buttonInfo\":[\"1871278073086095361\",\"1871278073086095362\",\"1871278073086095363\",\"1871278073086095364\",\"1871280381043814402\"]}');
INSERT INTO `SYS_RELATION` VALUES ('1909233948956041233', '1570687866138206208', '1548901111999771927', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999771927\",\"buttonInfo\":[]}'); INSERT INTO `SYS_RELATION` VALUES ('1909233948956041233', '1570687866138206208', '1548901111999771927', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1548901111999771927\",\"buttonInfo\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('2003522704174505988', '1570687866138206208', '/biz/group/add', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/group/add\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('2003522704174505989', '1570687866138206208', '/biz/group/delete', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/group/delete\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('2003522704174505990', '1570687866138206208', '/biz/group/detail', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/group/detail\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('2003522704174505991', '1570687866138206208', '/biz/group/edit', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/group/edit\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('2003522704174505992', '1570687866138206208', '/biz/group/grantUser', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/group/grantUser\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('2003522704174505993', '1570687866138206208', '/biz/group/orgTreeSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/group/orgTreeSelector\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('2003522704174505994', '1570687866138206208', '/biz/group/ownUser', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/group/ownUser\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('2003522704174505995', '1570687866138206208', '/biz/group/page', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/group/page\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('2003522704174505996', '1570687866138206208', '/biz/group/userSelector', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/group/userSelector\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('2003522704178700296', '1570687866138206208', '/biz/org/copy', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/org/copy\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
-- ---------------------------- -- ----------------------------
-- Table structure for SYS_RESOURCE -- Table structure for SYS_RESOURCE
@@ -1287,6 +1297,7 @@ INSERT INTO `SYS_RESOURCE` VALUES ('1871278073086095362', '1871278073018986498',
INSERT INTO `SYS_RESOURCE` VALUES ('1871278073086095363', '1871278073018986498', '删除用户组', NULL, 'bizGroupDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); INSERT INTO `SYS_RESOURCE` VALUES ('1871278073086095363', '1871278073018986498', '删除用户组', NULL, 'bizGroupDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `SYS_RESOURCE` VALUES ('1871278073086095364', '1871278073018986498', '批量删除', NULL, 'bizGroupBatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); INSERT INTO `SYS_RESOURCE` VALUES ('1871278073086095364', '1871278073018986498', '批量删除', NULL, 'bizGroupBatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `SYS_RESOURCE` VALUES ('1871280381043814402', '1871278073018986498', '授权用户', NULL, 'bizGroupGrantUser', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 5, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); INSERT INTO `SYS_RESOURCE` VALUES ('1871280381043814402', '1871278073018986498', '授权用户', NULL, 'bizGroupGrantUser', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 5, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `SYS_RESOURCE` VALUES ('2003522569956777985', '1548901111999773978', '复制机构', NULL, 'bizOrgCopy', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 5, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
-- ---------------------------- -- ----------------------------
-- Table structure for SYS_ROLE -- Table structure for SYS_ROLE