组装部门和岗位对应树,并提供根据id查询

This commit is contained in:
wangyifeng 2025-01-17 13:56:06 +08:00
parent 656fe2e4db
commit 936f2eea86
3 changed files with 121 additions and 34 deletions

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="outer-layer manage-group-silence-page"> <div class="outer-layer manage-group-admin-page">
<div class="root"> <div class="root">
<ZPaging ref="zPaging" :show-scrollbar="false"> <ZPaging ref="zPaging" :show-scrollbar="false">
<template #top> <template #top>
@ -11,13 +11,30 @@
</div> </div>
</tm-navbar> </tm-navbar>
</template> </template>
<div class="manage-group-silence"> <div class="manage-group-admin">
<span class="manage-group-silence-title text-[28rpx] font-regular"> <span class="manage-group-admin-title text-[28rpx] font-regular">
{{ $t('chat.settings.groupAdmin') }} {{ $t('chat.settings.groupAdmin') }}
</span> </span>
<div <div
class="add-silence-member-btn chat-settings-card" class="group-admin-list chat-settings-card"
:style="{
margin: state.groupAdminList.length > 0 ? '20rpx 0 0' : '',
}"
>
<div
class="group-admin-list-each"
v-for="(item, index) in state.groupAdminList"
:key="index"
>
<span>{{ item }}</span>
</div>
</div>
<div
class="add-admin-member-btn chat-settings-card"
@click="toSelectMembersPage" @click="toSelectMembersPage"
:style="{
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" />
<span class="text-[28rpx] font-medium"> <span class="text-[28rpx] font-medium">
@ -25,11 +42,15 @@
</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 } from 'vue'
@ -45,14 +66,17 @@ const groupTypeParams = reactive({
postTreeList: computed(() => groupTypeStore.postTreeList), postTreeList: computed(() => groupTypeStore.postTreeList),
}) })
const groupStore = useGroupStore() const groupStore = useGroupStore()
const groupParams = reactive({
groupInfo: computed(() => groupStore.groupInfo),
})
const dialogueStore = useDialogueStore() const dialogueStore = useDialogueStore()
const dialogueParams = reactive({ const dialogueParams = reactive({
adminList: computed(() => dialogueStore.getAdminList), adminList: computed(() => dialogueStore.getAdminList),
}) })
const state = reactive({ const state = reactive({
silenceAllBtn: null, // silenceAllBtn: null, //
groupAdminList: [], //
}) })
onLoad((options) => { onLoad((options) => {
@ -61,10 +85,35 @@ onLoad((options) => {
onMounted(async () => { onMounted(async () => {
console.log(dialogueParams.adminList) console.log(dialogueParams.adminList)
await groupStore.ServeGroupDetail()
await groupTypeStore.getPositionsTree() await groupTypeStore.getPositionsTree()
console.log(groupTypeParams) console.log(groupParams.groupInfo)
console.log(groupTypeParams.postTreeList)
assembleDepartmentPositions()
}) })
//
const assembleDepartmentPositions = () => {
let deptPosArr = []
if (groupParams?.groupInfo?.deptInfos?.length > 0) {
if (groupParams?.groupInfo?.positionInfos?.length > 0) {
groupParams?.groupInfo?.deptInfos.forEach((deptInfo) => {
groupParams?.groupInfo?.positionInfos.forEach((positionInfo) => {
let deptPosItem = groupTypeStore.getDepartmentPositionsById(
deptInfo.dept_id,
positionInfo.position_id,
)
if (deptPosItem) {
deptPosArr.push(deptPosItem)
}
})
})
}
}
console.log(deptPosArr)
state.groupAdminList = deptPosArr
}
// //
const toSelectMembersPage = () => { const toSelectMembersPage = () => {
uni.navigateTo({ uni.navigateTo({
@ -80,13 +129,21 @@ const toSelectMembersPage = () => {
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.manage-group-silence { .manage-group-admin {
padding: 20rpx 32rpx; padding: 20rpx 32rpx;
.manage-group-silence-title { .manage-group-admin-title {
line-height: 40rpx; line-height: 40rpx;
color: #959598; color: #959598;
} }
.add-silence-member-btn {
.group-admin-list {
.group-admin-list-each {
padding: 36rpx 0;
margin: 0 32rpx;
border-bottom: 1px solid $theme-border-color;
}
}
.add-admin-member-btn {
padding: 32rpx; padding: 32rpx;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -105,7 +162,6 @@ const toSelectMembersPage = () => {
.chat-settings-card { .chat-settings-card {
width: 100%; width: 100%;
background-color: #fff; background-color: #fff;
margin: 20rpx 0 0;
border-radius: 8rpx; border-radius: 8rpx;
box-shadow: 0 6px 12px 2px rgba(188, 188, 188, 0.08); box-shadow: 0 6px 12px 2px rgba(188, 188, 188, 0.08);
} }

View File

@ -2,10 +2,14 @@ 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} from '@/api/deps/index.js' import {
departmentV2TreeMy,
departmentV2AllPosition,
groupCreateDept,
} from '@/api/deps/index.js'
export const useGroupTypeStore = createGlobalState(() => { export const useGroupTypeStore = createGlobalState(() => {
const groupName = ref('') const groupName = ref('')
@ -16,29 +20,29 @@ export const useGroupTypeStore = createGlobalState(() => {
const crumbsIndex = ref(0) const crumbsIndex = ref(0)
const depCheckedKeys = ref([]) // 选中的部门keys const depCheckedKeys = ref([]) // 选中的部门keys
const groupAdmins = ref([]) // 选中的管理员 const groupAdmins = ref([]) // 选中的管理员
// const halfCheckedKeys = ref([]) // const halfCheckedKeys = ref([])
const getDepsTreeMy= async()=>{ const getDepsTreeMy = async () => {
const res = await departmentV2TreeMy() const res = await departmentV2TreeMy()
if(res.status===0){ if (res.status === 0) {
depTreeMyList.value = res.data.nodes depTreeMyList.value = res.data.nodes
} }
} }
const getPositionsTree= async()=>{ const getPositionsTree = async () => {
const res = await departmentV2AllPosition() const res = await departmentV2AllPosition()
if(res.status===0){ if (res.status === 0) {
postTreeList.value = res.data.nodes postTreeList.value = res.data.nodes
} }
} }
const resetGroupInfo = () => { const resetGroupInfo = () => {
groupName.value = ''; groupName.value = ''
groupActiveIndex.value = -1; groupActiveIndex.value = -1
depTreeMyList.value = []; depTreeMyList.value = []
postTreeList.value = []; postTreeList.value = []
crumbs.value = []; crumbs.value = []
crumbsIndex.value = 0 crumbsIndex.value = 0
depCheckedKeys.value = [] depCheckedKeys.value = []
groupAdmins.value = [] groupAdmins.value = []
@ -46,23 +50,49 @@ export const useGroupTypeStore = createGlobalState(() => {
const createDepGroup = async (param) => { const createDepGroup = async (param) => {
const res = await groupCreateDept({ const res = await groupCreateDept({
name:groupName.value, name: groupName.value,
deptInfos:depCheckedKeys.value.map(v=>{ deptInfos: depCheckedKeys.value.map((v) => {
return { return {
dept_id:v.ID, dept_id: v.ID,
dept_name:v.name dept_name: v.name,
} }
}), }),
positionInfos:groupAdmins.value.map(v=>{ positionInfos: groupAdmins.value.map((v) => {
return { return {
position_id:v.ID, position_id: v.ID,
position_name:v.name position_name: v.name,
} }
}) }),
}) })
return res; return res
} }
//通过部门Id和岗位Id得到部门和岗位的对应关系
const getDepartmentPositionsById = (departmentId, positionId) => {
return buildDepMap(postTreeList.value).get(`${departmentId}-${positionId}`)
}
//建立部门和岗位对应map
const buildDepMap = (departments) => {
const index = new Map()
function traverse(deps) {
for (let dep of deps) {
if (dep.positions && dep.positions.length > 0) {
dep.positions.forEach((position) => {
index.set(
`${dep.ID}-${position.ID}`,
dep.name + '-' + position.name,
)
})
}
if (dep.sons && dep.sons.length > 0) {
traverse(dep.sons)
}
}
}
traverse(departments)
return index
}
return { return {
groupName, groupName,
@ -77,5 +107,6 @@ export const useGroupTypeStore = createGlobalState(() => {
groupAdmins, groupAdmins,
resetGroupInfo, resetGroupInfo,
createDepGroup, createDepGroup,
getDepartmentPositionsById
} }
}) })

View File

@ -116,7 +116,7 @@
"chat.manage.addSilenceMember": "添加禁言成员", "chat.manage.addSilenceMember": "添加禁言成员",
"chatSettings.btn.undoSilence": "解禁", "chatSettings.btn.undoSilence": "解禁",
"silence.tag.hasDone": "已禁言", "silence.tag.hasDone": "已禁言",
"chat.manage.addAdmin": "添加管理员", "chat.manage.addAdmin": "添加管理员",
"search.condition.member": "按群成员查找", "search.condition.member": "按群成员查找",
"result.date.nowMonth": "这个月", "result.date.nowMonth": "这个月",
"user.detail.ringBell": "打电话", "user.detail.ringBell": "打电话",