index.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <template>
  2. <!-- <doc-alert title="【通用】跟进记录、待办事项" url="https://doc.iocoder.cn/crm/follow-up/" /> -->
  3. <el-row :gutter="20">
  4. <el-col :span="4" class="min-w-[200px]">
  5. <div class="side-item-list">
  6. <div
  7. v-for="(item, index) in leftSides"
  8. :key="index"
  9. :class="leftMenu == item.menu ? 'side-item-select' : 'side-item-default'"
  10. class="side-item"
  11. @click="sideClick(item)"
  12. >
  13. {{ item.name }}
  14. <el-badge v-if="item.count > 0" :max="99" :value="item.count" />
  15. </div>
  16. </div>
  17. </el-col>
  18. <el-col :span="20" :xs="24">
  19. <CustomerTodayContactList v-if="leftMenu === 'customerTodayContact'" />
  20. <ClueFollowList v-if="leftMenu === 'clueFollow'" />
  21. <ContractAuditList v-if="leftMenu === 'contractAudit'" />
  22. <ReceivableAuditList v-if="leftMenu === 'receivableAudit'" />
  23. <ContractRemindList v-if="leftMenu === 'contractRemind'" />
  24. <CustomerFollowList v-if="leftMenu === 'customerFollow'" />
  25. <CustomerPutPoolRemindList v-if="leftMenu === 'customerPutPoolRemind'" />
  26. <ReceivablePlanRemindList v-if="leftMenu === 'receivablePlanRemind'" />
  27. </el-col>
  28. </el-row>
  29. </template>
  30. <script lang="ts" setup>
  31. import CustomerFollowList from './components/CustomerFollowList.vue'
  32. import CustomerTodayContactList from './components/CustomerTodayContactList.vue'
  33. import CustomerPutPoolRemindList from './components/CustomerPutPoolRemindList.vue'
  34. import ClueFollowList from './components/ClueFollowList.vue'
  35. import ContractAuditList from './components/ContractAuditList.vue'
  36. import ContractRemindList from './components/ContractRemindList.vue'
  37. import ReceivablePlanRemindList from './components/ReceivablePlanRemindList.vue'
  38. import ReceivableAuditList from './components/ReceivableAuditList.vue'
  39. import * as CustomerApi from '@/api/crm/customer'
  40. import * as ClueApi from '@/api/crm/clue'
  41. import * as ContractApi from '@/api/crm/contract'
  42. import * as ReceivableApi from '@/api/crm/receivable'
  43. import * as ReceivablePlanApi from '@/api/crm/receivable/plan'
  44. defineOptions({ name: 'CrmBacklog' })
  45. const leftMenu = ref('customerTodayContact')
  46. const clueFollowCount = ref(0)
  47. const customerFollowCount = ref(0)
  48. const customerPutPoolRemindCount = ref(0)
  49. const customerTodayContactCount = ref(0)
  50. const contractAuditCount = ref(0)
  51. const contractRemindCount = ref(0)
  52. const receivableAuditCount = ref(0)
  53. const receivablePlanRemindCount = ref(0)
  54. const leftSides = ref([
  55. {
  56. name: '今日需联系客户',
  57. menu: 'customerTodayContact',
  58. count: customerTodayContactCount
  59. },
  60. {
  61. name: '分配给我的线索',
  62. menu: 'clueFollow',
  63. count: clueFollowCount
  64. },
  65. {
  66. name: '分配给我的客户',
  67. menu: 'customerFollow',
  68. count: customerFollowCount
  69. },
  70. {
  71. name: '待进入公海的客户',
  72. menu: 'customerPutPoolRemind',
  73. count: customerPutPoolRemindCount
  74. },
  75. {
  76. name: '待审核合同',
  77. menu: 'contractAudit',
  78. count: contractAuditCount
  79. },
  80. {
  81. name: '待审核回款',
  82. menu: 'receivableAudit',
  83. count: receivableAuditCount
  84. },
  85. {
  86. name: '待回款提醒',
  87. menu: 'receivablePlanRemind',
  88. count: receivablePlanRemindCount
  89. },
  90. {
  91. name: '即将到期的合同',
  92. menu: 'contractRemind',
  93. count: contractRemindCount
  94. }
  95. ])
  96. /** 侧边点击 */
  97. const sideClick = (item: any) => {
  98. leftMenu.value = item.menu
  99. }
  100. const getCount = () => {
  101. CustomerApi.getTodayContactCustomerCount().then(
  102. (count) => (customerTodayContactCount.value = count)
  103. )
  104. CustomerApi.getPutPoolRemindCustomerCount().then(
  105. (count) => (customerPutPoolRemindCount.value = count)
  106. )
  107. CustomerApi.getFollowCustomerCount().then((count) => (customerFollowCount.value = count))
  108. ClueApi.getFollowClueCount().then((count) => (clueFollowCount.value = count))
  109. ContractApi.getAuditContractCount().then((count) => (contractAuditCount.value = count))
  110. ContractApi.getRemindContractCount().then((count) => (contractRemindCount.value = count))
  111. ReceivableApi.getAuditReceivableCount().then((count) => (receivableAuditCount.value = count))
  112. ReceivablePlanApi.getReceivablePlanRemindCount().then(
  113. (count) => (receivablePlanRemindCount.value = count)
  114. )
  115. }
  116. /** 激活时 */
  117. onActivated(async () => {
  118. getCount()
  119. })
  120. /** 初始化 */
  121. onMounted(async () => {
  122. getCount()
  123. })
  124. </script>
  125. <style lang="scss" scoped>
  126. .side-item-list {
  127. top: 0;
  128. bottom: 0;
  129. left: 0;
  130. z-index: 1;
  131. font-size: 14px;
  132. background-color: var(--el-bg-color);
  133. border: 1px solid var(--el-border-color);
  134. border-radius: 5px;
  135. .side-item {
  136. position: relative;
  137. height: 50px;
  138. padding: 0 20px;
  139. line-height: 50px;
  140. cursor: pointer;
  141. }
  142. }
  143. .side-item-default {
  144. color: var(--el-text-color-primary);
  145. border-right: 2px solid transparent;
  146. }
  147. .side-item-select {
  148. color: var(--el-color-primary);
  149. background-color: var(--el-color-primary-light-9);
  150. border-right: 2px solid var(--el-color-primary);
  151. }
  152. .el-badge :deep(.el-badge__content) {
  153. top: 0;
  154. border: none;
  155. }
  156. .el-badge {
  157. position: absolute;
  158. top: 0;
  159. right: 15px;
  160. }
  161. </style>