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 @@
-
@@ -286,8 +294,19 @@
@@ -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;