完成部门群岗位管理员权限的设置、移除、查看
Some checks failed
Check / lint (push) Has been cancelled
Check / typecheck (push) Has been cancelled
Check / build (build, 18.x, ubuntu-latest) (push) Has been cancelled
Check / build (build, 18.x, windows-latest) (push) Has been cancelled
Check / build (build:app, 18.x, ubuntu-latest) (push) Has been cancelled
Check / build (build:app, 18.x, windows-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 18.x, ubuntu-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 18.x, windows-latest) (push) Has been cancelled

This commit is contained in:
wangyifeng 2025-01-21 18:43:14 +08:00
parent 65eaefdbc3
commit d516ce00ef
16 changed files with 428 additions and 133 deletions

View File

@ -3,7 +3,7 @@ import request from '@/service/index.js'
export const departmentV2TreeMy = (data) => { export const departmentV2TreeMy = (data) => {
return request({ return request({
url: '/department/v2/tree/my', url: '/department/v2/tree/my',
baseURL:import.meta.env.VITE_EPR_BASEURL, baseURL: import.meta.env.VITE_EPR_BASEURL,
method: 'POST', method: 'POST',
data, data,
}) })
@ -12,7 +12,7 @@ export const departmentV2TreeMy = (data) => {
export const departmentV2AllPosition = (data) => { export const departmentV2AllPosition = (data) => {
return request({ return request({
url: '/department/v2/tree/all/position', url: '/department/v2/tree/all/position',
baseURL:import.meta.env.VITE_EPR_BASEURL, baseURL: import.meta.env.VITE_EPR_BASEURL,
method: 'POST', method: 'POST',
data, data,
}) })
@ -21,7 +21,17 @@ export const departmentV2AllPosition = (data) => {
export const departmentV2TreeAll = (data) => { export const departmentV2TreeAll = (data) => {
return request({ return request({
url: '/department/v2/tree/all', url: '/department/v2/tree/all',
baseURL:import.meta.env.VITE_EPR_BASEURL, baseURL: import.meta.env.VITE_EPR_BASEURL,
method: 'POST',
data,
})
}
//获取指定部门下的所有岗位
export const v2TreePositionByDepartment = (data) => {
return request({
url: '/department/v2/position',
baseURL: import.meta.env.VITE_EPR_BASEURL,
method: 'POST', method: 'POST',
data, data,
}) })
@ -30,7 +40,7 @@ export const departmentV2TreeAll = (data) => {
export const userV2List = (data) => { export const userV2List = (data) => {
return request({ return request({
url: '/user/v2/list', url: '/user/v2/list',
baseURL:import.meta.env.VITE_EPR_BASEURL, baseURL: import.meta.env.VITE_EPR_BASEURL,
method: 'POST', method: 'POST',
data, data,
}) })

View File

@ -224,3 +224,12 @@ export const ServeGroupNoSpeak = (data) => {
data, data,
}) })
} }
//修改公司群、部门群的部门和岗位
export const ServeEditGroupAdmin = (data) => {
return request({
url: '/api/v1/group/edit-dept',
method: 'POST',
data,
})
}

View File

@ -2,6 +2,13 @@
<div class="group-member-list"> <div class="group-member-list">
<div <div
class="group-member-list-each" class="group-member-list-each"
:style="{
width: (
props.memberListsLimit ? memberIndex < props.memberListsLimit : true
)
? ''
: '0',
}"
v-for="(memberItem, memberIndex) in props?.memberList" v-for="(memberItem, memberIndex) in props?.memberList"
@click="toUserDetailPage(memberItem)" @click="toUserDetailPage(memberItem)"
> >
@ -21,7 +28,10 @@
}} }}
</span> </span>
</div> </div>
<div class="group-member-tag" v-if="memberItem?.leader === 1"> <div
class="group-member-tag"
v-if="memberItem?.leader === 1 || memberItem?.leader === 2"
>
<span class="text-[16rpx] font-regular"> <span class="text-[16rpx] font-regular">
{{ $t('group.identify.admin') }} {{ $t('group.identify.admin') }}
</span> </span>
@ -33,6 +43,26 @@
</div> </div>
</div> </div>
</div> </div>
<div class="group-member-list-each">
<div class="group-member-each">
<div class="group-member-avatar" :style="{ background: 'unset' }">
<img src="/src/static/image/chatSettings/add-member.png" />
</div>
<div class="group-member-name">
<span class="text-[24rpx] font-regular">添加</span>
</div>
</div>
</div>
<div class="group-member-list-each" v-if="props?.is_manager">
<div class="group-member-each">
<div class="group-member-avatar" :style="{ background: 'unset' }">
<img src="/src/static/image/chatSettings/remove-member.png" />
</div>
<div class="group-member-name">
<span class="text-[24rpx] font-regular">移除</span>
</div>
</div>
</div>
</div> </div>
</template> </template>
<script setup> <script setup>
@ -40,13 +70,15 @@ import { defineProps } from 'vue'
const props = defineProps({ const props = defineProps({
memberList: Array, // memberList: Array, //
memberListsLimit: Number, // memberListsLimit: Number, //
is_manager: Boolean, //
}) })
// //
const toUserDetailPage = (userItem) => { const toUserDetailPage = (userItem) => {
console.log(userItem.erp_user_id) console.log(userItem.erp_user_id)
uni.navigateTo({ uni.navigateTo({
url: '/pages/dialog/dialogDetail/userDetail?erpUserId=' + userItem.erp_user_id, url:
'/pages/dialog/dialogDetail/userDetail?erpUserId=' + userItem.erp_user_id,
}) })
} }
</script> </script>

View File

@ -13,8 +13,10 @@
<div <div
class="select-member-item-avatar" class="select-member-item-avatar"
v-if=" v-if="
props?.manageType === 'silence' || !(
props?.manageType === 'searchRecord' (props?.groupType == 2 || props?.groupType == 4) &&
props?.manageType === 'admin'
)
" "
> >
<img v-if="avatarImg !== 'textImg'" :src="avatarImg" /> <img v-if="avatarImg !== 'textImg'" :src="avatarImg" />
@ -22,25 +24,33 @@
{{ imgText }} {{ imgText }}
</span> </span>
</div> </div>
<div <div class="select-member-item-name">
class="select-member-item-name"
v-if="
props?.manageType === 'silence' ||
props?.manageType === 'searchRecord'
"
>
<span class="text-[28rpx] font-medium">{{ nameText }}</span> <span class="text-[28rpx] font-medium">{{ nameText }}</span>
</div> </div>
</div> </div>
<div class="operate-btns"> <div class="select-member-tags">
<div class="btn-undo-silence"> <div
<span class="done-silence-tag"
v-if="props?.memberItem?.is_mute === 1" v-if="
class="text-[28rpx] font-regular" props?.memberItem?.is_mute === 1 && props?.manageType === 'silence'
"
> >
<span class="text-[28rpx] font-regular">
{{ $t('silence.tag.hasDone') }} {{ $t('silence.tag.hasDone') }}
</span> </span>
</div> </div>
<div
class="is-admin-tag"
v-if="
(props?.memberItem?.leader === 1 ||
props?.memberItem?.leader === 2) &&
props?.manageType === 'admin'
"
>
<span class="text-[28rpx] font-regular">
{{ $t('group.identify.admin') }}
</span>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -54,6 +64,7 @@ const props = defineProps({
memberItem: Object, // memberItem: Object, //
manageType: String, // manageType: String, //
itemStyle: String, itemStyle: String,
groupType: Number, //
}) })
onMounted(() => {}) onMounted(() => {})
@ -123,8 +134,17 @@ const clickItem = () => {
} }
} }
} }
.operate-btns { .select-member-tags {
.btn-undo-silence { .done-silence-tag {
span {
color: #b4b4b4;
line-height: 40rpx;
}
}
.is-admin-tag {
padding: 6rpx 12rpx;
border: 2rpx solid #b4b4b4;
border-radius: 8rpx;
span { span {
color: #b4b4b4; color: #b4b4b4;
line-height: 40rpx; line-height: 40rpx;

View File

@ -125,6 +125,10 @@ const changeSwitch = (e, item) => {
.item-sub { .item-sub {
margin: 28rpx 0 0; margin: 28rpx 0 0;
white-space: nowrap;
overflow: hidden;
max-width: 100%;
text-overflow: ellipsis;
span { span {
line-height: 44rpx; line-height: 44rpx;
color: #747474; color: #747474;

View File

@ -17,11 +17,6 @@
</div> </div>
</div> </div>
<customBtn :btnText="$t('button.text.edit')"></customBtn> <customBtn :btnText="$t('button.text.edit')"></customBtn>
<template #bottom>
<div class="app-logo-icon">
<img src="/src/static/image/chatSettings/app-icon.png" />
</div>
</template>
</ZPaging> </ZPaging>
</div> </div>
</div> </div>
@ -58,9 +53,10 @@ const confirmEdit = () => {
<style scoped lang="scss"> <style scoped lang="scss">
.outer-layer { .outer-layer {
flex: 1; flex: 1;
background-image: url('@/static/image/clockIn/z3280@3x.png'); background-image: url('@/static/image/mine/background.png');
background-size: cover; background-size: cover;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position:center bottom;
} }
.edit-group-info { .edit-group-info {
@ -80,16 +76,4 @@ const confirmEdit = () => {
} }
} }
} }
.app-logo-icon {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 0 0 44rpx;
img {
width: 72rpx;
height: 72rpx;
}
}
</style> </style>

View File

@ -18,22 +18,37 @@
<div <div
class="group-admin-list chat-settings-card" class="group-admin-list chat-settings-card"
:style="{ :style="{
margin: state.groupAdminList.length > 0 ? '20rpx 0 0' : '', margin: state?.groupAdminList?.length > 0 ? '20rpx 0 0' : '',
}" }"
> >
<div <div
class="group-admin-list-each" class="group-admin-list-each"
v-for="(item, index) in state.groupAdminList" v-for="(item, index) in state?.groupAdminList"
:key="index" :key="index"
> >
<span>{{ item }}</span> <span>{{ item.deptPos }}</span>
<div class="group-admin-list-each-btns">
<img
v-if="item.is_mine"
src="/src/static/image/chatSettings/is-mine.png"
/>
<div
class="group-admin-list-each-btns-each"
v-if="!item.cannotRemove"
@click="removeGroupAdmin(item)"
>
<span class="text-[28rpx] font-regular">
{{ $t('chatSettings.btn.removeAdmin') }}
</span>
</div>
</div>
</div> </div>
</div> </div>
<div <div
class="add-admin-member-btn chat-settings-card" class="add-admin-member-btn chat-settings-card"
@click="toSelectMembersPage" @click="toSelectMembersPage"
:style="{ :style="{
margin: state.groupAdminList.length == 0 ? '20rpx 0 0' : '', margin: state?.groupAdminList.length == 0 ? '20rpx 0 0' : '',
}" }"
> >
<img src="/src/static/image/chatSettings/add-btn.png" /> <img src="/src/static/image/chatSettings/add-btn.png" />
@ -42,29 +57,24 @@
</span> </span>
</div> </div>
</div> </div>
<template #bottom>
<customBtn :isBottom="true" :btnText="$t('ok')"></customBtn>
</template>
</ZPaging> </ZPaging>
</div> </div>
</div> </div>
</template> </template>
<script setup> <script setup>
import customBtn from '@/components/custom-btn/custom-btn.vue'
import ZPaging from '@/uni_modules/z-paging/components/z-paging/z-paging.vue' import ZPaging from '@/uni_modules/z-paging/components/z-paging/z-paging.vue'
import { onLoad } from '@dcloudio/uni-app' import { onLoad } from '@dcloudio/uni-app'
import { computed, onMounted, reactive } from 'vue' import { computed, onMounted, reactive, watch } from 'vue'
import { useGroupTypeStore } from '@/store/groupType' import { ServeEditGroupAdmin } from '@/api/group/index.js'
import { useGroupStore, useDialogueStore } from '@/store' import { useGroupStore, useDialogueStore } from '@/store'
import { useAuth } from '@/store/auth'
const { userInfo } = useAuth()
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
const { t } = useI18n() const { t } = useI18n()
const groupTypeStore = useGroupTypeStore()
const groupTypeParams = reactive({
postTreeList: computed(() => groupTypeStore.postTreeList),
})
const groupStore = useGroupStore() const groupStore = useGroupStore()
const groupParams = reactive({ const groupParams = reactive({
groupInfo: computed(() => groupStore.groupInfo), groupInfo: computed(() => groupStore.groupInfo),
@ -72,46 +82,60 @@ const groupParams = reactive({
const dialogueStore = useDialogueStore() const dialogueStore = useDialogueStore()
const dialogueParams = reactive({ const dialogueParams = reactive({
adminList: computed(() => dialogueStore.getAdminList), adminList: computed(() => dialogueStore.getAdminList),
receiverId: computed(() => dialogueStore.talk.receiver_id),
}) })
const state = reactive({ const state = reactive({
silenceAllBtn: null, //
groupAdminList: [], // groupAdminList: [], //
}) })
watch(
() => groupParams?.groupInfo,
(newGroupInfo) => {
getGroupAdminList()
},
{ deep: true },
)
onLoad((options) => { onLoad((options) => {
console.log(options) console.log(options)
}) })
onMounted(async () => { onMounted(async () => {
console.log(dialogueParams.adminList) getGroupAdminList()
await groupStore.ServeGroupDetail()
await groupTypeStore.getPositionsTree()
console.log(groupParams.groupInfo)
console.log(groupTypeParams.postTreeList)
assembleDepartmentPositions()
}) })
// //
const assembleDepartmentPositions = () => { const getGroupAdminList = () => {
let deptPosArr = [] let myPositionsList = []
if (groupParams?.groupInfo?.deptInfos?.length > 0) { if (groupParams?.groupInfo?.groupAdminList?.length > 0) {
if (groupParams?.groupInfo?.positionInfos?.length > 0) { groupParams?.groupInfo?.groupAdminList.forEach((groupAdminItem) => {
groupParams?.groupInfo?.deptInfos.forEach((deptInfo) => { if (userInfo?.value?.PositionUsers?.length > 0) {
groupParams?.groupInfo?.positionInfos.forEach((positionInfo) => { userInfo?.value?.PositionUsers.forEach((item) => {
let deptPosItem = groupTypeStore.getDepartmentPositionsById( // console.log(item.DepartmentId + '-' + item.PositionID)
deptInfo.dept_id, if (item.PositionID === groupAdminItem.position_id) {
positionInfo.position_id, myPositionsList.push(groupAdminItem)
) }
if (deptPosItem) { })
deptPosArr.push(deptPosItem) }
})
}
if (
groupParams?.groupInfo?.groupAdminList?.length > 0 &&
myPositionsList?.length > 0
) {
groupParams.groupInfo.groupAdminList.forEach((ele) => {
myPositionsList.forEach((item) => {
if (ele.deptPos === item.deptPos) {
item.is_mine = true
if (myPositionsList?.length == 1) {
item.cannotRemove = true
}
} }
}) })
}) })
} }
} state.groupAdminList = groupParams?.groupInfo?.groupAdminList
console.log(deptPosArr)
state.groupAdminList = deptPosArr
} }
// //
@ -120,6 +144,40 @@ const toSelectMembersPage = () => {
url: '/pages/chatSettings/groupManage/selectMembers?manageType=admin', url: '/pages/chatSettings/groupManage/selectMembers?manageType=admin',
}) })
} }
//
const removeGroupAdmin = (adminItem) => {
let positionInfos = []
if (state?.groupAdminList?.length > 0) {
state?.groupAdminList.forEach((item) => {
if (
item.dept_id != adminItem.dept_id ||
item.position_id != adminItem.position_id
) {
positionInfos.push({
position_id: item.position_id,
position_name: item.deptPos,
})
}
})
let params = {
source: 'app',
id: dialogueParams.receiverId,
deptInfos: groupParams.groupInfo.deptInfos,
positionInfos: positionInfos,
}
console.log(params)
const resp = ServeEditGroupAdmin(params)
resp.then(({ code, data }) => {
console.log(data)
if (code == 200) {
groupStore.ServeGroupDetail()
} else {
}
})
resp.catch(() => {})
}
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.outer-layer { .outer-layer {
@ -141,6 +199,33 @@ const toSelectMembersPage = () => {
padding: 36rpx 0; padding: 36rpx 0;
margin: 0 32rpx; margin: 0 32rpx;
border-bottom: 1px solid $theme-border-color; border-bottom: 1px solid $theme-border-color;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
.group-admin-list-each-btns {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
img {
width: 52rpx;
height: 52rpx;
}
.group-admin-list-each-btns-each {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 10rpx 30rpx;
border: 2rpx solid #eeeeee;
margin: 0 0 0 20rpx;
span {
line-height: 40rpx;
color: #191919;
}
}
}
} }
} }
.add-admin-member-btn { .add-admin-member-btn {

View File

@ -105,6 +105,7 @@
> >
<tm-checkbox-group v-model="item.checkArr"> <tm-checkbox-group v-model="item.checkArr">
<selectMemberItem <selectMemberItem
:groupType="groupParams.groupInfo.group_type"
:memberItem="item" :memberItem="item"
@clickItem="handleClickItem(item)" @clickItem="handleClickItem(item)"
:manageType="state.manageType" :manageType="state.manageType"
@ -122,12 +123,21 @@
item?.checkArr?.length > 0 ? '#46299d' : '#B4B4B4' item?.checkArr?.length > 0 ? '#46299d' : '#B4B4B4'
" "
:outlined=" :outlined="
item?.checkArr?.length > 0 || item.is_mute === 1 item?.checkArr?.length > 0 ||
(state.manageType === 'silence' &&
item.is_mute === 1) ||
(state.manageType === 'admin' &&
(item.leader === 1 || item.leader === 2))
? false ? false
: true : true
" "
:value="item.id" :value="item.id"
:disabled="item.is_mute === 1" :disabled="
(state.manageType === 'silence' &&
item.is_mute === 1) ||
(state.manageType === 'admin' &&
(item.leader === 1 || item.leader === 2))
"
></tm-checkbox> ></tm-checkbox>
</template> </template>
</selectMemberItem> </selectMemberItem>
@ -156,22 +166,23 @@ import ZPaging from '@/uni_modules/z-paging/components/z-paging/z-paging.vue'
import useZPaging from '@/uni_modules/z-paging/components/z-paging/js/hooks/useZPaging.js' import useZPaging from '@/uni_modules/z-paging/components/z-paging/js/hooks/useZPaging.js'
import { computed, onMounted, reactive, ref, watch, nextTick } from 'vue' import { computed, onMounted, reactive, ref, watch, nextTick } from 'vue'
import { onLoad } from '@dcloudio/uni-app' import { onLoad } from '@dcloudio/uni-app'
import { ServeGroupNoSpeak } from '@/api/group/index.js' import { ServeGroupNoSpeak, ServeEditGroupAdmin } from '@/api/group/index.js'
import { useDialogueStore } from '@/store' import { useDialogueStore, useGroupStore, useGroupTypeStore } from '@/store'
const zPaging = ref() const zPaging = ref()
useZPaging(zPaging) useZPaging(zPaging)
const dialogueStore = useDialogueStore() const groupStore = useGroupStore()
const state = reactive({ const groupParams = reactive({
searchText: '', // groupInfo: computed(() => groupStore.groupInfo),
manageType: '', //
alphabet: [], //A-Z
resultMemberList: [], //A-Z
currentAlphabet: 'A', //A-Z
scrollDirection: '', //
isAssign: false, //view
}) })
const groupTypeStore = useGroupTypeStore()
const groupTypeParams = reactive({
departmentAllPositions: computed(() => groupTypeStore.departmentAllPositions),
})
const dialogueStore = useDialogueStore()
const dialogueParams = reactive({ const dialogueParams = reactive({
memberList: computed(() => { memberList: computed(() => {
const lowerCaseSearchText = state?.searchText.toLowerCase() const lowerCaseSearchText = state?.searchText.toLowerCase()
@ -184,10 +195,28 @@ const dialogueParams = reactive({
receiverId: computed(() => dialogueStore.talk.receiver_id), receiverId: computed(() => dialogueStore.talk.receiver_id),
}) })
const state = reactive({
searchText: '', //
manageType: '', //
alphabet: [], //A-Z
resultMemberList: [], //A-Z
currentAlphabet: 'A', //A-Z
scrollDirection: '', //
isAssign: false, //view
})
watch( watch(
() => dialogueParams?.memberList, () => dialogueParams?.memberList,
(newMemberList) => { (newMemberList) => {
assembleAlphabetMmeberList(newMemberList) assembleAlphabetMemberList(newMemberList)
},
{ deep: true },
)
watch(
() => groupParams?.groupInfo,
(newGroupInfo) => {
assembleAlphabetMemberList(dialogueParams?.memberList)
}, },
{ deep: true }, { deep: true },
) )
@ -201,7 +230,7 @@ onLoad((options) => {
console.log(options) console.log(options)
if (options.manageType) { if (options.manageType) {
state.manageType = options.manageType state.manageType = options.manageType
assembleAlphabetMmeberList(dialogueParams?.memberList) assembleAlphabetMemberList(dialogueParams?.memberList)
} }
}) })
@ -272,10 +301,21 @@ const inputSearchText = (e) => {
//item //item
const handleClickItem = (item) => { const handleClickItem = (item) => {
if (item.is_mute === 1) { if (
(state.manageType === 'silence' && item.is_mute === 1) ||
(state.manageType === 'admin' && (item.leader === 1 || item.leader === 2))
) {
return return
} }
dialogueParams.memberList.forEach((ele) => { let itemList = dialogueParams.memberList
if (
state.manageType === 'admin' &&
(groupParams.groupInfo.group_type == 2 ||
groupParams.groupInfo.group_type == 4)
) {
itemList = state.resultMemberList[0].memberList
}
itemList.forEach((ele) => {
if (ele.id == item.id) { if (ele.id == item.id) {
ele.checkArr = ele.checkArr?.length > 0 ? [] : [item.id] ele.checkArr = ele.checkArr?.length > 0 ? [] : [item.id]
} }
@ -285,7 +325,16 @@ const handleClickItem = (item) => {
// //
const confirmSilenceMember = () => { const confirmSilenceMember = () => {
let selectedUserIds = '' let selectedUserIds = ''
dialogueParams.memberList.forEach((ele) => { let itemList = dialogueParams.memberList
let positionInfos = []
if (
state.manageType === 'admin' &&
(groupParams.groupInfo.group_type == 2 ||
groupParams.groupInfo.group_type == 4)
) {
itemList = state.resultMemberList[0].memberList
}
itemList.forEach((ele) => {
if (ele.checkArr?.length > 0) { if (ele.checkArr?.length > 0) {
if (!selectedUserIds) { if (!selectedUserIds) {
selectedUserIds = String(ele.checkArr[0]) selectedUserIds = String(ele.checkArr[0])
@ -293,9 +342,16 @@ const confirmSilenceMember = () => {
selectedUserIds += ',' + ele.checkArr[0] selectedUserIds += ',' + ele.checkArr[0]
} }
} }
if (
ele.checkArr?.length > 0 ||
(ele.leader && (ele.leader == 1 || ele.leader == 2))
) {
positionInfos.push(ele.positionInfo)
}
}) })
console.log(selectedUserIds) console.log(selectedUserIds)
if (selectedUserIds) { if (selectedUserIds) {
if (state.manageType === 'silence') {
let params = { let params = {
mode: 1, //12 mode: 1, //12
group_id: dialogueParams.receiverId, //id group_id: dialogueParams.receiverId, //id
@ -311,11 +367,34 @@ const confirmSilenceMember = () => {
} }
}) })
resp.catch(() => {}) resp.catch(() => {})
} else if (state.manageType === 'admin') {
if (
groupParams.groupInfo.group_type == 2 ||
groupParams.groupInfo.group_type == 4
) {
let params = {
source: 'app',
id: dialogueParams.receiverId,
deptInfos: groupParams.groupInfo.deptInfos,
positionInfos: positionInfos,
}
console.log(params)
const resp = ServeEditGroupAdmin(params)
resp.then(({ code, data }) => {
console.log(data)
if (code == 200) {
groupStore.ServeGroupDetail()
} else {
}
})
resp.catch(() => {})
}
}
} }
} }
//A-Z //A-Z
const assembleAlphabetMmeberList = (newMemberList) => { const assembleAlphabetMemberList = async (newMemberList) => {
if (state.manageType === 'searchRecord') { if (state.manageType === 'searchRecord') {
const resultMemberList = ref([]) const resultMemberList = ref([])
const alphabet = Array.from({ length: 26 }, (_, i) => const alphabet = Array.from({ length: 26 }, (_, i) =>
@ -334,6 +413,53 @@ const assembleAlphabetMmeberList = (newMemberList) => {
}) })
state.alphabet = tempAlphabet state.alphabet = tempAlphabet
state.resultMemberList = resultMemberList state.resultMemberList = resultMemberList
} else {
if (
(groupParams.groupInfo.group_type == 2 ||
groupParams.groupInfo.group_type == 4) &&
state.manageType === 'admin'
) {
let departmentIdsArr = []
if (groupParams?.groupInfo?.deptInfos?.length > 0) {
groupParams.groupInfo.deptInfos.forEach((item) => {
departmentIdsArr.push(item.dept_id)
})
}
await groupTypeStore.getPositionByDepartment({
IDs: departmentIdsArr,
})
let departmentAllPositions = []
if (groupTypeParams?.departmentAllPositions?.value?.length > 0) {
groupTypeParams?.departmentAllPositions?.value?.forEach((item) => {
item?.AllPositions?.forEach((positionItem) => {
departmentAllPositions.push({
nickname: item.name + '-' + positionItem.name,
id: item.ID + '-' + positionItem.ID,
checkArr: [],
positionInfo: {
position_id: positionItem.ID,
position_name: positionItem.name,
},
})
})
})
}
if (groupParams?.groupInfo?.groupAdminList?.length > 0) {
groupParams?.groupInfo?.groupAdminList.forEach((item) => {
departmentAllPositions.forEach((idsItem) => {
if (item.dept_id + '-' + item.position_id == idsItem.id) {
idsItem.leader = 1
}
})
})
}
// console.log(departmentAllPositions)
state.resultMemberList = [
{
key: '',
memberList: departmentAllPositions,
},
]
} else { } else {
state.resultMemberList = [ state.resultMemberList = [
{ {
@ -342,6 +468,7 @@ const assembleAlphabetMmeberList = (newMemberList) => {
}, },
] ]
} }
}
} }
//view //view

View File

@ -62,8 +62,9 @@
@toManagePage="toManagePage" @toManagePage="toManagePage"
></settingFormItem> ></settingFormItem>
<groupMemberList <groupMemberList
:is_manager="groupParams?.groupInfo?.is_manager"
:memberList="dialogueParams?.memberList" :memberList="dialogueParams?.memberList"
:memberListsLimit="15" :memberListsLimit="groupParams?.groupInfo?.is_manager ? 13 : 14"
></groupMemberList> ></groupMemberList>
</div> </div>
</div> </div>
@ -371,9 +372,9 @@ const updateGroupInfos = () => {
if (groupParams?.groupInfo.groupAdminList?.length > 0) { if (groupParams?.groupInfo.groupAdminList?.length > 0) {
groupParams?.groupInfo.groupAdminList.forEach((item) => { groupParams?.groupInfo.groupAdminList.forEach((item) => {
if (!groupAdmins) { if (!groupAdmins) {
groupAdmins = item groupAdmins = item.deptPos
} else { } else {
groupAdmins += ',' + item groupAdmins += '' + item.deptPos
} }
}) })
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -2,16 +2,24 @@ import { defineStore } from 'pinia'
import { useDialogueStore } from '@/store' import { useDialogueStore } from '@/store'
import lodash from 'lodash' import lodash from 'lodash'
import {ref} from 'vue' import { ref } from 'vue'
import {createGlobalState,useStorage} from '@vueuse/core' import { createGlobalState, useStorage } from '@vueuse/core'
import {uniStorage} from "@/utils/uniStorage.js" import { uniStorage } from '@/utils/uniStorage.js'
import {departmentV2TreeMy,departmentV2AllPosition,groupCreateDept,departmentV2TreeAll,userV2List} from '@/api/deps/index.js' import {
departmentV2TreeMy,
departmentV2AllPosition,
groupCreateDept,
departmentV2TreeAll,
userV2List,
v2TreePositionByDepartment,
} from '@/api/deps/index.js'
export const useGroupTypeStore = createGlobalState(() => { export const useGroupTypeStore = createGlobalState(() => {
const groupName = ref('') const groupName = ref('')
const groupActiveIndex = ref(-1) // 当前激活的分组索引 const groupActiveIndex = ref(-1) // 当前激活的分组索引
const depTreeMyList = ref([]) const depTreeMyList = ref([])
const postTreeList = ref([]) const postTreeList = ref([])
const departmentAllPositions = ref([]) //部门下所有岗位
const crumbs = ref([]) const crumbs = ref([])
const crumbsIndex = ref(0) const crumbsIndex = ref(0)
const depCheckedKeys = ref([]) // 选中的部门keys const depCheckedKeys = ref([]) // 选中的部门keys
@ -19,13 +27,21 @@ export const useGroupTypeStore = createGlobalState(() => {
const membersCheckedKeys = ref([]) // 选中的人员keys const membersCheckedKeys = ref([]) // 选中的人员keys
const allChooseMembers = ref([]) const allChooseMembers = ref([])
const getDepsTreeMy= async()=>{ const getDepsTreeMy = async () => {
const res = await departmentV2TreeAll() const res = await departmentV2TreeAll()
if(res.status===0){ if (res.status === 0) {
depTreeMyList.value = res.data.nodes depTreeMyList.value = res.data.nodes
} }
} }
//获取指定部门下的所有岗位
const getPositionByDepartment = async (params) => {
const res = await v2TreePositionByDepartment(params)
if (res.status === 0) {
departmentAllPositions.value = res.data.data
}
}
const getPositionsTree = async () => { const getPositionsTree = async () => {
const res = await departmentV2AllPosition() const res = await departmentV2AllPosition()
if (res.status === 0) { if (res.status === 0) {
@ -33,9 +49,9 @@ export const useGroupTypeStore = createGlobalState(() => {
} }
} }
const getDepMembers= async(param)=>{ const getDepMembers = async (param) => {
const res = await userV2List(param) const res = await userV2List(param)
return res; return res
} }
const resetGroupInfo = () => { const resetGroupInfo = () => {
@ -100,7 +116,9 @@ export const useGroupTypeStore = createGlobalState(() => {
groupActiveIndex, groupActiveIndex,
depTreeMyList, depTreeMyList,
postTreeList, postTreeList,
departmentAllPositions,
getDepsTreeMy, getDepsTreeMy,
getPositionByDepartment,
getPositionsTree, getPositionsTree,
crumbs, crumbs,
crumbsIndex, crumbsIndex,
@ -111,6 +129,6 @@ export const useGroupTypeStore = createGlobalState(() => {
getDepMembers, getDepMembers,
membersCheckedKeys, membersCheckedKeys,
allChooseMembers, allChooseMembers,
getDepartmentPositionsById getDepartmentPositionsById,
} }
}) })

View File

@ -73,7 +73,7 @@ export const useDialogueStore = defineStore('dialogue', {
getSilenceMember: (state) => getSilenceMember: (state) =>
state.members.filter((item) => item.is_mute === 1), state.members.filter((item) => item.is_mute === 1),
//获取群管理员 //获取群管理员
getAdminList: (state) => state.members.filter((item) => item.leader === 1), getAdminList: (state) => state.members.filter((item) => (item.leader === 1 || item.leader === 2)),
}, },
actions: { actions: {
// 更新在线状态 // 更新在线状态

View File

@ -41,7 +41,11 @@ export const useGroupStore = defineStore('group', {
positionInfo.position_id, positionInfo.position_id,
) )
if (deptPosItem) { if (deptPosItem) {
deptPosArr.push(deptPosItem) deptPosArr.push({
deptPos: deptPosItem,
dept_id: deptInfo.dept_id,
position_id: positionInfo.position_id,
})
} }
}) })
}) })

View File

@ -130,5 +130,6 @@
"groupNotice.confirm.clear": "清空", "groupNotice.confirm.clear": "清空",
"groupNotice.quit.edit": "退出本次编辑", "groupNotice.quit.edit": "退出本次编辑",
"groupNotice.continue.edit": "继续编辑", "groupNotice.continue.edit": "继续编辑",
"groupNotice.confirm.quit": "退出" "groupNotice.confirm.quit": "退出",
"chatSettings.btn.removeAdmin": "移除"
} }