diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 710803a31..1037012c8 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -1653,19 +1653,22 @@ class UsersController extends AbstractController if (empty($parentDepartment)) { return Base::retError('上级部门不存在或已被删除'); } - if ($parentDepartment->parent_id > 0) { - return Base::retError('上级部门层级错误'); + if (count($parentDepartment->parents()) > 2) { + return Base::retError('部门层级最多只能创建3级'); } - if (UserDepartment::whereParentId($parent_id)->count() > 20) { + if ($id > 0 && UserDepartment::whereParentId($id)->whereId($parent_id)->exists()) { + return Base::retError('不能选择自己的子部门作为上级部门'); + } + if (UserDepartment::whereParentId($parent_id)->count() >= 20) { return Base::retError('每个部门最多只能创建20个子部门'); } - if ($id > 0 && UserDepartment::whereParentId($id)->exists()) { - return Base::retError('含有子部门无法修改上级部门'); - } } if (empty($owner_userid) || !User::whereUserid($owner_userid)->exists()) { return Base::retError('请选择正确的部门负责人'); } + if (UserDepartment::whereOwnerUserid($owner_userid)->count() >= 10) { + return Base::retError('每个用户最多只能负责10个部门'); + } // $userDepartment->saveDepartment([ 'name' => $name, @@ -1674,7 +1677,7 @@ class UsersController extends AbstractController ], $dialog_useid); Cache::forever("UserDepartment::rand", Base::generatePassword()); // - return Base::retSuccess($parent_id > 0 ? '保存成功' : '新建成功'); + return Base::retSuccess($id > 0 ? '保存成功' : '新建成功'); } /** @@ -1701,6 +1704,9 @@ class UsersController extends AbstractController if (empty($userDepartment)) { return Base::retError('部门不存在或已被删除'); } + if (UserDepartment::whereParentId($id)->exists()) { + return Base::retError('含有子部门无法删除'); + } $userDepartment->deleteDepartment(); Cache::forever("UserDepartment::rand", Base::generatePassword()); // diff --git a/app/Models/UserDepartment.php b/app/Models/UserDepartment.php index c95681055..319f6bed2 100644 --- a/app/Models/UserDepartment.php +++ b/app/Models/UserDepartment.php @@ -34,6 +34,21 @@ use App\Exceptions\ApiException; */ class UserDepartment extends AbstractModel { + /** + * 获取所有父级部门 + * @return array + */ + public function parents() + { + $parents = []; + $parent = $this; + while ($parent) { + $parents[] = $parent; + $parent = $parent->parent_id ? self::find($parent->parent_id) : null; + } + return $parents; + } + /** * 保存部门 * @param $data @@ -131,9 +146,7 @@ class UserDepartment extends AbstractModel }); // 解散群组 $dialog = WebSocketDialog::find($this->dialog_id); - if ($dialog) { - $dialog->deleteDialog(); - } + $dialog?->deleteDialog(); // $this->delete(); } diff --git a/resources/assets/js/pages/manage/components/TeamManagement.vue b/resources/assets/js/pages/manage/components/TeamManagement.vue index aaa89892d..c0156dad8 100644 --- a/resources/assets/js/pages/manage/components/TeamManagement.vue +++ b/resources/assets/js/pages/manage/components/TeamManagement.vue @@ -44,7 +44,7 @@ @command="onOpDepartment"> - +
{{$L('添加子部门')}}
@@ -183,11 +183,19 @@ - + + -
{{$L('含有子部门无法修改上级部门')}}
@@ -286,8 +294,19 @@
{{$L(`正在进行帐号【ID:${departmentEditData.userid}, ${departmentEditData.nickname}】部门修改。`)}} - +
@@ -515,34 +534,44 @@ export default { key: 'department', minWidth: 80, render: (h, {row}) => { - let departments = [] + const departments = [] row.department.some(did => { const data = this.departmentList.find(d => d.id == did) if (data) { - departments.push(data.name) + departments.push({ + id: data.id, + name: data.name, + chain: data.chains.join(' - ') + }) } }) + departments.sort((a, b) => { + return a.id - b.id + }) if (departments.length === 0) { return h('AutoTip', this.$L('默认部门')); } else { const tmp = [] tmp.push(h('span', { domProps: { - title: departments[0] + title: departments[0].chain } - }, departments[0])) + }, departments[0].name)) if (departments.length > 1) { - departments = departments.splice(1) tmp.push(h('ETooltip', [ - h('div', { + h('ol', { slot: 'content', + style: { + lineHeight: '1.5', + paddingLeft: '18px' + }, domProps: { - innerHTML: departments.join("
") + innerHTML: departments.map(({chain}) => `
  • ${chain}
  • `).join('') } }), h('div', { class: 'department-tag-num' - }, ` +${departments.length}`) + }, departments.length) ])) } return h('div', { @@ -910,10 +939,6 @@ export default { computed: { ...mapState(['formOptions']), - departmentParentDisabled() { - return !!(this.departmentData.id > 0 && this.departmentList.find(({parent_id}) => parent_id == this.departmentData.id)); - }, - userStyle({minWidth, windowPortrait}) { const style = {} if (minWidth > 0 && windowPortrait) { @@ -1206,23 +1231,29 @@ export default { url: 'users/department/list', }).then(({data}) => { this.departmentList = [] - this.generateDepartmentList(data, 0, 1) + this.generateDepartmentList(data, 0, 1, []) }).finally(_ => { this.departmentLoading--; }) }, - generateDepartmentList(data, parent_id, level) { + generateDepartmentList(data, parent_id, level, chains = []) { data.some(item => { if (item.parent_id == parent_id) { this.departmentList.push(Object.assign(item, { + chains: chains.concat([item.name]), level: level + 1 })) - this.generateDepartmentList(data, item.id, level + 1) + this.generateDepartmentList(data, item.id, level + 1, chains.concat([item.name])) } }) }, + onMultipleMaxBefore(num) { + $A.messageError(`最多选择${num}个部门`) + return false + }, + onShowDepartment(data) { this.departmentData = Object.assign({ id: 0, diff --git a/resources/assets/sass/pages/components/team-management.scss b/resources/assets/sass/pages/components/team-management.scss index 2c3d16e19..27784e196 100644 --- a/resources/assets/sass/pages/components/team-management.scss +++ b/resources/assets/sass/pages/components/team-management.scss @@ -83,13 +83,13 @@ font-weight: 500; } &.level-2 { - margin-left: 24px; + margin-left: 18px; } &.level-3 { - margin-left: 48px; + margin-left: 36px; } &.level-4 { - margin-left: 72px; + margin-left: 54px; } .department-icon { padding: 8px; @@ -155,6 +155,18 @@ } } +.team-department-level-name { + &.level-2 { + margin-left: 18px; + } + &.level-3 { + margin-left: 36px; + } + &.level-4 { + margin-left: 54px; + } +} + .team-department-add-dialog-group { display: flex; align-items: center;