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