CrmTeamList.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <template>
  2. <!-- 操作栏 -->
  3. <el-row justify="end">
  4. <el-button type="primary" @click="handleAdd">
  5. <Icon class="mr-5px" icon="ep:plus" />
  6. 新增
  7. </el-button>
  8. <el-button @click="handleEdit">
  9. <Icon class="mr-5px" icon="ep:edit" />
  10. 编辑
  11. </el-button>
  12. <el-button @click="handleRemove">
  13. <Icon class="mr-5px" icon="ep:delete" />
  14. 移除
  15. </el-button>
  16. <el-button type="danger" @click="handleQuit"> 退出团队</el-button>
  17. </el-row>
  18. <!-- 团队成员展示 -->
  19. <el-table
  20. v-loading="loading"
  21. :data="list"
  22. :show-overflow-tooltip="true"
  23. :stripe="true"
  24. class="mt-20px"
  25. @selection-change="handleSelectionChange"
  26. >
  27. <el-table-column type="selection" width="55" />
  28. <el-table-column align="center" label="姓名" prop="nickname" />
  29. <el-table-column align="center" label="部门" prop="deptName" />
  30. <el-table-column align="center" label="岗位" prop="postNames" />
  31. <el-table-column align="center" label="权限级别" prop="level">
  32. <template #default="{ row }">
  33. <el-tag>{{ getLevelName(row.level) }}</el-tag>
  34. </template>
  35. </el-table-column>
  36. <el-table-column :formatter="dateFormatter" align="center" label="加入时间" prop="createTime" />
  37. </el-table>
  38. <CrmPermissionForm ref="crmPermissionFormRef" />
  39. </template>
  40. <script lang="ts" setup>
  41. // TODO @puhui999:改成 CrmPermissionList
  42. import { dateFormatter } from '@/utils/formatTime'
  43. import { ElTable } from 'element-plus'
  44. import * as PermissionApi from '@/api/crm/permission'
  45. import { useUserStoreWithOut } from '@/store/modules/user'
  46. import CrmPermissionForm from './CrmPermissionForm.vue'
  47. import { CrmPermissionLevelEnum } from './index'
  48. defineOptions({ name: 'CrmTeam' })
  49. const message = useMessage() // 消息
  50. const props = defineProps<{
  51. bizType: number
  52. bizId: number
  53. }>()
  54. const loading = ref(true) // 列表的加载中
  55. const list = ref<PermissionApi.PermissionVO[]>([
  56. // TODO 测试数据
  57. {
  58. id: 1, // 数据权限编号
  59. userId: 1, // 用户编号
  60. bizType: 1, // Crm 类型
  61. bizId: 1, // Crm 类型数据编号
  62. level: 1, // 权限级别
  63. deptName: '研发部门', // 部门名称
  64. nickname: '芋道源码', // 用户昵称
  65. postNames: '全栈开发工程师', // 岗位名称数组
  66. createTime: new Date()
  67. }
  68. ]) // 列表的数据
  69. /** 查询列表 */
  70. const getList = async () => {
  71. loading.value = true
  72. try {
  73. const data = await PermissionApi.getPermissionList({
  74. bizType: props.bizType,
  75. bizId: props.bizId
  76. })
  77. list.value = data
  78. } finally {
  79. loading.value = false
  80. }
  81. }
  82. // TODO @puhui999:字典格式化
  83. /**
  84. * 获得权限级别名称
  85. * @param level 权限级别
  86. */
  87. const getLevelName = computed(() => (level: number) => {
  88. switch (level) {
  89. case CrmPermissionLevelEnum.OWNER:
  90. return '负责人'
  91. case CrmPermissionLevelEnum.READ:
  92. return '只读'
  93. case CrmPermissionLevelEnum.WRITE:
  94. return '读写'
  95. default:
  96. break
  97. }
  98. })
  99. // TODO @puhui999:空行稍微注意下哈;一些注释补齐下;
  100. const multipleSelection = ref<PermissionApi.PermissionVO[]>([])
  101. const handleSelectionChange = (val: PermissionApi.PermissionVO[]) => {
  102. multipleSelection.value = val
  103. }
  104. // TODO @puhui999:一些变量命名,看看有没可能跟列表界面的 index.vue 保持他统一的风格;
  105. const crmPermissionFormRef = ref<InstanceType<typeof CrmPermissionForm>>()
  106. const handleEdit = () => {
  107. if (multipleSelection.value?.length === 0) {
  108. message.warning('请先选择团队成员后操作!')
  109. return
  110. }
  111. const ids = multipleSelection.value?.map((item) => item.id)
  112. crmPermissionFormRef.value?.open('update', props.bizType, props.bizId, ids)
  113. }
  114. const handleRemove = async () => {
  115. if (multipleSelection.value?.length === 0) {
  116. message.warning('请先选择团队成员后操作!')
  117. return
  118. }
  119. await message.delConfirm()
  120. const ids = multipleSelection.value?.map((item) => item.id)
  121. await PermissionApi.deletePermission({
  122. bizType: props.bizType,
  123. bizId: props.bizId,
  124. ids
  125. })
  126. }
  127. const handleAdd = () => {
  128. crmPermissionFormRef.value?.open('create', props.bizType, props.bizId)
  129. }
  130. const userStore = useUserStoreWithOut()
  131. const handleQuit = async () => {
  132. const permission = list.value.find(
  133. (item) => item.userId === userStore.getUser.id && item.level === CrmPermissionLevelEnum.OWNER
  134. )
  135. if (permission) {
  136. message.warning('负责人不能退出团队!')
  137. return
  138. }
  139. const userPermission = list.value.find((item) => item.userId === userStore.getUser.id)
  140. await PermissionApi.quitTeam(userPermission?.id)
  141. }
  142. watch(
  143. () => props.bizId,
  144. () => {
  145. getList()
  146. },
  147. { immediate: true, deep: true }
  148. )
  149. </script>