PermissionList.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <template>
  2. <!-- 操作栏 -->
  3. <el-row v-if="showAction" justify="end">
  4. <el-button v-if="validateOwnerUser" type="primary" @click="openForm">
  5. <Icon class="mr-5px" icon="ep:plus" />
  6. 新增
  7. </el-button>
  8. <el-button v-if="validateOwnerUser" @click="handleUpdate">
  9. <Icon class="mr-5px" icon="ep:edit" />
  10. 编辑
  11. </el-button>
  12. <el-button v-if="validateOwnerUser" @click="handleDelete">
  13. <Icon class="mr-5px" icon="ep:delete" />
  14. 移除
  15. </el-button>
  16. <el-button v-if="!validateOwnerUser && list.length > 0" type="danger" @click="handleQuit">
  17. 退出团队
  18. </el-button>
  19. </el-row>
  20. <!-- 团队成员展示 -->
  21. <el-table
  22. ref="elTableRef"
  23. v-loading="loading"
  24. :data="list"
  25. :show-overflow-tooltip="true"
  26. :stripe="true"
  27. class="mt-20px"
  28. @selection-change="handleSelectionChange"
  29. >
  30. <el-table-column type="selection" width="55" />
  31. <el-table-column align="center" label="姓名" prop="nickname" />
  32. <el-table-column align="center" label="部门" prop="deptName" />
  33. <el-table-column align="center" label="岗位" prop="postNames" />
  34. <el-table-column align="center" label="权限级别" prop="level">
  35. <template #default="{ row }">
  36. <dict-tag :type="DICT_TYPE.CRM_PERMISSION_LEVEL" :value="row.level" />
  37. </template>
  38. </el-table-column>
  39. <el-table-column :formatter="dateFormatter" align="center" label="加入时间" prop="createTime" />
  40. </el-table>
  41. <!-- 表单弹窗:添加/修改 -->
  42. <CrmPermissionForm ref="formRef" @success="getList" />
  43. </template>
  44. <script lang="ts" setup>
  45. import { dateFormatter } from '@/utils/formatTime'
  46. import { ElTable } from 'element-plus'
  47. import * as PermissionApi from '@/api/crm/permission'
  48. import { useUserStoreWithOut } from '@/store/modules/user'
  49. import CrmPermissionForm from './PermissionForm.vue'
  50. import { DICT_TYPE } from '@/utils/dict'
  51. defineOptions({ name: 'CrmPermissionList' })
  52. const message = useMessage() // 消息
  53. const props = defineProps<{
  54. bizType: number // 模块类型
  55. bizId: number | undefined // 模块数据编号
  56. showAction: boolean //是否展示操作按钮
  57. }>()
  58. const loading = ref(true) // 列表的加载中
  59. const list = ref<PermissionApi.PermissionVO[]>([]) // 列表的数据
  60. const formData = ref({
  61. ownerUserId: 0
  62. })
  63. const userStore = useUserStoreWithOut() // 用户信息缓存
  64. /** 查询列表 */
  65. const getList = async () => {
  66. loading.value = true
  67. try {
  68. const data = await PermissionApi.getPermissionList({
  69. bizType: props.bizType,
  70. bizId: props.bizId
  71. })
  72. list.value = data
  73. const permission = list.value.find(
  74. (item) =>
  75. item.userId === userStore.getUser.id &&
  76. item.level === PermissionApi.PermissionLevelEnum.OWNER
  77. )
  78. if (permission) {
  79. formData.value.ownerUserId = userStore.getUser.id
  80. }
  81. } finally {
  82. loading.value = false
  83. }
  84. }
  85. const multipleSelection = ref<PermissionApi.PermissionVO[]>([]) // 选择的团队成员
  86. const elTableRef = ref<InstanceType<typeof ElTable>>()
  87. const handleSelectionChange = (val: PermissionApi.PermissionVO[]) => {
  88. if (val.findIndex((item) => item.level === PermissionApi.PermissionLevelEnum.OWNER) !== -1) {
  89. message.warning('不能选择负责人!')
  90. elTableRef.value?.clearSelection()
  91. return
  92. }
  93. multipleSelection.value = val
  94. }
  95. /** 编辑团队成员 */
  96. const formRef = ref<InstanceType<typeof CrmPermissionForm>>() // 权限表单 Ref
  97. const handleUpdate = () => {
  98. if (multipleSelection.value?.length === 0) {
  99. message.warning('请先选择团队成员后操作!')
  100. return
  101. }
  102. const ids = multipleSelection.value?.map((item) => item.id) as unknown as number[]
  103. formRef.value?.open('update', props.bizType, props.bizId!, ids)
  104. }
  105. /** 移除团队成员 */
  106. const handleDelete = async () => {
  107. if (multipleSelection.value?.length === 0) {
  108. message.warning('请先选择团队成员后操作!')
  109. return
  110. }
  111. await message.delConfirm()
  112. const ids = multipleSelection.value?.map((item) => item.id)
  113. await PermissionApi.deletePermissionBatch({
  114. bizType: props.bizType,
  115. bizId: props.bizId,
  116. ids
  117. })
  118. }
  119. /** 添加团队成员 */
  120. const openForm = () => {
  121. formRef.value?.open('create', props.bizType, props.bizId!)
  122. }
  123. // 校验负责人权限和编辑权限
  124. const validateOwnerUser = ref(false)
  125. const validateWrite = ref(false)
  126. const isPool = ref(false)
  127. watch(
  128. list,
  129. (newArr) => {
  130. isPool.value = false
  131. if (newArr?.length > 0) {
  132. isPool.value = !list.value.some(
  133. (item) => item.level === PermissionApi.PermissionLevelEnum.OWNER
  134. )
  135. validateOwnerUser.value = false
  136. validateWrite.value = false
  137. const userId = userStore.getUser?.id
  138. list.value
  139. .filter((item) => item.userId === userId)
  140. .forEach((item) => {
  141. if (item.level === PermissionApi.PermissionLevelEnum.OWNER) {
  142. validateOwnerUser.value = true
  143. validateWrite.value = true
  144. } else if (item.level === PermissionApi.PermissionLevelEnum.WRITE) {
  145. validateWrite.value = true
  146. }
  147. })
  148. } else {
  149. isPool.value = true
  150. }
  151. },
  152. {
  153. immediate: true
  154. }
  155. )
  156. defineExpose({ openForm, validateOwnerUser, validateWrite, isPool })
  157. /** 退出团队 */
  158. const handleQuit = async () => {
  159. const permission = list.value.find(
  160. (item) =>
  161. item.userId === userStore.getUser.id && item.level === PermissionApi.PermissionLevelEnum.OWNER
  162. )
  163. if (permission) {
  164. message.warning('负责人不能退出团队!')
  165. return
  166. }
  167. const userPermission = list.value.find((item) => item.userId === userStore.getUser.id)
  168. if (userPermission) {
  169. await PermissionApi.deleteSelfPermission(userPermission.id!)
  170. }
  171. }
  172. watch(
  173. () => props.bizId,
  174. (bizId) => {
  175. if (!bizId) {
  176. return
  177. }
  178. getList()
  179. },
  180. { immediate: true, deep: true }
  181. )
  182. </script>