From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目
---
src/views/crm/permission/components/PermissionList.vue | 206 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 206 insertions(+), 0 deletions(-)
diff --git a/src/views/crm/permission/components/PermissionList.vue b/src/views/crm/permission/components/PermissionList.vue
new file mode 100644
index 0000000..39c7aab
--- /dev/null
+++ b/src/views/crm/permission/components/PermissionList.vue
@@ -0,0 +1,206 @@
+<template>
+ <!-- 鎿嶄綔鏍� -->
+ <el-row v-if="showAction" justify="end">
+ <el-button v-if="validateOwnerUser" type="primary" @click="openForm">
+ <Icon class="mr-5px" icon="ep:plus" />
+ 鏂板
+ </el-button>
+ <el-button v-if="validateOwnerUser" @click="handleUpdate">
+ <Icon class="mr-5px" icon="ep:edit" />
+ 缂栬緫
+ </el-button>
+ <el-button v-if="validateOwnerUser" @click="handleDelete">
+ <Icon class="mr-5px" icon="ep:delete" />
+ 绉婚櫎
+ </el-button>
+ <el-button v-if="!validateOwnerUser && list.length > 0" type="danger" @click="handleQuit">
+ 閫�鍑哄洟闃�
+ </el-button>
+ </el-row>
+ <!-- 鍥㈤槦鎴愬憳灞曠ず -->
+ <el-table
+ ref="elTableRef"
+ v-loading="loading"
+ :data="list"
+ :show-overflow-tooltip="true"
+ :stripe="true"
+ class="mt-20px"
+ @selection-change="handleSelectionChange"
+ >
+ <el-table-column type="selection" width="55" />
+ <el-table-column align="center" label="濮撳悕" prop="nickname" />
+ <el-table-column align="center" label="閮ㄩ棬" prop="deptName" />
+ <el-table-column align="center" label="宀椾綅" prop="postNames" />
+ <el-table-column align="center" label="鏉冮檺绾у埆" prop="level">
+ <template #default="{ row }">
+ <dict-tag :type="DICT_TYPE.CRM_PERMISSION_LEVEL" :value="row.level" />
+ </template>
+ </el-table-column>
+ <el-table-column :formatter="dateFormatter" align="center" label="鍔犲叆鏃堕棿" prop="createTime" />
+ </el-table>
+
+ <!-- 琛ㄥ崟寮圭獥锛氭坊鍔�/淇敼 -->
+ <CrmPermissionForm ref="formRef" @success="getList" />
+</template>
+<script lang="ts" setup>
+import { dateFormatter } from '@/utils/formatTime'
+import { ElTable } from 'element-plus'
+import * as PermissionApi from '@/api/crm/permission'
+import { useUserStoreWithOut } from '@/store/modules/user'
+import CrmPermissionForm from './PermissionForm.vue'
+import { DICT_TYPE } from '@/utils/dict'
+
+defineOptions({ name: 'CrmPermissionList' })
+
+const message = useMessage() // 娑堟伅
+
+const props = defineProps<{
+ bizType: number // 妯″潡绫诲瀷
+ bizId: number | undefined // 妯″潡鏁版嵁缂栧彿
+ showAction: boolean //鏄惁灞曠ず鎿嶄綔鎸夐挳
+}>()
+const loading = ref(true) // 鍒楄〃鐨勫姞杞戒腑
+const list = ref<PermissionApi.PermissionVO[]>([]) // 鍒楄〃鐨勬暟鎹�
+const formData = ref({
+ ownerUserId: 0
+})
+const userStore = useUserStoreWithOut() // 鐢ㄦ埛淇℃伅缂撳瓨
+
+/** 鏌ヨ鍒楄〃 */
+const getList = async () => {
+ loading.value = true
+ try {
+ const data = await PermissionApi.getPermissionList({
+ bizType: props.bizType,
+ bizId: props.bizId
+ })
+ list.value = data
+ const permission = list.value.find(
+ (item) =>
+ item.userId === userStore.getUser.id &&
+ item.level === PermissionApi.PermissionLevelEnum.OWNER
+ )
+ if (permission) {
+ formData.value.ownerUserId = userStore.getUser.id
+ }
+ } finally {
+ loading.value = false
+ }
+}
+const multipleSelection = ref<PermissionApi.PermissionVO[]>([]) // 閫夋嫨鐨勫洟闃熸垚鍛�
+const elTableRef = ref<InstanceType<typeof ElTable>>()
+const handleSelectionChange = (val: PermissionApi.PermissionVO[]) => {
+ if (val.findIndex((item) => item.level === PermissionApi.PermissionLevelEnum.OWNER) !== -1) {
+ message.warning('涓嶈兘閫夋嫨璐熻矗浜猴紒')
+ elTableRef.value?.clearSelection()
+ return
+ }
+ multipleSelection.value = val
+}
+
+/** 缂栬緫鍥㈤槦鎴愬憳 */
+const formRef = ref<InstanceType<typeof CrmPermissionForm>>() // 鏉冮檺琛ㄥ崟 Ref
+const handleUpdate = () => {
+ if (multipleSelection.value?.length === 0) {
+ message.warning('璇峰厛閫夋嫨鍥㈤槦鎴愬憳鍚庢搷浣滐紒')
+ return
+ }
+ if (multipleSelection.value?.length > 1) {
+ message.warning('缂栬緫鍥㈤槦鎴愬憳鏃跺彧鑳介�夋嫨涓�涓紒')
+ return
+ }
+ formRef.value?.open0(
+ 'update',
+ props.bizType,
+ props.bizId!,
+ multipleSelection.value[0].id!,
+ multipleSelection.value[0].level
+ )
+}
+
+/** 绉婚櫎鍥㈤槦鎴愬憳 */
+const handleDelete = async () => {
+ if (multipleSelection.value?.length === 0) {
+ message.warning('璇峰厛閫夋嫨鍥㈤槦鎴愬憳鍚庢搷浣滐紒')
+ return
+ }
+ await message.delConfirm()
+ const ids = multipleSelection.value?.map((item) => item.id) as unknown as number[]
+ await PermissionApi.deletePermissionBatch(ids)
+ message.success('绉婚櫎鍥㈤槦鎴愬憳鎴愬姛锛�')
+ await getList()
+}
+
+/** 娣诲姞鍥㈤槦鎴愬憳 */
+const openForm = () => {
+ formRef.value?.open('create', props.bizType, props.bizId!)
+}
+
+// 鏍¢獙璐熻矗浜烘潈闄愬拰缂栬緫鏉冮檺
+const validateOwnerUser = ref(false)
+const validateWrite = ref(false)
+const isPool = ref(false)
+watch(
+ list,
+ (newArr) => {
+ isPool.value = false
+ if (newArr?.length > 0) {
+ isPool.value = !list.value.some(
+ (item) => item.level === PermissionApi.PermissionLevelEnum.OWNER
+ )
+ validateOwnerUser.value = false
+ validateWrite.value = false
+ const userId = userStore.getUser?.id
+ list.value
+ .filter((item) => item.userId === userId)
+ .forEach((item) => {
+ if (item.level === PermissionApi.PermissionLevelEnum.OWNER) {
+ validateOwnerUser.value = true
+ validateWrite.value = true
+ } else if (item.level === PermissionApi.PermissionLevelEnum.WRITE) {
+ validateWrite.value = true
+ }
+ })
+ } else {
+ isPool.value = true
+ }
+ },
+ {
+ immediate: true
+ }
+)
+
+defineExpose({ openForm, validateOwnerUser, validateWrite, isPool })
+const emits = defineEmits<{
+ (e: 'quitTeam'): void
+}>()
+/** 閫�鍑哄洟闃� */
+const handleQuit = async () => {
+ const permission = list.value.find(
+ (item) =>
+ item.userId === userStore.getUser.id && item.level === PermissionApi.PermissionLevelEnum.OWNER
+ )
+ if (permission) {
+ message.warning('璐熻矗浜轰笉鑳介��鍑哄洟闃燂紒')
+ return
+ }
+ const userPermission = list.value.find((item) => item.userId === userStore.getUser.id)
+ if (!userPermission) {
+ return
+ }
+ await PermissionApi.deleteSelfPermission(userPermission.id!)
+ message.success('閫�鍑哄洟闃熸垚鍛樻垚鍔燂紒')
+ emits('quitTeam')
+}
+
+watch(
+ () => props.bizId,
+ (bizId) => {
+ if (!bizId) {
+ return
+ }
+ getList()
+ },
+ { immediate: true, deep: true }
+)
+</script>
--
Gitblit v1.8.0