完成部门群岗位管理员权限的设置、移除、查看
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
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:
parent
65eaefdbc3
commit
d516ce00ef
@ -27,6 +27,16 @@ export const departmentV2TreeAll = (data) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//获取指定部门下的所有岗位
|
||||||
|
export const v2TreePositionByDepartment = (data) => {
|
||||||
|
return request({
|
||||||
|
url: '/department/v2/position',
|
||||||
|
baseURL: import.meta.env.VITE_EPR_BASEURL,
|
||||||
|
method: 'POST',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const userV2List = (data) => {
|
export const userV2List = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/user/v2/list',
|
url: '/user/v2/list',
|
||||||
|
@ -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,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
@ -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>
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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>
|
||||||
|
@ -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 {
|
||||||
|
@ -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, //1禁言2解禁
|
mode: 1, //1禁言2解禁
|
||||||
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 = [
|
||||||
{
|
{
|
||||||
@ -343,6 +469,7 @@ const assembleAlphabetMmeberList = (newMemberList) => {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//滚动到指定的view
|
//滚动到指定的view
|
||||||
const scrollToView = (alphabet) => {
|
const scrollToView = (alphabet) => {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
BIN
src/static/image/chatSettings/add-member.png
Normal file
BIN
src/static/image/chatSettings/add-member.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
BIN
src/static/image/chatSettings/is-mine.png
Normal file
BIN
src/static/image/chatSettings/is-mine.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
BIN
src/static/image/chatSettings/remove-member.png
Normal file
BIN
src/static/image/chatSettings/remove-member.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
@ -4,14 +4,22 @@ 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
|
||||||
@ -26,6 +34,14 @@ export const useGroupTypeStore = createGlobalState(() => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//获取指定部门下的所有岗位
|
||||||
|
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) {
|
||||||
@ -35,7 +51,7 @@ 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,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -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: {
|
||||||
// 更新在线状态
|
// 更新在线状态
|
||||||
|
@ -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,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -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": "移除"
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user